文章目錄
- 1. 摘要 ?
- 2. 代碼下載 📩
- 3. 編譯 🖥?
- 4. 修改&適配 ??
- 4.1 編譯框架基本概念
- 4.2 vendor & device 目錄
- 4.3 內核編譯
- 4.3.1 如何修改、適配自己的開發板?
- 4.4 修改外設驅動
- 5. 燒錄&驗證 📋
- 參考
1. 摘要 ?
本篇主要記錄如何編譯OpenHarmony 4.1 版本,并且在RK3568上燒錄、運行的過程。
其中,涉及到一些解決問題的思路和學習筆記,如果對你有幫助請點贊、轉發、收藏,也非常歡迎各位小伙伴評論,交流。😊💐👍👍👍
2. 代碼下載 📩
請參考官方文檔【1】
注意:版本要下載正確[OpenHarmony-v4.1-Release]
repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-v4.1-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
3. 編譯 🖥?
關于編譯,可能遇到的問題會比較多,不過也不要擔心,只要嚴格按照文檔中的步驟進行操作,安裝必須的依賴,就不會有問題。
參考【2】。
建議使用安裝Ubuntu的虛擬機或者Ubuntu主機,博主使用WSL2編譯遇到各種問題,解決花費了大量時間,得不償失
最重要的不步驟是安裝庫和工具集:
? 使用如下apt-get命令安裝后續操作所需的庫和工具:
sudo apt-get update; sudo apt-get install binutils; sudo apt-get install binutils-dev; sudo apt-get install git; sudo apt-get install git-lfs; sudo apt-get install gnupg; sudo apt-get install flex; sudo apt-get install bison; sudo apt-get install gperf; sudo apt-get install build-essential; sudo apt-get install zip; sudo apt-get install curl; sudo apt-get install zlib1g-dev; sudo apt-get install gcc-multilib; sudo apt-get install g++-multilib; sudo apt-get install gcc-arm-linux-gnueabi; sudo apt-get install libc6-dev-i386; sudo apt-get install libc6-dev-amd64; sudo apt-get install lib32ncurses5-dev; sudo apt-get install x11proto-core-dev; sudo apt-get install libx11-dev; sudo apt-get install lib32z1-dev; sudo apt-get install ccache; sudo apt-get install libgl1-mesa-dev; sudo apt-get install libxml2-utils; sudo apt-get install xsltproc; sudo apt-get install unzip; sudo apt-get install m4; sudo apt-get install bc; sudo apt-get install gnutls-bin; sudo apt-get install python3.9; sudo apt-get install python3-pip; sudo apt-get install ruby; sudo apt-get install genext2fs; sudo apt-get install device-tree-compilersudo apt-get install make; sudo apt-get install libffi-dev; sudo apt-get install e2fsprogs; sudo apt-get install pkg-config; sudo apt-get install perl; sudo apt-get install openssl; sudo apt-get install libssl-dev; sudo apt-get install libelf-dev; sudo apt-get install libdwarf-dev; sudo apt-get install u-boot-tools; sudo apt-get install mtd-utils; sudo apt-get install cpio; sudo apt-get install doxygen; sudo apt-get install liblz4-tool; sudo apt-get install openjdk-8-jre; sudo apt-get install gcc; sudo apt-get install g++; sudo apt-get install texinfo; sudo apt-get install dosfstools; sudo apt-get install mtools; sudo apt-get install default-jre; sudo apt-get install default-jdk; sudo apt-get install libncurses5; sudo apt-get install apt-utils; sudo apt-get install wget; sudo apt-get install scons; sudo apt-get install python3.9-distutils; sudo apt-get install tar; sudo apt-get install rsync; sudo apt-get install git-core; sudo apt-get install libxml2-dev; sudo apt-get install lib32z-dev; sudo apt-get install grsync; sudo apt-get install xxd; sudo apt-get install libglib2.0-dev; sudo apt-get install libpixman-1-dev; sudo apt-get install kmod; sudo apt-get install jfsutils; sudo apt-get install reiserfsprogs; sudo apt-get install xfsprogs; sudo apt-get install squashfs-tools; sudo apt-get install pcmciautils; sudo apt-get install quota; sudo apt-get install ppp; sudo apt-get install libtinfo-dev; sudo apt-get install libtinfo5; sudo apt-get install libncurses5-dev; sudo apt-get install libncursesw5; sudo apt-get install libstdc++6; sudo apt-get install gcc-arm-none-eabi; sudo apt-get install vim; sudo apt-get install ssh; sudo apt-get install locales; sudo apt-get install libxinerama-dev; sudo apt-get install libxcursor-dev; sudo apt-get install libxrandr-dev; sudo apt-get install libxi-dev
? 將Python 3.8設置為默認Python版本。
查看Python 3.8的位置:
which python3.8
如果無輸出請在環境中安裝python3.8或以上版本,以下安裝命令可作為python3安裝的參考:
sudo apt-get install python3
sudo apt-get install python-is-python3
查詢python是否可用符合版本要求
python --version
如果輸出高于3.8,則版本符合要求,若低于3.8可用以下方式安裝Python3.8:
cd
mkdir python_install #新建路徑,存儲python的安裝包
cd python_installwget https://mirrors.huaweicloud.com/python/3.8.10/Python-3.8.10.tgz #從官網獲取Python3.8安裝包,此處以3.8.10版本為例
tar -xzf Python-3.8.10.tgz
cd Python-3.8.10./configure --enable-optimizations --prefix=/usr/local/python3.8 #編譯和安裝python3.8
make -j$(nproc)
sudo make install/usr/local/python3.8/bin/python3.8 --version #確認python3.8是否安裝成功sudo update-alternatives --install /usr/bin/python python /usr/local/python3.8/bin/python3.8 1 #將Python和Python3切換為Python 3.8:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python3.8/bin/python3.8 1
環境依賴安裝、配置好后,OpenHarmony倉也有編譯前置依賴,直接執行腳本即可:
bash build/prebuilts_download.sh
然后,再安裝編譯工具hb:
? 在源碼根目錄運行如下命令安裝hb并更新至最新版本。
python3 -m pip install --user build/hb
? 設置環境變量。
vim ~/.bashrc
將以下命令拷貝到.bashrc文件的最后一行,保存并退出。
export PATH=~/.local/bin:$PATH
執行如下命令更新環境變量。
source ~/.bashrc
? 在源碼目錄執行"hb help",界面打印以下信息即表示安裝成功。
最后,參考【3】,編譯源碼:
/build.sh --product-name rk3568 --ccache
經過幾個小時的編譯,可以看到,終端提示編譯成功。
查看,編譯后的鏡像:
固件 | 說明 |
---|---|
boot_linux.img | 這是包含 Linux 內核的鏡像文件,負責啟動 Openharmony 系統的核心功能 |
chip_ckm.img | |
chip_prod.img | 該鏡像文件用于芯片制造商在芯片生產過程中燒錄到芯片中的系統鏡像 |
config.cfg | 燒寫工具的配置文件,可以直接導入燒寫工具顯示需要燒寫的選項 |
eng_system.img | 這是用于工程調試和測試的系統鏡像文件,包含了額外的調試工具和功能 |
MiniLoaderAll.bin | 這是一個引導加載程序,負責啟動 Openharmony 系統的初始化過程 |
parameter.txt | 包含分區信息 |
ramdisk.img | 該鏡像文件包含一個臨時文件系統,用于在系統啟動過程中提供臨時存儲 和加載所需的文件 |
resource.img | 該鏡像文件包含 Openharmony 系統所需的資源文件,如字體,圖標,音 頻等。 |
sys_prod.img | 這是用于生產環境的系統鏡像文件,用于制造商在設備生產過程中燒錄到 設備中。 |
system.img | 這是 Openharmony 系統的主要鏡像文件,包含了操作系統的核心組件, 庫和應用程序 |
uboot.img | 這是 U-boot 引導加載程序的鏡像文件,用于初始化硬件設備和加載操作 系統 |
updater.img | 這是用于系統升級的鏡像文件,包含了系統更新時所需的文件和信息 |
userdata.img | 該鏡像文件包含用戶的數據和設置,如應用程序數據,用戶配置等 |
vendor.img | 該鏡像文件包含設備供應商提供的特定驅動程序,庫和配置文件 |
進行到這一步,說明編譯環境,編譯依賴都沒問題。
那想要讓OpenHarmony在我們的板子上跑起來,還需要修改一下內核配置、外設驅動等,下面我們繼續。
4. 修改&適配 ??
4.1 編譯框架基本概念
OpenHarmony 的編譯框架是基于模塊化的,從大到小依次劃分為產品,子系統集(領域), 子系統,部件,模塊,特性。這種模塊化的樹狀編譯框架,非常方便根據目標產品硬件資源 的大小進行靈活的裁剪,從而實現“統一 OS,彈性部署”的目標。
? 產品:產品是基于解決方案為開發板的完整產品,主要包含產品對 OS 的適配、部件拼裝 配置、啟動配置和文件系統配置等。build.sh 編譯的時候通過–product-name 編譯選項指 定;hb 編譯的時候通過 hb set 進行設置。
? 子系統集:OpenHarmony 技術架構中有四大子系統集:“系統基本能力子系統集”、“基 礎軟件服務子系統集”、“增強軟件服務子系統集”、“硬件服務子系統集” 。四大子 系統不會直接出現在編譯選項或者參數中,而是有對應的一級源代碼文件夾:“系統基本 能力子系統集”對應源碼 foundation 文件夾;“基礎軟件服務子系統集”和“硬件服務子 系統集”對應源碼 base 文件夾;“增強軟件服務子系統集”對應源碼 domains 文件夾。
? 子系統:子系統是一個邏輯概念,它具體由對應的部件構成。在多設備部署場景下,支持 根據實際需求裁剪某些非必要的子系統或部件。
? 部件:對子系統的進一步拆分,可復用的軟件單元,它包含源碼、配置文件、資源文件和 編譯腳本;能獨立構建,以二進制方式集成,具備獨立驗證能力的二進制單元。
? 模塊:模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。
? 特性:特性是部件用于體現不同產品之間的差異。
各部分間的關系:
一個產品(product)可以包含 n 個子系統(subsystem),一個子系統可以包含 n 個部件 (component),一個部件只能屬于一個子系統。一個部件可以包含 n 個模塊(module),一個模塊 只能屬于一個部件。 不同產品中的相同部件可以通過特性(feature)進行差異化定義 ,子系統集(domain)在源 碼一級根目錄有體現。
如下圖所示:
總結一下就是:
- 子系統是某個路徑下所有部件的集合,一個部件只能屬于一個子系統。
- 部件是模塊的集合,一個模塊只能歸屬于一個部件。
- 通過產品配置文件配置一個產品包含的部件列表,部件不同的產品配置可以復用。
- 部件可以在不同的產品中實現有差異,通過變體或者特性feature實現。
- 模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。
關于編譯,后面我們單獨開個專題講
4.2 vendor & device 目錄
在編譯的時候,輸入編譯命令,如下所示:
/build.sh --product-name rk3568 --ccache
從編譯日志中,重點要了解和學習的目錄為 vendor 和 device 目錄。
vendor/hihope/rk3568
......
device/board/rockchip/rk3568
endor 目錄是以 vendor/{產品解決方案廠商}/{產品名稱}來存放的。 進入 vendor/hihope/rk3568 目錄下,有三個很重要的文件。 產品解決方案,在 config.json 文件中進行配置。
ohos.build 文件是子系統的配置文件,每個子系統有 ohos.build 配置文件,該文件中有添 加的組件配置。
device/board/hihope/rk3568/device.gni
device/board/hihope/rk3568/config.gni config.gni 文件配置開發板相關的編譯配置。
4.3 內核編譯
linux 內核編譯腳本的是放在 device/board/hihope/rk3568/kernel 目錄下的build_kernel.sh文件。
OpenHarmony 編譯腳本是通過打補丁的方式來適配不同的平臺, 不同的平臺有自己的內核補丁。
注意,理解這一點很重要
編譯腳本會先把 kernel/linux/linux-5.10 拷貝到 out/kernel/src_tmp/linux-5.10/, 然后打上 3568 的內核補丁patch -p1 < kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch后編譯生成自 己的鏡像,然后編譯內核鏡像。
4.3.1 如何修改、適配自己的開發板?
? 首先進入內核基礎目錄 kernel/linux/linux-5.10 打上 kernel.patch,這樣我們就有了一個完 整的內核代碼;
? 進入 kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip 目錄,加入自己的板級 dts 和 相關 dtsi 配置;
? 修改后生成新的內核補丁 kernel.patch,新的 kernel.patch 替換掉 kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch;
經過上述步驟,這樣完全編譯出的鏡像就支持自己的板子了。
4.4 修改外設驅動
TBD.
5. 燒錄&驗證 📋
我們使用RKDevTool工具燒寫鏡像:
右鍵,導入配置,然后點擊執行。
參考
【1】OpenHarmony/docs/sourcecode-acquire.md
【2】基于命令行開發,搭建開發環境
【3】編譯構建指導