日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

S5PV210的启动过程

發布時間:2024/9/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 S5PV210的启动过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

初步認識IROM和IRAM

S5PV210含有一個內64K的IROM和96K的IRAM,系統啟動時主要依靠它們,IROM和IRAM所處的存儲空間見下圖:

S5PV210有IROM,且只能從IROM啟動,不再支持原來的直接從外部介質啟動方式。
IROM代碼(BL0)運行完畢后,根據OM[5:0]確定外部啟動介質(BL1和BL2)完成啟動。S5PV210支持的外部啟動介質包括:NAND Flash、OneNAND、SD/MMC、eMMC、eSSD、UART/USB。

完整的啟動序列
系統剛啟動時,會運行IROM中的固化代碼,進行一些通用的初始化,具體步驟包括:
第一步 關閉看門狗;
第二步 初始化icache;
第三步 初始化堆棧;
第四步 設置時鐘;
第五步 判斷啟動設備(nand/sd/onenand等),檢查校驗和,然后從啟動設備中拷貝前16K的代碼到IRAM的0xD0020000處;
第六步 若是安全模式啟動,則進行完整性檢查;
第七步 跳轉到IRAM的0xD0020010地址上繼續運行;

UART /USB啟動模式
OM[5:4] = 0b10即可選擇UART/USB啟動模式此時IROM代碼運行完畢后,會先嘗試從UART 啟動,若失敗則會嘗試從USB啟動。若失敗則會根據OM[3:0]選擇相應的啟動介質再次嘗試啟動。
UART啟動時,必須在S5PV210上電前將串口連接好,上位機使用dnw工具來發送啟動代碼可執行文件。本教材中使用USB啟動方式作為調試,因此不詳細探討UART啟動方式。
1、USB啟動方式必須借助dnw工具,教材中使用dnw v0.60c。
2、打開dnw軟件,將dnw中USB下載地址設置為0xd0020010。
3、復位開發板。
4、若是初次使用則Windows會彈出發現新硬件圖標,索引安裝開發板dnw USB驅動即可。若已經安裝驅動,則dnw會顯示USB:OK,表示USB連接已經成功。
5、dnw菜單中USB Port->Transmit,選擇編譯好的bin文件即可。USB download完成后S5PV210會即刻跳轉到0xd0020010處執行。

1、//?關閉看門狗
ldr??? r0, =0xE2700000
mov??? r1, #0
str??? r1, [r0]

2、控制icache
// 打開icache可提高運行速度
#ifdef CONFIG_SYS_ICACHE_OFF
// clear bit 12 (I) I-cache??
??? bic???? r0, r0, #0x00001000
#else??
// set bit 12 (I) I-cache???
??? orr???? r0, r0, #0x00001000
#endif
??? mcr???? p15, 0, r0, c1, c0, 0

3、// 設置棧
棧的整體作用
1) 保存現場;
2) 傳遞參數:匯編代碼調用C函數時,需傳遞參數;
3) 保存臨時變量:包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量;

