主题 : S3C6410 SDboot程序求解,送SDBOOT完整程序。 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 33295
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2010-11-29
最后登录: 2016-12-02
楼主  发表于: 2011-03-18 11:47

 S3C6410 SDboot程序求解,送SDBOOT完整程序。

S3C6410 SDboot程序求解,送SDBOOT完整程序。
我编译时CPU_NAME报错,汇编代码如下:
;
;  Copyright (c) Microsoft Corporation.  All rights reserved.
;
;
;  Use of this source code is subject to the terms of the Microsoft end-user
;  license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
;  If you did not accept the terms of the EULA, you are not authorized to use
;  this source code. For a copy of the EULA, please see the LICENSE.RTF on your
;  install media.
;
;------------------------------------------------------------------------------
;
;   File:  startup.s
;
;   Kernel startup routine for Samsung SMDK6410 board. Hardware is
;   initialized in boot loader - so there isn't much code at all.
;
;------------------------------------------------------------------------------
  INCLUDE kxarm.h
  INCLUDE s3c6410.inc
  INCLUDE image_cfg.inc
  IMPORT OALClearUTLB
  IMPORT OALFlushICache
  IMPORT OALFlushDCache
  IMPORT System_DisableVIC
  IMPORT System_EnableIRQ
[  CPU_NAME = S3C6410
  IMPORT System_SetSyncMode
]
  IMPORT System_SetAsyncMode
  IMPORT System_EnableICache
;-------------------------------------------------------------------------------
; Definition for MMU table initialization
;-------------------------------------------------------------------------------
PT_1ST_BASE   EQU  (DRAM_BASE_PA_START+0x10000)  ; 1st level Page Table Base Address (PHYBASE + 0x10000) save room for interrupt vectors
PT_1ST_ENTRY_CNB EQU  (DRAM_BASE_PA_START+0x40E)   ; Cached Area Page Table Entry (Cache/Unbuffer/RW), PA base = 0x50000000
PT_1ST_ENTRY_NCNB EQU  (DRAM_BASE_PA_START+0x402)   ; Uncached Area Page Table Entry (Uncache/Unbuffer/RW), PA base = 0x50000000
PTR_1ST_PTE   EQU  ((DRAM_BASE_PA_START>>16)/4)  ; Ptr to 1st PTE for 0x50000000
BANK_SHIFT EQU  20
;------------------------------------------------------------------------------
;
; Macro for LED on SMDK Board (GPN[15:12])
;
; LED_ON for physical address domain
; VLED_ON for virtual address domain
;
;------------------------------------------------------------------------------
MACRO
  LED_ON $data
  ldr  r10, =GPNPUD
  ldr  r11, [r10]
  bic  r11, r11, #0xFF000000 ; Pull-Up-Down Disable
  str  r11, [r10]
  ldr  r10, =GPNDAT
  ldr  r11, [r10]
  bic  r11, r11, #0xF000
  ldr  r12, =$data
  mov  r12, r12, lsl #12 ; [15:12]
  orr  r11, r11, r12
  str  r11, [r10]
  ldr  r10, =GPNCON
  ldr  r11, [r10]
  bic  r11, r11, #0xFF000000
  orr  r11, r11, #0x55000000 ; GPN[15:12] Output .
  str  r11, [r10]
  MEND
  MACRO
  VLED_ON $data
  ldr  r10, =vGPNPUD
  ldr  r11, [r10]
  bic  r11, r11, #0xFF000000 ; Pull-Up-Down Disable
  str  r11, [r10]
  ldr  r10, =vGPNDAT
  ldr  r11, [r10]
  bic  r11, r11, #0xF000
  ldr  r12, =$data
  mov  r12, r12, lsl #12 ; [15:12]
  orr  r11, r11, r12
  str  r11, [r10]
  ldr  r10, =vGPNCON
  ldr  r11, [r10]
  bic  r11, r11, #0xFF000000
  orr  r11, r11, #0x55000000 ; GPN[15:12] Output .
  str  r11, [r10]
  MEND
;------------------------------------------------------------------------------
; End of Macro
;------------------------------------------------------------------------------
  TEXTAREA
  IMPORT  main
  INCLUDE oemaddrtab_cfg.inc
