嵌入式 hi3518c裸板uboot燒寫、kernel燒寫、fs燒寫小結
1、在uboot中我可以添加自己的命令,添加的方法是找到一個uboot的命令,然后模仿著去增加屬于自己的命令代碼以及實現函數就可以
2、記住在使用printf進行調試的時候,在遇到指針或者字符串的時候最好使用“%x”,以為我不知道指針或者字符串中是否包含不可見字符,如果有不可見字符會導致錯誤,而且錯誤不好查找
3、對于uboot中的環境變量,其實是放在uboot里面的,也就是環境變量占用的是uboot的空間,如果不需要去實時修改環境變量的值那么就可以不用env這個分區;但是如果需要修改環境變量,那么首先需要知道saveenv的起始地址和大小,來防止env的保存會覆蓋flash中其他的有用數據。具體運行saveenv就可以看到起始地址和env大小
4、有時候在燒寫完成kernel的時候直接第一次reset是可以啟動的,但是當斷電然后再一次上電的時候可能就會出現錯誤,例如:
Resetting CPU ...
這就有可能是內核不完整了,說明前面的操作可能覆蓋了內核的部分內容導致的
5、對flash(spi)串行flash進行分區的時候需要特別注意:
1):uboot對flash分區可能存在明顯的代碼分區列表可以直接進行修改
2):uboot中沒有這個明顯的代碼的時候,可能是在uboot的env中傳過去的
setenv bootargs mem=64M console=ttyAMA0,115200 root=/dev/mtdblock4 rootfstype=jffs2 mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(config),3072k(kernel),11264k(rootfs)
具體是哪種方式可以去uboot源碼中進行查找函數的入口參數的傳入點
6、分區的具體信息需要根據uboot的大小(每一分區的大小最小是一個扇區,包括kernel和rootfs)
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "env"
0x000000060000-0x000000080000 : "conf"
0x000000080000-0x000000380000 : "kernel"
0x000000380000-0x000000e80000 : "rootfs"
7、uboot對flash分區具有最大上限一般為(32)
在使用jlink燒寫之前必須對cpu進行初始化,然后進去normal模式,接著進行內存初始化,然后才能燒寫
hi3518c初始化命令:
setmem 0x20030000 0x11000000 32
setmem 0x20030004 0x0068306E 32
setmem 0x20030008 0x12000000 32
setmem 0x2003000c 0x007C2063 32
setmem 0x20030010 0x19000000 32
setmem 0x20030014 0x00682064 32
setmem 0x20030020 0x1B000000 32
setmem 0x20030024 0x007C40E1 32
setmem 0x20030028 0x00000010 32
setmem 0x2011001c 0x80000600 32
setmem 0x20030028 0x00000410 32
setmem 0x2011001c 0x80000600 32
setmem 0x20050014 0x0fff8000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20050000 0x00000214 32
setmem 0x2011001c 0x80000600 32
setmem 0x2011001c 0x80000600 32
setmem 0x20110020 0x00000785 32
setmem 0x20110058 0x3240a000 32
setmem 0x20110010 0x00000001 32
setmem 0x2011002c 0x00000122 32
setmem 0x20110040 0x80000000 32
setmem 0x20110050 0x62330a08 32
setmem 0x20110054 0xff626720 32
setmem 0x2011005c 0xffcff5f2 32
setmem 0x201100ac 0x03000001 32
setmem 0x2011001c 0x80000600 32
setmem 0x201100f4 0x00000001 32
setmem 0x20110004 0x00000000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120404 0x80000000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120408 0x01842200 32
setmem 0x20120418 0x00220055 32
setmem 0x2012041c 0x048b0d41 32
setmem 0x20120420 0x03233881 32
setmem 0x2012042c 0xf200001e 32
setmem 0x20120434 0x288f6693 32
setmem 0x20120438 0x0040009b 32
setmem 0x2012043c 0x1001aa00 32
setmem 0x20120584 0x0000006d 32
setmem 0x20120440 0x00001730 32
setmem 0x20120444 0x00000006 32
setmem 0x20120448 0x00000008 32
setmem 0x2011001c 0x80000600 32
setmem 0x201205c0 0x00000e81 32
setmem 0x20120600 0x00000e81 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120404 0x000000ff 32
setmem 0x2011001c 0x80000600 32
setmem 0x20110058 0x3240a062 32
setmem 0x20120408 0x01842200 32
注:其中每一空白行的前一行setmem 0x2011001c 0x80000600 32是為了實現wait操作
1、在裸板上使用jlink進行燒寫uboot的需要知道uboot在內存中的運行地址也就是代碼段的入口,可以去uboot源碼下找到uboot.map進行查找text入口。
2、然后在串口中進行loadb 0x82000000(uboot中也是可以找到定義的),然后sf write到flash但是需要先擦除后燒寫
3、有時候在燒寫uboot之后saveenv后reset找不到內核,并提示wrong format image 這可能是內核的頭沒了,原因是saveenv的時候覆蓋了內核的文件,所以需要去uboot中找到類似下面的代碼:
#define CFG_ENV_ADDR 0x80000
#define CFG_ENV_SIZE 0x2000
然后對flash分區進行重新計算
4、對flash分區3.0內核和uboot 2006中是使用環境變量進行劃分的,類似代碼如下:
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock4 rootfstype=jffs2 mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(conf),2944k(os),12800k(rootfs)'
注:speed 1000 后使用AXD進行cpu和ram 初始化
sf probe 0;mw.b 0x82000000 ff 0x80000;
燒錄uboot:
loadb 0x82000000
sf probe 0;sf erase 0x0 0x80000;sf write 0x82000000 0x0 0x80000
燒錄內核:
sf probe 0;mw.b 82000000 ff 300000;loadb 0x82000000;sf erase c0000 300000;sf write 82000000 c0000 300000
//mw.b表示按字節顯示 mw: 對RAM中的內容寫操作, mw 32000000 ff 10000(把內存0x32000000開始的0x10000字節設為0xFF)
燒錄文件系統:
sf probe 0 ;mw.b 82000000 ff C80000 ;loadb 0x82000000;sf erase 3c0000 C80000 ;sf write 82000000 3c0000 C80000
官方uboot_env:
bootargs=mem=64M console=ttyAMA0,115200
bootcmd=bootm 0x82000000
bootdelay=1
baudrate=115200
ethaddr=00:00:23:34:45:66
ipaddr=192.168.1.10
serverip=192.168.1.2
netmask=255.255.255.0
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06 (Dec 12 2012 - 13:16:58)
Environment size: 294/262140 bytes
hi3518_qy;
sf probe 0;mw.b 0x82000000 ff 0x80000;
燒錄uboot:
loadb 0x82000000
sf probe 0;sf erase 0x0 0x80000;sf write 0x82000000 0x0 0x80000
燒錄內核:
sf probe 0;mw.b 82000000 ff 300000;loadb 0x82000000;sf erase c0000 300000;sf write 82000000 c0000 300000
//mw.b表示按字節顯示 mw: 對RAM中的內容寫操作, mw 32000000 ff 10000(把內存0x32000000開始的0x10000字節設為0xFF)
燒錄文件系統:
sf probe 0 ;mw.b 82000000 ff C80000 ;loadb 0x82000000;sf erase 3c0000 C80000 ;sf write 82000000 3c0000 C80000
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock4 rootfstype=jffs2 mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(conf),2944k(os),12800k(rootfs)'
內核:
setenv bootcmd sf probe 0\;sf read 0x82000000 0xc0000 0x300000\;bootm 0x82000000
剩余:
256k未使用