Initramfs 已经制作好了,通过sf指令将相关文件烧到正确的nor位置 就可以正常启动系统了
通过分析 ucl2.xml中关于Quad Nor Flash的项,可以发现mfgtool需要将QSPI header
即CMD state="Updater" type="push" body="send" file="files/qspi-nor-micron-n25q256a-config">Sending QSPI config file</CMD>转换为hex烧录到nor的1k开始的位置
并且将uboot烧到4K的位置
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mtd0 bs=1k seek=4" ifdev="MX6SX MX6UL">write U-Boot to NOR flash</CMD>
这就需要我们先用 mfg工具将QSPI header下载到nor,然后在进行我们的操作。通过mfg工具烧录nor过程省略。
下面是我的ucl2.xml文件 我已经将需要用到的文件写死了
<LIST name="Quad Nor Flash" desc="Choose Quad Nor flash as media">
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ulevk_qspi1.imx" ifdev="MX6UL">Loading U-boot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul-14x14-evk.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6UL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd0 0 20">Erasing Boot partition</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6ulevk_qspi1.imx" ifdev="MX6UL">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mtd0 bs=1k seek=4" ifdev="MX6SX MX6UL">write U-Boot to NOR flash</CMD>
<!--QSPI header-->
<CMD state="Updater" type="push" body="send" file="files/qspi-nor-micron-n25q256a-config">Sending QSPI config file</CMD>
<CMD state="Updater" type="push" body="$ awk '{s=\"00000000\"$1;l=length(s);if(!((NR-1)%4))printf \"%%08x \",(NR-1)*4;for(i=l-1;i>l-8;i-=2)printf \" %%s\",substr(s,i,2);if(!(NR%4))printf \"\\n\";}' $FILE > qspi-tmp">generate header </CMD>
<!--hexdump to convert ascii value to hex file-->
<CMD state="Updater" type="push" body="$ busybox hexdump -R qspi-tmp > qspi-header">Converting ascii value to hex file</CMD>
<CMD state="Updater" type="push" body="$ dd if=qspi-header of=/dev/mtd0 bs=1k seek=1" ifdev="MX6SX MX6UL">Writing header to NOR flash</CMD>
<!--delete temporary files-->
<CMD state="Updater" type="push" body="$ rm qspi-tmp">Deleting temporary file</CMD>
<CMD state="Updater" type="push" body="$ rm qspi-header">Deleting temporary file</CMD>
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
</LIST>
下面是我的vbs文件 由于上面已经将 ucl2.xml要用到的文件写死了 所以这里实际上只有Quad Nor Flash"项起作用,其他的选项没有什么用
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""Quad Nor Flash"" -s ""board=sabresd"" -s ""mmc=0"" -s ""nor=spi-nor"" -s ""6uluboot=evk"" -s ""6uldtb=14x14-evk"" "
Set wshShell = Nothing
通过mfgtool正常烧nor后,重新启动板子,并且在uboot启动过程中敲回车,暂停uboot的引导过程。
然后进行nor的相应操作
首先输入 sf probe 0 找到我们的设备 即nor
烧zImage
tftp 80800000 zImage
擦除0xF0000地址 0xF0 0000size大小空间 0xF0000+ d27458 =E1 7458<0xF0 0000
sf erase 0xF0000 0xF00000
至于为什么是 0xF0000 可以在uboot的源码中找到 即uboot的环境变量会保存到0x000c0000的位置大小 因此我们将我们的kernel烧到0xF0000 防止环境变量和kernel 相互破坏kernel的大小13M多因此 我们将烧录擦除大小设为0xF00000大于0xF0000+ d27458
CONFIG_ENV_OFFSET 偏移地址 000C0000
CONFIG_ENV_SECT_SIZE 0001 0000
CONFIG_ENV_SIZE 0000 2000
将kernel从内存80800000复制到0xF0000的位置 大小为0xd27458
sf write 0x80800000 0xF0000 0xd27458
下面继续 烧 dtb
tftp 83000000 zImage-imx6ul-14x14-evk.dtb
sf erase 0xF01000 0xA000
sf write 0x83000000 0xF01000 0x8626
dtb 的烧录位置要大于kernel的终止位置 0xE1 7458<0xF01000 dtb大小为0x8626接下来设置启动参数bootcmd、bootargs
setenv bootcmd 'sf probe 0; sf read 0x83000000 0xF01000 0x8626; sf read0x808000000xF0000 0xd27458; bootz 0x80800000 - 0x83000000'
setenv bootargs console=ttymxc0,115200 rdinit=/linuxrc
保存 重启 ok