?

Linux platform驅動架構的解析與應用

2013-09-19 08:53波,高子,項陽,于
大連工業大學學報 2013年1期
關鍵詞:驅動程序內核調用

趙 波,高 真 香 子,項 伯 陽,于 忠 得

(1.大連工業大學 信息科學與工程學院,遼寧 大連 116034;2.大連交通大學 電氣信息學院,遼寧 大連 116028)

0 引 言

為統一管理Linux中的所有設備,Linux開發了設備模型。Linux設備模型可描述為:總線—設備—驅動程序編程接口,內核設備支持被清晰地結構化為總線、設備和驅動程序[1]。platform驅動架構是Linux設備模型中的重要組成部分,用于片上系統的外圍設備控制器驅動的實現。隨著片上系統(SOC)的集成度越來越高,越來越多的外圍設備控制器被集成進SOC,現有的驅動程序已無法滿足使用需求,研究platform驅動架構有利于這些設備驅動的改寫、維護與擴展,本文實現了基于platform驅動架構的LCD驅動。

1 platform驅動架構

Linux設備模型,實質上就是系統地管理Linux中所有設備,將設備間的層次關系抽象出來。內核設備驅動模型按層次可劃分為總線、設備、驅動三層架構,其基本關系可簡要概括為[2]:

(1)驅動核心可以注冊多種類型的總線;

(2)每種總線下面可以掛載許多設備(通過kset devices);

(3)每種總線下可以使用多種設備驅動(通過包含一個kset drivers);

(4)每個驅動可以處理一組設備。

平臺設備(platform)驅動架構的實現,是在Linux設備模型的基礎上,通過對總線、設備、驅動3個概念的再定義而實現的[3],在Linux內核中,這3個概念通過platform總線、platform_device(platform設備)、platform_driver(platform驅動)3個部分實現。

1.1 platform總線

Linux操作系統中,platform總線負責將platform驅動架構注冊進系統內核,在內核識別platform總線之后,才能進行platform設備、platform驅動的識別與自動匹配,所以,platform總線應該在系統上電后自動啟動。platform總線的生成與注冊過程如圖1所示。

圖1 platform總線的生成與注冊過程Fig.1 Platform bus formation and registration process

在系統上電后,Linux內核會自動運行/init/main.c程序,完成一些基本啟動配置,然后調用/drivers/base/init.c文件中的driver_init()函數,進行內核驅動機制初始化,其中就會通過調用/drivers/base/platform.c文件的 device_register()函數,將platform總線與platform驅動架構注冊進Linux內核。其中,platform總線作為設備的一種,通過platform_bus結構體表示;platform驅動架構通過platform_bus_type結構體來實現,這兩個結構體均在platform.c中被定義為全局對象。

1.2 platform設備

platform設備主要包括LCD、串口等可以被CPU總線直接尋址的集成于片上系統(SOC)的外圍設備控制器等[4]。Linux內核中,platform設備通過platform_device結構體實現,代碼路徑:/include/linux/platform_device.h,具體定義如下:

其中,設備名稱name是platform設備與platform驅動自動匹配的關鍵,只有name值相同時,platform設備與platform驅動才能匹配上。

Linux系統中,通過結構體的互相包含方式,實現了面向對象思想的繼承。在platform設備結構體中,就包含了struct device結構體,實現了對Linux中設備概念(struct device)的繼承。在struct device dev中dev->platform_data與dev->driver_data是兩個void型變量,可用于存儲具體設備的硬件信息、驅動信息等,如LCD的分辨率、刷新率等,可定義一個FS2410_fb_mach_info結構,記錄LCD的硬件信息(屏幕尺寸、屏幕信息、LCD配置寄存器)等,并將該結構體賦值給platform_device中的dev->platform_data。

*resource是具體設備的資源,如中斷號IRQ、地址資源等。通過platform_device_register()可以自動將platform_device結構體(硬件配置信息)注冊進內核空間。

platform設備必須在platform驅動之前注冊入內核空間,否則無法自動匹配。

1.3 platform驅動

platform驅動完全遵照設備驅動模型的約定[3],通過platform_driver_register()函數完成platform_driver的注冊,platform驅動的封裝結構體為 platform_driver,代碼路徑為:/include/linux/platform_device.h,具體定義如下:struct device_driver driver,實現了對 device_driver的繼承,為具體的platform驅動提供了統一內核接口;同時,提供了(*suspend)、(*resume)等函數指針,可用于休眠、喚醒等智能電源管理功能。在具體應用中,只需驅動開發人員實現設備底層功能函數,同時將功能函數填充platform_driver結構體的接口中,就可以由Linux內核自動進行platform驅動的管理,大大減輕了工作難度與強度。

對于platform_driver的注冊,可以通過調用platform_driver_register(&platform_driver)來實現,其主要涉及的數據流程參見圖2。

圖2 注冊platform驅動的內核數據流程Fig.2 Kernel data flow of Platform driver register

