设备驱动模型的传参源码分析--Apple的学习笔记

一,前言

我喜欢用ftrace来查看调关系。当然设备和驱动通过总线来匹配这个函数调用是比较熟悉了,但是传递的函数参数我一般没有太关心,反正都是从设备树或者driver的数组中灌入的数据。于是完成了i2c设备eeprom的驱动后,我再分析下5.4内核源码。

二,bus_foreach_dev

此函数就是在总线上遍历匹配的,其中传递的参数device * 从哪里来呢。通过5.4kernel源码搜索bus->p->klist_devices搜索到添加节点到链表中的函数为klist_add_tail,此函数位于bus_add_device中并且为device_add调用。

三,klist_add_tail

此函数中传递的参数dev->p->knode_bus又是从哪里来的呢?后来找了一圈发现,我不应该问从哪里来的,这就是个设备的私有链表和节点通过链表挂载的一种方法。参考linux内核之klist链表,因为通过万能的container_of就可以找到驱动设备。kobject+keset是最底层的数据结构派生出了device和driver结构体,继续有派生出platform_device,但是我之前我忽略了dtb通过device_node转换成了platform_device这个关键内容。我做了简单的调试,把参数的来源和指针的调用关系再看清楚些,好了,我今天的阶段性驱动模型理论回顾完成咯~

image.png

关于device_node转换成platform_device,参考网址如下
1.内核对设备树的处理(四)__device_node转换为platform_device
2.调用of_platform_populate函数创建platform device
3.论dts中的of_platform_populate如何选择性加载device node为platform device

你可能感兴趣的:(设备驱动模型的传参源码分析--Apple的学习笔记)