电商网站建设设计报告总结,wordpress需注册访问,商业空间设计网站大全,怎样查看网站是用什么cms_做的本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合#xff0c;就是根据不同的外设寻找各自的外设信息#xff0c;我们知道一个完整的开发板有 CPU 和各种控制器#xff08;如 I2C 控制器、SPI 控制器、DMA 控制器等#xff09;#xff0…本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合就是根据不同的外设寻找各自的外设信息我们知道一个完整的开发板有 CPU 和各种控制器如 I2C 控制器、SPI 控制器、DMA 控制器等CPU和控制器可以统称为 SOC除此之外还有各种外设 IP如 LCD、HDMI、SD、CAMERA 等如下图我们看到一个开发板上有很多的设备这些设备是如何一层一层展开的呢设备和驱动又是如何绑定的呢我们带着这些疑问进入本节的主题。各级设备的展开内核启动的时候是一层一层展开地去寻找设备设备树之所以叫设备树也是因为设备在内核中的结构就像树一样从根部一层一层的向外展开为了更形象的理解来看一张图大的圆圈中就是我们常说的 soc里面包括 CPU 和各种控制器 A、B、I2C、SPIsoc 外面接了外设 E 和 F。IP 外设有具体的总线如 I2C 总线、SPI 总线对应的 I2C 设备和 SPI 设备就挂在各自的总线上但是在 soc 内部只有系统总线是没有具体总线的。第一节中讲了总线、设备和驱动模型的原理即任何驱动都是通过对应的总线和设备发生联系的故虽然 soc 内部没有具体的总线但是内核通过 platform 这条虚拟总线把控制器一个一个找到一样遵循了内核高内聚、低耦合的设计理念。下面我们按照 platform 设备、i2c 设备、spi 设备的顺序探究设备是如何一层一层展开的。展开 platform 设备上图中可以看到红色字体标注的 simple-bus这些就是连接各类控制器的总线在内核里即为 platform 总线挂载的设备为 platform 设备。下面看下 platform 设备是如何展开的。还记得上一节讲到在内核初始化的时候有一个叫做 init_machine() 的回调函数吗如果你在板级文件里注册了这个函数那么在系统启动的时候这个函数会被调用如果没有定义则会通过调用 of_platform_populate() 来展开挂在“simple-bus”下的设备如图分别位于 kernel/arch/arm/kernel/setup.ckernel/drivers/of/platform.c这样就把 simple-bus 下面的节点一个一个的展开为 platform 设备。资料直通车最新Linux内核源码资料文档视频资料内核学习地址Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈展开 i2c 设备有经验的小伙伴知道在写 i2c 控制器的时候肯定会调用 i2c_register_adapter() 函数该函数的实现如下kernel/drivers/i2c/i2c-core.c注册函数的最后有一个函数 of_i2c_register_devices(adap)实现如下of_i2c_register_devices()函数中会遍历控制器下的节点然后通过of_i2c_register_device()函数把 i2c 控制器下的设备注册进去。展开 spi 设备spi 设备的注册和 i2c 设备一样在 spi 控制器下遍历 spi 节点下的设备然后通过相应的注册函数进行注册只是和 i2c 注册的 api 接口不一样下面看一下具体的代码kernel/drivers/spi/spi.c)当通过 spi_register_master 注册 spi 控制器的时候会通过 of_register_spi_devices 来遍历 spi 总线下的设备从而注册。这样就完成了spi设备的注册。各级设备的展开学到这里相信应该了解设备的硬件信息是从设备树里获取的如寄存器地址、中断号、时钟等等。接下来我们一起看下这些信息在设备树里是怎么记录的为下一节动手定制开发板做好准备。reg 寄存器我们先看设备树里的 soc 描述信息红色标注的代表着寄存器地址用几个数据量来表述绿色标注的代表着寄存器空间大小用几个数据量来表述。图中的含义是中断控制器的基地址是 0xfec00000空间大小是 0x1000。如果 address-cells 的值是 2 的话表示需要两个数量级来表示基地址比如寄存器是 64 位的话就需要两个数量级来表示每个代表着 32 位的数。ranges 取值范围ranges 代表了 local 地址向 parent 地址的转换如果 ranges 为空的话代表着与 cpu 是 1:1 的映射关系如果没有 range 的话表示不是内存区域。