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

本文的內(nèi)容基于如下硬件和軟件平臺:

目標平臺:TQ2440

CPU:s3c2440

內(nèi)核版本:3.12.5

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

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

待寫。。。

二、主要數(shù)據(jù)結(jié)構(gòu)

待寫。。。

三、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方法

并直接在內(nèi)部調(diào)用驅(qū)動probe方法*/

ret=mmc_register_bus();

if(ret)

gotodestroy_workqueue;

/*注冊名為mmc_host的類*/

ret=mmc_register_host_class();

if(ret)

gotounregister_bus;

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

并直接在內(nèi)部調(diào)用驅(qū)動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卡設(shè)備。我們會在后面進行說明。

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

接著注冊了兩條名為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的設(shè)備驅(qū)動模型的同學(xué)對這些肯定非常熟悉??偩€和類的注冊只是調(diào)用了相應(yīng)的接口,這些就不再贅述了。

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

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


/*

*ThiscurrentlymatchesanyMMCdrivertoanyMMCcard-drivers

*themselvesmakethedecisionwhethertodrivethiscardintheir

*probemethod.

*/

staticintmmc_bus_match(structdevice*dev,structdevice_driver*drv)

{

return1;

}

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

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

熟悉設(shè)備驅(qū)動模型的可能知道,隨著match返回1表示匹配成功后,將會調(diào)用總線提供的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方法中直接調(diào)用了驅(qū)動probe方法,這也驗證了剛才注釋中所說的話。

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


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

MMC核心層要和SD卡設(shè)備進行通信,為了完成這一個工作需要將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ù)分兩步走,第一步調(diào)用__mmc_start_req發(fā)送命令,第二部調(diào)用 mmc_wait_for_req_done等待命令完成。

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


staticint__mmc_start_req(structmmc_host*host,structmmc_request*mrq)

{

/*初始化completion,并設(shè)置done方法*/

init_completion(&mrq->completion);

mrq->done=mmc_wait_done;

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

if(mmc_card_removed(host->card)){

mrq->cmd->error = -ENOMEDIUM;

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