9.6.platform_driver_register是怎么进行驱动注册的?
设备树需要uboot传递给内核,参考设备树专题的视频,大体的流程是uboot把设备树编译成的.dtb文件的地址传递给内核,内核提取.dtb的根节点的compatible属性来匹配machine_desc,解析chosen节点、memory节点、#address-cells和#size-cells属性,为设备树分配内存。再去遍历整个.dts文件的节点将其转换成device_nodes并将properties填充到各个nodes,最终构建出device-tree。再根据compatible的转换规定将某些device_nodes转化成platform_devices,而不能转化成device_nodes的节点内核提供专门的处理函数。到这里设备树到内核的转换过程已经清楚了,回到leddrv.c中。先沿着leddrv.c的执行过程一路看下去。
下午看了2篇连续的博客,写的很好!但是看的很是晕乎!自己把函数调用过程过了一遍就清楚了,整理出来一张执行过程。
有篇博文写的很好记录下:https://blog.csdn.net/Richard_LiuJH/article/details/45825333
上图也解决了问题7_probe函数的形参是谁给的?
9.7.gpiod_get函数是怎么找到设备树中的led节点?
在probe函数中主要做了4件事:
a.从leds_my节点中获取led-gpios属性;
b.注册file_operations结构体,创建主设备;
c.创建设备类;
d.创建次设备;
目前有1个相关文档:Linux-4.9.88-Docs-gpio-consumer.txt,依次看下程序是如何执行的?先追踪下gpiod_get()的执行过程:
gpiod_get()
--->gpiod_get_index()
----->of_find_gpio()
------->of_get_named_gpiod_flags()
--------->of_parse_phandle_with_args()
--------->of_find_gpiochip_by_xlate()