【嵌入式Linux驅動開發】一、虛擬開發板QEMU IMX6ULL搭建

  本來花了大價錢買了原子哥的Linux開發板,寒假前以爲很快就能返校,所以果斷把板子留在了學校。人算不如天算,2020這個大災大難的鼠年這麼不太平,這段時間真是閒夠了,是時候走出舒適區,繼續學習Linux了!
  本文參考韋東山老師製作的qemu虛擬開發板,分享自己的Linux驅動開發學習!

  我們最終都要遠行,最終都要跟稚嫩的自己告別。也許路途有點艱辛,有點孤獨,但熬過了痛苦,我們才能得以成長。


  需要提醒的是,搭建過程中需要合適的路徑輸入相應的命令。

一、安裝qemu

  • 安裝KVM,加速qemu運行。
sudo apt-get update
sudo apt-get install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
  • 安裝git,方便下載qemu
sudo apt-get install git
  • 安裝qemu系統鏡像(適用ubuntu-16.04開發環境)
cd /home/clay/linux/qemu/new
git  clone  https://git.dev.tencent.com/weidongshan/ubuntu-16.04_imx6ul_qemu_system.git

  鏡像目錄結構及說明如下,尤其要注意紅框中的部分,在後期的嵌入式驅動開發中要進行替換! 在這裏插入圖片描述

二、運行qemu

  • 進入qemu安裝路徑
cd /home/clay/linux/qemu/new/ubuntu-16.04_imx6ul_qemu_system-release
  • 首次運行需要安裝SDL環境(注意:再次下載無需再重複安裝,會報錯!)
    用腳本自動解壓安裝
./install_sdl.sh // 提示輸入用戶密碼,等待安裝完成

如果遇到一依賴關係報錯,輸入sudo apt-get install -f修復依賴關係

  • 運行帶GUI的imx6ul模擬器(注意:啓動後便進入了qemu的終端,而下面的操作仍然是在ubuntu終端進行的,需要再開一個終端進行下面的操作。)
./qemu-imx6ull-gui.sh // 啓動後,登錄名是root,無需密碼

關於更多qemu具體操作案例,可以參考百問網

三、下載源碼

  完整的嵌入式Linux系統包含:bootloader、Linux內核、設備樹、根文件系統。QEMU可以略過bootloader而直接啓動內核,這給開發帶來了便利。

  • 設置git郵箱賬號和用戶名
git config --global user.email "you\@example.com"
git config --global user.name "Your Name"
  • 下載源碼到/home/clay目錄
    • 考慮到代碼倉庫過多,特使用repo工具管理代碼。先用git clone下載repo工具,再用repo工具下載源碼:
cd /home/clay
git clone https://git.dev.tencent.com/codebug8/repo.git
mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
../repo/repo init -u https://dev.tencent.com/u/weidongshan/p/manifests/git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
../repo/repo sync -j4
  • /home/clay目錄下的100ask_imx6ull-qemu文件夾裏,便是對應的源碼!
    • 其中交叉編譯工具,就在其中的ToolChain目錄下,接下來配置交叉編譯工具需要用到!
      在這裏插入圖片描述

四、更新內核和設備樹

  • 設置交叉編譯工具鏈
    • 在終端輸入vi ~/.bashrc
    • 在文件的末尾加上下列代碼,然後重啓即可生效!
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/clay/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

上述在.bashrc中設置交叉編譯工具鏈參數是永久生效的,若要僅對當前終端生效,直接在終端中敲入上述三行代碼即可!

  • 編譯內核及設備樹
cd /home/clay/100ask_imx6ull-qemu/linux-4.9.88
make mrproper
make 100ask_imx6ull_qemu_defconfig
make zImage -j4
make dtbs

編譯內核時可能會因爲缺少lzop報錯,安裝lzop即可解決:sudo apt-get install lzop

  • 更新內核和設備樹
    • 編譯成功後,可在./arch/arm/boot/zImage目錄下得到內核文件,在./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb得到設備樹文件
    • 用上述2個文件去替換qemu中的zImage和100ask_imx6ull_qemu.dtb即可達到更新內核和設備樹的目的。
      • qemu的內核和設備樹文件在其安裝目錄下的./imx6ull-system-image文件夾下。

五、更新根文件系統

  • 進入根文件系統所在目錄
cd /home/clay/linux/qemu/new/ubuntu-16.04_imx6ul_qemu_system-release/imx6ull-system-image
  • 掛載根文件系統
sudo mount -o loop rootfs.img /mnt
  • 更新根文件系統
    • 掛載成功後可以通過/mnt目錄訪問根文件系統,進而也可以對其中的內容進行修改
  • 修改完畢後,取消掛載
sudo umount /mnt

六、配置NFS

  • 啓動qemu虛擬開發板(注意:啓動後便進入了qemu的終端,而下面的操作仍然是在ubuntu終端進行的,需要再開一個終端進行下面的操作。)
./qemu-imx6ull-gui.sh
  • 在Ubuntu安裝、配置NFS服務
sudo apt-get install nfs-kernel-server
  • 打開配置文件
sudo vim /etc/exports
  • 在文件末尾,添加類似以下的內容
    • 下面的例子裏允許開發板通過NFS訪問Ubuntu的/home/clay目錄
/home/clay *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
  • 重啓NFS服務
sudo /etc/init.d/nfs-kernel-server restart
  • 在Ubuntu上通過NFS掛載自己,測試NFS是否可用。(注意:測試完畢後別忘了卸載哦)
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/clay /mnt
  • 輸入ls /mnt,看看是否和/home/clay下的內容一致,一致則說明掛載成功!

七、qemu通過NFS訪問Ubuntu

需要注意的是,以下配置qemu的NFS,應該在qemu打開的模擬板子終端輸入命令!

  • 開發板獲取IP地址
    • QEMU運行時,Ubuntu是Host即宿主機,QEMU給它分配的IP是10.0.2.2。
    • QEMU模擬的imx6ull板子是Guest即客戶機,它會自動獲取IP,也可以自己設置。
    • Guest可以通過10.0.2.2訪問Host,Host不能訪問Guest
  • Guest中可以使用ifconfig命令查看IP,如果沒有IP,可以進行如下設置:
ifconfig eth0 10.0.2.15
  • 掛載主機NFS目錄
    • QEMU模擬的imx6ull開發板,可以NFS掛載訪問10.0.2.2(Ubuntu主機)
mount -t nfs -o nolock,vers=3 10.0.2.2:/home/clay/linux/qemu/NFS /mnt
  • 如果一切正常,在開發板上就可以通過/mnt目錄訪問Ubuntu的/home/clay/linux/qemu/NFS目錄了。

八、更新QEMU

據韋老師講,qemu會隨着視頻的錄製添加相應的外設,也就意味着需要更新qemu。

新版本可以在新建的目錄下,執行下列命令,而原來舊版本的下載目錄可以直接刪除!

git  clone  https://git.dev.tencent.com/weidongshan/ubuntu-16.04_imx6ul_qemu_system.git

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章