在platform驅動的注冊過程中,會在_driver_attach()中通過調用driver_match_device(drv,dev)來匹配platform設備中name與platform驅動中的name值,如果相同,platform設備與platform驅動就綁定成功,底層的設備就可以正常地運行。

2 采用platform驅動架構的LCD驅動實現

本研究以優龍FS2410開發板為硬件平臺,Linux 2.6.31為內核版本,外接8寸夏普LCD顯示屏,采用Platform驅動架構的LCD驅動實現。在FS2410中,LCDC(LCD控制器)是集成于SOC的外圍設備控制器,被CPU總線直接尋址,按照platform驅動架構的一般步驟,有四個環節:定義platform 設備(platform_device)、注冊platform設備、定義platform驅動(platform_driver)、注冊platform驅動,同時必須保證platform設備在platform驅動之前注冊進內核空間。

2.1 定義platform設備

代碼路徑:/arch/arm/plat-s3c24xx/Devs.c。

在Devs.c統一定義了S3C24xx架構的platform_device,在這個文件里,可定義

在同文件的如下程序中定義了Lcdc所持有的資源(CPU尋址地址、IRQ中斷號)。

同時,定義一個FS2410fb_mach_info結構體,記錄LCD的屏幕信息、分辨率、LCD配置寄存器等信息,并填充到platform_device的dev->platform_data中,供內核空間調用。

2.2 注冊platform設備

代碼路徑:/arch/arm/mach-s3c2410/mach_smdk2410.c。

在 mach-smdk2410.c中,通過platform_add_devices(smdk2410_devices,…)將 smdk2410_devices注冊進內核空間,其中smdk2410_devices[]={&s3c_device_usb,&s3c_device_lcd,…},即所有2410平臺的platform設備,都被裝填入smdk2410_devics[]這個數組,在platform_add_devices()中統一注冊進內核空間。

2.3 定義platform驅動

代碼路徑:/drivers/video/s3c2410fb.c。

在s3c2410fb.c對platform_driver進行了定義:

在此結構體中,具體填充了probe驅動探測函數,suspend、resume電源管理函數,對于驅動開發人員,不需關心內核對它的調用,只需關心具體功能函數的實現,并填充到標準接口即可。在.driver中.name=”FS2410-lcd”,這個值需要與platform_device中的name完全一致。在suspend、resume部分,實行了Linux電源管理,在具體驅動開發中,可以在此處實現智能節電措施,可以采用如安卓操作系統(Android)中的喚醒鎖(wakelock)等機制。

S3c2410fb_probe()的調用實現,是在將platform驅動注冊進內核空間,并和內核已維護的platform_device鏈表中的name相匹配后。其具體實現流程:

2.4 注冊platform驅動

在/drivers/video/s3c2410fb.c中通過調用platform_driver_register()實現了platform_driver的注冊,具體實現如下:platform_driver_register(&s3c2410fb_driver)。

2.5 移植驗證

采用platform驅動架構,移植LCD驅動,修改相應 Makefile、Kconfig[5],編譯內核,并通過USB下載到FS2410開發板后,串口打印顯示LCD驅動加載成功。圖3為在移植后的8寸夏普LCD屏上運行QT/E應用程序,顯示結果清晰、穩定,無撕裂現象。

圖3 移植實驗結果Fig.3 Porting experiment results

3 結束語

采用platform驅動架構,具有框架代碼復用、設備資源與驅動獨立性強、代碼精簡、具有統一內核接口、易于維護與擴展等特點。在開發具體驅動時,只需專注完成底層設備操作函數集,并與platform_driver結構體提供的內核接口一一對應,保證device.name與driver.name相一致,platform設備在platform驅動之前注冊進內核空間,就可以使驅動良好、穩定地運行,大大減輕了工作強度,壓縮新產品的研發時間。移植試驗證明,采用該架構的驅動具有很好的移植性、可維護性、擴展性。

[1]VENKATESWARAN S.Essential Linux Device Drivers[M].Boston:Prentice Hall,2008:71-77.

[2]CORBET J,RUBINI A,HARTMAN G K.Linux設備驅動程序[M].3版.魏永明,譯.北京:中國電力出版社,2006:359-388.

[3]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008:476-490.

[4]宮莉莉,趙勇.基于嵌入式Linux系統的LCD驅動實現[J].微計算機信息,2008,24(35):1-3.

[5]蘇哲欣,劉鴻飛,薛曉.基于嵌入式Linux的LCD驅動分析與實現[J].工業控制計算機,2009,22(2):29-30.

猜你喜歡
驅動程序內核調用
多內核操作系統綜述①
強化『高新』內核 打造農業『硅谷』
核電項目物項調用管理的應用研究
阻止Windows Update更新驅動程序
基于嵌入式Linux內核的自恢復設計
Linux內核mmap保護機制研究
LabWindows/CVI下基于ActiveX技術的Excel調用
計算機硬件設備驅動程序分析
基于系統調用的惡意軟件檢測技術研究
利用RFC技術實現SAP系統接口通信
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合