# android9 gpio **Repository Path**: gotittogo/android9-gpio ## Basic Information - **Project Name**: android9 gpio - **Description**: android9 gpio操作方法 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-10-24 - **Last Updated**: 2022-11-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # android9 gpio 节点位置 在MTK平台,我们可以通过cat节点(mt_gpio)来查看对应的状态。不同的平台,该管脚对应的位置也是不同的。 需要先执行:adb root 查找节点位置:find sys/ -name "mt_gpio"             一般位于:/sys/devices/platform/soc/1000b000.pinctrl/mt_gpio 查看GPIO状态: adb输入命令:cat ./sys/devices/platform/soc/1000b000.pinctrl/mt_gpio   PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT] [DRIVE] ( [R1] [R0] )   0: 011110100 01   1: 000010100 01   2: 000111100 01   3: 000010100 01   4: 011100100 00   5: 000010100 01   6: 000100110   ... 对应的属性基本与DWS配置项一致,这里只对 [DRIVE] ( [R1] [R0] ) 两项进行说明 [DRIVE]:驱动能力,一般可取值0~7 ([R1] [R0]):当前GPIO pin的(上下拉)并联电阻的使能状态 1 0表示enable R1,disable R0 0 1表示disable R1,enable R0 1 1表示enable R1, enable R0 不打印出来,表示当前的GPIO pin不支持PUPD状况,即只有一个上拉电阻、一个下拉电阻。 通过对比上面信息我们可以看出GPIO的设置是否生效,如对应属性和驱动中设置不符,则需要检查驱动是否有疏漏,还要检查对应的GPIO是否有其他模块也使用了,我们也可以使用adb将GPIO配置成我们需要的状态,来验证此GPIO是否可控,也可以用此方法来临时满足我们外设的需求,方便调试其他功能。 使用adb设置GPIO属性: 设置模式:echo mode 14 0 > mt_gpio 设置输入/输出:echo dir 14 1  > mt_gpio 输出高/低:echo out 14 1 > mt_gpio 设置pullen:  echo pullen 14 1 > mt_gpio NOTE:设置pullen时, For pin with 2 pull resistors, $value can be 0 (R1=0, R0=0), 1 (R1=0, R0=1), 2 (R1=1, R0=0), 3 (R1=1, R0=1) For pin with 1 pull resistor, $value can be 0 or 1 android 代码示例 https://gitee.com/gotittogo/android9-gpio/tree/6765 核心类GpioPort.java ```java /** * @hide */ public class GpioPort { private String GPIODEV = "/sys/devices/platform/1000b000.pinctrl/mt_gpio"; public void set_gpio(final int pin, final int mode, final int dir, final int dout, final int din, final int driving, final int smt, final int pullen, final int pullsel){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"set "+pin+" "+mode+" "+dir+" "+dout+" "+din+" "+driving+" "+smt+" "+pullen+" "+pullsel); } }).start(); } //设置gpio模式 public void set_mode(final int pin, final int mode){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"mode "+pin+" "+mode); } }).start(); } //设置gpio输入/输出 0:input pin, 1:output pin public void set_dir(final int pin, final int dir){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"dir "+pin+" "+dir); } }).start(); } //设置gpio输出值 public void set_data(final int pin, final int data){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"out "+pin+" "+data); } }).start(); } //只对input pin有效,使能上/下拉 public void set_pullen(final int pin, final int pullen){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"pullen "+pin+" "+pullen); } }).start(); } //只对input pin有效,1:上拉 0:下拉 public void set_pull(final int pin, final int pull){ new Thread(new Runnable() { @Override public void run() { writeFile(GPIODEV,"pullsel "+pin+" "+pull); } }).start(); } //获取gpio模式 public int get_mode(int gpio){ String gpioinfo = readGPIO(gpio); if(gpioinfo.length()>10){ if(gpioinfo.substring(5,6).equals("1")){ return 1; }else{ return 0; } } return -1; } //获取gpio是输入还是输出 public int get_dir(int gpio){ String gpioinfo = readGPIO(gpio); if(gpioinfo.length()>10){ if(gpioinfo.substring(6,7).equals("1")){ return 1; }else{ return 0; } } return -1; } //获取输出值 public int get_data(int gpio){ String gpioinfo = readGPIO(gpio); if(gpioinfo.length()>10){ if(gpioinfo.substring(7,8).equals("1")){ return 1; }else{ return 0; } } return -1; } //获取输入值 public int get_datain(int gpio){ String gpioinfo = readGPIO(gpio); if(gpioinfo.length()>10){ if(gpioinfo.substring(8,9).equals("1")){ return 1; }else{ return 0; } } return -1; } private boolean writeFile(String path, String content) { boolean resault =true; FileWriter fileWriter = null; try { fileWriter = new FileWriter(path); if (fileWriter != null) { fileWriter.write(content); }else{ resault =false; } } catch (Exception e) { resault =false; e.printStackTrace(); } finally { if (fileWriter != null) try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } return resault; } String readGPIO(int lineNumber){ try { return readLineVarFile(GPIODEV,lineNumber+2); } catch (IOException e) { e.printStackTrace(); } return ""; } private String readLineVarFile(String fileName, int lineNumber) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line = reader.readLine(); if (lineNumber <= 0 || lineNumber > 180) { return ""; } int num = 0; while (line != null && num