;------------------------------------------------------------------------------
;
; StartUp Entry
;
; Main entry point for CPU initialization.
;
;------------------------------------------------------------------------------
LEAF_ENTRY      StartUp
  b  ResetHandler
  b  .    ; HandlerUndef
  b  .    ; HandlerSWI
  b  .    ; HandlerPabort
  b  .    ; HandlerDabort
  b  .    ; HandlerReserved
  b  .    ; HandlerIRQ
  b  .    ; HandlerFIQ
;------------------------------------------------------------------------------
;
; ResetHandler Function
;
; Reset Exception Handler
;
;------------------------------------------------------------------------------
ResetHandler
  LED_ON 0xf
;------------------------------------
; Enable Instruction Cache
;------------------------------------
  mov  r0, #0
  mcr  p15, 0, r0, c7, c7, 0   ; Invalidate Entire I&D Cache
  bl  System_EnableICache   ; Enable I Cache
;------------------------------------
; Peripheral Port Setup
;------------------------------------
  ldr  r0, =0x70000013  ; Base Addres : 0x70000000, Size : 256 MB (0x13)
  mcr  p15,0,r0,c15,c2,4
;------------------------------------
; Interrupt Disable
;------------------------------------
  ldr  r0, =VIC0INTENCLEAR
  ldr  r1, =0xFFFFFFFF;
  str  r1, [r0]
  ldr  r0, =VIC1INTENCLEAR
  ldr  r1, =0xFFFFFFFF;
  str  r1, [r0]
;------------------------------------
; Disable WatchDog Timer
;------------------------------------
  ldr  r0, =WTCON
  ldr  r1, =0x0
  str  r1, [r0]
