這一節主要討論1個問題:點燈。點燈是實際開發中,特別是裸板開發中常見的調試手段,相當於主機開發中漫天飛舞的printf/printk。為了追蹤程序的現場執行情況,很多時候我們都使用點一個燈的方法來進行初步的判斷。如果你把剛才編譯的程序燒錄到SoC,你又怎么知道這個Uboot有沒有工作呢?所以,我們在這里就要完成這樣一個程序的改造。
雖說只是點一個燈, 但麻雀雖小五臟俱全, 也算是對uboot源碼進行修改, 我總結了一點改造uboot的流程, 這一篇就按下面的改造流程來組織:
- 找運行邏輯,即插入代碼的位置。
- 根據運行邏輯編寫功能代碼。
- 找配置邏輯,即修改哪些文件使配置生效。
- 根據配置邏輯修改配置使功能代碼生效。
- 重新編譯燒寫uboot。
1. 找運行邏輯
我們希望板子在uboot的運行的時候就點燈示意, 所以應該在啟動過程中盡可能考前的位置編寫點燈代碼, 根據上一篇對啟動流程的敘述, 顯然我們需要修改的文件就是"arch/arm/cpu/armv7/start.S ", 我們在啟動代碼之后添加我們的代碼, 即"134行"后
2. 編寫功能代碼
根據我的電路板。我的LED最終接在了GPF3_5接口,所以我配置相應的寄存器,點亮一個燈,並將這部分代碼添加到"arch/arm/cpu/armv7/start.S +134"
135 msr cpsr,r0
136
137 #if 1
138 ldr r0, =0x114001E0 @load GPF3CON address to register
139 ldr r1, [r0] @load data in GPF3_5CON
140 bic r1, r1,#0xff0000 @output 0x110000
141 orr r1, r1,#0x110000
142 str r1, [r0]
143
144 ldr r0, =0x114001E4 @load GPF3_5DAT address to register
145 mov r1, #0x20 @10 0000
146 str r1, [r0]
147 #endif
148 /*
3. 找配置邏輯。
這段代碼不需要額外的配置即可工作
4. 修改配置
無
5. 重新編譯燒寫
改寫完程序,重新編譯uboot(強烈建議寫腳本,我這里就不貼了),如果沒有問題,我們的燈就可以亮了