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等设备上读出程序、运行程序。
- 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个问题。 - 10模式下既可以通过eFUSE的值也可以通过GPIO的值来选择启动设备,但是到底通过谁来决定?eFUSE中有一个值BT_FUSE_SEL,它的初始值为0,表示eFUSE未被烧写。在10模式下,当BT_FUSE_SEL为0时通过GPIO来启动设备,为1时通过eFUSE来选择启动设备。在开发中,我们选择用GPIO启动设备。
- 如何通过eFUSE或GPIO选择、设置启动设备?
设置启动设备时因为 Nand Flash 参数不同,有些页1024个字节,有些页 4096个字节,所以 boot ROM程序读Nand Flash的方法也不同, 我们要把这些页参数告诉 boot ROM。
100ASK_IMX6ULL启动方式选择


imx6ull驱动流程
- 如果设置为SD/TF卡启动,boot ROM把程序从SD/TF读出来,并初始化
- 读到内存即DDR去,需要初始化内存
- 可能要初始化时钟,目的是让CPU跑得更快
IMX6ULL映像文件
程序的二进制版本,比如lcd.bin可以直接烧写到Flash上。它们是自启动的,比如以上电,就会初始化内存,把自己从FLASH复制到内存上去。是自己把自己复制到内存。
但是对于IMX6ULL,烧写在EMMC、SD/TF卡上的程序,并不能“自己复制自己”,是“别人把它复制到内存里”。一上电首先运行的是boot ROM上的程序,它从EMMC、SD/TF卡上把程序复制进内存里。
IMX6ULL支持各种启动设备,比如各种Nor Flash。为了通用,boot ROM程序将会使用最保守的参数,也就是最慢的时序来访问Nor Flash。为加快启动程序,boot ROM程序可以根据我们提供的信息初始化硬件,让它以更优的参数运行。

制作映像文件的目的

步骤:
- 确定入口地址
- 确定映像文件在内存中的起始地址
- 确定IVT在内存中的地址self
- 确定Boot data在内存中的的地址boot_data
- 确定DCD在内存中的地址dcd
- 写入DCD的数据
- 写入用户程序
- 烧入启动设备,如EMMC,sd
映像文件烧写、运行

















