當向linux系統匯流排新增裝置或驅動時,總是會呼叫各匯流排對應的match匹配函式來判斷驅動和裝置是否匹配,這些match函式之間都存在一定的差異,本文先對常用的match匹配函式進行講解,以後會陸續新增新的內容。
struct of_device_id ;
向系統新增平台驅動或新增裝置時會呼叫平台匯流排platform_bus_type中的platform_match函式來匹配平台驅動和平台裝置。
static int platform_match(struct device *dev, struct device_driver *drv)
由platform_match可以看出,驅動和裝置是否匹配可以通過三種方式來進行判斷,首先是通過of_device_id結構:
static inline int of_driver_match_device(struct device *dev, const struct device_driver *drv)
struct of_device_id *of_match_device(const struct of_device_id *matches, const struct device *dev)
const struct of_device_id *of_match_node(const struct of_device_id *matches, const struct device_node *node)
return null;}
如果driver中定義了of_device_id,則通過driver中的of_device_id和device中的device_node內 容進行匹配判斷,匹配工作由of_match_node來完成,該函式會遍歷of_device_id列表,查詢是否有成員與device_node相匹 配,具體由matches的name,type和compatioble來進行對比,如果找到則返回相應的表項,否則返回null.如果沒有定義 of_device_id,device_node或不能找到對應的匹配項,則通過第二種方式platform_device_id來進行對比匹配,通過 platform_match_id來完成:
static const struct platform_device_id *platform_match_id( const struct platform_device_id *id, struct platform_device *pdev)
如i2c_device_match所示,i2c通過兩種方式進行匹配裝置和驅動,一種是of_device_id,另一種是 i2c_device_id,i2c_device_id資料結構和platform_device_id一樣。i2c裡的兩種匹配方式和之前的 platform判斷方式都是一樣,這裡就不展開。
當向usb匯流排上註冊驅動或新增裝置時,就會呼叫usb_match_device進行驅動和裝置配對,函式如下:static int usb_device_match(struct device *dev, struct device_driver *drv)
if (is_usb_device(dev)) else if (is_usb_inte***ce(dev))struct usb_device_id {usb_match_one_id和函式中的usb_match_device都是圍繞著usb_device_id進行匹配的,該結構定義如下:
__u16 match_flags;__u16 idvendor;
__u16 idproduct;
__u16 bcddevice_lo;
__u16 bcddevice_hi;
__u8 bdeviceclass;
__u8 bdevicesubclass;
__u8 bdeviceprotocol;
__u8 binte***ceclass;
__u8 binte***cesubclass;
__u8 binte***ceprotocol;
kernel_ulong_tdriver_info;
match_flags用來規定驅動匹配時的具體項,如match_flags包含usb_device_id_match_vendor,則是通過驅動中的usb_device_id和裝置dev中的idvendor來判斷。
各種匯流排match匹配函式
當向linux系統匯流排新增裝置或驅動時,總是會呼叫各匯流排對應的match匹配函式來判斷驅動和裝置是否匹配,這些match函式之間都存在一定的差異,本文先對常用的match匹配函式進行講解,以後會陸續新增新的內容。struct of device id struct platform device...
各種匯流排match匹配函式
當向linux系統匯流排新增裝置或驅動 driver register device register 時,總是會呼叫各匯流排對應的match匹配函式來判斷驅動和裝置是否匹配,這些match函式之間都存在一定的差異,本文先對常用的match匹配函式進行講解,以後會陸續新增新的內容。struct of...
match和 in 查詢匹配
首先建立示例資料 all.states as.data.frame state.x77 all.states name rownames state.x77 rownames all.states null 將內建資料集由陣列轉為資料框,然後新增州名為一列,移除行名稱 cold.states all...