Linux驱动程序--GPIO配置及应用
文章摘要:
General Purpose Input Output(通用输入输出),Linux在新的内核中对GPIO接口进行了统一管理,对于不同平台的普通的IO操作,不需要单独的写驱动程序。
硬件平台: SMDK2410
内核版本: 2.6.38
内核配置选项:
Device Drivers --->
GPIO Support --->
[*] /sys/class/gpio/... (sysfs interface)
配置后的内核,会产生/sys/class/gpio目录。
查看系统GPIO信息:
$ cd /sys/class/gpio
$ for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done
GPIOA: 0
GPIOE: 128
GPIOF: 160
GPIOG: 192
GPIOH: 224
GPIOB: 32
GPIOC: 64
GPIOD: 96
计算引脚编号:
GPB0 = GPIOB + 0 = 32 + 0 = 32;
GPF4 = GPIOF + 4 = 160 + 4 = 164;
依次类推,实际上所有引脚是按顺序排列的。
导出引脚:
#echo 164 > /sys/class/gpio/export
操作说明:该操作在/sys/class/gpio目录下产生一个gpio164的链接;
移除引脚:
#echo 164 > /sys/class/gpio/unexport
配置引脚:
方向配置(输入/输出): 修改direction属性.
#echo "output" > /sys/class/gpio/gpio164/direction
input - 输入;
output - 输出。
中断配置:修改edge属性.
#echo "rising" > /sys/class/gpio/gpio164/edge
none - 表示引脚为普通输入,不是中断引脚;
rising - 表示引脚为中断输入,上升沿触发;
falling - 表示引脚为中断输入,下降沿触发;
both - 表示引脚为中断输入,双边沿触发。
读写操作:读取/修改value属性.
#echo -n 0 > /sys/class/gpio/gpio164/value
#echo -n 1 > /sys/class/gpio/gpio164/value
#cat /sys/class/gpio/gpio164/value
文件操作:
适用于应用程序访问:
fd = open("/sys/class/gpio/gpio164/value", O_RDWR);
write(fd,"0",1);
read(fd,buf,1);
GPIO驱动程序相关操作:
申请GPIO
gpio_request();
释放GPIO
gpio_free();
设置GPIO为输出
gpio_direction_output();
设置GPIO为输入
gpio_direction_input();
获取GPIO值
gpio_get_value();
设置GPIO值
gpio_set_value();
通过GPIO端口号查询中断号
gpio_to_irq();
成功返回对应中断号,失败(非中断引脚)返回NULL
通过中断号查询端口号
irq_to_gpio();
注意事项:
GPIO操作被声明为GPL导出,所以如果用到相关操作;
必须在模块中显示的声明为GPL模块,否则,编译器会报怨找不到相关符号;
一般模块都会声明为GPL,不过调试时往往会不记得加这些声明;
函数声明在linux/gpio.h
函数实现在driver/gpio/gpiolib.c