1.概述
本文主要講述了U-boot的MMC DM框架驅(qū)動(dòng)的移植方法。DM是Driver Model的簡(jiǎn)稱,是U-boot的基本驅(qū)動(dòng)框架。常見的MMC設(shè)備包括SD卡、eMMC存儲(chǔ)器等。本文討論遵循SD Hostcontroller Specification 協(xié)議的MMC設(shè)備驅(qū)動(dòng)開發(fā)。
示例U-boot版本:2022.10。硬件平臺(tái):ARM SOC。
2.原理
在U-boot中,對(duì)遵循SD Hostcontroller Specification 協(xié)議的MMC設(shè)備有著完備的底層驅(qū)動(dòng)支持。因此,移植某個(gè)特定MMC外設(shè)驅(qū)動(dòng),具體工作為調(diào)用U-boot自有的MMC底層標(biāo)準(zhǔn)驅(qū)動(dòng),實(shí)現(xiàn)對(duì)MMC外設(shè)的訪問和操作。
MMC驅(qū)動(dòng)的工作原理:首先對(duì)設(shè)備樹文件xx.dts進(jìn)行解析,按照先bind后probe的順序加載MMC驅(qū)動(dòng),分別通過相應(yīng)的bind函數(shù)和probe函數(shù)完成。
U-boot啟動(dòng)后,在讀取MMC設(shè)備節(jié)點(diǎn)的compatible字段后,找到與之匹配的U_BOOT_DRIVER,然后執(zhí)行bind函數(shù)對(duì)驅(qū)動(dòng)進(jìn)行綁定,最后通過probe函數(shù)對(duì)驅(qū)動(dòng)進(jìn)行激活,解析設(shè)備樹的節(jié)點(diǎn)屬性,對(duì)驅(qū)動(dòng)進(jìn)行配置,從而使驅(qū)動(dòng)具備工作條件,供上層應(yīng)用程序調(diào)用。
U-boot的命令子系統(tǒng)包含了眾多測(cè)試命令子集,其中mmc命令集可用來對(duì)MMC驅(qū)動(dòng)進(jìn)行功能測(cè)試,對(duì)MMC設(shè)備進(jìn)行信息查詢和訪問操作。
3.移植方法
3.1 主要工作
向U-boot移植MMC DM框架驅(qū)動(dòng)的主要工作包括:
(1)向./drivers/mmc/添加驅(qū)動(dòng)文件源碼xx_sdhci .c(名稱xx由驅(qū)動(dòng)開發(fā)者定義,下同);
(2)在./drivers/mmc/Makefile添加xx_sdhci .c的編譯條目;
(3)在./drivers/mmc/Kconfig添加xx_sdhci .c的編譯配置選項(xiàng);
(4)向./arch/arm/dts/xx.dts中添加MMC設(shè)備節(jié)點(diǎn)。
3.2 驅(qū)動(dòng)源碼設(shè)計(jì)
在U-boot的MMC驅(qū)動(dòng)中,有眾多設(shè)備遵循了SD Hostcontroller Specification 協(xié)議,選取其中的Atmel SDHCI控制器驅(qū)動(dòng),講解驅(qū)動(dòng)代碼的原理和設(shè)計(jì)方法,代碼路徑: ./drivers/mmc/atmel_sdhci.c。自編的驅(qū)動(dòng)文件源碼xx_sdhci .c可參考atmel_sdhci.c進(jìn)行設(shè)計(jì)。
MMC驅(qū)動(dòng)包括2個(gè)核心函數(shù),即atmel_sdhci_bind和atmel_sdhci_probe函數(shù)。
atmel_sdhci_bind函數(shù)用于驅(qū)動(dòng)的綁定。調(diào)用了sdhci_bind函數(shù),位于./drivers/mmc/sdhci.c;而MMC作為一種塊設(shè)備,sdhci_bind函數(shù)進(jìn)一步調(diào)用了mmc_bind函數(shù),位于./drivers/mmc/mmc-uclass.c。
atmel_sdhci_probe函數(shù)用于驅(qū)動(dòng)的激活。atmel_sdhci_probe函數(shù)的主要流程為:首先對(duì)設(shè)備樹進(jìn)行參數(shù)解析,解析出MMC控制器的工作時(shí)鐘頻率、寄存器地址、數(shù)據(jù)寬度、最高工作頻率等參數(shù);然后通過sdhci_setup_cfg函數(shù)進(jìn)行參數(shù)配置,sdhci_setup_cfg函數(shù)位于./drivers/mmc/sdhci.c;最后調(diào)用sdhci_probe函數(shù)完成probe操作。
3.3 MMC設(shè)備樹節(jié)點(diǎn)
在設(shè)備樹添加MMC設(shè)備節(jié)點(diǎn),節(jié)點(diǎn)設(shè)計(jì)方法可以參考./doc/device-tree-bindings/mmc下的文檔。
4.驗(yàn)證方法
4.1編譯mmc測(cè)試工具
為編譯mmc測(cè)試工具,應(yīng)配置U-boot,使能CONFIG_CMD_MMC。
4.2驅(qū)動(dòng)加載結(jié)果查詢
cli>dm tree
Class Index Probed Driver Name
root 0 [ + ] root_driver root_driver
mmc 0 [ + ] xx_sdhci `-- mmc@xxxxxxxx
blk 0 [ + ] mmc_blk `-- [email protected]
4.3MMC設(shè)備信息查詢
cli>mmc info
Manufacturer ID: 3
OEM: 5344
Name: SD32G
Bus Speed: 2000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 29.7 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
4.4寫操作
cli>mmc write 0x80000000 100 2
2 blocks written: OK
4.5讀操作
cli>mmc read 0x90000000 100 2
2 blocks read: OK
-
ARM
+關(guān)注
關(guān)注
134文章
9176瀏覽量
369324 -
soc
+關(guān)注
關(guān)注
38文章
4208瀏覽量
219144 -
MMC
+關(guān)注
關(guān)注
0文章
77瀏覽量
30553 -
移植
+關(guān)注
關(guān)注
1文章
383瀏覽量
28197 -
u-boot
+關(guān)注
關(guān)注
0文章
121瀏覽量
38324
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
U-boot的基本介紹
![<b class='flag-5'>U-boot</b>的基本介紹](https://file1.elecfans.com/web2/M00/8C/C4/wKgaomSxDC-AIi1QAACKegMzhAU876.png)
U-Boot移植DM9000網(wǎng)卡分享!
嵌入式系統(tǒng)中U-Boot 基本特點(diǎn)及其移植方法
嵌入式系統(tǒng)中U-Boot 基本特點(diǎn)及其移植方法
嵌入式U-BOOT的啟動(dòng)流程及移植
基于nanoPC-T3的U-Boot移植過程梳理
Linux U-Boot開發(fā)指南
![Linux <b class='flag-5'>U-Boot</b>開發(fā)指南](https://file.elecfans.com//web2/M00/95/B6/poYBAGQFT7mAWRkKAAFz-Z4R0zY051.png)
U-boot的QSPI驅(qū)動(dòng)移植方法及驗(yàn)證方法
![<b class='flag-5'>U-boot</b>的QSPI<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>移植</b><b class='flag-5'>方法</b>及驗(yàn)證<b class='flag-5'>方法</b>](https://file.elecfans.com/web2/M00/9F/06/poYBAGQ4uJyAR2S0AAFCsQC4t40453.png)
U-boot的SPLASH_SCREEN(啟動(dòng)畫面)驅(qū)動(dòng)移植方法
![<b class='flag-5'>U-boot</b>的SPLASH_SCREEN(啟動(dòng)畫面)<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>移植</b><b class='flag-5'>方法</b>](https://file.elecfans.com/web2/M00/9F/87/pYYBAGQ4uauAMTOLAAFqram3zoA825.png)
U-boot的DPU驅(qū)動(dòng)移植方法
![<b class='flag-5'>U-boot</b>的DPU<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>移植</b><b class='flag-5'>方法</b>](https://file1.elecfans.com/web2/M00/89/68/wKgZomSCyByAWv4YAAKnpIxOJZM063.jpg)
U-boot驅(qū)動(dòng)SPLASH_SCREEN驅(qū)動(dòng)移植方法
![<b class='flag-5'>U-boot</b><b class='flag-5'>驅(qū)動(dòng)</b>SPLASH_SCREEN<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>移植</b><b class='flag-5'>方法</b>](https://file1.elecfans.com/web2/M00/89/67/wKgaomSCyQuAFUyoAAK4jneyalY711.jpg)
遵循SD Host controller Specification協(xié)議的MMC設(shè)備驅(qū)動(dòng)開發(fā)討論
![遵循SD Host controller Specification協(xié)議的<b class='flag-5'>MMC</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)討論](https://file1.elecfans.com/web2/M00/89/69/wKgZomSCydCAFKJ1AAGqMCnPsTk034.jpg)
評(píng)論