iMX6ULL SD卡系统制作与启动¶
鉴于之前玩的 MT7688A 已经停产并且模块断货,最近把目光投向一款新芯片:iMX6ULL,因为其起点价格在接受范围,最低配置的核心板价格在百元以内,128M+128M 足够跑我的OpenThread网关,通用芯片该有的功能都有,按功能来算的话比 MT7688A 性价比还高。
拿到开发板,目标是跑 OpenWRT + OpenThread 网关,MQTT/MQTT-SN 或者 LWM2M 服务,把手上一堆传感器、控制器接上,不依赖外部服务运行。
原装系统运行在 nand 上,不方便折腾,于是准备用 SD 卡启动的方式,修改起来很简单,热风枪把一个配置电阻换个位置。
由于还不熟悉此板卡 uboot,内核的编译,暂时先用着随板带的固件。
写入uboot¶
uboot 固件使用 uboot-myimx6ek140-6y-256m-nand.imx,imx 文件格式在这里有个比较详细的介绍:https://www.cnblogs.com/Lioker/p/13219519.html。芯片启动时内部 ROM 程序会按 imx 文件格式从 SD 卡的 0x400 地址加载相关配置,并且启动。
所以我们要以以下命令将 uboot 写入sd卡:
1 |
|
上面的命令含义是以 1k 的块大小写入,并且跳过第一个块(第一个块一般为分区表);详细解说可以参考 i.MX_Linux_User's_Guide.pdf 4.3 章节以及上面关于 imx 格式的文章。
顺便吐槽一下国内某些卖开发板的,文档就只是一堆关于软件使用,脚本运行,却完全不涉及这么操作的原理
SD卡分区,烧写文件¶
如果平时用的是 Linux 系统,SD 卡的分区就简单一点,分两个区,一个 fat32 格式用来放内核文件以及设备树(不确定为何要 fat32,看自带的 uboot 是已经支持 ext4 ),一个选一个你喜欢的格式,用来放根目录;可以按官方推荐的分区方式:
- 前面 10MB 空出来,因为要留给 uboot
- 10MB 开始,分 500MB 格式化成 FAT32 用来存放内核与设备树文件
- 后面一个 ext3/ext4 用来做根文件
通过 fdisk 与 mkfs 指令完成,参考官方文档(需要注意sdx需要与你sd卡对应):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
格式化:
1 2 |
|
然后将内核文件、dtb、rootfs分别拷贝过去。
uboot 启动¶
将 SD 卡换过去,加电,如无以外 uboot 应该是可以起来,内核起不来(如果内核也能起来的话可以uboot启动的时候按一下键盘暂停内核启动)
在 uboot 终端运行 printenv 命令,查看厂家预定义的一些参数根据自己的需要进行修改。
譬如在我的开发板上运行下面的指令就可以从 SD 卡启动:
1 2 3 4 5 |
|
上面指令依次从 SD 卡的第一个分区加载 zimage-myimx6a7 内核文件到内核启动的内存地址,myimx6ek140-6y-256m-nand.dtb 设备树文件到设备树内存地址,然后设置 bootargs (传递给内核的启动参数),然后启动。
参数化一下:
1 2 3 4 5 |
|
然后就可以用此单行指令启动:
1 |
|
更进一步:
1 2 3 |
|
或者直接改掉原开发板的 bootcmd
1 2 |
|
重启,可以直接从SD卡启动
参考:
- https://blog.csdn.net/wofeile880_jian/article/details/64444029
- i.MX_Linux_User's_Guide.pdf