我是張權,今日起正式入駐達爾聞,将給大家分享我在嵌入式系列研究的經驗和成果。
> 複旦大學微電子在讀碩士
> 從事數字晶片設計及嵌入式系統開發研究
> 擅長RISC-V指令集架構及AI處理器架構
> 樹莓派愛好者
> 喜歡打籃球和慢跑
“ 跟着我一起,一步步操作,7天實作基于嵌入式開發闆的驅動設計和雲計算平台的搭建! 3篇超詳細全文檔攻略助你操作無障礙: 本篇教你完成作業系統的移植,第二篇是驅動的設計,第三篇用網頁調用設計的驅動和擴充部分雲計算平台的搭建! ”
正式進入今天分享的第一步,在開發闆中移植一個作業系統和檔案系統:
移植u-boot至SD卡
安裝toolschain的指令:
tar ‐zxvf arm‐linux‐gcc‐4.5.1‐v6‐vfp‐20120301.tgz
在.bashrc檔案裡面添加工具鍊bin檔案和lib檔案路徑:
(點選可放大)
生成u-boot檔案:
觀察看到沒有../../u-boot.bin與../mkbl2兩個檔案,但是在../目錄夾Makefile下找到以下指令可生成mkbl2與sd_fdisk,下一步考慮怎麼生成u-boot.bin檔案。
跳到../../目錄夾下直接執行make all O=build發現有Error,如下圖:
通過觀看Makefile,感覺如下有些東西暫時沒有配置,後面會再嘗試确定:
下圖可見config.mk基本奠定了此次編譯的基調
Build uboot的步驟:
a)安裝好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)
b)設定好環境變量PATH,保證可以正常使用,PATH設定在bin目錄下
c)配置 uboot 并編譯
cd uboot_tiny4412make tiny4412_configmake
d) 編譯 用于生成bl2 的工具
make ‐C sd_fuse
或者
cd sd_fusemake
在執行make過程中,發現即使路徑設定正确,仍爆出No such file or directory
經過debug發現是32位程式運作在64位系統的錯誤,參考以下解決:
# 确定有一個64架構的核心dpkg ‐‐print‐architecture# 結果會提示如下amd64# 确認打開多架構支援功能dpkg ‐‐print‐foreign‐architectures# 結果會如下提示i386# 打開多架構支援sudo dpkg ‐‐add‐architecture i386sudo apt‐get update# 檢查擁有的庫檔案是否需要更新版本sudo apt‐get dist‐upgrade# 執行下面語句安裝sudo apt‐get install lib32ncursesw5 lib32ncursesw5‐dev
接着發現無法調用動态連結庫
問題仍是64位系統不能調用32位的動态連結庫,解決方法如下
sudo apt‐get install zlib1g:i386
之後買了一張8G的記憶體卡,用讀卡器接到PC主機上,記憶體被識别為/dev/sdb
執行以下指令,燒入u-boot至記憶體卡中:
cd sd_fuse/tiny4412./sd_fusing.sh /dev/sdb
啟動裝置後,第一次沒有看到虛拟機有任何反應,并沒有進入到uboot終端,經考慮發現需要序列槽工具(原諒我第一次接觸嵌入式系統開發,有點蠢),之後選用IPOP作為序列槽調試工具,并安裝相關驅動
之後會看到如下互動界面:
每一次燒寫都要重拔USB
将u-boot移植至emmc
首先需要格式化emmc,u-boot模式下輸入以下指令來格式化emmc裝置
>fdisk ‐c 1 320 2057 520
執行後會傳回分區資訊,繼續格式化分區,需要注意第一分區是fat格式化,分區2,3,4作ext3格式化,至此格式化完成。
>fatformat mmc 1:1>ext3format mmc 1:2>ext3format mmc 1:3>ext3format mmc 1:4
然後需要下載下傳固件到開發闆記憶體中。首先打開emmc裝置,u-boot下輸入:
>emmc open 1eMMC OPEN Success.!!!!!Notice!!!!You must close eMMC boot Partition after all image writing!!eMMC boot partition has continuity at image writing time.!!So, Do not close boot partition, Before, all images is written.!
上面提示emmc開啟成功,注意說明,emmc一旦打開,需要連續燒錄,燒錄完成後可以關閉emmc。
接下來運作dnw,u-boot下面輸入:
>dnw
OTG cable Connected!
Now, Waiting for DNW to transmit data
提示等待資料輸入,這裡就是等待我們從PC端通過DNW傳送資料過來。
此時在PC端加載到E4412_N.bl1.bin目錄夾下,确認bl1.bin已經燒進去了,但是執行mmc write 1 0xc0000000 0x10沒有反應,是為什麼?
是因為我在上面少了一個0
mmc write 1 0xc0000000 0 0x10
之後同理,将bl2.bin, u-boot.bin, E4412_tzsw.bin加載進emmc
Board: emmc open 1Board: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_N.bl1.binBoard: mmc write 1 0xc0000000 0 0x10Board: dnwPC : sudo dnw sd_fuse/bl2.binBoard: mmc write 1 0xc0000000 0x10 0x1CBoard: dnwPC : sudo dnw u‐boot.binBoard: mmc write 1 0xc0000000 0x30 0x21DBoard: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_tzsw.binBoard: mmc write 1 0xc0000000 0x2c0 0xB8Board: emmc close 1
編譯核心
tar xzf linux‐3.5‐20150929.tgzcd linux‐3.5/cp tiny4412_linux_defconfig .config(如果不執行這一步會遇到很多莫名的錯誤)make menuconfig:去掉 Support TrustZone‐enabled Trusted Execution Environmentmake zImage
在運作make zImage時遇到三個沒有找到頭檔案的問題,這裡直接從其他路徑下複制過來即可解決
然後又遇到以下問題
經在網上查詢得知,是因為perl版本更新到了v5.22.1,将defined(@array)去掉了,可以直接使用數組判斷非空。将if (!defined(@val))改為if ([email protected]),再次編譯就 OK。
在編譯mkfs_ext2.c檔案的時候,會遇到沒有ext2_fs.h的問題,裡面許多宏和結構變量無法使用,這裡我從工具鍊中将頭檔案放在核心根目錄include子目錄下直接調用
最終核心編譯結果如下
制作根檔案系統
一、根檔案系統建立
1、編譯、安裝busybox
tar xzf busybox‐1.17.2‐20101120.tgzmake menuconfig :添加交叉編譯選項(arm‐linux‐) //也可以通過修改Makefile實作makemake CONFIG_PREFIX=/work/nfs_root/francis_linux_fs install
2、安裝連結庫
找到工具鍊下的庫的目錄并将lib庫複制粘貼到自己的根檔案系統中
mkdir libmkdir usr/libcd /opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/usr/libcp *so* /work/nfs_root/francis_linux_fs/usr/lib ‐dcd /opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/libcp *so* /work/nfs_root/francis_linux_fs/lib ‐d
3、建構etc目錄
在etc目錄下建立inttab檔案,内容如下:
# /etc/inittab::sysinit:/etc/init.d/rcS //初始化執行rcS檔案console::askfirst:‐/bin/sh::ctrlaltdel:/sbin/reboot //重新開機指令::shutdown:/bin/umount ‐a ‐r // 關機
在etc目錄夾下繼續建立init.d檔案夾,并在init.d目錄下建立rcS腳本檔案,檔案内容如下:
#!/bin/shmount ‐amkdir /dev/ptsmount ‐t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug
在rcS裡面可以添加:
#PATH變量PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S //單使用者模式prelevel=Numask 022 //決定使用者建立目錄夾的權限,加起來為666export PATH runlevel prelevelmount ‐a //挂載所有應該被挂載的檔案系統,這些檔案以及格式包含在fstab裡面/bin/hostname ‐F /etc/sysconfig/HOSTNAME //設定主機名ifconfig eth0 xxx.xxx.xxx.xxx //設定 ip位址
并給這個檔案加上可執行權限:chmod +x rcS
在etc目錄下建立fstab檔案,内容如下:
# device mount‐point type options dump fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0
4、建構dev目錄
在這個目錄下添加兩個裝置檔案:console和null檔案,執行以下指令
sudo mknod console c 5 1sudo mknod null c 1 3
5、建構其他目錄
mkdir proc sys tmp mnt root
二、根檔案系統鏡像檔案制作
dd if=/dev/zero of=francis_linux_fs_64M.img bs=1M count=64sudo losetup /dev/loop0 francis_linux_fs_64M.imgsudo mkfs.ext4 /dev/loop0cd /work/nfs_root/francis_linux_fs/sudo mount /dev/loop0 /mntsudo cp * ‐rfd /mntsudo umount /mntsudo losetup ‐d /dev/loop0
通過fastboot燒寫核心和根檔案系統
1、fastboot指令的安裝
sudo apt‐get updatesudo apt‐get install android‐tools‐fastboot
2、移植核心和根檔案系統鏡像
将開發闆設定為emmc啟動,在u-boot指令行模式下讓開發闆執行:fastboot
在PC機上(裝有fastboot指令)執行下面指令下載下傳核心和根檔案系統鏡像:
fastboot flash kernel zImagefastboot flash fat francis_linux_fs_64M.imgfastboot reboot
在u-boot下設定一下啟動參數
set bootargs "root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200init=/linuxrc ctp=2 lcd=S70"set bootcmd "movi read kernel 0 0x40008000; bootm 0x40008000"savefast
開發闆挂接NFS檔案系統
1、主機安裝NFS服務
首先要确認linux主機是否安裝有NFS服務
$ ls ‐al /etc/init.d/nfs‐kernel‐server // 檢視是否存在nfs服務
如果沒有需要手動安裝nfs-kernel-server服務
$ sudo apt‐get install nfs‐kernel‐server
修改 /etc/exports 檔案,增加需要挂在的目錄 /mnt *(rw, sync),(其中/mnt是要被挂在的目錄,*表示任何伺服器,也可以寫用戶端的IP位址,(rw,sync)表示挂載檔案系統時的政策,rw表示讀寫,sync表示同步進行IO操作,還有其他的一些選項async(非同步進行IO操作)),然後重新開機nfs服務
$ sudo /etc/init.d/nfs‐kernel‐server restart
2、確定主機,網關,開發闆在同一網段
因為是在筆記本上操作,是以需要将準備三根網線和一個交換器,其中一根連接配接以太網,一根連接配接筆記本,最後一根連接配接開發闆。
查詢host主機ip作為serverip為192.168.100.107
随後查詢筆記本ip作為網關為192.168.100.106
ifconfig eth0 192.168.100.108# 設定網關route add default gw 192.168.100.106
之後在闆子上執行以下指令進行挂載
$ sudo mount ‐o ‐nolock ‐t nfs 10.24.21.143:/home/edision/work/nfs_root/francis_linux_fs /test
結果如上圖所示,至此,7天實作嵌入式開飯雲計算平台搭建的第一步移植作業系統就完成了。
步驟很詳細,祝你成功,如在移植過程中遇到問題,可以進達爾聞技術交流群找我。
第一步完成的老鐵,可以進入第二篇,繼續更新學習驅動的設計。