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

當前位置:首頁 > 單片機 > 單片機
[導讀]本文的內容基于如下硬件和軟件平臺:目標平臺:TQ2440CPU:s3c2440內核版本:3.12.5基于SD規(guī)范4.10,即《SD Specifications Part 1 Physical Layer Simplified Specification Version 4.10》。一、MMC子系統(tǒng)構架待寫

本文的內容基于如下硬件和軟件平臺:

目標平臺:TQ2440

CPU:s3c2440

內核版本:3.12.5

基于SD規(guī)范4.10,即《SD Specifications Part 1 Physical Layer Simplified Specification Version 4.10》。

一、MMC子系統(tǒng)構架

待寫。。。

二、主要數(shù)據(jù)結構

待寫。。。

三、MMC子系統(tǒng)初始化

首先看看子系統(tǒng)是如何初始化的,完成哪些工作。

代碼位于linux/drivers/mmc/core/core.c。


staticint__initmmc_init(void)

{

intret;

/*創(chuàng)建一個工作隊列*/

workqueue=alloc_ordered_workqueue("kmmcd",0);

if(!workqueue)

return-ENOMEM;

/*注冊mmc總線,總線提供probe方法

并直接在內部調用驅動probe方法*/

ret=mmc_register_bus();

if(ret)

gotodestroy_workqueue;

/*注冊名為mmc_host的類*/

ret=mmc_register_host_class();

if(ret)

gotounregister_bus;

/*注冊sdio總線,總線提供probe方法

并直接在內部調用驅動probe方法*/

ret=sdio_register_bus();

if(ret)

gotounregister_host_class;

return0;

unregister_host_class:

mmc_unregister_host_class();

unregister_bus:

mmc_unregister_bus();

destroy_workqueue:

destroy_workqueue(workqueue);

returnret;

}


代碼首先注冊了一個工作隊列,這個工作隊列將用于掃描sd卡設備。我們會在后面進行說明。

工作對類已內核線程的形式運行,可以用ps命令看到名為[kmmcd]的內核線程。

接著注冊了兩條名為mmc和sdio的總線,以及一個名為mmc_host的類。具體代碼如下:


staticstructbus_typemmc_bus_type={

.name="mmc",

.dev_attrs=mmc_dev_attrs,

.match=mmc_bus_match,

.uevent=mmc_bus_uevent,

.probe=mmc_bus_probe,

.remove=mmc_bus_remove,

.shutdown=mmc_bus_shutdown,

.pm=&mmc_bus_pm_ops,

};

intmmc_register_bus(void)

{

returnbus_register(&mmc_bus_type);

}


staticstructclassmmc_host_class={

.name="mmc_host",

.dev_release=mmc_host_classdev_release,

};

intmmc_register_host_class(void)

{

returnclass_register(&mmc_host_class);

}


staticstructbus_typesdio_bus_type={

.name="sdio",

.dev_attrs=sdio_dev_attrs,

.match=sdio_bus_match,

.uevent=sdio_bus_uevent,

.probe=sdio_bus_probe,

.remove=sdio_bus_remove,

.pm=SDIO_PM_OPS_PTR,

};

intsdio_register_bus(void)

{

returnbus_register(&sdio_bus_type);

}

staticstructclassmmc_host_class={

.name="mmc_host",

.dev_release=mmc_host_classdev_release,

};

intmmc_register_host_class(void)

{

returnclass_register(&mmc_host_class);

}


熟悉Linux的設備驅動模型的同學對這些肯定非常熟悉??偩€和類的注冊只是調用了相應的接口,這些就不再贅述了。

其次,sdio總線不是我們關心的。我們只關心mmc總線。首先來看看mmc總線的match方法:

代碼位于linux/drivers/mmc/core/bus.c。


/*

*ThiscurrentlymatchesanyMMCdrivertoanyMMCcard-drivers

*themselvesmakethedecisionwhethertodrivethiscardintheir

*probemethod.

*/

staticintmmc_bus_match(structdevice*dev,structdevice_driver*drv)

{

return1;

}

match返回居然直接返回了1。這表示任意的驅動都能和mmc卡設備成功匹配。

從注釋中我們也能看出,驅動的probe方法將會決定驅動是否能真正的匹配這個mmc卡設備。

熟悉設備驅動模型的可能知道,隨著match返回1表示匹配成功后,將會調用總線提供的probe方法。接著我們來看下mmc總線的probe方法。

代碼位于linux/drivers/mmc/core/bus.c。


staticintmmc_bus_probe(structdevice*dev)

{

structmmc_driver*drv=to_mmc_driver(dev->driver);

structmmc_card*card=mmc_dev_to_card(dev);

returndrv->probe(card);

}

從這里我們可以看到在mmc的probe方法中直接調用了驅動probe方法,這也驗證了剛才注釋中所說的話。

從上面分析可以看出,子系統(tǒng)初始化代碼僅僅注冊了兩條總線和一個類,并建立了一個工作隊列。


四、核心層與控制器層間的接口API

MMC核心層要和SD卡設備進行通信,為了完成這一個工作需要將CMD或者ACMD命令通過MMC/SD控制器發(fā)送給SD卡。

那么MMC核心層如何將通信的數(shù)據(jù)包交給MMC/SD控制器,并讓后者去發(fā)送呢?

MMC通過函數(shù)mmc_wait_for_req完成這個工作,我們來看下這個函數(shù)。

4.1 mmc_wait_for_req函數(shù)

下列代碼位于linux/drivers/mmc/core/core.c。


/**

*mmc_wait_for_req-startarequestandwaitforcompletion

*@host:MMChosttostartcommand

*@mrq:MMCrequesttostart

*

*StartanewMMCcustomcommandrequestforahost,andwait

*forthecommandtocomplete.Doesnotattempttoparsethe

*response.

*/

voidmmc_wait_for_req(structmmc_host*host,structmmc_request*mrq)

{

__mmc_start_req(host,mrq);

mmc_wait_for_req_done(host,mrq);

}

EXPORT_SYMBOL(mmc_wait_for_req);


通過注釋可以發(fā)現(xiàn),該函數(shù)會阻塞并等待request的完成。


該函數(shù)分兩步走,第一步調用__mmc_start_req發(fā)送命令,第二部調用 mmc_wait_for_req_done等待命令完成。

分別來看下這兩個函數(shù) :


staticint__mmc_start_req(structmmc_host*host,structmmc_request*mrq)

{

/*初始化completion,并設置done方法*/

init_completion(&mrq->completion);

mrq->done=mmc_wait_done;

/*如果mmc已經(jīng)被拔出,設置錯誤并返回錯誤*/

if(mmc_card_removed(host->card)){

mrq->cmd->error = -ENOMEDIUM;

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