亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

地址代碼uboot之start.S源碼分析

系統 1917 0

每日一貼,今天的容內關鍵字為地址代碼

???? /arch/arm920t/cpu/start.s 件文就是uboot 的第一階段,uboot的前4K容內,即nandflash中的前4K容內會被拷貝到cpu中的SRAM中運行,這一小段代碼擔任初始化硬件環境,并將殘余的Uboot代碼加載到內存中去。從而跳到轉第二階段,在第二階段運行之前要需建立棧堆。

???? IRQ_STACK_START??? .word 0x0badc0de

???? FRQ_STACK_START??? .word 0x0badc0de

????/*

?*? armboot - Startup Code for ARM920 CPU-core

?*

??*/

?

?

????#include <config.h>

????#include <version.h>

?

?

????/*

?*************************************************************************

?*

?* Jump vector table as in table 3.1 in [1]

?*

?*************************************************************************

?*/

?

?

????.globl _start

????_start:? b?????? reset????? ?? //b 是跳轉指令,即跳到轉reset 標簽處。接著返回到此處。

???? ldr? pc, _undefined_instruction 置設斷中向量表 0x0 0x4.....0x8 0xc

???? ldr? pc, _software_interrupt

???? ldr? pc, _prefetch_abort

???? ldr? pc, _data_abort

???? ldr? pc, _not_used

???? ldr? pc, _irq

???? ldr? pc, _fiq

?

????_undefined_instruction: .word undefined_instruction

????_software_interrupt:?? .word software_interrupt

????_prefetch_abort:?? .word prefetch_abort

????_data_abort:?????? .word data_abort

????_not_used:???????? .word not_used

????_irq:????????????? .word irq

????_fiq:????????????? .word fiq

???? 利用.word 來在以后位置放置一個值,這個值實際上就用對應的斷中理處函數的地址
;.word的義意為在以后地址處放入一個16bits值

???? .balignl 16,0xdeadbeef

?

?

????/*

?*************************************************************************

?*

?* Startup Code (reset vector)

?*

?* do important init only if we don't start from memory!

?* relocate armboot to ram

?* setup stack

?* jump to second stage //從英文注釋中可以看出starts.o的作用。

?*

?*************************************************************************

?*/

?

????_TEXT_BASE:

???? .word??? TEXT_BASE

?

????.globl _armboot_start

????_armboot_start:

???? .word _start

?

????/*

?* These are defined in the board-specific linker script. 針對不同板類型的鏈接腳本中經已義定過了,體具的腳本??

?*/

????.globl _bss_start?? //未初始化的數據段開始地址

????_bss_start:

???? .word __bss_start

?

????.globl _bss_end? //結束地址

????_bss_end:

???? .word _end

?

????#ifdef CONFIG_USE_IRQ?? //斷中是不是經已置配。

????/* IRQ stack memory (calculated at run-time) */

????.globl IRQ_STACK_START

????IRQ_STACK_START:

???? .word??? 0x0badc0de? //棧堆的始起地址。

?

????/* IRQ stack memory (calculated at run-time) */

????.globl FIQ_STACK_START

????FIQ_STACK_START:

???? .word 0x0badc0de

????#endif

?

?

????/*

?* the actual reset code

?*/

???? _start: 入口處,馬上跳到轉reset 處,在SVC狀態下要關閉有所斷中。

????reset:

???? /*

???? ?* set the cpu to SVC32 mode // 超等用戶態, 操縱統系用使的保護模式。統系復位和軟件斷中時進入該模式。

???? ?*/

???? mrs? r0,cpsr? ? // 將以后cpsr 的狀態為保存到r0中。

???? bic? r0,r0,#0x1f ? //bic ,位清零指令。0x1f=00011111 ,相當于清除低5位。剛好是模式位。

???? orr? r0,r0,#0xd3? // 或指令。很明顯是置模式位。0xd3=11010011 以及置設5,6,7位的狀態位。制止FIQ,IRQ,處于arm狀態。低5位為10011,則對應超等用戶態。

???? msr? cpsr,r0? // 在將r0 中的值賦給狀態寄存器cpsr

?

????/* turn off the watchdog */ 關閉看門狗

????#if defined(CONFIG_S3C2400)

????# define pWTCON??????? 0x15300000

????# define INTMSK??????? 0x14400008??? /* Interupt-Controller base addresses */

????# define CLKDIVN?? 0x14800014??? /* clock divisor register */

????#elif defined(CONFIG_S3C2410) 我們的是2410 ,如果移植其它的,則可以添加關相的基地址

