我所理解的u-boot移植可以分為以下幾個部分:
1、內核級的配置與初始化
這個主要就是在start.S文件里面那些匯編代碼,這部分呢我覺得基本上沒有改的必要,除非你很熟悉內核相關的東西。
2、SOC級別的配置與初始化
這部分的內容是比較多的,而且可以說貫穿整個u-boot,但基本上必要的都集中在lowlevel_init,其它的就取決于你是否要在u-boot階段使用某些硬件資源了,比如網卡是在board_init_r里面,已經是靠后的位置了,有些板子甚至可能都不會在u-boot階段使用網絡,自然也就不需要初始化。這部分是移植過程中修改較多的地方,而且基本上都是使用匯編編碼,只要這部分搞定了,那u-boot基本就可以成功啟動了。
3、board_init_f階段
這個階段主要是對u-boot之后重定位進行內存的規劃,雖然執行的子函數多,但都不復雜。移植內容少。
4、u-boot比較核心的重定位
現在版本比較新的的u-boot重定位的意義和以前感覺都發生了變化,以前只需要讓u-boot運行在鏈接地址就對了,主要就是將u-boot搬到DDR運行,而現在不一樣,即使已經運行在鏈接地址了還不夠,還需要更加合理的規劃內存,現在u-boot重定位后,內存變得更加連續,我們也基本不擔心將內核拷貝到DDR后覆蓋掉u-boot本身,所以重定位還是比較重要的。可以說不用改。
5、board_init_r階段
這個階段干的事主要就是準備終端,初始化需要用到的硬件資源,如果使用新的驅動模型的話,還要像kernel一樣將硬件進行抽象。這個根據自己的需求,用了什么就要改什么。
6、啟動內核或者處理用戶命令
u-boot最大的使命就是啟動內核,所以這部分也是核心的內容。board_init_r最后會調用run_main_loop進入一個循環,要么就是直接去啟動內核,要么就是進入終端處理用戶命令和用戶交互。也可以說不用改,差不多已經是純軟件干的事了。
在移植2020.04版本之前,我也移植過2018.04版本,兩個版本大致內容差不多,感覺最大的變化就是重定位這部分,在各個大版本中,重定位代碼基本上是一直在變的,但確實感覺是變得越來越容易理解。
移植之前還覺得有很多的內容都不清楚,可能移植會失敗什么的,也怕寫到中途發現很多錯誤而放棄,但做了才發現,也不是想象的那么困難,雖然反反復復的修改了好幾次,但大的方向都是正確的,這也讓我對以前很多不理解的地方有了新的認識,如果當時我沒去做,可能現在還停留在對u-boot迷迷糊糊的狀態,對很多東西一知半解,下次遇到還是一臉懵,慶幸的是我做了,并且做到了。
接下來計劃的內容還有網絡的支持,及MMC卡檢測失敗的問題,可能還會分析一下驅動模型。
歡迎掃碼關注我的微信公眾號