1. 首先构建设备树,此例中,测试两个GPIO管脚,一个做输入中断,一个做输出
 
每个GPIO需要分别描述,其中,label随意,pioA后面的数字,可以在sama5d2-pinfunc.h文件中找到
 
这是管脚功能复用的配置,把他们配置成普通的GPIO
 
2. 使用compatible = "gpio-test" 这个名字,构建一个平台总线驱动程序,系统会自动调用probe函数
然后,我们在probe函数里再构建一个字符设备驱动即可。
 
3. 在驱动中,我们需要操作gpio口,比如得到其电平值,置电平值,申请中断,在a5d2的驱动里,都需要用到
gpio_desc这个结构体指针,那我们如何能得到上面两个gpio的gpio_desc指针呢。通过查看例子驱动,发现只要两句
 
即可。
device_for_each_child_node(dev, child) {
 gpiod[i] = devm_get_gpiod_from_child(dev, NULL, child);
 i++;
 }
 
这样就可以得到设备树里描述的两个gpio的gpio_desc指针,将它存储在一个指针数组里为后面备用。
 
4. 那如何操作它呢,a5d2对gpio所有的操作都封装在gpiolib.c文件中。
下面介绍几个常用的函数
gpiod_direction_input  设置gpio为输入
 
gpiod_direction_output  设置gpio为输出
 
gpiod_set_value 设置gpio输出电平
 
gpiod_get_value 得到gpio输入电平
 
gpiod_to_irq 得到gpio的中断编号,为申请中断用