[project X] tiny210 uboot移植進度說明

這份移植進度是當時在project X項目移植對應版本上的uboot到tiny210上的時候寫的。
現在回過頭來,想要整理一些uboot的移植心得和學習筆記,所以先把當時的移植進度發出來,方便後續文檔整理的思路。

零、項目說明

project X項目是由wowo發起的,希望能夠在一個項目中可以支持多個板子的項目。
在wowo的project X項目上對友善之臂tiny210的板子進行支持。
目前已經可以正常啓動到kernel commandline部分。
暫時只使用SDcard作爲存儲設備,後續會對nand flash進行支持。
歡迎有tiny210或者其他板子的同學也一起參與到這個項目來,讓project x項目支持更多的板子。

一、移植進度說明

本次移植基於project-x使用的uboot來進行移植。
本次移植參考了kangear的移植,在這裏向這位大神致敬。

  • 7月23日以前。

    • 前期做一些準備工作,包括搭ubuntu環境,弄板子,下project-x的代碼,找一些相關資料。git庫操作的學習。
      嘗試在ubuntu環境下編譯過project-x的代碼。
      第一次添加tiny210 board支持失敗,在wowo的指導下發現關於tiny210的一些CPU配置搞錯了,應該是armv7並且可以使用machine s5pv1xx.
    • 進展:環境和代碼都已經搞定,板子也已經到位。
    • 後續任務:繼續嘗試添加tiny210 board並且編譯成功。(7.23-7.27完成)
  • 7.23-7.27——需要整理文檔

    • 第二次添加tiny210 board支持,使用arm-linux-gcc4.5編譯器,逐步解決編譯問題(有一部分修改內容是參考kangear的代碼)。
      上傳到自己的git hub分支上。
    • 注意:目前的修改有一些純粹就是爲了解決編譯錯誤,不管代碼的內容,後續移植過程中需要對這些內容進行fix。
    • 進展:初步添加到tiny210 board支持到project-x的項目上,並且編譯成功。創建了一個tiny210的分支專門用於維護tiny210的代碼。
    • 後續任務:
      1、測試板子,安裝好各種驅動,用kangear的uboot測試能否正常啓動。熟悉一下sdcard啓動uboot的步驟。(7.30完成)
      2、搞清楚s5pv210的啓動流程,BL0-BL1(uboot-spl)-BL2(uboot)。(7.29完成)
  • 7.29——需要整理文檔

    • 根據文檔和資料搞清楚了s5pv210的啓動流程,簡單結合文檔看了一下arrmv7的uboot-spl的流程。
      http://blog.csdn.net/linuxarmsummary/article/details/44836293
      http://www.cnblogs.com/zhangpengshou/p/3617800.html
    • 注意:上述網站代碼和project-x中armv7的代碼有差異,需要結合代碼自己整理一遍流程,思考一下uboot-spl“點LED燈”的代碼應該加在什麼位置。
    • 進展:大致整明白了armv7-uboot-spl的流程。(armv7的uboot-spl使用位置無關代碼的方式)
    • 後續任務:
      1、結合project-x的代碼來分析uboot-spl的流程。
      2、讓自己編譯的uboot-spl也可以正常在tiny210中跑起來,通過點亮LED來觀察是否跑起來了。(7.30完成)
  • 7.30

    • 測試tiny210板子,安裝好各種驅動,編譯了kangear的uboot,在tiny210的板子上測試kangear的uboot正常啓動。
      熟悉一下sdcard啓動uboot的步驟。
    • 進展:
      1、kangear的uboot可以正常在tiny210中啓動,後續在在tiny210上移植uboot,可以參考kangear的uboot來進行。
      2、成功的讓project-x項目的uboot-spl在tiny210中跑起來了,很殘暴的在_main中直接去點亮LED測試了一下。
    • 後續任務:
      1、在正常的board.c中去點亮LED。(8.3完成)
      2、實現串口輸出log。(8.15完成)
  • 7.31

    • 因爲該版本uboot上已經添加了s5pv210的gpio的一些配置的API,在s5p_gpio.c。
      但是要編譯通過這個函數需要使能FIT的部分,也就是要打開device_tree的功能。
      所以就先簡單移植tiny210的device tree.
    • 進展:
      1、移植device tree成功。
  • 8.3

    • uboot-spl太小,無法編譯進s5pc110原來的gpio.o。所以無法使用標準的gpio_cfg_pin來點亮LED。只能直接操作GPIO的寄存器來實現。
    • 進展:在board.c中點亮LED。完善通過LED實現的tiny210_early_debug操作。
    • 後續:
      因爲在spl中實現串口輸出意義不大。先移植DRAM的代碼。
      1、研究kangear中DRAM的初始化和BL2的img的copy過程。(8.7-8.10)
      2、實現DRAM的初始化(8.10,寫了一篇文檔來代替,基本上搞清楚了)
      3、實現BL2的img的copy過程(8.11完成)
    • 幾個重點關注問題
      (0)可以先嚐試把kangear關於ddr的部分先移植過去再說。(8.6完成)
      (1)BL1中DRAM初始化的過程
      _start——》reset——》cpu_init_crit——》lowlevel_init——》實現一些底層的初始化,包括DDR的初始化。(8.4完成)
      (2)BL1中copy BL2到DRAM的流程(8.11完成)
      (3)如何驗證是否初始化成功?是否copy成功?
      初始化完DDR之後嘗試往DDR寫入一個值,然後再讀出來,如果讀出來的值和寫入的值一樣,就說明初始化成功。(8.6完成)
  • 8.6

    • 直接移植kangear的ddr初始化代碼成功。
    • 進展:移植kangear的ddr代碼到project-x項目中,使用直接寫一個DDR地址之後再從這個地址裏面讀出來,發現值是對的。所以DDR的初始化應該是成功的。
  • 8.7-8.10——需要整理文檔(已整理)

    • 進展:研究了s5pv210的DDR硬件結構,地址映射方法,初始化流程以及一些參數的設置
      根據原理圖、datasheet和代碼整理了文檔《tiny210 ddr文檔》。
  • 8.11——需要整理文檔(已整理)

    • 進展:參考kangear的代碼實現了BL1中copy BL2到DRAM的流程。
      並且用kangear可以正常使用的uboot測試了一下。
      弄清楚了整個copy的流程和原理。並整理了文檔《從SDCARD加載到dram中》。
    • 後續:
      1、研究uboot的編譯過程和運行過程(可以從Makefile入手)(8.12完成)。
      2、使用自己編譯通過的uboot,可以成功在DRAM上面跑起來(8.11完成)。
      通過在_start點亮三個燈並用b xys_loop死循環之後,可以判斷uboot.bin已經開始執行了。
  • 8.12——需要整理文檔

    • 進展:1、大致搞清楚了uboot的啓動和uboot-spl的啓動的差異。
      弄明白了global data的原理、地址和使用等等。
      uboot和uboot-spl的堆棧的設置。
      2、定位到serial_init導致程序uboot不斷重啓,屏蔽掉之後就沒事了
    • 疑問:uboot-spl中把sp設置錯了(也就是堆棧設置錯了),但是C函數還是可以正常調用。
      原因:因爲編譯器對於C函數的彙編進行了優化,沒有使用push和pop指令,所以不需要使用到堆棧。
    • 後續:1、解決掉serial_init導致重啓的問題(8.15完成)
      2、使串口正常使用(8.15完成)
  • 8.15

    • 進展:1、解決開機過程中不斷重啓問題。
      兩個原因導致,1、dts節點中serial的配置問題 2、CONFIG_OF_TRANSLATE使能之後導致的DTS解析錯誤的問題。
      2、串口已經可以正常打印log了。
    • 後續:1、研究一下s5pv210的串口驅動代碼。
      2、繼續完善一些初始化的東西,包括dram_init等等(08.18完成)
      3、啓動到命令行的位置(08.18完成)
  • 8.18——需要整理文檔

    • 進展:1、學習了下relocation過程uboot大小的計算(bss_end-_start)
      學習了下relocation的過程
      2、使能DEBUG來打印debug()函數的log
      3、對dram_init的補充
      4、屏蔽掉一些函數之後uboot正常啓動到了命令行模式。
      屏蔽了nand_init(); initr_nand, initr_mmc,initr_env,
    • 後續:1、文檔的整理《relocation》、《board_init_f》、《board_init_r》等等
      2、對上述屏蔽掉的函數進行補充和修正(08.20完成)。
  • 8.20

    • 進展:1、修正屏蔽了nand_init(); initr_nand, initr_mmc,initr_env的問題
      2、看project-x中移植kernel的方法,學習研究中。
      3、查找了一下後續在tiny210中移植kernel的文檔,以便後面學習參考。
    • 後續:1、針對tiny210添加一個配置,使其能夠編譯通過。(08.22完成)

    • 接下來就是kernel移植的部分,已經整理到《tiny210 kernel移植進度說明》中

    • 目前任務:針對tiny210添加一個配置,使其能夠編譯通過。
    • 目前問題:
    • 目前的一些想法:因爲uboot的比較簡陋,nand flash還不支持,可以直接在SD卡中刷入kernel。另外,可以直接使用一個沒有壓縮的kernel,暫時不考慮參數的問題,直接將其拷貝到RAM上,然後直接跳轉過去進行點燈。先保證kernel可以正常跑入。(08.22完成)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章