linux中platform與中斷
學習總結:
在linux2.6中引入platform的概念,包括platform_device與platform_driver結構。每個裝置的資源(地址、中斷號等)在platform_device中的resource中描述,resource結構在kernel/include/linux/ioport.h定義,resource資源一般都位於/arch/arm/mach-xxx中定義。開發裝置驅動時,不但註冊platform_device裝置,還要註冊platform_driver驅動。platform_device與platform_driver結構體中都有name成員,兩個結構體的name成員必須匹配。驅動程式註冊時找到與其name相同的platform_device後,呼叫其結構中的probe()函式進行相關初始化,probe()函式通過platform_get_resource()獲取platform_device中的resource資源資訊。在probe()可以進行字元裝置的註冊,包括file_optations成員的實現。從resource中可以通過platform_get_irq()獲取其中資源的中斷號(看具體定義是硬中斷號還是軟中斷號),從而可以呼叫request irq()進行中斷請求。在linux2.6之後,核心始祖Linus Torvalds發現核心充斥大量板級的垃圾程式碼而震怒,arm社群於是借鑑PowerPC引入裝置樹。將板級資訊用裝置樹表示,通過uboot的解析之後傳給linux核心。裝置樹描述了所有的板級資訊,由platform_device與resource結構定義的一些實體都不再需要,核心會根據裝置樹的資訊利用函式of_platform_bus_probe自動展開為驅動程式probe()函式的platform_device結構的入參,這樣在probe()中就可以用platform_get_resource()獲取資源。在進行中斷註冊時會與原來不同,沒用裝置樹時從resource讀出的中斷號為軟中斷號,採用裝置樹時中斷號為硬體中斷號,這是需要利用irq_of_parse_and_map()進行動態分配軟中斷號,再利用request irq()進行中斷請求。