天天看點

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

目錄

  • 規劃分區
  • 燒寫流程
    • 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焊下來再重燒。非常麻煩

現在很多燒錄器可以直接在闆子上直接燒了

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

原理就是通過序列槽實作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的燒寫

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟
海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

燒錄開始

燒錄完畢會有提示

燒錄過程分析

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

boot download completed

這一步就是将uboot.bin傳到3518中

system startup

說明uboot已經啟動

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

Boot Started successfully!

說明bootloader啟動已經成功

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

接下來就是一些預設的,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)

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

最後把uboot 燒寫進去

0x81000000

是uboot.bin存放的源位址

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

接上序列槽,确認燒錄成功

燒錄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自己的虛拟機

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

能ping通就行

燒錄

接着搭建tftp伺服器

接下來按照指導文檔中的流程來走

由于我們是裸機燒寫uboot的,于是tftp階段直接從kernel開始燒寫

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

燒錄根檔案系統

按照燒寫流程,同kernel一樣,通過

tftp

伺服器進行燒寫

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

燒錄完成後的步驟

燒寫完這三個部分以後,直接

reset

是不能啟動的

因為我們環境變量的設定還是有問題的

一個系統要能夠啟動,有兩個關鍵的環境變量

  • bootcmd
  • bootargs

正确的bootcmd和bootargs對應的設定指令:

  • set bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'

    從0x10 0000讀取0x30 0000長度(即kernel的位置),到0x8200 0000。讀完直接去啟動核心鏡像
  • set bootargs mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)

    記憶體32M,根檔案系統在第二個分區,檔案系統是jffs2

記憶體一部分給linux用,一部分給MPP用——海思專門處理h264編碼的體系,體系裡面有很多ko檔案,運作本身時需要大量記憶體。是以不能将64M記憶體全部給linux核心,隻要他們兩個不碰到就沒有問題

我們之前的分區表是完全寫死的分區表,這樣做如果需要更改分區表就需要去更改核心的源碼然後重新編譯,重新燒錄很麻煩

解決辦法是,在

bootargs

啟動時使用傳參去動态的建立分區表。于是存在兩個分區表,一個是核心中預設的分區表,一個是mtdparts傳參的分區表。

配置完後輸入

save

儲存,儲存後reset重新開機

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟

這就是正常啟動的情況

也能看到核心編譯的時間

海思3518E開發筆記1.5——flash分區及uboot、kernel、rootfs燒寫并部署規劃分區燒寫流程裸機燒錄uboot燒錄kernel燒錄根檔案系統燒錄完成後的步驟