目錄
- 規劃分區
- 燒寫流程
-
- tftp更新并重新燒寫uboot的指令序列
- tftp更新并重新燒寫kernel的指令序列
- tftp更新并重新燒寫rootfs的指令序列:
- 裸機燒錄uboot
-
- 什麼是裸機
- 燒錄方法
- 燒錄uboot
- 燒錄過程分析
- 燒錄kernel
-
- 配置開發闆網絡
- 燒錄
- 燒錄根檔案系統
- 燒錄完成後的步驟
規劃分區
因為嵌入式系統為了簡化,沒有使用分區表來自動管理flash,是以都是事先定死的。是以在部署一個嵌入式系統前都要人為的定下一個分區
規劃原則
- 每個分區要足夠放鏡像
- 盡量留一點擴充餘地
- 滿足上兩個條件,其他随便搞
分區規劃如下
分區名 | 分區大小 | 起始位址 | 截止位址 |
---|---|---|---|
bootloader | 1M | 0X00000000 | 0x00100000 (1024*1024 bit) |
kernel | 3M | 0X00100000 | 0X00400000 |
ootfs | 12M | 0X00400000 | 0X01000000 |
燒寫流程
tftp更新并重新燒寫uboot的指令序列
mw.b 0x82000000 ff 0x100000
(mw.b 寫記憶體,以位元組為機關操作,0x82000000 ff記憶體從0x82000000開始清成全ff,0x100000為清理的大小為1MB
tftp 0x82000000 u-boot-hi3518ev200.bin
從伺服器(Ubuntu)下載下傳檔案(u-boot-hi3518ev200.bin)到記憶體0x82000000
sf probe 0
先選中spiflash ,0代表第一個,闆上可能有多個flash
sf erase 0x0 0x100000
sf write 0x82000000 0x0 0x100000
tftp更新并重新燒寫kernel的指令序列
mw.b 0x82000000 ff 0x300000
(mw.b 寫記憶體,以位元組為機關操作,0x82000000 ff記憶體從0x82000000開始清成全ff,0x300000為清理的大小為1MB
tftp 0x82000000 uImage_hi3518ev200
從伺服器(Ubuntu)下載下傳檔案(uImage_hi3518ev200)到記憶體0x82000000
sf probe 0
先選中spiflash ,0代表第一個,闆上可能有多個flash
sf erase 0x100000 0x300000
sf write 0x82000000 0x100000 0x300000
tftp更新并重新燒寫rootfs的指令序列:
mw.b 0x82000000 ff 0xc00000
(mw.b 寫記憶體,以位元組為機關操作,0x82000000 ff記憶體從0x82000000開始清成全ff,0xa00000為清理的大小為1MB
tftp 0x82000000 rootfs_hi3518ev200_64k.jffs2
從伺服器(Ubuntu)下載下傳檔案(rootfs_hi3518ev200_64k.jffs2)到記憶體0x82000000
sf probe 0
先選中spiflash ,0代表第一個,闆上可能有多個flash
sf erase 0x400000 0xc00000
sf write 0x82000000 0x400000 0xc00000
裸機燒錄uboot
什麼是裸機
- 不帶作業系統
- 空白機器(裝置沒有程式),未經燒錄
燒錄方法
空白機器的情況下,燒錄方法如下
- 通過外部燒錄器去燒錄闆載flash
- 通過主晶片提供的isp下載下傳的機制來間接燒錄闆載flash
外部燒錄器直接和SPI Flash互動,和晶片沒有關系。
以前的做法是,SPIFLASH先單獨通過燒錄器和支架來燒錄好鏡像再把燒錄過鏡像的SPIFLASH焊接到闆子上;不小心把uboot玩壞了,返廠是把SPIFLASH焊下來再重燒。非常麻煩
現在很多燒錄器可以直接在闆子上直接燒了
原理就是通過序列槽實作pc與3518的通信,3518再和spi flash通信
但是要求3518内部提供
ISP
的代碼,就是我們常說的
BL0
程式複位後先開始運作BL0,再通過BL0選擇從哪裡啟動,從目标位置讀取鏡像進行啟動
3518E的設計是從Uart啟動,就相當于BL0先啟動,ISP是第一選擇,上電後試圖從uart接收資料。
此間必然有一些協定,比如3518通過序列槽不斷向PC發送資料,PC端有一個
PC Tool
進行配合,如210是
DNW
,海思是
HI tool
PC上的工具會接受目标晶片不斷發送的資訊,并且按協定回複。比如晶片給pc發0x23,pc給晶片回0x87。3518收到了0x87後就知道,有一台pc準備給我ISP。
由此就對接上了,然後PC将準備好的uboot.bin發送給3518,3518再通過SPI給Flash
燒錄uboot
HITool是基于eclipse java的,于是需要安裝jre
然後使用HITool進行uboot的燒寫
燒錄開始
燒錄完畢會有提示
燒錄過程分析
boot download completed
這一步就是将uboot.bin傳到3518中
system startup
說明uboot已經啟動
Boot Started successfully!
說明bootloader啟動已經成功
接下來就是一些預設的,3518和pc的序列槽互動資訊
sf就是spi flash的簡稱
Send command: sf probe 0 16384 KiB hi_fmc at 0:0 is now current device [EOT](OK)
說明定位到了spi flash
接下來就是擦除flash相應的分區,從0x開始,長度為0x10 0000(1M = 1024 x 1024 bit)
最後把uboot 燒寫進去
0x81000000
是uboot.bin存放的源位址
接上序列槽,确認燒錄成功
燒錄kernel
- 1、将kernel從pc傳入3518的SD Ram中
- 2、擦除SPI Flash相應分區
- 3、将SD RAM中的kernel燒錄到SPI Flash的相應分區中
由于3518ev200的ddr是内置的,是以無法看接線
于是檢視晶片手冊
SDRAM範圍為:
0x8000 0000~0x83ff ffff
隻要在這個範圍内找一個4.8MB的記憶體的地方存放kernel即可
官方文檔中推薦的是從
0x82000000
開始
配置開發闆網絡
開發闆通過網線連接配接筆記本即可同網段
我用的是桌上型電腦,是以将開發闆連接配接至路由器
hisilicon # set ipaddr 192.168.2.10
hisilicon # set serverip 192.168.2.95
設定ip位址
然後輸入
save
,在用
print
檢視
然後ping自己的虛拟機
能ping通就行
燒錄
接着搭建tftp伺服器
接下來按照指導文檔中的流程來走
由于我們是裸機燒寫uboot的,于是tftp階段直接從kernel開始燒寫
燒錄根檔案系統
按照燒寫流程,同kernel一樣,通過
tftp
伺服器進行燒寫
燒錄完成後的步驟
燒寫完這三個部分以後,直接
reset
是不能啟動的
因為我們環境變量的設定還是有問題的
一個系統要能夠啟動,有兩個關鍵的環境變量
- bootcmd
- bootargs
正确的bootcmd和bootargs對應的設定指令:
-
從0x10 0000讀取0x30 0000長度(即kernel的位置),到0x8200 0000。讀完直接去啟動核心鏡像set bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
-
記憶體32M,根檔案系統在第二個分區,檔案系統是jffs2set bootargs mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)
記憶體一部分給linux用,一部分給MPP用——海思專門處理h264編碼的體系,體系裡面有很多ko檔案,運作本身時需要大量記憶體。是以不能将64M記憶體全部給linux核心,隻要他們兩個不碰到就沒有問題
我們之前的分區表是完全寫死的分區表,這樣做如果需要更改分區表就需要去更改核心的源碼然後重新編譯,重新燒錄很麻煩
解決辦法是,在
bootargs
啟動時使用傳參去動态的建立分區表。于是存在兩個分區表,一個是核心中預設的分區表,一個是mtdparts傳參的分區表。
配置完後輸入
save
儲存,儲存後reset重新開機
這就是正常啟動的情況
也能看到核心編譯的時間