说明:
SDR的意思是Single Data Rate(单边数据采样,换句话说就是,要么上升沿采样,要么下降沿采样);DDR的意思是Double Data Rate(双边数据采样,换句话说,双边沿采样)。
1.4 TF卡工作原理
1.4.1 EVB-P6UL TF卡硬件设计
EVB-P6UL的TF卡硬件设计兼容SD 3.0标准,即支持SDXC与SDHC,原理图1-3所示。
TF卡的默认工作电压为3.3V,通过设置IO脚“SD1_VSELECT”的电平(控制2KS3018是否导通改变FB脚的电阻阻值),从而设置RT9043GB的反馈电压,最终调节输出电压(RT9043GBVout)。RT9043GB的输出电压与FB脚上电阻有关,相关的计算公式如图1-4所示。电阻已经选定,设置“SD1_VSELECT”为高电平即可输出1.8V。
2 tf卡及EMMC启动
2.1 tf卡及EMMC启动原理
I.MX6UL根据BOOT_MODE0和BOOT_MODE1配置不同,分为如下四种启动方式.
Fuses启动模式 (BOOT_MODE[1:0] = 00b)
当BOOT_MODE[1:0]寄存器为00b是,选择为从Fuses模式下启动。该模式和内部启动模式很相似,只是有一点不同:在此模式下,GPIO启动(internal boot 内部启动)重载引脚会被忽略。
内部启动模式 (BOOT_MODE[1:0] = 0b10)
BOOT_MODE[1:0]寄存器的值为0b10时,选择为内部启动模式。在此模式下,处理器继续执行内部的启动代码。启动代码执行硬件初始化,从选择的启动设备中加载程序镜像,使用HAB执行镜像有效性检查,然后跳到程序镜像地址处。如果在内部启动中出项任何错误,启动代码就会跳到串行下载器。
内部启动模式一般只用于产品的开发阶段,因为此模式要占用大量的GPIO资源,而这些GPIO是EIM中关键的数据和地址控制线。在Fuses启动模式下,一旦这些eFuses被烧录,均不能被重擦修改,显而易见的是后者不利于开发中的摸索尝试(一旦出现错误,我们甚至要考虑更换CPU)。在开发阶段,我们使用跳线来配置efuses,然后我们调试测试,直至其稳定后,在最终的产品中,使用和跳线配置相对的eFuses值来烧录fuse,最终可将这些GPIO上的跳线去除,而用于一般用途。
下载模式 (BOOT_MODE[1:0] = 0b01)
该模式下,i.mx6ul处于下载模式,可以通过mfgtools工具对i.mx6ul的存储媒质进行烧写.
EVB-P6UL支持4种存储媒质的启动,分别是SD/TF卡启动、NAND启动、eMMC启动和QSPI启动(分为不同的四类产品,根据客户选择核心模块的不同),通过对BT_CFG1、BT_CFG2和BT_CFG4三组信号来配合设置来改变启动媒质,除了BT_CFG4之外,其他两组信号BT_CFG1和BT_CFG2直接影响启动模式选择(BT_CFG1+BT_CFG2+BT_CFG4等于24位LCD信号),整个启动配置如下图2-1、图2-2所示:
而根据EVB-P6UL评估板原理图里面对BOOT的选择,只设置了几个信号来供用户进行配置选择,其他都已经被强制拉高或拉低,原理设计如图2-3所示。
因EVB-P6UL采取了internal boot mode,所以,这些配置的gpio起到了关键作用,直接决定了启动模式的选择,TF卡关于信号的配置(启动电阻)说明参考如图2-4、图2-5所示:
说明:目前只操作了普速卡。如若把BOOT_DFG2[1]设为1,GPIO_IO5设为1,VDD_SD1输出3.3V,板子可以正常启动。
缺陷:当操作高速卡时,即把BOOT_DFG2[1]设为1,GPIO1_IO5为0,VDD-SD1输出为1.8V,终端会打印信息提示提供电压不足,详见附录2。
2.1 tf卡启动原理及实现
我们刚刚交代了tf卡(接到端口uSDHC1)和emmc(接到端口uSDHC2)启动的原理,为了更改为TF卡启动,我们必须去更改配置电阻,那么是否有更好的办法实现TF卡启动呢?经过我们仔细查看相关手册,我们发现,在Fuses启动(BOOT_MODE[1:0] = 00b)这个模式下,默认的启动就是从uSDHC1启动:
3软件支持
要把板子跑起来,无非就是包括U-boot、dtb、Kernel和跟文件系统均写入正确,此次TF启动只修改U-boot和dtb的部分代码。
3.1 U-boot
u-boot如果要支持TF卡启动,则启用USDHC1,注释USDHC2。修改uboot-imx/include/configs/mx6ul_arm2.h,修改后如下图3-1。
然后,修改
uboot-imx/board/freescale/mx6ul_14x14_ddr3_arm2/mx6ul_14x14_ddr3_arm2.c将USDHC1设为高电平。如图3-2所示。
3.2 内核
EVB-P6UL采用3.14.38版本的Linux内核,驱动描述使用dts。因存储媒质及应用接口不同,对应的dtb也不同,EVB-P6UL评估板主要有5路UART(双网络)和8路UART(单网络)两种,另外有使能CAMERA接口产品等,为了便于管理这些dtb文件,我们采用关键字区别法来区别。例如:“CSI”、“UART”、“RES”、“CAP”来判定应该烧写那个dtb,命名规则举例说明:
evbp6ul-m256f512-res-8uarts.dtb:
m256,即memory 256MB;f512,即Nand Flash 512MB;res,电阻式触摸屏;8uarts,8路UART(单网络)。
evbp6ul-m256s64-res-5uarts.dtb:
m256,即memory 256MB;s64表示QSPI Nor Flash为64M;res表示电容式触摸屏;5uarts
表示5路UART(双网络)。
evbp6ul-m256e2g-cap-5uarts.dtb:
m256,即memory 256MB;e2g表示emmc Flash为2G;cap表示电容式触摸屏;5uarts表示5路UART(双网络)。
说明:选择正确的dtb才能使板子正常工作,具体可看/fsl-release-bsp/Makefile,然后选择对应的dtb编译。
确认dts中usdhc1(EVB-P6UL硬件设计usdhc1为TF卡)的驱动描述,如下图3-3、图3-4、图3-5所示。
代码清单如下:
&usdhc1 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc1>;
pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
cd-gpios = <&gpio1 19 0>;
keep-power-in-suspend;
enable-sdio-wakeup;
vmmc-supply = <®_sd1_vmmc>;
status = "okay";
};
代码清单如下:
reg_sd1_vmmc: regulator@1 {
compatible = "regulator-fixed";
regulator-name = "VSD_3V3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
enable-active-high;
};
代码清单如下:
pinctrl_usdhc1: usdhc1grp {
fsl,pins = <
MX6UL_PAD_SD1_CMD__USDHC1_CMD 0x17059
MX6UL_PAD_SD1_CLK__USDHC1_CLK 0x10071
MX6UL_PAD_SD1_DATA0__USDHC1_DATA0 0x17059
MX6UL_PAD_SD1_DATA1__USDHC1_DATA1 0x17059
MX6UL_PAD_SD1_DATA2__USDHC1_DATA2 0x17059
MX6UL_PAD_SD1_DATA3__USDHC1_DATA3 0x17059
>;
};
pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
fsl,pins = <
MX6UL_PAD_SD1_CMD__USDHC1_CMD 0x170b9
MX6UL_PAD_SD1_CLK__USDHC1_CLK 0x100b9
MX6UL_PAD_SD1_DATA0__USDHC1_DATA0 0x170b9
MX6UL_PAD_SD1_DATA1__USDHC1_DATA1 0x170b9
MX6UL_PAD_SD1_DATA2__USDHC1_DATA2 0x170b9
MX6UL_PAD_SD1_DATA3__USDHC1_DATA3 0x170b9
>;
};
pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
fsl,pins = <
MX6UL_PAD_SD1_CMD__USDHC1_CMD 0x170f9
MX6UL_PAD_SD1_CLK__USDHC1_CLK 0x100f9
MX6UL_PAD_SD1_DATA0__USDHC1_DATA0 0x170f9
MX6UL_PAD_SD1_DATA1__USDHC1_DATA1 0x170f9
MX6UL_PAD_SD1_DATA2__USDHC1_DATA2 0x170f9
MX6UL_PAD_SD1_DATA3__USDHC1_DATA3 0x170f9
>;
};
4 TF卡启动Linux
EVB-P6UL可选用MfgTools或Linux主机(PC,x86平台)烧录TF卡。Linux内核镜像包括u-boot、zImage、DTB和根文件系统。u-boot裸写到TF卡,zImage与DTB存储到u-boot之后的FAT分区,根文件系统存储到内核分区之后的ext3/ext4分区。
以下两节,将分别介绍Linux主机和MFGTools制作TF。
4.1Linux主机制作TF卡
Linux主机制作TF卡,使用脚本完成。步骤如下:
1、将p6ultfboot.tar.bz2复制到Linux主机,并解压,指令如下
$tar -jxf p6ultfboot.tar.bz2
解压后得到图4-1所示的文件:
其中,mksdcard.sh为制作TF卡的脚本文件;rootfs-p6ul-mmc.tar为根文件系统,该文件根据需要替换,文件名为格式rootfs*.tar;sdboot目录下的u-boot.imx、zImage、evbp6ul.dtb分别为u-boot、内核镜像和dtb文件。
2、使用root用户(权限)执行制作脚本createSdcard.sh
$ sudosh createSdcard.sh
提示选择设备号时,根据实际情况输入“#”所在列的数值。若同时有多个TF卡,设备号与设备对应(name对应的列),制作TF卡时不建议同时插入多张卡。如图4-2所示。
提示重分区是,输入“y”。如图4-3所示。
当制作完成,显示如图4-4所示信息。
说明:除了图4-4所提示的信息,还应查看脚本执行的所有信息是否有错误提示。
4.2 MfgTools烧录TF卡
使用MfgTools制作TF启动卡的步骤如下:
MfgTools的烧录脚本分为QT与无QT两种,分别如下:
mfgtool2-linux-mx6ul-console-sd (无QT)
mfgtool2-linux-mx6ul-qt4-sd (QT4.8)
1、拨码开关SW5切换至下载模式(Serial Downloader),连接电源、debug console、USB device接口(CN11)。上电,运行烧录脚本(例如,mfgtool2-linux-mx6ul-console-sd),当USB device连接成功后插入TF卡,USB device与PC连接成功,MfgTools出现“HID-compliant device”,如图4-5所示。
说明:由于启动设备优先级的原因,TF卡需在MfgTools连接成功后安装,否则出现MfgTools不连接的现象,如图4-6所示。若不了解接线以及拨码开关的使用,请参考产品开发光盘中《EVB-P6UL linux系统烧录手册》。
2、点击MfgTools的“start”按钮开始烧录,此时debug console(用超级终端、putty此类软件查看)打印Linux系统启动、烧录等信息。当弹出如图4-7的格式化对话窗时,cancel或关闭。
3、烧录完成,弹出图4-8窗口。
4、断电,拨码开关切换至“00”(Boot From Fuses),从TF卡引导Linux。
说明:关于i.MX6UL从TF卡引导的介绍,参考附录1。