硬件信息在內(nèi)核驅(qū)動(dòng)中的傳遞方法(平臺(tái)設(shè)備)
內(nèi)核驅(qū)動(dòng)模型重要的三個(gè)結(jié)構(gòu)體
struct device
struct device_driver
struct bus_type
詳細(xì)內(nèi)容放在末尾。
硬件信息在內(nèi)核驅(qū)動(dòng)中的傳遞方法(平臺(tái)設(shè)備)
對(duì)于linux設(shè)備驅(qū)動(dòng)模型來說,所有設(shè)備和驅(qū)動(dòng)都掛接在總線上。編程者需要通過內(nèi)核提供的struct device結(jié)構(gòu)體告訴內(nèi)核,外設(shè)工作所需要的資源,例如gpio引腳、中斷、時(shí)鐘等。然后通過填充內(nèi)核提供的struct device_driver結(jié)構(gòu)體,完成相關(guān)資源的申請(qǐng)并對(duì)外設(shè)進(jìn)行初始化,然后為應(yīng)用程序提供操作設(shè)備的方法,包括打開、關(guān)閉、讀寫等操作。
如果遇到一個(gè)新設(shè)備,我們發(fā)現(xiàn)內(nèi)核設(shè)備驅(qū)動(dòng)模型提供的struct device和struct device_driver結(jié)構(gòu)體不能完全滿足我們的需求,這時(shí)可以自行定義新結(jié)構(gòu)體, 將struct device和struct device_driver嵌入其中,用于描述通用信息,不同的信息再額外添加,這樣做的好處是我們新添加的結(jié)構(gòu)體也可以納入設(shè)備驅(qū)動(dòng)模型中進(jìn)行管理,例如struct i2c_driver、struct platform_device等。而對(duì)于platform設(shè)備驅(qū)動(dòng)來說,外設(shè)的的配置信息需要傳給內(nèi)核的struct device,struct device中定義了專門的指針void *platform_data,用來指向存儲(chǔ)外設(shè)備信息的結(jié)構(gòu)體。以便在適合的時(shí)候被驅(qū)動(dòng)讀取使用。我們可以看出,指針void *platform_data并沒有被指定相應(yīng)的類型,也就是說可以根據(jù)不同的設(shè)備,讓其指向struct xxxx_platform_data,該結(jié)構(gòu)體可以由不同的驅(qū)動(dòng)框架提供。例如gpio_led_platform,i2c_gpio_platform_data;

詳細(xì)代碼: