前情
基于 linux gpio 会在 /sys/class/gpio
目录下会生成 export, unexport
文件,当然也有 gpiochipx
文件,gpiochipx
是对引脚的管理,如某一个 chip 可能控制着一定数量的引脚,在相应目录下 ngpio
是控制的数量。
执行 echo 4 > /sys/class/gpio/export
的时候会在 /sys/class/gpio
目录下生成 gpio4
目录,在这个目录下会有 如 value, edge, direction
等相关文件,value 是当前值, edge 是引脚触发方式,direction 是引脚输入,输出方式。但是 echo
之后如何产生这个的呢。
过程扫描
- 在一开始的初始化过程中有函数
gpiolib_dev_init
被导出为core_initcall
(gpio/gpiolib.c) - 此函数调用
bus_register
注册 gpio ,对应生成/sys/bus/gpio
目录 - 再调用
alloc_chrdev_region
- 再进行gpiochip 的设置
gpiochip_setup_devs
- 这会对总数量 的 gpiochip 进行处理,对每个调用
gpiochip_sysfs_register
,文件到了gpiolib-sysfs.c
中 - 调用
device_create_wtih_groups
来创建gpiochip%d
- 此函数对应的参数为
gpio_class
即一个class
类 - 此
class
定义的名称是gpio
, 同时定义了 attr - attr 包括
export - export _store
,unexport - unexport_store
- 前者是属性名,后者是函数
- 也就是
echo
动作为触发export_store
函数 - 此函数 调用
gpio_request
准备引脚 - 再调用
gpiod_export
在此函数中调用device_create_with_groups
来创建gpio%d
,以及其它事项
备注
- 当然这里还有很多细节尚不清楚,只是一个概览,后期再来补充