日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 從Linux2.6內(nèi)核起,引入一套新的驅(qū)動(dòng)管理和注冊機(jī)制:platform_device 和 platform_driver 。Linux 中大部分的設(shè)備驅(qū)動(dòng),都可以使用這套機(jī)制,設(shè)備用 platform_device 表

 從Linux2.6內(nèi)核起,引入一套新的驅(qū)動(dòng)管理和注冊機(jī)制:platform_device 和 platform_driver 。Linux 中大部分的設(shè)備驅(qū)動(dòng),都可以使用這套機(jī)制,設(shè)備用 platform_device 表示;驅(qū)動(dòng)用 platform_driver 進(jìn)行注冊。

Linux platform driver 機(jī)制和傳統(tǒng)的device driver機(jī)制(即:通過 driver_register 函數(shù)進(jìn)行注冊)相比,一個(gè)十分明顯的優(yōu)勢在于platform機(jī)制將設(shè)備本身的資源注冊進(jìn)內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動(dòng)程序中用使用這些資源時(shí),通過platform device提供的標(biāo)準(zhǔn)接口進(jìn)行申請并使用。

platform 是一個(gè)虛擬的地址總線,相比 PCI、USB,它主要用于描述SOC上的片上資源。platform 所描述的資源有一個(gè)共同點(diǎn):在CPU 的總線上直接取址。平臺設(shè)備會分到一個(gè)名稱(用在驅(qū)動(dòng)綁定中)以及一系列諸如地址和中斷請求號(IRQ)之類的資源。

platform 總線下驅(qū)動(dòng)的開發(fā)步驟是:

1、 設(shè)備

需要實(shí)現(xiàn)的結(jié)構(gòu)體是:platform_device 。

1)初始化 resource 結(jié)構(gòu)變量

2)初始化 platform_device 結(jié)構(gòu)變量

3)向系統(tǒng)注冊設(shè)備:platform_device_register。

以上三步,必須在設(shè)備驅(qū)動(dòng)加載前完成,即執(zhí)行platform_driver_register()之前,原因是驅(qū)動(dòng)注冊時(shí)需要匹配內(nèi)核中所有已注冊的設(shè)備名。platform_driver_register()中添加device到內(nèi)核最終還是調(diào)用的device_add函數(shù)。Platform_device_add和device_add最主要的區(qū)別是多了一步insert_resource(p, r),即將platform資源(resource)添加進(jìn)內(nèi)核,由內(nèi)核統(tǒng)一管理。

2、驅(qū)動(dòng)

驅(qū)動(dòng)注冊中,需要實(shí)現(xiàn)的結(jié)構(gòu)體是:platform_driver 。

在驅(qū)動(dòng)程序的初始化函數(shù)中,調(diào)用了platform_driver_register()注冊 platform_driver 。需要注意的是:platform_driver 和 platform_device 中的 name 變量的值必須是相同的 。這樣在 platform_driver_register() 注冊時(shí),會將當(dāng)前注冊的 platform_driver 中的 name 變量的值和已注冊的所有 platform_device 中的 name 變量的值進(jìn)行比較,只有找到具有相同名稱的 platform_device 才能注冊成功。當(dāng)注冊成功時(shí),會調(diào)用 platform_driver 結(jié)構(gòu)元素 probe 函數(shù)指針。

platform_driver_register()的注冊過程:

1 platform_driver_register(&s3c2410fb_driver)

2 driver_register(&drv->driver)

3 bus_add_driver(drv)

4 driver_attach(drv)

5 bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)

6 __driver_attach(struct device * dev, void * data)

7 driver_probe_device(drv, dev)

8 really_probe(dev, drv)

在really_probe()中:為設(shè)備指派管理該設(shè)備的驅(qū)動(dòng):dev->driver = drv, 調(diào)用probe()函數(shù)初始化設(shè)備:drv->probe(dev)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