《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 其他 > Linux設(shè)備驅(qū)動(dòng)程序架構(gòu)分析之MMC/SD(四)

Linux設(shè)備驅(qū)動(dòng)程序架構(gòu)分析之MMC/SD(四)

2015-04-29
關(guān)鍵詞: platform_get_device_id

1630行,調(diào)用platform_get_device_id宏,取得處理器類型,該宏定義在include/linux/platform_device.h文件中:

捕獲.PNG

但是,回憶一下我們注冊(cè)的platform_device s3c_device_sdi,我們并沒(méi)有初始化platform_device.id_entry成員,那么這里的 platform_get_device_id宏返回值是NULL嗎?如果不是NULL,應(yīng)該是什么值呢?

答案是platform_get_device_id(pdev)->driver_data返回值為1。

原因是s3cmci_driver.id_table被設(shè)置為s3cmci_driver_ids。s3cmci_driver_ids定義在drivers/mmc/host/s3cmci.c文件中:

捕獲.PNG

struct platform_device_id定義在include/linux/mod_devicetable.h文件中:

捕獲.PNG

platform_driver.id_table是platform_driver所支持的設(shè)備列表。可以看到,s3cmci_driver支持 3種設(shè)備,分別是"s3c2410-sdi"、"s3c2412-sdi"和"s3c2440-sdi"。對(duì)于"s3c2410-sdi",其 driver_data成員值為0,對(duì)于其它兩種設(shè)備,它們的driver_data成員值為1。

當(dāng)調(diào)用platform_driver_register函數(shù)注冊(cè)s3cmci_driver 時(shí),s3cmci_driver.driver.bus被設(shè)置為 platform_bus_type,structbus_type platform_bus_type定義在drivers/base/platform.c文件中:

捕獲.PNG

根據(jù)《Linux設(shè)備模型分析之device_driver(基于3.10.1內(nèi)核)》 一文對(duì)Linux設(shè)備模型的分析,在s3cmci_driver.probe函數(shù)被調(diào)用執(zhí)行之前,platform_bus_type.match即 platform_match首先會(huì)被調(diào)用執(zhí)行。platform_match函數(shù)定義在drivers/base/platform.c文件中:

捕獲.PNG

737行,如果pdrv->id_table不為空,則調(diào)用platform_match_id函數(shù)。而我們的 platform_drivers3cmci_driver.id_table被設(shè)置為s3cmci_driver_ids,所以 platform_match_id函數(shù)會(huì)被執(zhí)行。

platform_match_id函數(shù)定義在drivers/base/platform.c文件中:

捕獲.PNG

可以看到,在701行,如果platform_device.name與platform_device_id.name相同,則將id賦值給pdev->id_entry。

回到我們的platform_driver s3cmci_driver和platform_device s3c_device_sdi,s3c_device_sdi.name被初始化為"s3c2410-sdi",但是因?yàn)槲覀兓诘钠脚_(tái)是 Mini2440,處理器是S3C2440,所以s3c244x_map_io函數(shù)會(huì)被調(diào)用,至于什么時(shí)候該函數(shù)會(huì)被調(diào)用我還沒(méi)有搞清楚,呵呵!該函數(shù)定 義在arch/arm/mach-s3c24xx/s3c244x.c文件中:

捕獲.PNG

71行,將s3c_device_sdi.name設(shè)置為"s3c2440-sdi"

而s3cmci_driver.id_table被設(shè)置為 s3cmci_driver_ids,s3cmci_driver_ids[2].name同樣為"s3c2440-sdi",所以,雖然 s3c_device_sdi.id_entry在初始化時(shí)沒(méi)有賦值,但是在platform_match_id函數(shù)中,它會(huì)被賦值為 s3cmci_driver_ids[2]。

現(xiàn)在我們可以回到s3cmci_probe函數(shù)了:

1630行,經(jīng)過(guò)前面的分析,我們知道platform_get_device_id(pdev)->driver_data的值其實(shí)就是 s3cmci_driver_ids[2].driver_data,其值為1。所以,對(duì)于Mini2440平臺(tái),is2440變量被賦值為1。

1632行,調(diào)用mmc_alloc_host函數(shù)為struct mmc_host指針變量mmc分配內(nèi)存空間并初始化。注意mmc_alloc_host的第一個(gè)參數(shù)表示除了mmc_host結(jié)構(gòu)體外,還要額外多分配 的內(nèi)存空間大小,所以這里分配的內(nèi)存大小是struct mmc_host加上struct s3cmci_host。

mmc_alloc_host函數(shù)定義在drivers/mmc/core/host.c文件中,其內(nèi)容如下:

捕獲.PNG

捕獲.PNG

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。