RK3328安裝liunx(ubuntu16.04)RK固件

編譯環境

系統:Ubuntu14.04(server版) 內核:4.4.0-142-generichtml

基本上與官方文檔沒什麼特別大的出入,只有在編譯Ubuntu根文件系統時有些許差別。python

準備工做

硬件要求:

64 位系統,硬盤空間大於 40G。若是進行多個構建,將須要更大的硬盤空間。linux

軟件要求:編譯環境初始化

  • 預先安裝所需環境依賴
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip tar curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 cmake tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 lzop lib32stdc++6

$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

複製代碼
  • 安裝 ARM 交叉編譯工具鏈和編譯內核相關軟件包
$ sudo apt-get install gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev \
libssl1.0.0 libssl-dev

複製代碼

下載LINUX-SDK:下載源碼包(推薦國內用戶使用)

  • 下載repo工具:
$ cd /opt
$ mkdir linux
$ cd linux
$ git clone https://github.com/FireflyTeam/repo.git

複製代碼
  • 源碼包

Linux-SDK GPT 源碼包 (提取碼:f4hg)c++

解壓文件:7z x linux-sdk-3328.7z,可經過如下命令安裝7zgit

$ sudo apt install p7zip-full
複製代碼

把下載好的源碼包上傳到建立好的linux目錄下github

注意:解壓完以後,用戶可能會疑惑看不到文件。在linux/目錄運行ls -a命令,有.repo/目錄,這是咱們的倉庫。bootstrap

同步源碼:

# 這個命令在repo文件中有一個執行文件可以使用
$ ./repo/repo sync -c

複製代碼

注意:從 Github 上同步 SDK 時,部分國內用戶會有不穩定的現象,這就須要屢次運行同步命令 repo sync -c 才能夠ubuntu

$ tree -L 1
.
├── app
├── buildroot buildroot根文件系統的編譯目錄
├── build.sh -> device/rockchip/common/build.sh 全自動編譯腳本
├── device
├── distro
├── docs 開發文檔
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel 內核
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh 打包腳本
├── prebuilts
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh 燒寫腳本
├── rootfs
├── tools
└── u-boot
複製代碼

編譯 Ubuntu 根文件系統(Ubuntu 16.04 amd64)

  • 安裝依賴包:
$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
複製代碼
  • 下載 Ubuntu core:
$ sudo mkdir ubuntu-rootfs && cd ubuntu-rootfs
$ wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.1-base-arm64.tar.gz
複製代碼
  • 建立一個大小爲 1000M 的根文件系統映像文件,並使用 Ubuntu 的基礎包去初始化:
# 快速建立一個大文件
$ fallocate -l 1000M rootfs.img
# 格式化此大文件
$ sudo mkfs.ext4 -F -L ROOTFS rootfs.img
$ mkdir mnt
# 把大文件掛載到mnt文件下
$ sudo mount rootfs.img mnt
# 把下載好的ubuntu解壓到mnt文件下,此時由於mnt與rootfs.img有關聯,放到mnt文件下,就是放到了rootfs.img文件中了
$ sudo tar -xzvf ubuntu-base-16.04.1-base-arm64.tar.gz -C mnt/
$ sudo cp -a /usr/bin/qemu-aarch64-static mnt/usr/bin/
# 把本機中的dns文件放到mnt中,不然在進入文件系統時沒法鏈接網絡, 官網中是手動設置的dns文件,此時不設置,後續配置會遇到/etc/network/interfaces.d/eth0: No Such file or directory
$ sudo cp /etc/resolv.conf mnt/etc/
複製代碼

qemu-aarch64-static是其中的關鍵,能在 x86_64 主機系統下 chroot 到 arm64 文件系統vim

  • Chroot 到新的文件系統中去並初始化:
$ sudo chroot mnt/

# 這裏能夠修改設置
$ USER=firefly
$ HOST=firefly

# 建立用戶
$ useradd -G sudo -m -s /bin/bash $USER
$ passwd $USER
# 輸入密碼

# 設置主機名和以太網
$ echo $HOST > /etc/hostname
$ echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
$ echo "127.0.0.1 $HOST" >> /etc/hosts
$ echo "auto eth0" > /etc/network/interfaces.d/eth0
$ echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0

# 使能串口
$ ln -s /lib/systemd/system/serial-getty\@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service

# 安裝包,在安裝以前能夠進行更換鏡像源,也能夠不進行更換,若是遇到速度慢等問題,能夠更換國內鏡像源

$ apt-get update
$ apt-get upgrade
$ apt-get install ifupdown net-tools ping
$ apt-get install udev sudo ssh vim
# 退出文件系統
$ exit
# 取消掛載
$ sudo umount /mnt && cd ..
$ pwd
/opt/linux
複製代碼

若是還有什麼想要安的軟件能夠在退出文件系統以前繼續安裝。bash

重要:上述命令中有一行使能串口的軟鏈接命令,暫時能夠按照這麼寫,由於我在後續啓動的過程當中,遇到了如下錯誤

Timed out waiting for device dev-ttyS0.device
複製代碼

