来自精通Linux设备驱动程序开发:平台设备驱动中的平台可看做一种伪总线,通常用于将集成进片上系统的轻量级设备和Linux设备模型连接在一起。平台由平台设备和平台设备驱动程序组成。
(来自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=862226&PostID=21247170)
设备驱动中,平台设备作为一个虚拟的设备和总线可以大大简化设计难度。
内核在初始化过程中,首先初始化虚拟总线,其次将设备添加到虚拟总线上,最后注册设备驱动,它会扫描虚拟总线寻找与之匹配的设备(如果设备名相符,就进行探测,探测成功后进行绑定)
probe函数一般完成硬件设备使能, struct resource的获取以及虚拟地址的动态映射和具体类型设备的注册(因为平台设备只是一种虚拟的设备类型);remove函数与之相反。
只要和内核本身运行依赖性不大的外围设备 ( 换句话说只要不在内核运行所需的一个最小系统之内的设备 ), 相对独立的 , 拥有各自独自的资源 (addresses and IRQs) ,都可以用 platform_driver 实现。
在开发过程中内核版本的不同对于平台设备驱动注册方式也有不同的表示方法。
如2.6.14.1中的注册和注销 如2.6.26.1中的注册和注销
static int __init s3c2410_rtc_init(void) static int __init s3c2410_rtc_init(void)
{ {
return driver_register(&s3c2410_rtcdrv); return platform_driver_register(&s3c2410_rtcdrv);
} }
static void __exit s3c2410_rtc_exit(void) static void __exit s3c2410_rtc_exit(void)
{ {
driver_unregister(&s3c2410_rtcdrv); platform_driver_unregister(&s3c2410_rtcdrv);
} }
如2.6.14.1中 如2.6.26.1中
static struct device_driver s3c2410_rtcdrv={ static struct platform_driver s3c2410_rtcdrv = {
.name = "s3c2410-rtc", .probe = s3c2410_rtc_probe,
.owner = THIS_MODULE, .remove = s3c2410_rtc_remove,
.bus = &platform_bus_type, .suspend = s3c2410_rtc_suspend,
.probe = s3c2410_rtc_probe, .resume = s3c2410_rtc_resume,
.remove = s3c2410_rtc_remove, .driver = {
.suspend = s3c2410_rtc_suspend, .name = "s3c2410-rtc",
.resume = s3c2410_rtc_resume, .owner = THIS_MODULE,}
}; };
来自:http://yuxu9710108.blog.163.com/blog/static/23751534201111805633259/ 平台设备,平台驱动间及资源间的关系
平台设备:platform_device{}用于定义好该SOC芯片上所用的各个设备所需要占用的资源
然后platform_add_devices()初始化好之,注册其需要占用的资源。