第1节 Linux设备驱动

设备驱动:驱使硬件设备按照指令行动

Linux一切都是文件

  • 字符设备:/dev/存放设备所对应的文件。通过文件操作字符设备,/dev/目录下每一个文件对应一个硬件设备,Linux通过文件来访问硬件,而不是在无操作系统的情况下访问接口。eg.lcd、串口、触摸屏都是文件,这些文件都在dev下面。
    tty 终端设备(串口也属于tty),新打开两个窗口输入tty,返回/dev/pts/6和/dev/pts/7
    在/dev/pts/7中输入echo "hello" > /dev/pts/6,/dev/pts/6终端有hello出现
  • 块设备:/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份代码。

 

posted on 2022-04-15 15:37  Misko  阅读(89)  评论(0编辑  收藏  举报