linux内核虽然完全由c语言编写,但却频繁用到面向对象的分层设计思想。在设备驱动方面,往往为同类的设备设计一个框架,框架的核心层实现了通用操作,如果具体设备需要具体操作,可以进行重载。
1.重载的一般实现:
int core_func(struct xxx_dev *dev,...){
if(dev->func)
return dev->func(...);
/*核心层的实现*/
}
首先检查是否在底层设备驱动中重载了该函数,如果重载了就调用具体设备的具体实现,否则按核心层代码功能实现。
2.简化驱动程序
return_type core_func(xxx_dev *dev,...){
//通用代码A
底层操作1:dev->func_ops1
//通用代码B
底层操作2:dev->func_ops2
//通用代码C
底层草组3:dev->func_ops3
}
这样就免去了通用的代码,只需要实现具体设备的操作
linux驱动中,一般把通用的驱动部分放在core层中,底层不能通用的部分则划分为设备驱动,所以设备的驱动也是要联合core层才是一个完整的驱动,只是linux内核里面已经有了core层通用的设备,编写驱动时只需要编写不通用的部分。
分层化设计在linux的input、RTC、MTD、I2C、SPI、TTY、USB等诸多设备驱动类型中广泛应用。