环境

在uboot中分析emmc初始化流程代码,emmc在uboot中方便添加命令和打印调试,uboot版本:2017.03

开机打印

uboot启动打印

 U-Boot 2017.03-g101318f (Jan 09 2019 - 17:37:10 +0800)CPU:   Freescale i.MX6UL rev1.2 696 MHz (running at 396 MHz)CPU:   Automotive temperature grade (-40C to 125C) at 58CReset cause: WDOGModel: Freescale i.MX6 UltraLite 14x14 EVK BoardBoard: MX6UL 14x14 EVKDRAM:  256 MiBSF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiBHardware version: 0x0401MMC:   board_mmc_initCONFIG_MX6UL_14X14_EVK_EMMC_REWORKFSL_SDHC: 0Using default environmentSF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiBIn:    serialOut:   serialErr:   serialSF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiBNet:   eth1: ethernet@020b4000, eth0: ethernet@02188000 [PRIME]Normal BootHit any key to stop autoboot:  0 

内核启动打印

 mmc1: new DDR MMC card at address 0001mmcblk1: mmc1:0001 P1XXXX 7.20 GiB mmcblk1boot0: mmc1:0001 P1XXXX partition 1 16.0 MiBmmcblk1boot1: mmc1:0001 P1XXXX partition 2 16.0 MiBmmcblk1rpmb: mmc1:0001 P1XXXX partition 3 128 KiBmmcblk1: p1 p2

启动参数

 => pribaudrate=115200board_name=EVKboard_rev=14X14boot_fdt=trybootcmd=run kernel_env;if test ${default_image} = system1; then echo Booting from ${default_image}......;sf probe 0; sf read ${itb_addr} 0x90000 0xF30000; bootm ${itb_addr}; fi;if test ${default_image} = system2; then echo Booting from ${default_image}......;sf probe 0; sf read ${itb_addr} 0xFC0000 0xF30000; bootm ${itb_addr}; fi; bootdelay=1console=ttymxc0default_image=system1eth1addr=08:ed:02:37:10:02ethact=ethernet@02188000ethaddr=08:ed:03:37:10:02ethprime=eth0fdt_addr=0x83000000fdt_file=undefinedfdt_high=0xfffffffffdtcontroladdr=8ef58068initrd_high=0xffffffffip_dyn=yesitb_addr=0x86800000kernel_env=setenv bootargs initrd=0x84800000,0x2000000 init=/etc/preinit console=${console},115200 root=/dev/ram0 ro rootfstype=ext4 image=${default_image} cma=64M mtdparts=21e0000.qspi:512k(uboot),64k(boardcfg),15552k(system1),15552k(system2),1024k(rootfs_data),60k(crashlog),4k(flags)loadaddr=0x80800000

EMMC信息

 => mmcinfo Device: FSL_SDHCManufacturer ID: feOEM: 14eName: P1XXX Tran Speed: 52000000Rd Block Len: 512MMC version 4.5High Capacity: YesCapacity: 7.2 GiBBus Width: 8-bitErase Group Size: 512 KiBHC WP Group Size: 8 MiBUser Capacity: 7.2 GiBBoot Capacity: 16 MiB ENHRPMB Capacity: 128 KiB ENH

EMMC初始化代码分析

emmc初始化函数

 struct mmc *mmc;        定义一个结构体指针mmc = init_mmc_device(curr_device, false);struct mmc *mmc;    定义一个结构体指针mmc = find_mmc_device(dev);   返回一个全局静态结构体地址:static struct mmc mmc_static;return &mmc_static;mmc_init(mmc)return mmc;mmc_init(struct mmc *mmc)  mmc_start_init(mmc);mmc_power_init(mmc);mmc->ddr_mode = 0;mmc_set_bus_width(mmc, 1);mmc_set_clock(mmc, 1);/* Reset the Card */err = mmc_go_idle(mmc);struct mmc_cmd cmd;#define MMC_CMD_GO_IDLE_STATE      0cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;cmd.cmdarg = 0;cmd.resp_type = MMC_RSP_NONE;err = mmc_send_cmd(mmc, &cmd, NULL);mmc->cfg->ops->send_cmd(mmc, cmd, data);

probe探测函数,文件fsl_esdhc.c,赋值操作函数指针。

 static const struct mmc_ops esdhc_ops = {.send_cmd = esdhc_send_cmd,.set_ios  = esdhc_set_ios,.init      = esdhc_init,.getcd        = esdhc_getcd,};   static const struct udevice_id fsl_esdhc_ids[] = {{ .compatible = "fsl,imx6ul-usdhc", },    fsl_esdhc_probefsl_esdhc_init(priv);struct mmc *mmc;memset(&priv->cfg, 0, sizeof(priv->cfg));priv->cfg.name = "FSL_SDHC";priv->cfg.ops = &esdhc_ops;【怎么与mmc里面的mmc->cfg->ops对应?见下面】mmc = mmc_create(&priv->cfg, priv);struct mmc *mmc = &mmc_static;mmc->cfg = cfg;    等同于mmc->cfg = priv->cfgmmc->priv = priv;return mmc;              priv->mmc = mmc;

dts表配置

 arch/arm/dts/imx6ul.dtsi    usdhc2: usdhc@02194000 {compatible = "fsl,imx6ul-usdhc", "fsl,imx6sx-usdhc";reg = <0x02194000 0x4000>;interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_USDHC2>,<&clks IMX6UL_CLK_USDHC2>,<&clks IMX6UL_CLK_USDHC2>;clock-names = "ipg", "ahb", "per";bus-width = <4>;status = "disabled";};arch/arm/dts/imx6ul-14x14-evk.dts    &usdhc2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_usdhc2_8bit>;bus-width = <8>;non-removable;status = "okay";};

