Android GPIO 控制
定义需要控制的GPIO
在board.dts中的配置如下:
&gpio_para { 
    gpio-pins = <&pio PH 6 GPIO_ACTIVE_LOW>, <&pio PH 9 GPIO_ACTIVE_LOW>; 	//设备使用的pin脚配置<控制器 引脚号 有效电平> 
    init-status = <GPIO_ACTIVE_LOW>, <GPIO_ACTIVE_LOW>; 					//初始状态 
    pin-names = "normal_led", "standby_led"; 								//设备使用的pin脚名称 
    gpio-sdcard-reused; 													//是否用于卡打印灯的控制,与sdcard复用gpio 
    status = "okay"; 														//设备是否使用 
};
控制GPIO的接口
添加了GPIO的配置后,会在sys文件系统下产生节点。sys/class/gpio_sw/ 
├── normal_led 		//normal_led灯控制 
│ ├── light 		//控制灯的状态 
│ ├── cfg		 	//设置/读取gpio的功能 
│ ├── drv 			//设置/读取gpio的驱动等级 
│ ├── pull 			//设置/读取gpio电阻上拉或者下拉 
│ ├── data 			//设置/读取gpio的电平状态 
├── standby_led 	//standby_led灯控制 
│ ├── light 
│ ├── cfg 
│ ├── drv 
│ ├── pull 
│ ├── data
对于目录下的normal_led/standby_led节点下的light节点写入0,将导致输出低电平,写入1,将导致输出高电平,为了方便代码中进行操作,有提供java以及C++的接口。
点亮normal_led:
echo 1 > /sys/class/gpio_sw/normal_led/light 
熄灭normal_led:
echo 0 > /sys/class/gpio_sw/normal_led/light
java层的接口
java控制GPIO的接口定义在文件Gpio.java中,其路径为:
platform/frameworks/base/services/core/java/com/aw/server/Gpio.java。
在java代码中 import com.softwinner.Gpio; 的 setNormalLedOn(bool) 和 setStandbyLedOn(bool) 接口方便的操作Led的亮灭。
提供的接口如下。
public static int setNormalLedOn(boolean on);
public static int setStandbyLedOn(boolean on);
public static int setNetworkLedOn(boolean on) ;
public static int writeGpio(char group, int num, int value);
public static int readGpio(char group, int num) ;
public static int setPull(char group, int num, int value);
public static int getPull(char group, int num);
public static int setDrvLevel(char group, int num, int value);
public static int getDrvLevel(char group, int num);
public static int setMulSel(char group, int num, int value);
public static int getMulSel(char group, int num);
private static String composePinPath(char group, int num);
c++层的接口
C++层的操作函数是对内核接口的简单封装,具体的接口如下。
int readData(const char * filePath);
int writeData(const char *data, int count, const char *filePath);
cfg:设置/读取gpio的功能
    0x00:input
    0x01:output
pull:设置/读取gpio电阻上拉或者下拉
    0x00:关闭上拉/下拉
    0x01:上拉
    0x02:下拉
    0x03:保留
drv:设置/读取gpio的驱动等级
    0x00:level 0
    0x01:level 1
    0x02:level 2
    0x03:level 3
data:设置/读取gpio的电平状态
    0x00:低电平
    0x01:高电平
在C语言中可以用read和write函数直接操作这4个文件。具体的范例可参考文件vendor/aw/homlet/framework/gpio/libgpio/GpioService.cpp中的代码。