來自精通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()初始化好之,註冊其需要佔用的資源。