1630行,調(diào)用platform_get_device_id宏,取得處理器類型,該宏定義在include/linux/platform_device.h文件中:
但是,回憶一下我們注冊(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文件中:
struct platform_device_id定義在include/linux/mod_devicetable.h文件中:
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文件中:
根據(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文件中:
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文件中:
可以看到,在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文件中:
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)容如下: