本文打造一個迷你的LINUX系統,講述了arm嵌入式裝置的常用方法和過程。適合新手入門,當然最好還是知道什麼是交叉編譯,和懂得linux的基本命令。
先說說大致的思路,要在cubieboard板子上跑起來一個linux需要四大件:uboot,script-bin,linux核心(uImage),rootfs(這個我們自己做)
前面3個已經很多人寫過相關的文章了,我們不厭其煩的也多做一遍。
本文所用的系統是FC17-i686的系統,工具璉是4.7.2,arm-unknown-linux-gnueabi-,網上找的
需要準備的源碼:
busybox-1.21.0
google一搜一大吧。
linux 3.4.5
git clone https://github.com/linux-sunxi/linux-sunxi/tree/sunxi-3.4
sunxi-boards
git clone https://github.com/linux-sunxi/sunxi-boards
sunxi-tools
git clone https://github.com/linux-sunxi/sunxi-tools
u-boot-sunxi
git clone https://github.com/linux-sunxi/u-boot-sunxi
準備好這些東東,我們就可以了開始幹活了,首先把SD卡拿出來,確保上面沒有重要的資料資料。
我建議大家用root使用者進行操作,不然經常使用sudo很麻煩
1.首先是給SD卡分區,假設你的卡是/dev/sdx
fdisk /dev/sdx
我的卡是8g的,我的分區如下:
/dev/sdb1 2048 34815 16384 83 Linux
/dev/sdb2 34816 15122431 7543808 83 Linux
分區大小可以按自己喜好,但第一個區要從2048開始,這個切記。什麼fdisk不會用?。。。。d是刪除,n是建立,w是儲存,q是退出。
分好區,就是要格式化了
mkfs.vfat /dev/sdx1
mkfs.ext4 /dev/sdx2
現在把它們mount到本地
mount /dev/sdx1 /mnt/card1
mount /dev/sdx2 /mnt/card2,沒有card目錄請自己建立。
在開始所有的編譯之前,我們要把交叉編譯工具加入到PATH的環境變數
比方我的工具包放在/tools下,arm-unknown-linux-gnueabi-在/tools/bin目錄下,那麼
export PATH="/tools/bin:$PATH"
這個只對當前終端和其子終端有效。
2.編譯uboot,
uboot是一個bootloader,有關他的介紹很多,我們在這裡不多做介紹了。
進入uboot-sunxi目錄:
make distclean CROSS_COMPILE=arm-unknown-linux-gnueabi-make cubieboard CROSS_COMPILE=arm-unknown-linux-gnueabi-
編譯完,執行命令
dd if=spl/sunxi-spl.bin of=/dev/sdb1 bs=1024 seek=8 dd if=u-boot.bin of=/dev/sdb1 bs=1024 seek=32
在tools/下有個檔案叫mkimage,以後編核心和boot.src會用上,把它拷貝到/usr/bin目錄下吧。如果你有的話,可以不這麼做。
cp tools/mkimage /usr/bin
3.編譯sunxi-tools
不需要什麼config,直接make
沒有看到error,就說明成功了,請直接到4,不成功繼續往下看。
如果出現報錯:
Package libusb-1.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libusb-1.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libusb-1.0' found
fel.c:21:20: 致命錯誤:libusb.h:沒有那個檔案或目錄
編譯中斷。
make: *** [fel] 錯誤 1
如果是ubuntu使用者,用apt-get install libusb-dev可以搞定。
但是如果和我一樣是用fedora使用者的話,就稍微麻煩點了。首先要去下一個叫libusb-1.0.9(版本號碼無所謂了)的包,解壓進入目錄
./configuremake CROSS_COMPILER=arm-unknown-linux-gnueabi-make installcp libusb/libusb.h /usr/includecp libusb-1.0.pc /usr/share/pkgconfig
4.編譯script-bin
這個最簡單
cd sunxi-boards/sys_config/a10/../../../sunxi-tools/fex2bin cubieboard.fex script.bin
把script.bin拷貝到/mnt/card1
cp script.bin /mnt/card1
5.編譯uImage
這個時間會稍微長點。其實也很簡單。不過有點要注意的,在linux下面解壓unzip有時候會缺少檔案,建議大家用7zip
make ARCH=arm sun4i_defconfigmake ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- uImage
同樣,把arch/arm/boot/uImage 拷貝到/mnt/card1
cp arch/arm/boot/uImage /mnt/card1
6.建立boot.src
cd /mnt/card1touch boot.cmdvi boot.cmd#按i輸入下面內容:setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 init=/sbin/init rootwait panic=10 ${extra}fatload mmc 0 0x43000000 script.binfatload mmc 0 0x48000000 uImagebootm 0x48000000#按esc 再按:wq儲存退出mkimage -C none -A arm -T script -d boot.cmd boot.scr
現在你的/mnt/card1下面應該有4個檔案:
boot.scr ; boot.cmd; uImage;script.bin;
開機磁碟分割的工作到此為止了。
7.編譯busybox
make ARCH=arm defconfigmake ARCH=arm menuconfig
busybox settings-->
build option -->
Build BusyBox as a static binary (no shared libs) 把這個選上,意思是靜態編譯
Cross Compiler prefix 輸入交叉編譯器首碼,我這裡是:arm-unknown-linux-gnueabi-
networking Utilities -->
inetd 這個去掉,選上的話編譯會有問題。
如果出現錯誤:
miscutils/nandwrite.c:49:26: fatal error: mtd/mtd-user.h: No such file or directory
compilation terminated.
make[1]: *** [miscutils/nandwrite.o] 錯誤 1
make: *** [miscutils] 錯誤
則使用命令,拷貝相應檔案
cp -Rv /usr/include/mtd/ include/
如果還缺少其它的,一樣道理
編譯完畢,
make install
預設裝在_install檔案夾下面
8.建立根檔案系統
把_install 下面的東東都拷貝到/mnt/card2
cp -Rv _install/* /mnt/card2
cp -Rv examples/bootfloppy/etc /mnt/card2
在mkdir下面建立檔案夾/dev /proc /sys /var /home /tmp /mnt /run等目錄
修改etc下面的fstab檔案如下:
proc /proc proc nosuid,noexec,nodev 0 0sysfs /sys sysfs nosuid,noexec,nodev 0 0devpts /dev/pts devpts gid=4,mode=620 0 0tmpfs /tmp tmpfs defaults 0 0devtmpfs /dev devtmpfs mode=0755,nosuid 0 0/dev/mmcblk0p1 /boot vfat defaults 0 2/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
修改initab檔案如下:
::sysinit:/etc/init.d/rcS::askfirst:-/bin/sh
好了,umount 它們,嘗試啟動一下系統吧。
當你看到Please press Enter to activate this console,按一下,就可以進入終端了
網卡裝置還沒啟動。如果要啟動的話,也是可以的。不過不在這裡一一說明了。呵呵