????# define pWTCON??????? 0x53000000? //pWTCON 看門狗寄存器的基地址,手冊上就是WTCON ,這里多一個p

????# define INTMSK??????? 0x4A000008??? /* Interupt-Controller base addresses */

????# define INTSUBMSK 0x4A00001C 斷中子掩碼寄存器

????# define CLKDIVN?? 0x4C000014??? /* clock divisor register */

????#endif

?

???? 將看門狗寄存器清空,其各位含意為,第0 位為1則當看門狗定時器溢出時重啟,為0則不重啟,初始值為1

???? 第2 位為斷中使能位,初值為0

???? 第3 ,4位為時鐘頻分銀子,初值為00

???? 第5 位為看門狗的使能位,初值為1

???? 第8~15 位為比例因子,初值為0x80

????#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

???? ldr???? r0, =pWTCON //將pWTCON寄存器的地址賦給r0

???? mov??? ?r1, #0x0

???? str???? r1, [r0]? // 將pWTCON 有所位置為0,就關閉看門狗了,實際上只要將第5位置0可即。

?

???? /*

???? ?* mask all IRQs by setting all bits in the INTMR - default

???? ?*/

???? mov? r1, #0xffffffff

???? ldr? r0, =INTMSK? //蔽屏有所的斷中

???? str? r1, [r0]

????# if defined(CONFIG_S3C2410)

???? ldr? r1, =0x7ff?? 011111111111 ,很多料資上是0x3ff 。手冊上定規有13位可用

???? ldr? r0, =INTSUBMSK 如果是2410, 這個寄存器也要蔽屏

???? str? r1, [r0] // 將低13 位全都置1 13位可用 而不是12位

????# endif

?

???? /* FCLK:HCLK:PCLK = 1:2:4 */

???? /* default FCLK is 120 MHz ! */ 時鐘置設

???? ldr? r0, =CLKDIVN

???? mov? r1, #3

???? str? r1, [r0]

????#endif?? /* CONFIG_S3C2400 || CONFIG_S3C2410 */

?

???? /*

???? ?* we do sys-critical inits only at reboot,

???? ?* not when booting from ram!

???? ?*/

????#ifndef CONFIG_SKIP_LOWLEVEL_INIT 避免重復用引cpu_init_crit 函數。

???? bl?? cpu_init_crit

????#endif

???? ?

???? 橙色的分部代碼,是針對從nor flash 中啟動的設備。對于不是從nandflash中啟動的設備,沒什么用。這一段似乎也能行執代碼制復.

???? #ifndef CONFIG_SKIP_RELOCATE_UBOOT?

???? relocate:????????????? /* relocate U-Boot to RAM?? ??? */

???? ???? adr? r0, _start???????? /* r0 <- current position of code?? */

???? 查看以后代碼的地址信息,若從ram 中運行,則_start=_TEXT_BASE,否則_start = 0x00000000

???? ???? ldr? r1, _TEXT_BASE???????? /* test if we run from flash or RAM */

???? ???? cmp???? r0, r1????????????????? /* don't reloc during debug???????? */

???? ???? beq???? stack_setup 若相稱,則建立棧堆

???? ?

???? ???? ldr? r2, _armboot_start? ?? 若不等,則表現從flash 中運行,重定向代碼

???? ???? ldr? r3, _bss_start ??????? 獲得未初始化數據段地址

???? ???? sub? r2, r3, r2???????? /* r2 <- size of armboot??????????? */ 代碼段的度長

???? ???? add? r2, r0, r2???????? /* r2 <- source end address???????? */ 代碼的度長

???? ?

???? copy_loop:

???? 制復代碼,r0 為代碼的始起地址,r1為ram中地址,r2為代碼的終止地址,每次copy后將r0的值遞增同r2較比來判斷是不是制復成完。

???? ???? ldmia??? r0!, {r3-r10}????? /* copy from source address [r0]??? */

???? ???? stmia??? r1!, {r3-r10}????? /* copy to?? target address [r1]??? */

???? ???? cmp? r0, r2???????????? /* until source end addreee [r2]??? */

???? ???? ble? copy_loop

???? #endif?? /* CONFIG_SKIP_RELOCATE_UBOOT */

???? ???? /* Set up the stack??????????????????????????? ??? */

???? stack_setup:

???? ???? ldr? r0, _TEXT_BASE???????? /* upper 128 KiB: relocated uboot?? */

???? ???? sub? r0, r0, #CFG_MALLOC_LEN /* malloc area? 192K??????????????????? */

???? ???? sub? r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo 配分128 節字來存儲開發板信息??????? */

