天天看點

核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND

核心啟動全攻略——小白學ARM(九)

  • 網絡環境搭建
  • 下載下傳核心
  • 啟動核心
  • 記憶體與NAND

網絡環境搭建

上一篇部落格這塊寫的有些亂,這裡重寫:

要啟動核心,得先下載下傳核心,核心下載下傳離不開uboot,用uboot自帶的tftp網絡下載下傳功能,可以将核心下載下傳到闆上。

怎麼搭建tftp環境呢,

  1. 用普通網線将mini2440連接配接到路由器的LAN口,即圖上黃色接口。
  2. 確定你連上的路由器是可以上網的(其實不能上網也沒事)
  3. 筆記本電腦連上該路由器的wifi,這樣你的闆子和電腦就在同一個網段了。(桌上型電腦連上該路由器拉出的網線)
    核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND
  4. 確定闆子和電腦可以互相ping通:進入uboot指令行模式(不知道怎麼進入該模式參考上篇部落格),輸入

    print

    可以檢視闆子的IP位址,如圖,ipaddr就是闆子的ip位址,一般預設的ip不正确,需要修改
    核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND
    運作cmd,輸入指令

    ipconfig

    ,檢視電腦的ip位址,如圖所示,電腦ip位址為192.168.1.100,那麼我們就将闆子的位址改為192.168.1.120,保證前三段一緻,這個“120”是我随便設的,隻要不是100就行。

    修改方法為:在uboot指令行下輸入:

修改好闆子IP,再修改伺服器ip,修改為電腦的ip

完了之後再儲存一下

saveenv
           

這樣修改的内容就儲存到nand裡了,掉電不丢失,否則隻是修改了記憶體中的環境變量,再上電會發現修改的内容又變回去了。

核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND
核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND

至此,tftp環境基本搭建完成,可以在uboot指令行中輸入,ping電腦的ip

核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND

可以看到最後一句:host 192.168.1.100 is alive

說明闆子和電腦可以通過網絡通信了。

下載下傳核心

這步比較簡單,電腦先安裝一個小軟體:Tftpd64

打開大概是這樣的

核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND

上面的路徑裡,存放着你要用TFTP傳輸的檔案,這裡我們吧uImage.bin檔案放進去,

這個uImage.bin檔案就是傳說中的核心。

確定這個軟體打開,IP位址欄選擇本機的ip

進入uboot指令行,確定闆子ip和伺服器IP都修改正确後

輸入:

tftp 0x31000000 uImage
           

稍等片刻,可以看到uImage正在傳輸,待傳輸完成,核心就下載下傳到闆子裡了。

啟動核心

緊接着,在uboot指令行中輸入:(注意,位址與上面下載下傳位址“0x31000000”要一緻)

可以看到核心自行啟動。

至此核心啟動完成。

如果啟動過程卡在“starting kernel…”

很可能是你下載下傳的核心與闆子不比對,或者核心規定的下載下傳位址并不是“0x31000000”。

記憶體與NAND

為甚講這個呢,因為tftp下載下傳到闆子的資料,并不是直接存儲在nand裡,更不是nor flash裡,而是存在記憶體裡,是會斷電丢失的,這也就能解釋為什麼下載下傳時需要指定一個“0x31000000”這樣的記憶體位址。

mini2440的nand flash 分區如下圖所示,代碼部分說明各分區起始位址和分區大小。

目前我們的uboot,即圖上bootloader,是存放在nor flash中,友善我們下載下傳其他檔案。

核心檔案我們下載下傳到記憶體中,都沒有放到flash對應位置,等學會了核心剪裁,uboot編譯,驅動編寫後,最後成品,也即交給使用者的産品是要按下圖所示分區存放的,這裡隻是擴充一下,以防要素過多,搞不清各資料到底存放在哪裡。

核心啟動全攻略——小白學ARM(九)網絡環境搭建下載下傳核心啟動核心記憶體與NAND
static struct mtd_partition friendly_arm_default_nand_part[] = {
         [0] = {
                   .name = "supervivi",
                   .size = 0x00040000,
                   .offset = 0,
         },
         [1] = {
                   .name = "param",
                   .offset = 0x00040000,
                   .size = 0x00020000,
         },
         [2] = {
                   .name = "Kernel",
                   .offset = 0x00060000,
                   .size = 0x00500000,
         },
         [3] = {
                   .name = "root",
                   .offset = 0x00560000,
                   .size = 1024 * 1024 * 1024, //
         },
         [4] = {
                   .name = "nand",
                   .offset = 0x00000000,
                   .size = 1024 * 1024 * 1024, //
         }
};
           

繼續閱讀