Linux设备驱动的软件架构思想与设备驱动的基础内容总结

Linux设备驱动的软件架构思想与设备驱动的基础内容总结

Linux是一个兼容性特别强的一个系统,而兼容性的实现与驱动强大的适应性密不可分。而这个具体的实现是离不开 总线bus和类class的管理方式。

Linux使用bus统一的管理一系列相似的驱动和设备,而又将具有同一类设备特色的设备利用同一个类class进行管理。 设备驱动模型中,每一种总线的注册函数中都将关于使用此总线进行管理的设备的公共部分进行了封装,而留给了驱动开发者进行一些设备独有的信息的填充接口。

通过总线的管理,驱动只用管驱动,设备只管设备,总线则负责匹配驱动和设备,而驱动则以标准的途径拿取设备的板载信息,这样驱动就可以匹配多个不同的设备了。

关于设备和驱动的匹配,以paltform平台总线为例简单的分析如下:

在驱动的注册函数 platform_driver_register(struct platform_driver *drv)的实现中,驱动框架为我完成了一部分通用的程序操作。 将与驱动相关的一些信息进行了填充,对回调函数进行了赋值,最后注册了驱动:

Ret=platform_driver_register(&sunxi_keyboard_driver)               
#define platform_driver_register(drv) __platform_driver_register(drv, THIS_MODULE)
int __platform_driver_register(struct platform_driver *drv,struct module *owner)
{
	drv->driver.owner = owner;
	drv->driver.bus = &platform_bus_type;
	drv->driver.probe = platform_drv_probe;
	drv->driver.remove = platform_drv_remove;
	drv->driver.shutdown = platform_drv_shutdown;

	return driver_register(&drv->driver);
}

Device_driver 和device分别表示驱动和设备,两者只有依附于同一个总线才能一起工作,因此都会包含一个 struct bus_type 结构体类型变量。在驱动和设备分别注册时他们互相并不知道对方的存在,各自涌向内核,然后寻找自己的另一半,最终通过 match 回调函数进行匹配捆绑,匹配的方式有多种,包括:设备树分风格匹配、ACPI风格匹配、匹配ID表、name匹配。

struct bus_type platform_bus_type = {
		.name		= "platform",
		.dev_groups	= platform_dev_groups,
		.match		= platform_match,
		.uevent		= platform_uevent,
		.pm		= &platform_dev_pm_ops,
};

一旦匹配成功 sunxi_keyboard_driver 中的probe 回调函数就会被执行。

以platform平台设备总线为例引入设备总线的好处:
1.隔离BSP和驱动,在BSP中定义platform设备信息、设备使用到的资源、以及设备的配合信息,而在驱动中只需要使用固定的接口函数进行资源和数据的获取,做到了驱动和设备的分离,使得驱动具有更好的扩展性。
2.适配更灵活,同一个驱动,可以通过改变不同的 platform_device 结构体变量,实现多份硬件的适配。

你可能感兴趣的:(驱动开发)