亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  u-boot2020.04移植(eMMC/SD調試)

u-boot2020.04移植(eMMC/SD調試)

時間:2024-05-31

文章目錄

  • 前奏

  • 流程

  • 驅動匹配

  • 分析需要的屬性

  • 調試

  • 補充

  • 結果


前奏

隨著u-boot版本的變遷,u-boot的功能也越來越多越來越強大,在較新的u-boot中已經支持很多不同類型的文件系統,告別了以前需要移植者自己手動規劃eMMC/SD等鏡像存儲介質的分區信息(并非真正的磁盤分區,只是一個標號而已),可直接使用相關的命令就可以讀取出各種文件系統類型的存儲介質中的文件,使燒錄、更新、啟動等操作變得更加方便,所以在u-boot中支持eMMC/SD卡是很有必要的。

流程

在我現在用的u-boot版本2020.04中mmc相關的驅動默認使用了驅動模型,為了不破壞原有的結構,所以也決定使用驅動模型進行移植調試。通過閱讀源碼發現mmc相關的driver與uclass_driver都已經有了,唯一缺的就是driver_info(這里需要了解dm驅動模型相關的知識),驅動模型建議使用設備樹傳遞driver_info,但不幸的是三星(什么東西都藏著掖著)并沒有提供我這塊板子mmc相關的設備樹參考,便只好再次閱讀源碼,下面跟著源碼重點分析一下,該怎么從源碼中提取設備樹必須提供的屬性。
uclass_driver:

/*drivers\mmc\mmc-uclass.c*/

UCLASS_DRIVER(mmc) = {
.id = UCLASS_MMC,
.name = "mmc",
.flags = DM_UC_FLAG_SEQ_ALIAS,
.per_device_auto_alloc_size = sizeof(struct mmc_uclass_priv),
};

driver:

/*drivers\mmc\s5p_sdhci.c*/

U_BOOT_DRIVER(s5p_sdhci_drv) = {
.name = "s5p_sdhci",
.id = UCLASS_MMC,
.of_match = s5p_sdhci_ids,
.bind = s5p_sdhci_bind,
.ops = &sdhci_ops,
.probe = s5p_sdhci_probe,
.priv_auto_alloc_size = sizeof(struct sdhci_host),
.platdata_auto_alloc_size = sizeof(struct s5p_sdhci_plat),
};

本文略過dm驅動模型相關的內容

驅動匹配

在u-boot啟動過程中會有一個加載并驅動匹配的過程,當驅動匹配的時候會執行對應的probe函數,這個probe函數就是本次的重點,這里對應s5p_sdhci_probe函數。
那怎么才能讓驅動知道該和誰進行匹配呢?
這里就要看其中的of_match參數了,下面是s5p對應的of_match參數:

static const struct udevice_id s5p_sdhci_ids[] = {
{ .compatible = "samsung,exynos4412-sdhci"},
{ }
};

從這里我們知道首先得定義一個compatible屬性,并指定其值為samsung,exynos4412-sdhci,如下:

/*如果不懂,可先了解一下設備樹相關的知識*/
sdhci0:sdhci@eb000000 {
compatible = "samsung,exynos4412-sdhci";
};

這步完了后,驅動和數據就能匹配了,但是我們還需要其它參數,接著往下看。

分析需要的屬性

我們看一下s5p_sdhci_probe函數:

static int s5p_sdhci_probe(struct udevice *dev)
{
/*
省略
*/


/*這個函數就是從設備樹解析我們想要的數據*/
ret = sdhci_get_config(gd->fdt_blob, dev_of_offset(dev), host);
if (ret)
return ret;

/*
省略
*/

}

從源碼知道了sdhci_get_config函數中會從設備樹獲取相關的數據,看一下到底哪些數據是必須的:

static int sdhci_get_config(const void *blob, int node, struct sdhci_host *host)
{
int bus_width, dev_id;
unsigned int base;

/* Get device id */
dev_id = pinmux_decode_periph_id(blob, node);
if (dev_id < PERIPH_ID_SDMMC0 || dev_id > PERIPH_ID_SDMMC3) {
debug("MMC: Can't get device id\n");
return -EINVAL;
}
host->index = dev_id - PERIPH_ID_SDMMC0;

/* Get bus width */
bus_width = fdtdec_get_int(blob, node, "samsung,bus-width", 0);
if (bus_width <= 0) {
debug("MMC: Can't get bus-width\n");
return -EINVAL;
}
host->bus_width = bus_width;

/* Get the base address from the device node */
base = fdtdec_get_addr(blob, node, "reg");
if (!base) {
debug("MMC: Can't get base address\n");
return -EINVAL;
}
host->ioaddr = (void *)base;

gpio_request_by_name_nodev(offset_to_ofnode(node), "pwr-gpios", 0,
&host->pwr_gpio, GPIOD_IS_OUT);
gpio_request_by_name_nodev(offset_to_ofnode(node), "cd-gpios", 0,
&host->cd_gpio, GPIOD_IS_IN);

return 0;
}