uboot启动到emmc初始化流程

common/board_r.c#ifdef CONFIG_GENERIC_MMCstatic int initr_mmc(void){puts("MMC:   ");mmc_initialize(gd->bd);return 0;}#endif drivers/mmc/mmc.cmmc_initializemmc_probe(bis);board_mmc_init(bis)cpu_mmc_init(bis);fsl_esdhc_mmc_init   mmc_do_preinit();struct mmc *m = &mmc_static;mmc_start_init(m);board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.cboard_mmc_initprintf("board_mmc_init\n");fsl_esdhc_initialize(bis, &usdhc_cfg[i]);drivers/mmc/fsl_esdhc.c        fsl_esdhc_initialize    fsl_esdhc_init(priv)fsl_esdhc_mmc_init  fsl_esdhc_initialize    

IMX6UL eMMC初始化流程相关推荐

  1. SD/eMMC初始化流程、读写流程(dwc mshc)

    目录 1.芯片简介 1.1 模块与接口 1.2 SD/eMMC初始化流程 1.3 SD/eMMC数据传输流程 1.3.1 传输模式 2.调试问题 2.1 uboot 2.1.1 连续读4个以上bloc ...

  2. imx6ul 时钟初始化流程

    1,查看 dtsi 设备树找到 clock : clocks {#address-cells = <1>;#size-cells = <0>;ckil: clock@0 {co ...

  3. Linux内核网络栈1.2.13-网卡设备的初始化流程

    参考资料 <<linux内核网络栈源代码情景分析>> 网卡设备的初始化 本文主要描述一下网卡设备的整个初始化的过程,该过程主要就是根据设备的硬件信息来获取与传输网络数据,注册相 ...

  4. 开机流程简介--init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

    init 处理系统初始化流程 (/etc/rc.d/rc.sysinit) 还记得上面提到 /etc/inittab 里头有这一句' si::sysinit:/etc/rc.d/rc.sysinit ...

  5. 关于Flutter初始化流程,我必须告诉你的是...

    作者:闲鱼技术-然道 1. 引言 最近在做性能优化的时候发现,在混合栈开发中,第一次启动Flutter页面的耗时总会是第二次启动Flutter页面耗时的两倍左右,这样给人感觉很不好.分析发现第一次启动 ...

  6. SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

    我们启动web服务器,在浏览器中输入地址,就可以看到浏览器上输出我们写好的页面.为了更好的理解上面这个过程,你需要学习关于Servlet生命周期的三个阶段,就是所谓的"init-servic ...

  7. 深入分析 Flutter 初始化流程

    在调研 Flutter 动态化方案的时候,需要了解 Flutter 加载 dart 产物的流程,阅读了一部分源码,顺便也读了初始化相关的代码.于是梳理了一遍 Flutter 的初始化流程 flutte ...

  8. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  9. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

    深度学习 Caffe 初始化流程理解(数据流建立) 之前在简书的文章,搬迁过来 ^-^ 本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处. #Caffe FeatureMap数据流的建 ...

最新文章

  1. pytorch统计矩阵非0的个数_PyTorch常见的12坑
  2. 示波器触发模式及其使用
  3. Docker使用自定义网络实现容器互联
  4. lvm的备份还原及修改UUID
  5. java 构造方法
  6. Conan and Agasa play a Card Game
  7. maven依赖avro_如何使用maven进行avro序列化
  8. CTO 和你唠唠,这 7 个团队都在干啥 | 神策招人记
  9. 面向对象和面向过程连接数据库
  10. Android—Navigation的使用
  11. PL SQL导入导出sql/dmp文件
  12. ojdbc14_g.jar与ojdbc14.jar区别
  13. 可重入函数 与线程安全的区别与联系
  14. 布隆过滤器 redis_redis位图-布隆过滤器
  15. 前端学HTTP之网络基础
  16. 膜拜 丹尼斯·里奇(纪念 C 语言之父离世 6 周年) 我们欠他的不止是张电影票
  17. Mac下解压bin文件
  18. 王家林大数据资源共享
  19. idea 修改项目名称的方法
  20. 【Linux】scp命令基本使用

热门文章

  1. 基于jsp的诗歌诗词国学网站
  2. GIS原理篇 TIN 不规则三角网
  3. 【USACO DEC09】音乐节拍
  4. android仿喜马拉雅APP状态栏,一个模仿企鹅 FM 界面的 Android 应用—喜马拉雅Kotlin。完全使用 Kotlin 开发。...
  5. python课堂笔记手抄图片_读书手抄报简单又漂亮_读书手抄报内容图片
  6. 使用pyqt5制作自己的图像处理软件
  7. 系统清理工具:iBoostUp for Mac
  8. Android开发蓝牙操作
  9. 评价指标reacll@10,mrr@10,ndcg@10,hit@10的含义
  10. 操作系统学习总结-第三章