1.芯片手册讲解

IMX6ULL芯片内部有一个boot ROM,上电后boot ROM上的程序就会运行。它会根据BOOT_MODE[1:0]的值,以及eFUSE或GPIO的值决定后续的启动流程。
注:eFUSE即熔丝,只能烧写一次,一般正式发布产品时烧写最终值;平时调试时通过GPIO来设置开发板的启动方式。
boot ROM上的程序功能强大,可以从USB口或串口下载程序并把它烧写到Flash等设备上,也可以从SD卡或EMMC、Flash等设备上读出程序、运行程序。
boot ROM上的程序功能强大,可以从USB口或串口下载程序并把它烧写到Flash等设备上,也可以从SD卡或EMMC、Flash等设备上读出程序、运行程序。

  1. boot ROM从哪里读出由谁决定
    由BOOT_MODE[1:0]的值来决定启动方式,它们来自于2个引脚BOOT_MODE1、BOOT_MODE0。这2个引脚在上电时是输入引脚,芯片启动后采集这2个引脚的值,存入BOOT_MODE寄存器。以后这2个引脚就可以用于其他功能,不会影响到BOOT_MODE寄存器。

    01模式,boot ROM程序通过USB或串口下载、运行程序,这个模式可以用来烧写EMMC等设备。我们的开发板出厂时,就是通过这个模式下载、烧写出厂程序的。
    10模式,称之为内部模式,简单地说就是从SD卡、EMMC等设备启动程序。这就引入下面第2个问题。
  2. 10模式下既可以通过eFUSE的值也可以通过GPIO的值来选择启动设备,但是到底通过谁来决定?eFUSE中有一个值BT_FUSE_SEL,它的初始值为0,表示eFUSE未被烧写。在10模式下,当BT_FUSE_SEL为0时通过GPIO来启动设备,为1时通过eFUSE来选择启动设备。在开发中,我们选择用GPIO启动设备。
  3. 如何通过eFUSE或GPIO选择、设置启动设备?
    设置启动设备时因为 Nand Flash 参数不同,有些页1024个字节,有些页 4096个字节,所以 boot ROM程序读Nand Flash的方法也不同, 我们要把这些页参数告诉 boot ROM。

100ASK_IMX6ULL启动方式选择

imx6ull无法从emmc启动_引脚


imx6ull无法从emmc启动_引脚_02

imx6ull驱动流程

  1. 如果设置为SD/TF卡启动,boot ROM把程序从SD/TF读出来,并初始化
  2. 读到内存即DDR去,需要初始化内存
  3. 可能要初始化时钟,目的是让CPU跑得更快

IMX6ULL映像文件

程序的二进制版本,比如lcd.bin可以直接烧写到Flash上。它们是自启动的,比如以上电,就会初始化内存,把自己从FLASH复制到内存上去。是自己把自己复制到内存。

但是对于IMX6ULL,烧写在EMMC、SD/TF卡上的程序,并不能“自己复制自己”,是“别人把它复制到内存里”。一上电首先运行的是boot ROM上的程序,它从EMMC、SD/TF卡上把程序复制进内存里。

IMX6ULL支持各种启动设备,比如各种Nor Flash。为了通用,boot ROM程序将会使用最保守的参数,也就是最慢的时序来访问Nor Flash。为加快启动程序,boot ROM程序可以根据我们提供的信息初始化硬件,让它以更优的参数运行。

imx6ull无法从emmc启动_初始化_03

制作映像文件的目的

imx6ull无法从emmc启动_嵌入式_04


步骤:

  1. 确定入口地址
  2. 确定映像文件在内存中的起始地址
  3. 确定IVT在内存中的地址self
  4. 确定Boot data在内存中的的地址boot_data
  5. 确定DCD在内存中的地址dcd
  6. 写入DCD的数据
  7. 写入用户程序
  8. 烧入启动设备,如EMMC,sd

映像文件烧写、运行

imx6ull无法从emmc启动_初始化_05