210串列埠控制台 210移植printf不好使

2021-08-10 10:38:31 字數 2204 閱讀 8658

210串列埠控制台-問題描述

這邊正常大家應該會發現,移植核心中printf函式還是會不好使,但是基本的串列埠列印是正常的,

首先我們先得分析一下這邊主要的原因,如果細心的同學應該會發現,

當我們加入核心printf的**之後,編譯出來的檔案會大於16k,

可以發現手冊中有這個部分的操作順序,上電之後首先會執行在irom中bl0裡廠商固化好的**,

並且把使用者的bl1部分(只有16k)複製到了sram中(起始位址是0xd0020010,其中0xd0020000~0xd0020010是210加頭的部份),

按照圖中順序使用者應該要在bl1中將bl2(超過16k的部份),自己複製到sram中,

整個sram中有96k,如果整個bootloader還超過就要在bl2中將剩餘**複製到記憶體sdram中,

因此我們發現最大的問題應該就出在bl0只複製16k上,按手冊要求,也為了之後的實驗,

我們在這裡需要把我們的裸機**分成bl1跟bl2兩個部分,這樣才能解決不好使的問題

210串列埠控制台-bl0廠商固化**

如果你看過答疑助手-許老師的bl1部分**,你會發現許老師在bl1中根本沒有做記憶體初始化,

直接就使用c語言,我們都知道c語言必須先要設定堆疊指標,而且堆疊指標會指向記憶體,

但是這個時候我們記憶體初始化都還沒做呢,怎麼可能會把指標指向記憶體,

其實答案就出在bl0廠商固化**中,210跟2440、6410的啟動流程最大不一樣的地方,

就在這個bl0廠商固化**中,首先從手冊可以找到這個bl0幹了什麼

1.關閉看門狗計時器

2.初始化 icache

3.初始化棧

4.初始化堆

5.初始化塊裝置複製函式

6.初始化鎖相環並且設定系統時鐘

7.複製使用者**bl1到sram中

8.檢查bl1的校驗值

9.檢查是否為安全啟動模式

10.跳轉到使用者的bl1繼續執行

也就是說bl0中其實已經為我們初始化好堆疊了並且可以參考下面的記憶體位址分布來看一下

210串列埠控制台-bl1、bl2分別需要完成的**

然後複製的時候

需要注意的是這個函式的輸入部分是資料所在的塊跟所在的頁,而不是頁偏移,因為是塊裝置複製

(c)另外值得注意的是我們自己寫的nand複製函式其實沒有考慮過ecc,因為nand儲存的資料很容易會出錯,

所以nand有個ecc的校驗機制,其實我們在看nand的手冊仔細點就可以看出端倪,

也就是這個部分,多出的這些位元組其實就是存放ecc校驗碼的,至於演算法有興趣的可以參考yang的**

最後就是從nand的哪個位址開始複製,首先分為slc跟mlc兩種flash

正常大家應該使用的都是slc的版本,下一節會提到bl1跟bl2的分割方式,

假設bl1加頭之後填充到4k,並且把bl2附加在後面那麼實際上就是從nand4k的位置開始複製,

如果bl1加頭之後填充到16k,並且把bl2附加在後面那麼實際上就是從nand16k的位置開始複製

另外提一下在210手冊523頁有乙個om腳的變數可以用來判斷是怎麼啟動的

固化**中還有從sd卡複製**的函式有興趣的可以參考yang的**判斷om假設從sd卡啟動,

就從sd卡複製剩下的**bl2到記憶體。

210串列埠控制台-鏈結位址與bl1、bl2的分割方式

首先我們知道bl1是複製到sram中去執行的,在bl1中我們基本上只有在跳轉bl2的時候使用絕對跳轉,

剩下的地方都不會使用絕對跳轉,所以bl1的鏈結位址實際上沒有多大的作用,

而bl2的鏈結位址因為是跳轉到記憶體中的,並且是我們主要的程式部分,

加上需要處理中段向量,因此這個鏈結位址就非常重要了,

如果我們的**最終是複製到0x20008000這個位址並且跳轉到這個位址的,

那我們的鏈結位址就必須是0x20008000,也就是說鏈結位址與**實際的位址必須保持一致

至於怎麼把**分割成bl1跟bl2實際上的作法是做兩個**分別編譯,

並且保證bl1小於16k,把bl1加頭之後擴充套件到一定的大小,再把bl2附加在bl1後面

bl1的makefile先把bl1編譯之後加頭

儲存到相簿

2017-4-13 10:30 上傳

頂層的makefile實際上就是把已經加完頭的spl_210.bin 擴充套件成16k,然後再把編譯完的bl2,

連線,實際上因為在210的頭中有bl1的實際大小,因此如果你的bl1不到16k也就不需要一定得擴充套件到16k

X210串列埠配置與stdio移植

串列埠控制器初始化關鍵步驟 1 初始化串列埠的tx和rx引腳所對應的gpio 查原理圖可知rx和rx分別對應gpa0 1和gpa0 0 2 gpa0con 0xe0200000 bit 3 0 0b0010 bit 7 4 0b0010 3 初始化這幾個關鍵暫存器ucon0 ulcon0 umcon...

Ubuntu Server 控制台轉串列埠

ubuntu 伺服器下配置串列埠的方法 第一步 修改grub.conf 檔案。其中紅色粗體傾斜字型為需要新增的部分 vi boot grub grub.cfg begin etc grub.d 10 linux menuentry ubuntu,with linux 2.6.32 28 server...

關閉串列埠控制台 靈思科

由於mt7620n只有乙個uart lite介面,在原生的openwrt中作為了核心列印和tty控制台所用。而在很多情況下,需要使用串列埠與外部晶元就行通訊,這時就需要從openwrt中釋放串列埠。其實這個任務只有兩個步驟 我們假定 topdir 為openwrt的編譯目錄 關閉串列埠控制台 將 t...