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的中断编号,为申请中断用