声明
以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。
本节目标
- 了解Linux总线、设备、驱动是什么
基本知识
一般的设备:接入设备 -> 注册设备 -> 注册驱动
热插拔设备:注册驱动 -> 接入设备 -> 注册设备
查看命令
#总线(i2c,spi,platform)
ls /sys/bus/
# 设备号
cat /proc/devices
# 杂项设备号
cat /proc/misc
简述
Linux的设备模型是用总线(bus)、设备(device)和驱动(driver)来描述的。所有的设备和对应的驱动都必须挂载在某一个总线上。
总线
以下是引用:
在Linux设备模型中,Bus(总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道。为了方便设备模型的实现,内核规定,系统中的每个设备都要连接在一个Bus上,这个Bus可以是一个内部Bus、虚拟Bus或者Platform Bus。
我们重点学习的一个总线,就是platform bus(虚拟总线),芯片包含的东西再多,也要外接各种各样的设备,为了安置他们就有了虚拟总线,因为设备都要挂载在总线上,那些外接的、不好安置的,都注册到platform虚拟总线都行。
设备
问:我们如何分辨设备?答:设备号
每个设备都要给他分配一个设备号,这样我们才能知道谁是谁。
问:万一设备有很多,岂不是杂乱无章?答:分主、次设备号
我们去超市买东西,能准确找到东西是因为分类,我们首先要找到同一类东西在哪,再到那里去找我们要的东西。
设备也是同理。设备先分类,一类设备一个设备号,我们叫他主设备号。这一类设备里我们再具体到每个具体的设备,分配一个次设备号。(后面会讲,设备号是dev_t类型,高12位用来表示主设备号,低20位用来表示次设备号)
主、次设备号这些都是可以自己定义的,但不是没有限制,linux的主设备号一共有256个(0-255),一些常用设备,Linux固定了一些主设备号。比如主设备号10固定是用于杂项设备等等。
具体流程
简述一下,以后有心得了再补充。
这些内容看看就好,有点概念即可。具体的函数以后会慢慢讲。
设备、驱动挂载在总线上是核心思想。一般情况下,我们先注册设备,再注册驱动。
注册设备时我们会用到一个结构体platform_device,注册驱动的结构体是platform_driver,里面都包含了例如name和id这样的成员变量。
当你注册驱动的时候,系统会通过驱动的name在总线里面查找、匹配一个同name的设备。当你注册设备的时候,系统也会去匹配驱动。如果没有,则匹配失败,告辞。如果有,则匹配成功,然后会调用驱动里的probe()函数进行注册驱动。
大致就是这么个流程。
看到的几个具体讲解platform的链接,分享一下
【设备注册与驱动注册概念讲解】
https://blog.csdn.net/coolwriter/article/details/78011946
【驱动注册函数讲解】
https://blog.csdn.net/ufo714/article/details/8595021