设备驱动模型的需求
总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。
举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。
其实这就是软件工程强调的高内聚、低耦合概念。
所谓高内聚低耦合是模块内各元素联系越紧密就代表内聚性就越高,模块间联系越不紧密就代表耦合性低。
所以高内聚、低耦合强调的就是内部要紧紧抱团。设备和驱动就是基于这种模型去实现彼此隔离不相干的。
这里,有的读者就要问了,高内聚、低耦合的软件模型理解,可设备和驱动为什么要采用这种模型呢?没错,好问题。
下面进入今天的话题——总线、设备和驱动模型的探究。
举个例子
设想一个叫 GITCHAT 的网卡,它需要接在 CPU 的内部总线上,需要地址总线、数据总线和控制总线,以及中断 pin 脚等。

那么在 GITCHAT 的驱动里需要定义 GITCHAT 的基地址、中断号等信息。假设 GITCHAT 的地址为0x0001,中断号是 2,那么:
#define GITCHAT_BASE 0x0001
#define GITCHAT_INTERRUPT 2
int gitchat_send()
{
writel(GITCHAT_BASE + REG, 1);
...
}
int gitchat_init()
{
request_init(GITCHAT_INTERRUPT, ...);
...
}
但是世界上的板子千千万,有三星、华为、飞思卡尔……每个板子的信息也都不一样,站在驱动的角度看,当每次重新换板子的时候,GITCHAT_BASE 和 GITCHAT_INTERRUPT 就不再一样,那驱动代码也要随之改变。
这样的话一万个开发板要写一万个驱动了,这就是文章刚开始提到的高内聚、低耦合的应用场景。
驱动想以不变应万变的姿态适配各种设备连接的话就要实现设备驱动模型。
基本上我们可以认为驱动不会因为 CPU 的改变而改变,所以它应该是跨平台的。
自然像 “#define GITCHAT_BASE 0x0001,#define GITCHAT_INTERRUPT 2” 这样描述和 CPU 相关信息的代码不应该出现在驱动里。

最低0.47元/天 解锁文章
457

被折叠的 条评论
为什么被折叠?