在獲取dev-ttyS0.device時超時了,默認等待5分鐘才能進行下一步,這是由於在/dev目錄下根本沒有ttyS0這個文件,具體解決方法,我放到了後面的踩坑記錄中,可參考。

配置Rootfs

  • 完成上述後,獲得rootfs.img(1G),拷貝根文件系統到rootfs目錄下;
$ cp mnt/rootfs.img /opt/liunx/rootfs/
複製代碼
  • 在device/rockchip/rk3328/roc-rk3328-cc.mk中, 將「# rootfs image path」修改成:
$ cd /opt/liunx
$ sudo vim device/rockchip/rk3328/roc-rk3328-cc.mk
export RK_ROOTFS_IMG=rootfs/rootfs.img
複製代碼
  • 編譯配置文件:
$ ./build.sh roc-rk3328-cc.mk
複製代碼

運行完上述腳本後,在 device/rockchip/ 目錄下,生成 .BoardConfig.mk 軟連接 device/rockchip/rk3328/roc-rk3328-cc.mk

模塊編譯

如下編譯若是有遇到錯誤,請看最後的踩坑,若是有同樣的錯誤可參照修改。

build腳本參數以下:

./build.sh --help

====USAGE: build.sh modules====
uboot              -build uboot
kernel             -build kernel
rootfs             -build default rootfs, currently build buildroot as default
buildroot          -build buildroot rootfs
yocto              -build yocto rootfs, currently build ros as default
ros                -build ros rootfs
debian             -build debian rootfs
pcba               -build pcba
recovery           -build recovery
all                -build uboot, kernel, rootfs, recovery image
cleanall           -clean uboot, kernel, rootfs, recovery
firmware           -pack all the image we need to boot up system
updateimg          -pack update image
sdbootimg          -pack sdboot image
save               -save images, patches, commands used to debug
default            -build all modules
BoardConfig        -select the corresponding BoardConfig.mk file  
複製代碼

編譯u-boot:

$ ./build.sh uboot
複製代碼

編譯kernel:

$ ./build.sh kernel
複製代碼

編譯rootfs:

  • recovery 分區在 Ubuntu 系統中不會用到,如有須要,可運行以下命令:
$ ./build.sh recovery
複製代碼
$ ./mkfirmware.sh
複製代碼
  • 提示:在運行./mkfirmware時,可能會遇到以下報錯:
error: /home/ljh/proj/linux-sdk/buildroot/output/rockchip_rk3328_recovery/images/recovery.img not found!
複製代碼

表示recovery分區沒有找到,相似的如oem.img、userdata.img,上文提到,這些屬於可省略分區鏡像,能夠不用理會。

  • 整合統一固件
#該命令打包爲RK固件
$ ./build.sh updateimg
複製代碼

注意:每次打包固件前,須要運行mkfirmware.sh腳本更新rockdev/下的分區鏡像

燒寫固件到SD卡中

遇到的錯誤

Uboot

  • unable to execute 'swig': No such file or directory
  • error: command 'swig' failed with exit status 1

解決:

sudo apt-get install swig

複製代碼
  • command 'x86_64-linux-gnu-gcc' failed with exit status 1
  • Python.h: No such file or directory

解決:

$ sudo apt-get install python-dev

複製代碼

kernel

  • lz4c: not found

解決:

$ sudo apt-get install liblz4-tool 

複製代碼

打包

  • genext2fs: command not found

解決:

$ sudo apt-get install genext2fs

複製代碼

啓動

  • Timed out waiting for device dev-ttyS0.device

首先這個錯誤是由於在/dev目錄下根本沒有ttyS0這個文件,**ls*命令後,只看到了ttyS1文件,好像也不必定是S1也有多是別的數字,視狀況而定。

解決:

$ ls /etc/systemd/system/getty.target.wants -al
lrwxrwxrwx 1 root root   34 Jul 19  2016 getty@tty1.service -> /lib/systemd/system/getty@.service
lrwxrwxrwx 1 root root   41 Aug  1 02:19 serial-getty@ttyS0.service -> /lib/systemd/system/serial-getty@.service
# 先把S0那條軟鏈接刪除
$ cd /etc/systemd/system/getty.target.wants
$ sudo rm -rf serial-getty@ttyS0.service
# 由於肯定我/dev下存在的是ttyS1文件,因此再次運行使能串口的軟鏈接,不一樣的是改爲S1
$ ln -s /lib/systemd/system/serial-getty\@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS1.service
複製代碼
  • A job is running for... network interfaces

這個不能算是錯誤,這個緣由是由於你沒有插網線,網絡緣由形成的,由於前面設置的是dhcp動態獲取IP地址,在沒有插網線的狀況下,這個信息會在5分鐘以內一直獲取IP,要想timeout時間短點修改如下設置。

解決:

$ sudo vim /etc/systemd/system/network-online.target.wants/networking.service
# 找到如下參數並修改,默認單位是秒,可自由修改時間,退出保存便可
imeoutStartSec=20
複製代碼
相關文章
相關標籤/搜索