Linux Driver
1.Device, Driver
a.设备是用来完成特定动作的;
b.驱动是告诉处理器,“你只能用我提供的方法来操作我”;
c.App就是控制处理器,通过驱动的方法完成一系列动作,以完成特定的任务;
2.Bus
a.总线,是处理器与外设传输数据的通道,硬件上外设都是通过总线连接到CPU的,软件也抽象出这一个概念;
b.Device和Driver都是存在于Bus下面,device_register,driver_register实质都是通过bus_add_device,bus_add_driver来实现(/sys/bus目录下面的子目录都会包含devices, drivers文件夹);
c.提供match方法,用于device或者driver的绑定匹配;
当新设备,或者新驱动注册时,就会触发这个绑定匹配的过程。
2.Class
a.Class的出现是为了把具有相同接口和语义(属性)的设备等归类;驱动和设备绑定成功后,设备和驱动都会自动注册到它所属的class中。
3.Platform
先谈Platform device,一般指CPU(SOC)中的各种控制器等;所以platform用来把CPU内部的所有总线连接统一抽象;
然后看了几篇文章画的图,I2C总线虽然物理上是Platform的device提供的,在platform中可以找到i2c控制器的驱动和设备,但值得注意的是在/sys/bus中的拓扑图中I2C总线与Platform总线是平行对等独立的关系;
5.Device tree
出现的背景故事:请参见http://www.wowotech.net/device_model/why-dt.html这篇文章。
6.Device resource management
相关函数
platform_get_resouce
说明:获取寄存器资源
芯片资源一般在特殊的文件中统一定义,通过name匹配要找的资源
相关函数
devm_ioremap_resource, 首先看到devm代表该资源不需要手动释放,当驱动卸载时,kernel会自动回收。
为啥跟ioremap扯上关系,请参考这篇文章
https://blog.csdn.net/qq_16777851/article/details/82975057
里面有如下一段话:
“一般来说,在系统运行时,外设的I/O资源的物理地址是已知的,有硬件决定,查看手册即可知道。但是CPU通常并没有为这些已知的外设I/O的物理地址分配虚拟地址,所以驱动程序并不能直接通过物理地址来访问I/O的地址资源,而必须将它们映射到核心虚拟地址空间(通过页表),然后才能根据映射所得到的核心虚拟地址范围,通过访问指令来访问这些I/O内存资源。linux中在io.h头文件中申明了函数ioremap(),用来将I/O内存资源的物理地址映射到核心的虚拟地址空间。”
参考文章
http://www.wowotech.net/linux_kenrel/device_resource_management.html
Linux字符设备驱动file_operations
app通过open函数获取设备fd以read/write等操作设备,驱动中通过inode的设备号(i_rdev)来选择最终的设备(如果该驱动对应多个设备的情况,如spidev)。
但open的参数一般是包含路径的设备文件(如/dev/spidev1.0),file_operations->open的参数是struct inode(参数输入)和struct file(参数输出,保存private_data),猜测在open调用后,在file_operations->open前,以将设备文件转换wei设备号了(i_rdev)。
https://www.cnblogs.com/chen-farsight/p/6181341.html