4、重定位代碼到IRAM+0x4000
重定位:對于程序而言,我們需要理解兩個概念,一是程序當前所處的地址,即程序在運行時,所處的當前地址;二是程序的鏈接地址,即程序運行時應該位于的運行地址。編譯程序時,可以指定程序的鏈接地址。?
對于S5PV210而言,啟動時只會從NAND Flash/sd等啟動設備中拷貝前16K的代碼到IRAM中,那么當我們的程序超過16K怎么辦?那就需要我們在前16K的代碼中將整個程序完完整整地拷貝到DRAM等其他更大存儲空間,然后再跳轉到DRAM中繼續運行我們的代碼,這個拷貝然后跳轉的過程就叫重定位。本章中我們主要學習如何重定位,但是并不會涉如何使用到DRAM,而是簡單地將代碼從IRAM的0xD0020010處拷貝到IRAM的0xD0024000處,然后跳轉到0xD0024000處繼續運行我們的代碼。
鏈接腳本:鏈接腳本就是程序鏈接時的參考文件,其主要目的是描述如何把輸入文件中的段(SECTION)映射到輸出文件中,并控制輸出文件的存儲布局。鏈接腳本的基本命令式SECTIONS命令,一個SECTIONS命令內部包含一個或多個段,段(SECTION)是鏈接腳本的基本單元,它表示輸入文件中的某個段是如何放置的。
鏈接腳本的標準格式如下:?
SECTIONS?
{
???? sections-command
???? sections-command?
}
/*link.lds*/
SECTIONS
{
??? . = 0xD0024000;
??? .text : {
??????? start.o
??????? * (.text)
??? }????
??? .data : {
??????? * (.data)
??? }
??? bss_start = .;?
??? .bss : {
??????? * (.bss)
??? }
??? bss_end? = .;????
}
1) 在鏈接腳本中,單獨的點號(.)代表了當前位置,. = 0xD0024000; 表示程序的鏈接地址是0xD0024000;
2) link.lds中的.text 、 .data 、 .bss分別是text段、data段、bss段的段名(這些段名并不是固定的,是可以隨便起的)。.text段包含的內容是start.o和其余代碼中所有的text段;.data段包含的內容是代碼中所有的data段;.bss段包含的內容是代碼中所有的bss段。
3) bss_start和bss_end保存的是bss段的起始地址和結束地址,在start.S中會被用到。

data、text、bss段:
1) data段:數據段(datasegment)通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬于靜態內存分配。
2) text段:代碼段通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀,某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。
3) bss段:指用來存放程序中未初始化的全局變量的一塊內存區域。BSS是英文BlockStarted by Symbol的簡稱。當我們的程序有全局變量是,它是放在bss段的,由于全局變量默認初始值都是0,所有我們需要手動清bss段。
/*start.S*/
.global _start
_start:??
??? // 關閉看門狗???
??? ldr??? r0, =0xE2700000???????????????
??? mov??? r1, #0???
??? str??? r1, [r0]???
??? // 設置棧,以便調用c函數???
??? ldr??? sp, =0xD0037D80????
??? // 重定位????????????????????????????
??? // _start當前所位于的地址:0xd0022000???
??? adr r0, _start?????????????
??? // _start的鏈接地址:0xd0024000??
??? ldr r1, =_start???????
??? // bss段的起始地址??
??? ldr r2, =bss_start???
??? cmp r0, r1
??? beq clean_bss
copy_loop:???
??? ldr r3, [r0], #4??? // 源???
??? str r3, [r1], #4??? // 目的???
??? cmp r1, r2???
??? bne copy_loop???
// 清bss段
clean_bss:????
??? ldr r0, =bss_start???????????????????????
??? ldr r1, =bss_end???
??? cmp r0, r1???
??? beq run_on_dram???
??? mov r2, #0
??? clear_loop:???
??? str r2, [r0], #4???
??? cmp r0, r1???
??? bne clear_loop??
// 跳轉
run_on_dram:????????????????
??? ldr pc, =main

/*main.c*/
#define???? GPJ2CON???? (*(volatile unsigned long *) 0xE0200280)
#define???? GPJ2DAT??????? (*(volatile unsigned long *) 0xE0200284)
// 延時函數
void delay(unsigned long count)
{
??? volatile unsigned long i = count;
??? while (i--);????????
}
void main()????????????????
//LED 閃爍
{
??? GPJ2CON = 0x00001111;
??? // 配置引腳
??? while(1)????????????????????
??? // 閃爍
??? {
??????? GPJ2DAT = 0;
??????? // LED on
??????? delay(0x100000);
??????? GPJ2DAT = 0xf;
??????? // LED off
??????? delay(0x100000);
??? }
}

?

5、重定位代碼到DRAM
DRAM0對應的地址是0x2000_0000~0x3FFF_FFF共512M,DRAM1對應的地址是0x4000_000~0x7FFF_FFFF共1G。


代碼下載鏈接:http://download.csdn.net/detail/klcf0220/5508253

總結

以上是生活随笔為你收集整理的S5PV210的启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。