[ CHANGE_PLL_CLKDIV_ON_EBOOT
;-----------------------------------------------
; Change Operation Mode to Sync Mode or Async Mode
;-----------------------------------------------
  ldr  r0, =OTHERS
  ldr  r1, [r0]
  and  r1, r1, #0x80
  cmp  r1, #0x80   ; OTHERS[7] = 0:AsyncModde 1:SyncMode
[  CPU_NAME = S3C6410
  [ (SYNCMODE)
   bne  System_SetSyncMode
  |
   beq  System_SetAsyncMode
  ]
]
[  CPU_NAME = S3C6400
  beq  System_SetAsyncMode
]
;---------------------------------------
; Check PLL and CLKDIV
;---------------------------------------
  ldr  r3, =0x83FF3F07  ; Mask for APLL_CON/MPLL_CON
  ldr  r4, =0x80FF3F07  ; Mask for EPLL_CON0
  ldr  r5, =0x0000FFFF  ; Mask for EPLL_CON1
  ldr  r6, =0x0003FF17  ; Mask for CLKDIV0
  ldr  r0, =APLL_CON  ; Check APLL
  ldr  r1, [r0]
  and  r1, r1, r3
  ldr  r2, =((1<<31)+(APLL_MVAL<<16)+(APLL_PVAL<<8)+(APLL_SVAL)) ; APLL_CON value to configure
  cmp  r1, r2
  bne  PLL_NeedToConfigure
  ldr  r0, =MPLL_CON  ; Check MPLL
  ldr  r1, [r0]
  and  r1, r1, r3
  ldr  r2, =((1<<31)+(MPLL_MVAL<<16)+(MPLL_PVAL<<8)+(MPLL_SVAL)) ; MPLL_CON value to configure
  cmp  r1, r2
  bne  PLL_NeedToConfigure
  ldr  r0, =EPLL_CON0  ; Check EPLL_CON0
  ldr  r1, [r0]
  and  r1, r1, r4
  ldr  r2, =((1<<31)+(EPLL_MVAL<<16)+(EPLL_PVAL<<8)+(EPLL_SVAL))  ; EPLL_CON0 value to configure
  cmp  r1, r2
  bne  PLL_NeedToConfigure
  ldr  r0, =EPLL_CON1  ; Check EPLL_CON1
  ldr  r1, [r0]
  and  r1, r1, r5
  ldr  r2, =EPLL_KVAL  ; EPLL_CON1 value to configure
  cmp  r1, r2
  bne  PLL_NeedToConfigure
  ldr  r0, =CLK_DIV0  ; Check CLKDIV0
  ldr  r1, [r0]
  and  r1, r1, r6
[  CPU_NAME = S3C6410
  ldr  r2, =((PCLK_DIV<<12)+(HCLKx2_DIV<<9)+(HCLK_DIV<<8)+(MPLL_DIV<<4)+(APLL_DIV<<0))  ; CLKDIV0 value to configure
]
[  CPU_NAME = S3C6400
  ldr  r2, =((OND_DIV<<16)+(PCLK_DIV<<12)+(HCLKx2_DIV<<9)+(HCLK_DIV<<8)+(MPLL_DIV<<4)+(APLL_DIV<<0))  ; CLKDIV0 value to configure
]
  cmp  r1, r2
  bne  CLKDIV_NeedToConfigure
  b  PLL_CLKDIV_AlreadyConfigured ; APLL/MPLL/EPLL and CLKDIV0 is already configured
;------------------------------------
; Prepare to Change PLL
;------------------------------------
PLL_NeedToConfigure
[ CPU_NAME = S3C6410
;------------------------------------
; Disable PLL Clock Out
;------------------------------------
  ldr  r0, =CLK_SRC
  ldr  r1, [r0]
  bic  r1, r1, #0x7   ; FIN out
  str  r1, [r0]    
  ldr  r0, =CLK_DIV0
  ldr  r1, [r0]
  bic  r1, r1, #0xff00
  bic  r1, r1, #0xff
  [ SYNCMODE
  ldr  r2, =0x1300   ; ARM:HCLKx2:HCLK:PCLK = 1:2:2:2
  |
  ldr  r2, =0x1100   ; ARM:HCLKx2:HCLK:PCLK = 1:1:2:2
  ]
  orr  r1, r1, r2
  str  r1, [r0]
]
[ CPU_NAME = S3C6400
  ldr  r0, =CLK_DIV0
  ldr  r1, [r0]
  bic  r1, r1, #0xff00
  bic  r1, r1, #0xff
  ldr  r2, =0x1100   ; ARM:HCLKx2:HCLK:PCLK = 1:1:2:2
  orr  r1, r1, r2
  str  r1, [r0]
]
;------------------------------------
; Change PLL Value
;------------------------------------
  ldr  r1, =0x4B1   ; Lock Time : 0x4b1 (100us @Fin12MHz) for APLL/MPLL
  ldr  r2, =0xE13   ; Lock Time : 0xe13 (300us @Fin12MHz) for EPLL
  ldr  r0, =APLL_LOCK
  str  r1, [r0]    ; APLL Lock Time
  str  r1, [r0, #0x4]   ; MPLL Lock Time
  str  r2, [r0, #0x8]   ; EPLL Lock Time
  ldr  r0, =APLL_CON
  ldr  r1, =((1<<31)+(APLL_MVAL<<16)+(APLL_PVAL<<8)+(APLL_SVAL))
  str  r1, [r0]
  ldr  r0, =MPLL_CON
  ldr  r1, =((1<<31)+(MPLL_MVAL<<16)+(MPLL_PVAL<<8)+(MPLL_SVAL))
  str  r1, [r0]
  ldr  r0, =EPLL_CON1
  ldr  r1, =EPLL_KVAL
  str  r1, [r0]
  ldr  r0, =EPLL_CON0
  ldr  r1, =((1<<31)+(EPLL_MVAL<<16)+(EPLL_PVAL<<8)+(EPLL_SVAL))
  str  r1, [r0]
;------------------------------------
; Set System Clock Divider
;------------------------------------
CLKDIV_NeedToConfigure
  ldr  r0, =CLK_DIV0
  ldr  r1, [r0]
  bic  r1, r1, #0x30000
  bic  r1, r1, #0xff00
  bic  r1, r1, #0xff
[  CPU_NAME = S3C6410
  ldr  r2, =((PCLK_DIV<<12)+(HCLKx2_DIV<<9)+(HCLK_DIV<<8)+(MPLL_DIV<<4)+(APLL_DIV<<0))
]
[  CPU_NAME = S3C6400
  ldr  r2, =((OND_DIV<<16)+(PCLK_DIV<<12)+(HCLKx2_DIV<<9)+(HCLK_DIV<<8)+(MPLL_DIV<<4)+(APLL_DIV<<0))  ; CLKDIV0 value to configure
]
  orr  r1, r1, r2
  str  r1, [r0]
;------------------------------------
; Enable PLL Clock Out
;------------------------------------
  ldr  r0, =CLK_SRC
  ldr  r1, [r0]
  orr  r1, r1, #0x7   ; PLL  Clockout
  str  r1, [r0]    ; System will be waiting for PLL unlocked after this instruction
  PLL_CLKDIV_AlreadyConfigured
] ; CHANGE_PLL_CLKDIV_ON_EBOOT
;------------------------------------
; Expand Memory Port 1 to x32
;------------------------------------
  ldr  r0, =MEM_SYS_CFG
  ldr  r1, [r0]
  bic  r1, r1, #0x80   ; ADDR_EXPAND to "0"
  str  r1, [r0]
;------------------------------------
; Disable VIC
;------------------------------------
  bl  System_DisableVIC
;------------------------------------
; Enable IRQ
;------------------------------------
  bl  System_EnableIRQ
;------------------------------------
; Clear DRAM
;------------------------------------
[ CLEAR_DRAM_ON_EBOOT
  mov  r1, #0
  mov  r2, #0
  mov  r3, #0
  mov  r4, #0
  mov  r5, #0
  mov  r6, #0
  mov  r7, #0
  mov  r8, #0
  ldr  r0, =IMAGE_NK_PA_START    ; Start address (Physical 0x5010.0000)
  ldr  r9, =(DRAM_SIZE-IMAGE_NK_OFFSET) ; 127 MB of RAM (1MB + 127MB)
10
  stmia r0!, {r1-r8}
  subs  r9, r9, #32
  bne  %B10
]
;------------------------------------
; Initialize MMU Table
;------------------------------------
;----------------------------
; Compute physical address of the OEMAddressTable.
  20
  add  r11, pc, #g_oalAddressTable -(. + 8)
  ldr  r10, =PT_1ST_BASE    ; (r10) = 1st level page table
;----------------------------
; Setup 1st level page table (using section descriptor)
; Fill in first level page table entries to create "un-mapped" regions
; from the contents of the MemoryMap array.
;
; (r10) = 1st level page table
; (r11) = ptr to MemoryMap array
  add  r10, r10, #0x2000  ; (r10) = ptr to 1st PTE for "unmapped space"
  mov  r0, #0x0E   ; (r0) = PTE for 0: 1MB cachable bufferable
  orr  r0, r0, #0x400  ; set kernel r/w permission
25
  mov  r1, r11    ; (r1) = ptr to MemoryMap array
30
  ldr  r2, [r1], #4   ; (r2) = virtual address to map Bank at
  ldr  r3, [r1], #4   ; (r3) = physical address to map from
  ldr  r4, [r1], #4   ; (r4) = num MB to map
  cmp  r4, #0    ; End of table?
  beq  %F40



  ldr  r5, =0x1FF00000
  and  r2, r2, r5    ; VA needs 512MB, 1MB aligned.



  ldr  r5, =0xFFF00000
  and  r3, r3, r5    ; PA needs 4GB, 1MB aligned.



  add  r2, r10, r2, LSR #18
  add  r0, r0, r3    ; (r0) = PTE for next physical page



35
  str  r0, [r2], #4
  add  r0, r0, #0x00100000 ; (r0) = PTE for next physical page
  sub  r4, r4, #1   ; Decrement number of MB left
  cmp  r4, #0
  bne  %B35    ; Map next MB



  bic  r0, r0, #0xF0000000 ; Clear Section Base Address Field
  bic  r0, r0, #0x0FF00000 ; Clear Section Base Address Field
  b  %B30    ; Get next element



40
  tst  r0, #8
  bic  r0, r0, #0x0C   ; clear cachable & bufferable bits in PTE
  add  r10, r10, #0x0800  ; (r10) = ptr to 1st PTE for "unmapped uncached space"
  bne  %B25    ; go setup PTEs for uncached space
  sub  r10, r10, #0x3000  ; (r10) = restore address of 1st level page table



;----------------------------------------------
; Setup mmu to map (VA == 0) to (PA == 0x30000000).



  ; cached area
  ldr  r0, =PT_1ST_BASE   ; PTE entry for VA = 0
  ldr  r1, =PT_1ST_ENTRY_CNB ; Cache/Unbuffer/RW
  str  r1, [r0]



  ; uncached area.
  add  r0, r0, #0x0800   ; PTE entry for VA = 0x02000000
  ldr  r1, =PT_1ST_ENTRY_NCNB ; Uncache/Unbuffer/RW
  str  r1, [r0]



  ; Comment:
  ; The following loop is to direct map RAM VA == PA. i.e.
  ;   VA == 0x50XXXXXX => PA == 0x50XXXXXX for S3C6410
  ; Fill in 8 entries to have a direct mapping for DRAM



  ldr  r10, =PT_1ST_BASE  ; Restore address of 1st level page table
  ldr  r0,  =DRAM_BASE_PA_START



  add  r10, r10, #PTR_1ST_PTE ; (r10) = ptr to 1st PTE for 0x50000000



  add  r0, r0, #0x1E   ; 1MB cachable bufferable
  orr  r0, r0, #0x400  ; set kernel r/w permission
  mov  r1, #0
;  mov  r3, #64    ; 64MB DRAM
  mov  r3, #128    ; 128MB DRAM
45
  mov  r2, r1    ; (r2) = virtual address to map Bank at
  cmp  r2, #0x20000000:SHR:BANK_SHIFT
  add  r2, r10, r2, LSL #BANK_SHIFT-18
  strlo  r0, [r2]
  add  r0, r0, #0x00100000 ; (r0) = PTE for next physical page
  subs  r3, r3, #1
  add  r1, r1, #1
  bgt  %B45



  ldr  r10, =PT_1ST_BASE ; (r10) = restore address of 1st level page table



  ; The page tables and exception vectors are setup.
  ; Initialize the MMU and turn it on.
  mov  r1, #1
  mcr  p15, 0, r1, c3, c0, 0 ; setup access to domain 0
  mcr  p15, 0, r10, c2, c0, 0



  mcr  p15, 0, r0, c8, c7, 0 ; flush I+D TLBs



  mrc  p15, 0, r1, c1, c0, 0
  orr  r1, r1, #0x0071  ; Enable MMU
  orr  r1, r1, #0x0004  ; Enable the Data Cache



  ldr  r0, =VirtualStart



  cmp  r0, #0    ; make sure no stall on "mov pc,r0" below
  mcr  p15, 0, r1, c1, c0, 0
  mov  pc, r0    ; & jump to new virtual address
  nop



         ; MMU & caches now enabled.
         ;   (r10) = physcial address of 1st level page table



;-----------------------------------------------
; MMU Enabled and Virtual Address is Valid from here
;-----------------------------------------------
VirtualStart
;--------------------------------------------------
; Initialize Stack
; Stack size and location information is in "image_cfg.inc"
;--------------------------------------------------
  mrs  r0, cpsr
  bic  r0, r0, #Mode_MASK
  orr  r1, r0, #Mode_IRQ | NOINT
  msr  cpsr_cxsf, r1    ; IRQMode
  ldr  sp, =IRQStack_VA   ; IRQStack
  bic  r0, r0, #Mode_MASK | NOINT
  orr  r1, r0, #Mode_SVC
  msr  cpsr_cxsf, r1    ; SVCMode
  ldr  sp, =SVCStack_VA   ; SVCStack
;------------------------------------
; Jump to Main() "C" Routine
;------------------------------------
  b  main
  b  .  ; Should no be here...
  ENTRY_END
;------------------------------------------------------------------------------
; End of StartUp
;------------------------------------------------------------------------------
  END
###################################################################################

SMDK6410 BSP SDBoot完整的文件包图片:

自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2011-03-18 12:05
请不要在此讨论其他厂家的开发板问题,飞凌所谓开源的bootloader完全是骗人的,这些源代码基本就是三星公开的东西,却被拿来借花献佛,这么多NC竟然也信。

友善之臂提供的资料,虽然有些不开源,但都有明确的说明,而开源的部分,用户完全可以按照手册编译出来使用,而不是模棱两可,拐弯抹角欺骗用户。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.