日期:2014-05-16  浏览次数:20680 次

platfrom驱动问题集!!!求高手一一化解
大家好啊!小弟最近在学习驱动!有几个问题请教大家!
1. 我添加了平台platfrom_device和资源(系统会自动帮我注册吧,也就注册平台设备的意思 ) ,但是为什么还要在platfrom_driver里面的probe函数中注册该设备呢?

2.在probe中获得了资源结构体resource,但是资源怎么用呢?

3.在总线设备模型中注册的struct device为什么没有像platfrom_device里面的资源结构体呢?难道不要用资源?



------解决方案--------------------
1 同一bus上的 device 和 driver 匹配后,执行driver里的probe做初始化。probe里不会再注册这个device。
2、程序员根据具体需要提取resource。resource都是程序员自己放进去的,自己知道放进去什么resource,怎么就不知道自己需要用什么了呢。
3、platfrom_device包含struct device,就像面向对象编程里的继承一样
------解决方案--------------------
platform_driver的probe函数就是用来注册rtc字符设备的。要不,用它来何用。
rtc_device_register--> device_register(&rtc->dev)/rtc_dev_add_device(rtc)
也可以这么理解:ds1511不仅是platform总线上的一个Platform设备,也是一个(rtc class)设备。
------解决方案--------------------
多看看内核源码中的例子啥都知道了
------解决方案--------------------
platform_device相当于一个配置,告诉系统有哪些设备,这些设备有哪些配置
而后来在probe里注册的device是注册了一个文件接口,这个文件接口可以提供具体的调用,系统可以通过这个文件接口调用设备的功能。
至于为什么这样,我觉得应该是platform_device是一个通用的部分,所有的设备都需要通过这个统一的形式告诉系统有哪些设备需要使用。因为系统中可能有很多很多各种各样的设备,而且还要考虑驱动程序的可移植性。如果在platform_device中就将device全部弄好,那如果移植一个设备的话,需要做的移植工作会非常多。所以我觉得platform_device就像是一个框架,系统在启动的时候先把这个框架搭好,然后等着具体的driver去匹配、去填充。等匹配成功了,设备驱动会自己生成一个device,这个device提供具体的功能接口以被系统调用。
而class的存在是为了简化编程,同样也可以对整个系统中的设备进行比较好的分层。注册了一个class也就拥有了这个class所有的接口,也就是说注册到这个class的设备都应该有这些通用的接口,如果驱动需要自己添加一些特别的接口也可以注册一些属于自己的属性。
------解决方案--------------------
LDD说的很清楚了,设备模型的好处,我列举两条:
1, 电源管理
比如设备要省电,内核怎么统一通知你的注册的字符设备? 但要是有了设备模型,如这里的platform子系统,platform总线上有个devices 链表,只要遍历这个链表就可以通知所有的设备了!
2, 热插拔
如果设备不是系统启动之前就挂上的! 字符设备的注册是建立在设备已经存在的情况下!字符设备要怎么处理? 但要有了platform子系统,当有设备热插入的时候,先是总线匹配到platform总线,然后调用总线的probe动态的建立platform_device, 到这里为止,设备已经是一个platfrom设备了,他由paltform子系统统一管理,但在此例中设备还是一个rtc设备,所以又有了以下动作: 然后在调用paltform的match去匹配driver, 也就是你这个ds1511 driver, 然后调用ds1511 driver 的probe 也就是 ds1511_rtc_probe! 然后在再次把设备注册成rtc设备!由rtc子系统统一管理!其实这里你也可以不注册成rtc设备,而直接注册成一个字符设备也是可行的,但你终究要用到paltfrom系统的热插拔机制,系统才能完成此字符设备的注册!