核心版本:linux-3.4.67
platform的match函式如下:
/**
* platform_match - bind platform device to platform driver.
* @dev: device.
* @drv: driver.
* * platform device ids are assumed to be encoded like this:
* "", where is a short description of the type of
* device, like "pci" or "floppy", and is the enumerated
* instance of the device, like '0' or '42'. driver ids are simply
* "". so, extract the from the platform_device structure,
* and compare it against the name of the driver. return whether they match
* or not.
*/static int platform_match(struct device *dev, struct device_driver *drv)
從match函式中可以看到,platform匯流排匹配裝置和驅動有兩種方法:一是通過platform_driver中的id_table,如果id_table不存在,則只是簡單的比較裝置中的name欄位和驅動中的name欄位是否相同。後面一種方法呢,已經見過無數次了,這裡也就不再舉例了,這裡主要是看前一種方法。例如rtc-s3c.c:static struct platform_device_id s3c_rtc_driver_ids = , , , ,
};
上面就是platform_device_id,可以看到支援的不只一種,包括2410、2416等等。而platform_driver定義如下:static struct platform_driver s3c_rtc_driver = ,
};
2410的platfrom_device定義如下:
struct platform_device s3c_device_rtc = ;
那麼在匹配的時候,match函式會在驅動的id_table表裡面查詢同platform device的name欄位是否相同,如果相同則返回true,否則返回false。那麼通過id_table這種方式有什麼好處呢,如果只是簡單的比較name欄位是否相同,那麼乙個驅動只能支援特定的乙個裝置,而如果通過id_table的方式呢,乙個驅動可以支援很多個裝置,而它們只是name欄位不同而已。 關於IDT報錯亂碼總結
可算是把我折騰壞了。一籌莫展。最後才把這些問題搞好。有些事不知道做以前,怎麼都想不到。發現了方法之後,原來也不過這樣。我覺得自己記性太差。還是好好寫下來吧。寫下來順便會幫我重新再梳理一遍。原先亂碼是因為字符集的問題。說實話這個問題的原因還沒有找到。當我重新換了個驅動,新建 了關係連線之後,它自己就好...
Linux驅動中的platform
從linux2.6核心起,引入一套新的驅動管理和註冊機制 platform device 和 platform driver linux 中大部分的裝置驅動,都可以使用這套機制,裝置用 platform device 表示 驅動用 platform driver 進行註冊。linux platfor...
Linux驅動中的platform
從linux2.6核心起,引入一套新的驅動管理和註冊機制 platform device 和 platform driver linux 中大部分的裝置驅動,都可以使用這套機制,裝置用 platform device 表示 驅動用 platform driver 進行註冊。linux platfor...