万事开头难 - 介绍IMX6ULL启动方式
不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要。若不了解清楚启动方式,后面的所有开发工作便无从谈起。
本文摘自100ask_imx6ull 开发板 配套学习手册-《嵌入式Linux应用开发完全手册_韦东山全系列视频文档全集V2.5》.pdf
1.1 IMX6ULL 启动方式
参考资料:
开发板资料网盘
路径:
06_Datasheet(数据手册)
-> Core_board->CPU->IMX6ULLRM.pdf”
中《Chapter 8: System Boot》。
网盘地址:
100ASK_IMX6ULL
链接:
1.1.1芯片手册讲解
IMX6ULL芯片内部有一个boot ROM,上电后boot ROM上的程序就会运行。它会根据BOOT_MODE[1:0]的值,以及eFUSE或GPIO的值决定后续的启动流程。
注:eFUSE即熔丝,只能烧写一次,一般正式发布产品时烧写最终值;平时调试时通过GPIO来设置开发板的启动方式。
boot ROM上的程序功能强大,可以从USB口或串口下载程序并把它烧写到Flash等设备上,也可以从SD卡或EMMC、Flash等设备上读出程序、运行程序。
问题来了:
① boot ROM是从USB口下载、运行程序,还是从SD卡等设备上读出、运行程序,这由谁决定?
由BOOT_MODE[1:0]的值来决定启动方式,它们来自于2个引脚BOOT_MODE1、BOOT_MODE0。这2个引脚在上电时是输入引脚,芯片启动后采集这2个引脚的值,存入BOOT_MODE寄存器。以后这2个引脚就可以用于其他功能,不会影响到BOOT_MODE寄存器。
BOOT_MODE[1:0]的值确定了4种启动模式,如下图:
BOOT_MODE
在100ASK_IMX6ULL中,这2个引脚对应的原理图如下:
原理图
00模式, 在我们的开发过程中很少用到,简单介绍一下:在这种模式下,GPIO的值被忽略。Boot ROM会根据eFUSE的值来选择启动设备、设置启动设备。但是,对于刚出厂的芯片eFUSE值可能是错乱的、不适合你的设备的,怎么办?eFUSE中有一个值BT_FUSE_SEL,它的出厂值是0,表示eFUSE未被烧写。
boot ROM程序发现BT_FUSE_SEL为0时,它会通过USB或串口来下载程序;发现BT_FUSE_SEL为1时,才会根据eFUSE的值选择启动设备,读出、运行该设备上的程序。
01模式,boot ROM程序通过USB或串口下载、运行程序,这个模式可以用来烧写EMMC等设备。我们的开发板出厂时,就是通过这个模式下载、烧写出厂程序的。
10模式,称之为内部模式,简单地说就是从SD卡、EMMC等设备启动程序。这就引入下面第2个问题。
② 如何选择启动设备?
00模式下是通过eFUSE的值选择启动设备,我们不关心。
10模式下既可以通过eFUSE的值也可以通过GPIO的值来选择启动设备,但是到底通过谁来决定?eFUSE中有一个值BT_FUSE_SEL,对,又是它。它的初始值为0,表示eFUSE未被烧写。
在10模式下,当BT_FUSE_SEL为0时就会通过GPIO来选择启动设备;当BT_FUSE_SEL为1时就会通过eFUSE来选择启动设备。
在开发阶段,我们使用GPIO来选择设备,这就引入下面第3个问题。
③ 如何通过eFUSE或GPIO选择、设置启动设备?
通过eFUSE或GPIO不仅能选择启动设备,还可以设置启动设备。为什么还需要设置?比如Nand Flash参数各有不同,有些的页大小是2048,有些是4096。这些参数不同,boot ROM程序读Nand Flash的方法就不同,我们必须把这些参数告诉boot ROM:通过eFUSE或GPIO来标明这些参数。
首先看看要设置哪些eFUSE或GPIO来选择不同的启动设备。
BOOT_CFG1设置
从上图可知,既可以使用eFUSE也可以使用GPIO来选择启动设备,换句话说GPIO可以覆盖eFUSE的值。
哪些GPIO覆盖哪些eFUSE?
这可以查看IMX6ULL芯片手册《Chapter 8: System Boot》里的《GPIO boot overrides》,我们把它摘出来放在1.1.3小节里。
选择启动设备后,还需要标明一些参数。比如选择EMMC启动时,EMMC接在哪一个接口,eSDHC1还是eSDHC2?它的速度如何?比如选择TF卡启动时,TF卡接在哪一个接口,eSDHC1还是eSDHC2?它的速度如何?
假设使用EMMC启动,或是TF卡启动,怎么设置eFUSE或GPIO?这些信息可以查询IMX6ULL芯片手册《Chapter 5: Fusemap》,摘录如下。
Fusemap
当BOOT_MODE设置为0b00时,通过eFUSE选择启动设备,通过eFUSE获得设备的参数。
当BOOT_MODE设置为0b10时,通过eFUSE或GPIO来选择启动设备,获得设备的参数;使用eFUSE还是GPIO由eFUSE中的BT_FUSE_SEL决定,它默认是0,表示使用GPIO。
以BOOT_MODE为0b10为例,解析一下上图。要设置为SD卡、TF卡启动,有2个设置方法:
a. 设置eFUSE的BOOT_CFG1[7:5]为0b010,
或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG1[7:5]对应的GPIO为LCD1_DATA07~05,把这3个引脚设置为0b010。
根据SD卡、TF卡的性能,可以设置eFUSE或GPIO来表示它能否提供更高的速度:
a. 设置eFUSE的BOOT_CFG1[4:0],
或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG1[4:0]对应的GPIO为LCD1_DATA04~00,设置这些引脚。
IMX6ULL有两个SD卡、TF卡接口,使用哪一个接口?请看下表:
a. 设置eFUSE的BOOT_CFG2[4:3]可以确定使用eSDHC1或eSDHC2,
或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG2[4:3]对应的GPIO为LCD1_DATA12~11,设置这些引脚
BOOT_CFG
通过eFUSE或GPIO,还可以标明启动设备的更多参数,具体细节可以参考芯片手册《Chapter 5: Fusemap》,作为硬件开发人员需要去细细研究;作为软件开发人员,实际上只需要看开发板手册知道怎么设置启动开关即可。
1.1.2 IMX6ULL启动方式选择
100ASK_IMX6ULL开发板上的红色拨码开关用来设置启动方式、选择启动设备,支持这3种方式:EMMC启动、SD卡启动、USB烧写。
板子背后画有一个表格,表示这3种方式如何设置。
表格如下:
表格
拔码开关中的SW3、SW4用来设置BOOT_MODE,ON表示0,OFF表示1。
所以当SW3、SW4设置为ON、OFF时,BOOT_MODE为0b10,将会使用SD卡、TF卡、EMMC等设备启动。
刚出厂的开发板中BT_FUSE_SEL默认为0,表示使用GPIO来设置参数。即使用LCD1_DATA07~05来选择启动设备。
100ASK_IMX6ULL开发板只支持SD/TF卡、EMMC启动,LCD1_DATA07~05为0b010时选择SD/TF卡启动,LCD1_DATA07~05为0b011时选择EMMC启动。
这两种启动设备对应的LCD1_DATA07~06的值相同,都是0b01,这在核心板上已经通过电阻设置好,我们只需要在拨码开关上设置SW1(对应LCD1_DATA05)就可以。
IMX6ULL上有2个EMMC Flash接口,也复用为2个SD/TF卡接口,通过LCD1_DATA12~11来选择接口。
0b00对应eSDHC1接口,0b01对应eSDHC2接口。LCD1_DATA12的值在核心板上已经通过电阻设置好。
LCD1_DATA11的值通过拨码开关SW2来设置:ON表示0,对应eSDHC1接口,100ASK_IMX6ULL的TF卡接口使用了eSDHC1接口;OFF表示1,对应eSDHC2接口,100ASK_IMX6ULL的EMMC接口使用了eSDHC2接口。
这3种启动方式的设置示意图如下:
要注意的是,设置为USB启动时,不能插上SD卡、TF卡。刚出厂的板子在EMMC上烧写了系统,你可以设置为EMMC启动方式。
1.1.3 GPIO boot overrides
IMX6ULL中既可以通过eFUSE也可以通过GPIO来选择、设置启动设备,在手册里大部分场合只列出了eFUSE,对应的GPIO需要查表:IMX6ULL芯片手册《Chapter 8: System Boot》里的《GPIO boot overrides》。
我们把它摘录出来。
总结
整篇读下来,概念有点多,你可能会感觉有点抽象,其实现在不理解启动方式原理没关系,现在只要记住《3种启动方式的设置示意图》即可,清楚怎么拨码对应什么启动方式,原理留到后期再研究也行。
精品推荐
文中提到的100ask_imx6ull,是用来学习嵌入式Linux的不错选择,0利润,外设丰富,一千多页文档,一百多讲视频,开源共享,如有兴趣,可以手淘扫码了解开发板的更多参数: