字符设备和块设备的区别:
两种类型的设备的根本区别在于它们是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。
所有芯片的引脚顺序都是逆时针排列的。
运算符优先级++大于*。
sys/bus/plantform/drivers:该路径下的文件节点,是在对应的驱动代码里创建实现。
sys/bus/plantform/devices:该路径下的文件节点,是在对应的设备树里创建实现。
MTD(memory technology device 存储 技术设备 ) 是用于访问 memory 设备( ROM 、 flash )的 Linux 的子系统。
存储器分区即可以实现对不同的分区使用不同的文件系统。这就是分区与文件系统的关系。
BUS、Driver、Device
总线中既定义了设备,也定义了驱动;设备中既有总线,也有驱动;驱动中既有总线也有设备相关的信息。那这三个的关系到底是什么呢?
三者的关系是:
内核要求每次出现一个设备,就要向总线汇报,会着说注册;每次出现一个驱动,也要向总线汇报,或者叫注册。比如系统初始化时,会扫描连接了哪些设备,并为每一个设备建立一个struct device变量,并为每一个驱动程序准备一个struct device_driver结构的变量。把这些量变量加入相应的链表,形成一条设备链表和一条驱动量表。这样,总线就能通过总线找到每一个设备和每一个驱动程序。
当一个struct device诞生,总线就会去driver链表找设备对应的驱动程序。如果找到就执行设备的驱动程序,否则就等待。反之亦然。
platform总线提供了设备和驱动的mach函数,当设备和驱动匹配完成后,就会执行驱动的probe函数。
linux内核中分别用struct bus_type,struct device和struct device_driver来描述总线、设备和驱动。
__pci_register_driver函数中,调用driver_register,在总线上注册驱动;
driver_register中调用bus_add_driver,将设备驱动添加到总线上。
将驱动程序追加到总线上之后,现在开始将设备与驱动进行匹配。
driver_match_device函数就是用来为driver匹配device的,调用device_driver中注册的match函数来进行匹配。
match函数,它的两个参数一个是驱动,另一个则是设备。这个函数就是用来进行判断,总线上的驱动程序能不能处理设备的。
probe函数在设备驱动注册最后收尾工作,当设备的device 和其对应的driver 在总线上完成配对之后,系统就调用 platform设备的probe函数完成驱动注册最后工作。资源、 中断调用函数以及其他相关工作。
在linux内核中,所有设备的驱动的定义,都是以struct device_driver为基类,进行继承与扩展的。内核当中使用了很多OO的思想。
基本上,在ARM Linux在,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。
中断:
interrupts = <中断类型 中断号 中断方式>。
中断控制器的功能是:把外设的中断信号,转换成CPU能够明白的vector,并完成中断执行控制,确保在合适的时机把中断提交给CPU执行。
硬件封装层->中断流控层->中断通用逻辑层->驱动程序API层。
/proc/interrupts:文件
/proc/irq:子目录
读取interrupts会依次显示irq编号,每个cpu对该irq的处理次数,中断控制器的名字,对应的gpio号,中断触发方式,以及驱动程序注册该irq时使用的名字。