經過分析,我們需要的參數如下:

  • 設備id

  • 總線寬度

  • 寄存器基地址

  • 電源引腳(可選)

  • 卡檢測引腳(可選)

所以可以推導出設備樹如下:

sdhci0:sdhci@eb000000 {
compatible = "samsung,exynos4412-sdhci";
/*根據芯片手冊得知*/
reg = <0xeb000000 0x100000>;
/*根據硬件原理圖得知*/
samsung,bus-width = <8>;
/*設備id定義于arch/arm/mach-s5pc1xx/include/mach/periph.h*/
id = <75>;
/*通道0是eMMC不可熱插拔*/
non-removable;
/*使能該設備*/
status = "okay";
};

調試

經過上面的步驟,driver_info也就準備好了,但經過測試,啟動u-boot后還是probe失敗,調了好久沒辦法,只能開啟調試信息看輸出log,最后定位到讀取id失敗,明明設置了id為什么還是失敗。看一下id讀取函數:

/*drivers\mmc\s5p_sdhci.c*/

int pinmux_decode_periph_id(const void *blob, int node)
{
return 0;
}

找到問題了,原來是id讀取函數是空的,之前也沒有仔細把每個函數都看一遍,導致在這里卡了很久,修改成下面的代碼,從設備樹中獲取id即可:

/*drivers\mmc\s5p_sdhci.c*/

int pinmux_decode_periph_id(const void *blob, int node)
{
return fdtdec_get_int(blob, node, "id", 0);
}

補充

另外再補充一個關于SD卡的問題,當你發現SD卡探測成功,但無論如何都檢測不到卡的時候,不妨試試通過menuconfig將CONFIG_MMC_BROKEN_CD配置宏打開,其作用是使用輪詢的方式來檢測卡,有時候檢測不到卡可能是因為卡檢測引腳沒有被正確的配置,使用輪詢方式檢測就可以了:

Device Drivers --->
MMC Host controller Support --->
[*] Poll for broken card detection case

結果

修改后再次測試已經能夠正確的讀取到eMMC并且各種操作也沒有問題。


歡迎掃碼關注我的微信公眾號


亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲永久在线观看| 狠狠久久五月精品中文字幕| 国产精品久久久久aaaa| 亚洲伦理在线免费看| 欧美激情亚洲精品| 亚洲一区在线免费观看| 国产视频精品va久久久久久| 亚洲日韩欧美一区二区在线| 欧美日韩免费高清| 亚洲摸下面视频| 黄色国产精品| 欧美日韩午夜| 欧美一区二区福利在线| 韩国精品久久久999| 欧美福利电影在线观看| 亚洲欧美激情精品一区二区| 国产真实乱偷精品视频免| 欧美成人精品一区二区| 亚洲一区二区三区欧美 | 久久一区二区三区av| 亚洲精品欧美在线| 国产精品视频999| 欧美 日韩 国产 一区| 亚洲午夜一区二区三区| 1024国产精品| 国产精品入口福利| 欧美精选在线| 麻豆精品在线视频| 亚洲欧美日韩在线一区| 亚洲美女精品久久| 激情欧美一区二区三区在线观看| 欧美午夜大胆人体| 欧美第十八页| 久久综合色影院| 欧美在线免费观看视频| 一区二区三区四区五区视频| 亚洲第一精品夜夜躁人人躁| 国产欧美成人| 国产精品久久久久9999| 欧美日本韩国一区二区三区| 久久久精品性| 午夜亚洲性色福利视频| 一本色道88久久加勒比精品 | 亚洲激情午夜| 国产亚洲成av人在线观看导航| 欧美日韩国内自拍| 欧美精品啪啪| 欧美片在线观看| 欧美国产视频一区二区| 欧美va亚洲va国产综合| 久久在线观看视频| 老**午夜毛片一区二区三区| 久久麻豆一区二区| 久久久欧美一区二区| 久久成人18免费网站| 校园春色国产精品| 欧美亚洲免费高清在线观看| 欧美一级在线播放| 欧美中文在线观看| 亚洲国产欧洲综合997久久| 99视频精品在线| 午夜精品成人在线| 亚洲人成精品久久久久| 国产精品国产三级国产aⅴ9色| 欧美视频四区| 国产精品网站在线| 欧美在线日韩| 亚洲一区www| 在线精品视频一区二区三四| 欧美日本一区二区高清播放视频| 亚洲伊人观看| 亚洲视频网站在线观看| 亚洲毛片av在线| 中文欧美字幕免费| 亚洲伊人一本大道中文字幕| 亚洲一区二区三区成人在线视频精品| 一区二区三区精品在线| 亚洲欧美经典视频| 久久综合国产精品| 欧美日韩综合网| 国产永久精品大片wwwapp| 国产精品亚洲激情| 国内综合精品午夜久久资源| 黑人极品videos精品欧美裸| 亚洲精品免费电影| 午夜精品理论片| 欧美成人三级在线| 国产精品高潮呻吟久久av黑人| 国产婷婷精品| 亚洲精品国产精品乱码不99| 亚洲自拍偷拍网址| 欧美成人首页| 欧美性猛交一区二区三区精品| 黑人巨大精品欧美一区二区小视频| 亚洲国产色一区| 香蕉免费一区二区三区在线观看 | 欧美日韩国产成人在线| 国产欧美日本一区视频| 欧美午夜精品久久久久久孕妇| 国产麻豆日韩| 亚洲美女中文字幕| 欧美一区不卡| 国产精品裸体一区二区三区| 国产日韩成人精品| 亚洲美洲欧洲综合国产一区| 久久国产日本精品| 欧美激情中文不卡| 国产日韩欧美综合一区| 一本不卡影院| 欧美福利视频网站| 在线成人免费观看| 久久久久久电影| 国产精品第三页| 亚洲日韩成人| 免播放器亚洲一区| 激情成人av在线| 午夜精品久久久久久| 欧美日韩亚洲91| 亚洲每日更新| 麻豆精品精品国产自在97香蕉| 国产精品v日韩精品v欧美精品网站| 亚洲国产美女| 欧美jizz19hd性欧美| 一区精品在线| 久久久久久一区| 激情久久一区| 久久精品91久久久久久再现| 国产欧美在线观看一区| 亚洲欧美在线一区二区| 国产精品久久999| 亚洲欧美日韩国产一区| 国产精品视频免费| 亚洲一级在线观看| 欧美日韩国产123| 一区二区欧美日韩视频| 欧美理论大片| 亚洲精品资源美女情侣酒店| 欧美精品播放| 这里只有视频精品| 国产精品mm| 亚洲综合电影| 国产美女精品视频免费观看| 午夜亚洲一区| 激情偷拍久久| 免费在线观看成人av| 亚洲人在线视频| 欧美先锋影音| 欧美一区二区免费| 韩国一区二区三区在线观看| 蜜臀久久99精品久久久久久9| 欧美一区二区三区的| 国产精品伦理| 久久精品青青大伊人av| 亚洲高清不卡在线| 欧美日韩精品免费观看| 亚洲小视频在线| 国产日韩欧美中文| 老司机aⅴ在线精品导航| 亚洲人成网站影音先锋播放| 欧美午夜激情视频| 欧美一级淫片播放口| 极品中文字幕一区| 欧美福利专区| 香蕉久久a毛片| 亚洲国产精品www| 国产精品久久久久9999| 久久久久久夜精品精品免费| 亚洲激情在线激情| 国产精品久久久久久超碰| 久久久久久亚洲精品中文字幕| 亚洲第一福利社区| 国产精品欧美风情| 噜噜噜躁狠狠躁狠狠精品视频| av成人免费观看| 国产主播喷水一区二区| 欧美大片一区二区| 久久成人免费视频| 亚洲一区制服诱惑| 亚洲国产欧美国产综合一区| 欧美午夜精品一区| 欧美a级片网| 久久精品亚洲精品| 9久草视频在线视频精品| 韩日午夜在线资源一区二区| 欧美三日本三级少妇三2023| 久久一区二区三区国产精品 | 欧美国产欧美综合| 亚洲无玛一区| 美女主播精品视频一二三四| 久久久久国色av免费看影院| 国产精品一区二区三区久久久| 免费在线欧美视频| 欧美在线免费一级片| 亚洲婷婷在线| 99这里只有精品| 在线看一区二区| 国产亚洲在线| 亚洲日韩视频| 亚洲高清在线| 在线看成人片|