???? #ifdef CONFIG_USE_IRQ

???? ???? sub? r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

???? #endif 再減去12 節字用于棧點起

???? ???? sub? sp, r0, #12??????? /* leave 3 words for abort-stack??? */

???? ?

???? clear_bss:

???? ???? ldr? r0, _bss_start???????? /* find start of bss segment??????? */

???? ???? ldr? r1, _bss_end?????? /* stop here??????????????????????? */

???? ???? mov r2, #0x00000000??????? /* clear??????????????????????????? */

???? ?

???? clbss_l:str?? r2, [r0]????? /* clear loop...??????????????????? */

???? ???? add? r0, r0, #4

???? ???? cmp? r0, r1

???? ???? ble? clbss_l

?

???? #if 0

???? ???? /* try doing this stuff after the relocation */

???? ???? ldr???? r0, =pWTCON

???? ???? mov???? r1, #0x0

???? ???? str???? r1, [r0]

???? ?

???? ???? /*

???? ???? ?* mask all IRQs by setting all bits in the INTMR - default

???? ???? ?*/

???? ???? mov? r1, #0xffffffff

???? ???? ldr? r0, =INTMR

???? ???? str? r1, [r0]

???? ?

???? ???? /* FCLK:HCLK:PCLK = 1:2:4 */

???? ???? /* default FCLK is 120 MHz ! */

???? ???? ldr? r0, =CLKDIVN

???? ???? mov? r1, #3

???? ???? str? r1, [r0]

???? ???? /* END stuff after relocation */

???? #endif

???? 當初的設別,大都是利用SDRAM 與NANDFLASH獨特作用,因此為了支撐能從nand_flash中啟動,要需添加面下的紅色代碼。

???? ?

???? #ifdef CONFIG_S3C2410_NAND_BOOT

???? bl copy_myself

???? ?

???? @jump to ram

???? ldr r1,=on_the_ram

???? add pc,r1,#0

???? nop

???? nop

???? 1:

???? b 1b

???? on_the_ram

???? #endif

?

???? ldr? pc, _start_armboot

?

????_start_armboot:??? .word start_armboot

?

???? #ifdef CONFIG_S3C2410_NAND_BOOT

???? copy_myself:

???? mov r10.lr? 將以后的lr 保存到r10中,保存斷點地址

???? @reset nand

???? mov r1,#NAND_CTL_BASE nandflash 基地址

???? ldr r2,0xf830 r2 = 1111 ,1000 ,0011,0000 第15位為nandflash控制器使能位,第12位初始化ECC,第11位nFCE使能?????有問題

