第一天写博客,先从工作最简单、最基础的写起,希望在未来的时光里,对有缘看见这篇文章的你和不断成长的自己又一些帮助吧。
一、概述
GPIO中断时linux驱动开发最基础,最简单驱动。可以在内核驱动中设置使用GPIO,也可以在应用层模拟使用,查看GPIO的使用情况,为在驱动中使用某个引脚做测试。内核已经有一套完整的GPIO的驱动了,只要会调用各个接口去使用起来就行了。内核将GPIO所以可用的接口由0~MAX_INT的整数编号。可以实现GPIO的各个功能:普通引脚、中断、模拟各个协议等。
二、GPIO内核驱动使用
1、GPIO的引脚编号规则(由原理图找相应的芯片规格书,找到功能引脚对应的GPIO引脚)
GPIO1 【4】 = (1 - 1)*32 + 4 = 4
GPIO6 【11】 = (11 - 1)*32 + 11 = 171
*注:公司用的imx6系列芯片
由底板原理图:pcpu6_v02_sf-20180604.pdf 6UL_IIC1_SCL(1)
找核心板原理图:FETIMX6UL_V1.1_p.pdf UART4_TXD(2) UART4_TX_DATA(3)
找参考手册:IMX6UL参考手册(RM)_201604.pdf UART4_TX_DATA(4) ***GPIO1 【28】***
2、普通引脚使用
#define PS2_DATA_PIN 171
1)、注册GPIO
gpio_request(PS2_DATA_PIN,"ps2-data");
2)、设置方向
gpio_direction_input(PS2_DATA_PIN);
gpio_direction_output(PS2_DATA_PIN,1);
3)、获取和设置GPIO值
gpio_get_value(PS2_DATA_PIN);
gpio_set_value(PS2_DATA_PIN,1);
3、GPIO 中断使用
1)、设置为中断int irq_num1 = 0;
irq_num1 = gpio_to_irq(PS2_DATA_PIN); //返回中断编号,是request_irq(),free_irq()的参数
2)、注册中断err = request_irq(irq_num1,irq_fuction,IRQF_TRIGGER_FALLING,"tiny4412_key1",dev);
实现irq_fuction()中断处理函数,完成中断,中断不易处理太耗时的工作,但是调用一下其他函数,或者置个标志位,在其他函数里处理还是可以的。
三、GPIO 用户空间使用
在应用层配置GPIO,测试GPIO能不能用,输出控制都可以实现,在linux系统跑起来后,在文件系统里执行
1、进入GPIO配置主目录
cd /sys/class/gpio申请一个gpio引脚,引脚号同上,成功会在当前目录生成一个该gpio的目录,失败则提示buzy
echo 43 > ./export
进入gpio目录,对其进行配置和控制
cd gpio43
将引脚配置为输出模式
echo "out" > ./direction
控制引脚输出1、0
echo 1 > ./value
echo 0 > ./value
2、中断的设置
没写这个,用户空间没有用到,想想可能很少用到,就没写,用到的时候再看他人的博客!
四、学以致用
我项目中用GPIO模拟PS2键盘驱动,涉及GPIO的普通用法和中断用法,有兴趣的可以看一下
第一篇博文就写到这里,新的开始,一点一滴记录自己的成长过程!
赠语:书山有路勤为径
学海无涯苦做舟