第1节 Linux设备驱动
设备驱动:驱使硬件设备按照指令行动
Linux一切都是文件
- 字符设备:/dev/存放设备所对应的文件。通过文件操作字符设备,/dev/目录下每一个文件对应一个硬件设备,Linux通过文件来访问硬件,而不是在无操作系统的情况下访问接口。eg.lcd、串口、触摸屏都是文件,这些文件都在dev下面。
tty 终端设备(串口也属于tty),新打开两个窗口输入tty,返回/dev/pts/6和/dev/pts/7 - 块设备:/sda/ /sda1/ /sda2/ /sdb/ ...磁盘上的分区,通过mount命令访问ext
- 网络设备:唯一一个不体现一切都是文件。eg.网卡驱动/dev/下找不到
设备驱动模型
- 总线:设备和驱动挂载的总线,做关键动作,匹配驱动和设备。
- 设备:每一个设备在注册的时候会寻找匹配的驱动。
- 驱动:每一个驱动在注册的时候会寻找匹配的设备。
总线的驱动、设备的驱动、设备的注册三个不同的组成部分。
probe函数执行的前提是驱动匹配到了一个设备,总线做这个匹配,匹配的原则每一种总线都不一样。
eg.系统注册了一个A设备,然后加载了一个A驱动,这个设备和驱动都叫A,因为它们都挂载在platform总线上。
总线匹配后,驱动进入到运行周期,可以在板级包里丢任何一行代码,但驱动不需要改动,移植不用改动驱动,改了叫“破坏”。
Linux中有一个抽象基类叫Kobject,kernel对象都继承自kobject。虽然Linux内核是汇编C语言写的,但是处处都体现了面向对象(有继承、重载、多态存在)的思想,如文件系统的结构,设备驱动的模型。
Linux内核用同样的一份源代码支持了20多种体系结构(支持X86、ARM、powerPC、Platform等),又支持了同意体系结构的几百种芯片,同样的ARM结构的芯片有很多的电路板。
同一个芯片在不同的电路上有不同的源代码是错误的。
因为继承kobject,所以总线、设备、驱动在注册的时候都会产生kobject事件。
主机驱动与client驱动分离
驱动和设备要分离,驱动和驱动要分离。
- I2C adapter和I2C client分离
- SPI adapter(总线驱动)和SPI client(设备驱动)
在I2C的触摸屏上去访问I2C触摸屏时不再需要去访问I2C controller,只是调用一个通用的I2C interface,这个interface通过I2C controller去实现I2C message收发,I2C看不到任何一行和I2C controller相关的代码,所以触摸屏可以放到其他地方。
驱动和驱动要分离:假如有A个adapter驱动,B个外设驱动,如果不进行分离,需要A*B份代码,分离只需要A+B份代码。