of_match_device函數(shù)是什么?
of_match_device函數(shù)一般用于設(shè)備樹驅(qū)動程序中,用來獲取與設(shè)備節(jié)點(diǎn)相關(guān)聯(lián)的設(shè)備驅(qū)動程序。
of_match_device函數(shù)是Linux內(nèi)核中的一個函數(shù),用于設(shè)備樹中設(shè)備節(jié)點(diǎn)和設(shè)備驅(qū)動程序之間的匹配。這個函數(shù)的作用是通過指定的設(shè)備樹節(jié)點(diǎn)和設(shè)備驅(qū)動程序的匹配信息進(jìn)行匹配,如果匹配成功,就返回相應(yīng)的設(shè)備驅(qū)動程序。
of_match_device函數(shù)的原型定義如下:
```
const struct of_device_id *of_match_device(const struct of_device_id *matches,
const struct device *dev);
```
其中:
matches參數(shù)是一個of_device_id類型的數(shù)組,用來存儲 設(shè)備驅(qū)動程序和設(shè)備節(jié)點(diǎn)之間的匹配信息。
dev參數(shù)是設(shè)備樹中的一個設(shè)備節(jié)點(diǎn),用于匹配 設(shè)備節(jié)點(diǎn)和設(shè)備驅(qū)動程序之間的匹配信息。
of_match_device函數(shù)會遍歷matches數(shù)組中的每一項,將其與dev參數(shù)進(jìn)行匹配,如果匹配成功,就返回該設(shè)備驅(qū)動程序?qū)?yīng)的of_device_id結(jié)構(gòu)體,否則返回NULL。
在設(shè)備樹驅(qū)動程序中,一般會定義一個static const struct of_device_id類型的數(shù)組,用來存儲設(shè)備驅(qū)動程序和設(shè)備節(jié)點(diǎn)之間的匹配信息。然后通過調(diào)用of_match_device函數(shù),將設(shè)備節(jié)點(diǎn)和設(shè)備驅(qū)動程序進(jìn)行匹配,獲取匹配成功的設(shè)備驅(qū)動程序。
比如:
static const struct mtk_soc_data mt7621_data = {
.caps = MT7621_CAPS,
.required_clks = MT7621_CLKS_BITMAP,
.required_pctl = false,
.irq_num = 1,
};
const struct of_device_id of_mtk_match[] = {
{ .compatible = "mediatek,mt2701-eth", .data = &mt2701_data},
{ .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
{ .compatible = "mediatek,mt7629-eth", .data = &leopard_data},
{ .compatible = "mediatek,mt7621-eth", .data = &mt7621_data},
{},
};
MODULE_DEVICE_TABLE(of, of_mtk_match);
static int mtk_probe(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct device_node *mac_np;
const struct of_device_id *match;
struct mtk_eth *eth;
int err;
int i;
eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL);
if (!eth)
return -ENOMEM;
match = of_match_device(of_mtk_match, &pdev->dev);
eth->soc = (struct mtk_soc_data *)match->data;