imx6ul evk板子 QSPI nor启动记录(3) 启动qspi nor 系统

来源:互联网 发布:什么是淘宝号 编辑:程序博客网 时间:2024/06/15 18:21

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 



0 0
原创粉丝点击