前言
之前一直嘗試做一塊自己的linux板子,但是一直未能得償所願,最關鍵原因還是自己的電路知識過於薄弱,同時pcb制作也不是很純熟,所以就擱置了。后來,翻閱了大量的設計資料,發現如果嘗試做一塊自己的linux板子的話,很多電路模塊,比如usb轉ttl模塊,tf卡電路模塊,電源管理模塊,晶振模塊等等,其實大家的設計基本上是一樣的,且在網上也能夠找到成熟的設計方案。所以后面我會嘗試設計一套自己的linux板子,然后再嘗試進行嵌入式方面的開發。這里,我先入手了一塊荔枝派nano的板子,用來研究如何進行uboot燒寫和linux移植先,話不多說,今天主要來講解如何進行uboot移植吧。
虛擬機上的串口和usb設置
首先,在開始之前,我們需要准備一下編譯環境,自不必說,linux發行版本,由於天生具有良好的編譯環境設定,所以我們選用了ubuntu 64位的系統,然后在vmware虛擬機中做一套出來。虛擬機安裝ubuntu系統,這里就不提了。
之后,ubuntu安裝完畢后,如果想讓物理機的u盤或者是串口能交互到unbuntu上,我們需要對虛擬機進行設置。
針對串口設備,比如usb2ttl這種,需要設置如下:
之后,啟動ubuntu進入系統后,會有彈窗提醒你要將串口連接到物理設備還是虛擬設備中,這里我們點擊虛擬設備,然后選中我們的ubuntu系統即可。這樣串口就連接到虛擬機了,可以使用命令查看一下:
需要注意的是,串口連上來,一定是形如ttyUSB*的形式,至於是數字幾,我們可以通過插入串口設備后,執行一下ls /dev/tty*, 然后拔掉串口設備后,再執行一下ls /dev/tty*,看看哪個設備下掉了,則串口設備名稱就是這個。
之后,我們利用命令 sudo apt install minicom命令來安裝minicom串口管理工具,之后,我們利用sudo minicom -s來進行設置,將串口設置為ttyUSB0:
設置完畢后,保存並推出,我們的串口就設定好了。
針對U盤,請確認一定要是usb電路,單純的tf卡套這種,在ubuntu是無法識別的,需要利用usb讀卡器才行,usb設置如下:
這樣設置完畢后,usb插入到電腦,然后在虛擬機右下角就可以看到usb連接上來了,可以使用命令查看一下:
由於我這里對usb做了插拔,這里很容易看出來,我的usb名稱是sdb,其中一個分區是sdb1
這樣,我們串口和usb都設定好了。
U-Boot編譯環境設定
U-Boot編譯,由於采用的是荔枝派nano,其芯片是f1c100s,是基於arm的,所以這里我們的交叉編譯鏈要使用arm的,這里使用Linaro提供的交叉編譯工具。
下載地址為:http://releases.linaro.org/,注意區分32位與64位,由於我們是64位系統,所以這里我們下載64位的:
64位下載地址:http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz
32位下載地址:http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-i686_arm-linux-gnueabi.tar.xz
下載完畢后,我們需要將數據傳輸到虛擬機中,這里我推薦一個小工具:hfs,文件傳輸上去后,解壓到/home/scy/linux-mi/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/目錄下
這時候,我們需要將此目錄添加到環境變量中並執行命令,查看配置生效:
#打開文本 nano ~/.bashrc #將此命令加到文本最后一行,ctrl+s保存,ctrl+x退出 export PATH=$PATH:/home/scy/linux-mi/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin #使配置生效 source ~/.bashrc #執行如下命令,校驗配置生效
可以看到輸出了信息,配置已生效。
之后,我們開始進行uboot編譯,這里需要先下載uboot源碼,從https://github.com.cnpmjs.org/Lichee-Pi/u-boot/tree/nano-v2018.01下載這個分支壓縮包,然后利用hfs上傳到虛擬機上並解壓到/home/scy/linux-mi/u-boot-nano-v2018.01目錄
之后進入此目錄,執行如下命令:
#如果需要生成在sdram里啟動的uboot,我們采用這個 make ARCH=arm licheepi_nano_defconfig #如果需要生成在spiflash里啟動的uboot make ARCH=arm licheepi_nano_spiflash_defconfig
此操作會將配置文件進行寫入:
然后執行:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16
則開始進行編譯操作,需要注意的是,需要指明交叉編譯鏈,同時-j可以來指定並發線程數,這個數量可以根據機器的性能更改,整體輸出如下:
這里我們可以看到最后生成的bin文件就是我們需要的文件。需要說明一下,如果在編譯過程中,有任何錯誤,都可以使用apt install來進行安裝,我在編譯過程中,基本上安裝過如下幾個組件:
sudo apt install swig sudo apt install python-dev dtc: not found dtc是device-tree-compiler的縮寫,即設備樹編譯器,說明系統中沒有安裝這個編譯器 sudo apt-get install device-tree-compiler
這樣我們就編譯成功了。
U-Boot燒寫
既然編譯成功后,那么這里就需要進行燒寫了。
燒寫的話,我們首先需要對我們的usb進行格式化,然后去掉所有分區,這里我們采用的工具是gparted,通過sudo apt install gparted來進行安裝,之后啟動並插入我們的usb:
這里可以看到我們的usb,上面有了個分區,我們先對sdb1分區進行卸載,然后再進行刪除,之后保存執行即可:
到這里,盤就干凈了,我們開始燒寫吧,需要在uboot目錄執行如下命令:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
這句命令的意思是,如果找到了spl目錄下的sunxi-spl.bin文件,則拷貝到我們的usb中,sdb就是我們的usb, 位大小為1mb,偏移為8,看下執行結果:
這里可以看到我們寫入成功了。
但是到這里只是編譯了默認部分,由於uboot倒計時結束,要啟動Linux內核,所以需要修改配置文件使u-boot去執行:
/* bootcmd 保存着 uboot 默認命令, uboot 倒計時結束以后就會執行 bootcmd 中的命令 */ /* bootargs 保存着 uboot 傳遞給 Linux 內核的參數*/ sudo nano /include/configs/suniv.h /* 添加以下代碼(mmc 0為TF卡,1是第一分區,文件系統為fat32,把zImage和dtb文件拷入DRAM)*/ #define CONFIG_BOOTCOMMAND "fatload mmc 0:1 0x80800000 zImage; " \ "fatload mmc 0:1 0x83000000 suniv-f1c100s-licheepi-nano.dtb; " \ "bootz 0x80800000 - 0x83000000;" /* 繼續添加(linux將使用uart0進行交互,死機5s重啟,根文件系統在mmc0(tf卡)第二分區(EXT4),等待 mmc 設備初始化完成以后再掛載,開啟讀寫權限) */ #define CONFIG_BOOTARGS "console=ttyS0,115200 panic=5 root=/dev/mmcblk0p2 rootwait rw " /* 回到u-boot目錄進行編譯 */ make ARCH=arm menuconfig /* 取消勾選 [] Enable a default value for bootcmd */ /* 勾選 [v] Enable boot arguments;*/ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16
將上面生成成功的u-boot-sunxi-with-spl.bin再燒錄到sd卡一次,即執行如下命令:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
現在,我們將usb中的卡拿下來,插入到usb2ttl中,看看串口的顯示吧,需要在命令行中輸入sudo minicom來提前打開串口:
此時還沒有任何輸入,我們將usb2ttl重新插拔下,或者是將荔枝派nano上的5v電源線重新插拔一下,輸出結果如下,但是因為沒有linux內核,所以引導失敗,我們看下環境變量信息::
上面這個是正常的輸出結果,如果從tf卡啟動的話,如果輸出是下面的結果,則極有可能是你沒有修改suniv.h這個文件導致的,需要去修改下這個文件,然后重新生成。
來看看環境信息:
再看下bd信息:
可以說整體uboot從sd卡移植成功。
接下來,我們就需要創建一個分區,為fat16,里面放上設備樹文件和zimage,
zimage是linux內核
rootfs是根文件系統
參考
http://nano.lichee.pro/get_started/first_eat.html
https://blog.csdn.net/p1279030826/article/details/112672535 值得看一下,燒錄結果和我的一致