yocto工程升級要點
需求
原有的工程是多年前基于yocto sumo開發,對應的linux kernel版本是4.14。 需求是要求linux kernel升級到5.10。
背景
工程由以下幾部分組成,
- yocto sumo構建部分的代碼,包括poky,bitbake等
- 目標平臺支持多款第三方處理器,包括imx6和imx8,以及intel某款cpu,所以有meta-freescale和meta-intel等
- 我們自己的linux kernel代碼,當初是基于yocto sumo 的linux kernel4.14寫的,主要是幾個驅動代碼,還有少-部分自己維護的補丁
- 我們自己的業務代碼,這部分業務代碼又分成好幾個模塊,這里不細述。
調查評估
表面需求是升級linux kernel,我們需要調查:
- 我們當前的驅動代碼可能會有問題,包括新的kernel代碼可能刪除了某些函數導致我們驅動編譯失敗,另外需要調查我們的補丁是否還適用,是否需要修改
- 為保證應用戶態基礎服務能夠與新kernel正常交互工作,對應的glibc等也需要相應升級,對應的交叉編譯工具鏈也需要升級
- 我們的業務代碼,由于kerne和#2變化,也需要相應修改以適配新的kernel,glibc和編譯鏈
- 該需求目標平臺是基于intel某款cpu的,時間關系我們可以暫時不用關心meta-freescale,重點關注meta-intel layer的升級
所以實際需求是升級整個yocto工程,調查發現yocto hardknott默認linux kernel版本是5.10, 所以需要更新我們的驅動代碼,補丁和業務代碼,隨之帶來的是需要更新recipes以適應yocto hardknott升級,基于sumo的腳本與配置也需要修改
實現
-
把poky,meta-openembedded,meta-intel, meta-freescale升級到hardknott
-
upgrade yocto poky to hardknott, git clone -b hardknott git://git.yoctoproject.org/poky
-
in the poky, upgrade meta-openembedded to hardknott, git clone -b hardknott https://github.com/openembedded/meta-openembedded.git
-
in the poky, upgrade meta-intel to hardknott, git clone -b hardknott https://git.yoctoproject.org/meta-intel
-
meta-freescale upgrade, git clone -b hardknott https://git.yoctoproject.org/meta-freescale
-
編譯打包過程中需要新的宿主機工具,在local.conf & local.conf.sample中加入HOST_TOOLS
-
layer.conf中有依賴sumo的特定部分,需要改成hardknott
-
hardknott默認python版本已經轉變為python3了,對應的get_bblayers.py, set_bb_env.sh等如果還期望繼續按python2執行需要把python關鍵字改為python2
-
bitbake-layers add-layer 指定的layers
-
build/conf/templateconf.cfg 內容需要指定為本工程的conf路徑
-
linux kernel upstream代碼如果還沒有包含我們之前的補丁那就需要重新生成新補丁并打上
-
linux driver部分,主要有一些函數新的kernel代碼已經刪除,或者參數返回值類型有變化,相應的需要調整代碼,比如
-
- Kconfig 文件語法與新kernel不兼容,需要改
-
- struct timespec 被刪掉了, 需要改為timespec64, 替換 ktime_get_ts() 為 ktime_get_ts64(), time_sub →time64_sub, getnstimeofday() → ktime_get_real_ts64(),類似的還有
-
- SIOCGSTAMP, ioremap_nocache(),stubssock_no_setsockopt,sock_no_getsockopt ,setup_timer(),init_timer() ,kernel_setsockopt() cancel_work(), kernel_sock_ioctl() 不再支持,需要找到相應的替代者
-
- wakeup_source_register() ,kernel_getsockname(), send_sig_info(siginfo_t sig, ...) 原型變化,需要相應改動代碼
-
用戶空間代碼改動也較多,簡單舉幾個例子
-
- 不再能在頭文件里定義變量,不然新的gcc會報錯,需要把原先頭文件里定義的變量挪到對應的.c里,如果多處.c使用該變量則用extern 關鍵字聲明。
-
- nanopb 版本升級,對應的需要重新生成.pb.c, .pb.h
-
- recipe里例子比如python-protobuf 需改為python3-protobuf

浙公網安備 33010602011771號