linux下platform设备驱动框架的实现与作用解析

在网上找了好多资料看,包括宋宝华那本书。都是在讲platform的构成,设备驱动的内容什么的。却没有人专门来讲一下platform框架跟一般驱动之间的关系,以及platform到底用来干什么?


定义为platform的设备,就是定义了一个虚拟总线。同类设备都可以挂在这个总线上。第一,这样总线与设备之间实际是有一个继承的关系,总线的sysfs结点,设备电源管理等都可以继承过来。第二个是隔离BSP和驱动。这些是老生常谈了。


那对于我们编写一个驱动,想要挂到一个platform总线上面去。到底该怎么做?


首先,由于隔离性,一切资源和数据都在BSP里面定义的platform里面,驱动要通过platform_get_resource去获取资源。而数据就通过指针直接获取。在platform里面,资源和数据是两个不同的概念。资源主要是总线占有的一些硬件的设备描述,而数据指的是一些配置信息。两者都在platform_device里面,见下面这个示例。

struct platform_device xxx_device = 
{
	.name= "xxx",
	.id= 0,
	.num_resources= ARRAY_SIZE(xxx_resource),
	.resource =xxx_resource,
	.dev = 
	{
		.platform_data = &xxx_platdata,
	}
};

这里面,xxx_resource是资源,xxx_platdata就是数据。当获取到这些资源和数据之后,就根据资源和数据的内容,对设备进行初始化,存储空间、ioremap之类的。


其次,在原来的驱动外面会再套一层platform驱动结构。里面的驱动实际上变化不大,该是字符还是字符,该是块还是块。如果你没用platform的资源的话连代码都不用改(不过这样其实没啥意义,就是个演示而已)。套platform外壳的过程是:

驱动的初始化xxx_init()的内容会变成platform_driver_register(&xxx_device_driver),结构体如下。

struct platform_driver xxx_device_driver = 
{
	.probe = xxx_probe,
	.remove = __devexit_p(xxx_remove),
	.driver = 
	{
		.name = "xxx",
		.owner = THIS_MODULE,
	}
};
然后register再到xxx_probe()里面去进行原来的初始化工作。这中间xxx_device_driver.driver.name和xxx_device.name会对上,于是这两个结构体就知道彼此是对方的好基友,所以用platform_get_resource才能得到对应的资源。驱动的退出类似。


platform设备的初始化一般是在BSP里面直接显式调用初始化函数,如果自己写的就写成一个模块,只要在初始化函数执行platform_device_register,把设备结构体加到内核就可以了(还没试过)。

platform驱动的初始化就是跟普通驱动一样,或者直接编译进内核,或者insmod。


OK,done。至于platform里面的资源什么的,那就跟具体设备密切相关,该做什么该怎么做,就无法通用描述了。


实例嘛,这里没有,可以去看我转载的那篇文章,或者网上到处都是。不过我可以讲个小故事。

实际上在TI的linux里面,还有更低几层的一个hwmod层。貌似主要针对电源管理外设互联之类的(没仔细看),但是一般的驱动根本不用管,比platform还要低。用户驱动一般都不会调用里面的内容,platform里面倒是会有。这算platform的好处之一,把东西都封装起来了,用户直接拿来用,不用去写代码。


还有更重要的:

为什么要使用platform这么麻烦的架构?

定义成一个platform,好处是驱动跟设备分开。如果移植改设备,则只改BSP,不用管驱动。但是其实设备都不一样了,资源肯定不一样,难道驱动会不需要改?所以这点那还不是关键。


另外一个就是如果不定义成platform,则所有资源和数据都要定义在驱动里面,对于硬件和内核的统一管理极为不便,比如suspend之类的操作。还有就是资源的分配。比如新定义一个platform设备初始化时需要分配资源,可以直接找母设备xxx_devicexxx_device会晓得哪些资源已经使用,如果你再申请同样的资源,会被拒绝!如果是分离的驱动,要实现这点很麻烦。


一句话概括之:platform设备是针对硬件资源的分配,platform驱动是软件对已分配的硬件资源的使用。


这算是研究了这几天的一点初步结果,很难保证全对,欢迎各路高手前来指教。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值