???? str r2,[r1,#oNFCONF]

????每日一道理
冰心說道:“愛在左,同情在右,走在生命的兩旁,隨時撒種,隨時開花,將這一徑長途,點綴得香花彌漫,使穿枝拂葉的行人,踏著荊棘,不覺得痛苦,有淚可落,卻不是悲涼。”

???? ldr r2,[r1,#oNFCONF]

???? ?

???? bic r2,r2,#0x800?? 將第11 位清零指令,使能片芯

???? str r2,[r1,#oNFCONF]

???? 寫入令命

???? mov r2,#0xff?? @reset command

???? strb r2,[r1,#oNFCMD]

???? ?

???? mov r3,#0?

???? 1:
??add r3, r3, #0x1???? // 循環等待 ??

???? cmp r3, #0xa
??blt 1b

2: 利用狀態寄存器試測flash 部內操縱是不是成完,如果成完則狀態寄存器將返回1.NFSTAT最后位一為0時,表現正在忙,為1表現閑暇
??ldr r2, [r1, #oNFSTAT] @ wait ready
??tst r2, #0x1 //tst 位試測指令
??beq 2b

??ldr r2, [r1, #oNFCONF] 制止片芯
??orr r2, r2, #0x800 @ disable chip
??str r2, [r1, #oNFCONF]

@ get read to call C functions (for nand_read()) 建立棧堆,棧點起0x33f00000 ,巨細為0x8000
??ldr sp, DW_STACK_START ??????? @ setup stack pointer
??mov fp, #0 ??????????????????? @ no previous frame, so fp=0


???? ?

???? ?

???? @ copy U-Boot to RAM 。r0 r1 r2 為傳入到Nand_read_ll中的三個參數, nand_read_ll( unsigned char *buf, unsigned long start_addr, int size)

????可知,
??ldr r0, =UBOOT_RAM_BASE?
??mov r1, #0x0
? ?//mov r2, #0x20000? //UBOOT 巨細為128K 這三個參數傳入到nand_read_ll中

???? mov r2. #0x30000 // 置設為192k
??bl nand_read_ll
??tst r0, #0x0 ??? r0 為返回值nand_read_ll 的返回值
??beq ok_nand_read

bad_nand_read:
loop2: b loop2 @ infinite loop


ok_nand_read: nand_flash 通過ecc 驗校來保障拷貝到SDRAM中的容內是確正的
@ verify
??mov r0, #0
??ldr r1, =TEXT_BASE
??mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes ,每條指令占4 個節字,共挪動0x400即1024次,加起來就挪動了4*1024即4K的巨細
go_next:
??ldr r3, [r0], #4
??ldr r4, [r1], #4
??teq r3, r4
??bne notmatch
??subs r2, r2, #4
??beq stack_setup
??bne go_next

notmatch:
loop3: b loop3 @ infinite loop

#endif @ CONFIG_S3C2410_NAND_BOOT

?

?

????/*

?*************************************************************************

?*

?* CPU_init_critical registers

?*

?* setup important registers

?* setup memory timing

?*

?*************************************************************************

?*/

?

?

????#ifndef CONFIG_SKIP_LOWLEVEL_INIT? cpu 的置設,楚清I/D cache, 清除TLB

????cpu_init_crit:

???? /*

???? ?* flush v4 I/D caches

???? ?*/

???? mov? r0, #0

???? mcr? p15, 0, r0, c7, c7, 0? /* flush v3/v4 cache */

???? mcr? p15, 0, r0, c8, c7, 0? /* flush v4 TLB */

?

???? /*

???? ?* disable MMU stuff and caches

???? ?*/

???? mrc? p15, 0, r0, c1, c0, 0

???? bic? r0, r0, #0x00002300??? @ clear bits 13, 9:8 (--V- --RS)

???? bic? r0, r0, #0x00000087??? @ clear bits 7, 2:0 (B--- -CAM)

???? orr? r0, r0, #0x00000002??? @ set bit 2 (A) Align

???? orr? r0, r0, #0x00001000??? @ set bit 12 (I) I-Cache

???? mcr? p15, 0, r0, c1, c0, 0

?

???? /*

???? ?* before relocating, we have to setup RAM timing 在重定位之前,要需設初始化內存時序,因為內存時鐘是開發板獨立的。

???? ?* because memory timing is board-dependend, you will

???? ?* find a lowlevel_init.S in your board directory.

???? ?*/

???? mov? ip, lr??????? // 返回到reset

???? bl?? lowlevel_init

???? mov? lr, ip

???? mov? pc, lr??????? // 從lowlevel_init 中,返回到reset

????#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

?

????/*

?*************************************************************************

?*

?* Interrupt handling 斷中函數的理處。義定各種常異指令。

?*

?*************************************************************************

?*/

?

????@

????@ IRQ stack frame.

????@

????#define S_FRAME_SIZE?? 72

?

????#define S_OLD_R0?? 68

????#define S_PSR????? 64

????#define S_PC?????? 60

????#define S_LR?????? 56

????#define S_SP?????? 52

?

????#define S_IP?????? 48

????#define S_FP?????? 44

????#define S_R10????? 40

????#define S_R9?????? 36

????#define S_R8?????? 32

????#define S_R7?????? 28

????#define S_R6?????? 24

????#define S_R5?????? 20

????#define S_R4?????? 16

????#define S_R3?????? 12

????#define S_R2?????? 8

????#define S_R1?????? 4

????#define S_R0?????? 0

?

????#define MODE_SVC 0x13

????#define I_BIT 0x80

?

????/*

?* use bad_save_user_regs for abort/prefetch/undef/swi ...

?* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling

?*/

?

???? .macro?? bad_save_user_regs

???? sub? sp, sp, #S_FRAME_SIZE

???? stmia??? sp, {r0 - r12}????????????? @ Calling r0-r12

???? ldr? r2, _armboot_start

???? sub? r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)

???? sub? r2, r2, #(CFG_GBL_DATA_SIZE+8)? @ set base 2 words into abort stack

???? ldmia??? r2, {r2 - r3}????????? @ get pc, cpsr

???? add? r0, sp, #S_FRAME_SIZE?????? @ restore sp_SVC

?

???? add? r5, sp, #S_SP

???? mov? r1, lr

???? stmia??? r5, {r0 - r3}????????? @ save sp_SVC, lr_SVC, pc, cpsr

???? mov? r0, sp

???? .endm

?

???? .macro?? irq_save_user_regs

???? sub? sp, sp, #S_FRAME_SIZE

???? stmia??? sp, {r0 - r12}????????????? @ Calling r0-r12

???? add ????r8, sp, #S_PC

???? stmdb?? r8, {sp, lr}^?????????????????? @ Calling SP, LR

???? str???? lr, [r8, #0]??????????????????? @ Save calling PC

???? mrs???? r6, spsr

???? str???? r6, [r8, #4]??????????????????? @ Save CPSR

???? str???? r0, [r8, #8]??????????????????? @ Save OLD_R0

???? mov? r0, sp

???? .endm

?

???? .macro?? irq_restore_user_regs

???? ldmia??? sp, {r0 - lr}^????????????? @ Calling r0 - lr

???? mov? r0, r0

???? ldr? lr, [sp, #S_PC]???????????? @ Get PC

???? add? sp, sp, #S_FRAME_SIZE

???? subs pc, lr, #4???????????? @ return & move spsr_svc into cpsr

???? .endm

?

???? .macro get_bad_stack

???? ldr? r13, _armboot_start???????? @ setup our mode stack

???? sub? r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)

???? sub? r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack

?

???? str? lr, [r13]????????? @ save caller lr / spsr

???? mrs? lr, spsr

???? str???? lr, [r13, #4]

?????????????????

???? mov? r13, #MODE_SVC????????????? @ prepare SVC-Mode

???? @ msr??? spsr_c, r13

???? msr? spsr, r13

???? mov? lr, pc

???? movs pc, lr

???? .endm

?

???? .macro get_irq_stack???????????? @ setup IRQ stack

???? ldr? sp, IRQ_STACK_START

???? .endm

?

???? .macro get_fiq_stack???????????? @ setup FIQ stack

???? ldr? sp, FIQ_STACK_START

???? .endm

?

????/*

?* exception handlers

?*/

???? .align? 5

????undefined_instruction:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_undefined_instruction

?

???? .align?? 5

????software_interrupt:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_software_interrupt

?

???? .align?? 5

????prefetch_abort:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_prefetch_abort

?

???? .align?? 5

????data_abort:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_data_abort

?

???? .align?? 5

????not_used:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_not_used

?

????#ifdef CONFIG_USE_IRQ

?

???? .align?? 5

????irq:

???? get_irq_stack

???? irq_save_user_regs

???? bl ? do_irq

???? irq_restore_user_regs

?

???? .align?? 5

????fiq:

???? get_fiq_stack

???? /* someone ought to write a more effiction fiq_save_user_regs */

???? irq_save_user_regs

???? bl ? do_fiq

???? irq_restore_user_regs

?

????#else

?

???? .align?? 5

????irq:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_irq

?

???? .align?? 5

????fiq:

???? get_bad_stack

???? bad_save_user_regs

???? bl ? do_fiq

?

????#endif

文章結束給大家分享下程序員的一些笑話語錄: 騰訊總舵主馬化騰,有人曾經戲稱如果在Z國選舉總統,馬化騰一定當選,因為只要QQ來一個彈窗”投馬總,送Q幣”即可。

地址代碼uboot之start.S源碼分析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品久久久久久久久大尺度 | 欧美性xxx免费看片 欧美性白人顶级hd 欧美性插视频 | 日韩在线看片中文字幕不卡 | 欧美另类日韩中文色综合 | 伊人久久综合网站 | 在线不卡日韩 | 成人欧美日韩 | 奇米网在线观看 | 国产精品边做奶水狂喷小说 | 久草中文网 | 亚洲精品欧洲久久婷婷99 | 久久综合精品不卡一区二区 | 久久涩综合 | 亚洲国产一区二区三区精品 | www.黄色片| 久久日韩精品激情 | 五月天婷婷一区二区三区久久 | 日韩精品中文字幕在线观看 | 国产成人在线视频播放 | 国产成人精品第一区二区 | 精品久久中文网址 | 伊人久热这里只精品视频 | 日韩高清在线二区 | 欧美精品亚洲人成在线观看 | 狼狼色丁香久久婷婷综合五月 | 欧美日韩视频在线播放 | 免费观看一级毛片 | 国产人做人爱视频精品 | 天天摸天天操天天射 | 日韩一区二区视频在线观看 | 久久伊人精品 | 欧美日韩国产一区三区 | 日韩精品高清自在线 | 国产精选一区二区 | 乱子伦xxx欧美 | 99爱视频99爱在线观看免费 | 免费一级欧美片在线观免看 | 日本视频在线观看不卡高清免费 | 色哟网站 | 亚洲经典在线中文字幕 | 久99久热只有精品国产99 |