4789|0

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

u-boot_smdkv210 分析三:启动代码lowlevel.s分析 [复制链接]

u-boot_smdkv210 分析三:启动代码lowlevel.s分析

_TEXT_BASE:
.word TEXT_BASE

.globl lowlevel_init
lowlevel_init:
push {lr}                                        1.lr入栈

/* check reset status  */

ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)   2.读取复位标志,如果是睡眠唤醒,跳过接下来的初始化
ldr r1, [r0]
bic r1, r1, #0xfff6ffff
cmp r1, #0x10000
beq wakeup_reset_pre
cmp r1, #0x80000
beq wakeup_reset_from_didle

/* IO Retention release */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)   3.复位引脚到默认功能?
ldr r1, [r0]
ldr r2, =IO_RET_REL
orr r1, r1, r2
str r1, [r0]

/* Disable Watchdog */
ldr r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */    4.关闭看门狗定时器
mov r1, #0
str r1, [r0]

/* SRAM(2MB) init for SMDKC110 */                   5.配置sram引脚,16位数据宽度,22位地址宽度
/* GPJ1 SROM_ADDR_16to21 */
ldr r0, =ELFIN_GPIO_BASE

ldr r1, [r0, #GPJ1CON_OFFSET]
bic r1, r1, #0xFFFFFF
ldr r2, =0x444444
orr r1, r1, r2
str r1, [r0, #GPJ1CON_OFFSET]

ldr r1, [r0, #GPJ1PUD_OFFSET]
ldr r2, =0x3ff
bic r1, r1, r2
str r1, [r0, #GPJ1PUD_OFFSET]

/* GPJ4 SROM_ADDR_16to21 */
ldr r1, [r0, #GPJ4CON_OFFSET]
bic r1, r1, #(0xf<<16)
ldr r2, =(0x4<<16)
orr r1, r1, r2
str r1, [r0, #GPJ4CON_OFFSET]

ldr r1, [r0, #GPJ4PUD_OFFSET]
ldr r2, =(0x3<<8)
bic r1, r1, r2
str r1, [r0, #GPJ4PUD_OFFSET]


/* CS0 - 16bit sram, enable nBE, Byte base address */
ldr r0, =ELFIN_SROM_BASE /* 0xE8000000 */
mov r1, #0x1
str r1, [r0]

/* PS_HOLD pin(GPH0_0) set to high */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET)
ldr r1, [r0]
orr r1, r1, #0x300                                 6.设置PMIC控制引脚
orr r1, r1, #0x1
str r1, [r0]

/* when we already run in ram, we don't need to relocate U-Boot.
  * and actually, memory controller must be configured before U-Boot
  * is running in ram.
  */
ldr r0, =0xff000fff                                 7.读取当前PC与链接地址进行比较,如果已经在ram中运行,跳过sdram初始化
bic r1, pc, r0  /* r0 <- current base addr of code */
ldr r2, _TEXT_BASE  /* r1 <- original base addr in ram */
bic r2, r2, r0  /* r0 <- current base addr of code */
cmp     r1, r2      /* compare r0, r1                  */
beq     1f   /* r0 == r1 then skip sdram init   */

/* init PMIC chip */
bl PMIC_InitIp                                      8.PMIC初始化

/* init system clock */
bl system_clock_init                                9.系统时钟初始化

/* Memory initialize */
bl mem_ctrl_asm_init                                10.存储器控制器初始化

1:
/* for UART */
bl uart_asm_init                                    11.串口初始化

bl tzpc_init                                        12.取消存储保护区域

#if defined(CONFIG_ONENAND)
bl onenandcon_init                                  13.onenand初始化
#endif

#if defined(CONFIG_NAND)
/* simple init for NAND */
bl nand_asm_init                                    14.nand简单的初始化
#endif

/* check reset status  */

ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfffeffff
cmp r1, #0x10000
beq wakeup_reset_pre                                15.再次检查复位状态?

/* ABB disable */
ldr r0, =0xE010C300                                 16.关闭ABB?
orr r1, r1, #(0x1<<23)
str r1, [r0]

/* Print 'K' */
ldr r0, =ELFIN_UART_CONSOLE_BASE                    17.打印底层初始化完毕字符K
ldr r1, =0x4b4b4b4b
str r1, [r0, #UTXH_OFFSET]

pop {pc}                                            18.返回到start.s

wakeup_reset_from_didle:
/* Wait when APLL is locked */
ldr r0, =ELFIN_CLOCK_POWER_BASE                     *深度睡眠需要等待APLL锁定
lockloop:
ldr r1, [r0, #APLL_CON0_OFFSET]
and r1, r1, #(1<<29)
cmp r1, #(1<<29)
bne  lockloop
beq exit_wakeup

wakeup_reset_pre:
mrc p15, 0, r1, c1, c0, 1 @Read CP15 Auxiliary control register
and r1, r1, #0x80000000 @Check L2RD is disable or not
cmp r1, #0x80000000  
bne wakeup_reset  @if L2RD is not disable jump to wakeup_reset *如果L2RD没被禁用,跳转到唤醒复位

bl disable_l2cache                         *禁用l2cache
bl v7_flush_dcache_all                     *清空dcache
/* L2 cache enable at sleep.S of kernel
  * bl enable_l2cache
  */

wakeup_reset:
/* init system clock */
bl system_clock_init                        *系统时钟初始化
bl mem_ctrl_asm_init                        *存储器控制初始化
bl tzpc_init                                *存储器保护禁用
#if defined(CONFIG_ONENAND)
bl onenandcon_init                          *onenand初始化
#endif
#if defined(CONFIG_NAND)
bl nand_asm_init                            *nand初始化
#endif

exit_wakeup:
/*Load return address and jump to kernel*/
ldr r0, =(INF_REG_BASE+INF_REG0_OFFSET)
ldr r1, [r0] /* r1 = physical address of s5pc110_cpu_resume function*/

mov pc, r1  /*Jump to kernel */         *r1存放唤醒的物理地址,返回到内核中
nop
nop

/*
* system_clock_init: Initialize core clock and bus clock.
* void system_clock_init(void)
*/
system_clock_init:

ldr r0, =ELFIN_CLOCK_POWER_BASE @0xe0100000

/* Set Mux to FIN */
ldr r1, =0x0
str r1, [r0, #CLK_SRC0_OFFSET]

ldr r1, =APLL_LOCKTIME_VAL
str r1, [r0, #APLL_LOCK_OFFSET]

/* Disable PLL */
#if defined(CONFIG_CHECK_MPLL_LOCK)
retryloop:
#endif
ldr r1, =0x0
str r1, [r0, #APLL_CON0_OFFSET]
ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET]          *将APLL和MPLL禁用

ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET]          *将MPLL禁用

ldr    r1, [r0, #CLK_DIV0_OFFSET]      *取DIV0值
ldr r2, =CLK_DIV0_MASK
bic r1, r1, r2                          *清零

ldr r2, =CLK_DIV0_VAL
orr r1, r1, r2
str r1, [r0, #CLK_DIV0_OFFSET]          *写入DIV0值

ldr r1, =APLL_VAL
str r1, [r0, #APLL_CON0_OFFSET]         *分别设置APLL MPLL VPLL

ldr r1, =MPLL_VAL
str r1, [r0, #MPLL_CON_OFFSET]

ldr r1, =VPLL_VAL
str r1, [r0, #VPLL_CON_OFFSET]
#if defined(CONFIG_EVT1)
ldr r1, =AFC_ON
str r1, [r0, #APLL_CON1_OFFSET]         *是否开启AFC
#endif
mov r1, #0x10000
1: subs r1, r1, #1                      *耗时等待稳定
bne 1b

#if defined(CONFIG_CHECK_MPLL_LOCK)
/* MPLL software workaround */
ldr r1, [r0, #MPLL_CON_OFFSET]
orr     r1, r1, #(1<<28)                *该位在文档中是保留位?
str r1, [r0, #MPLL_CON_OFFSET]

mov r1, #0x100
1: subs r1, r1, #1                      *耗时等待
bne 1b

ldr r1, [r0, #MPLL_CON_OFFSET]
and r1, r1, #(1<<29)
cmp r1, #(1<<29)
bne  retryloop                       *未锁定继续重试

/* H/W lock detect disable */
ldr r1, [r0, #MPLL_CON_OFFSET]
bic     r1, r1, #(1<<28)
str r1, [r0, #MPLL_CON_OFFSET]
#endif

ldr r1, [r0, #CLK_SRC0_OFFSET]
ldr r2, =0x10001111
orr r1, r1, r2
str r1, [r0, #CLK_SRC0_OFFSET]          *复位时未接入PLL,现在将ACLK等接入PLL

#if defined(CONFIG_MCP_AC)

/* CLK_SRC6[25:24] -> OneDRAM clock sel = MPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<24)
orr r1, r1, #0x01000000
str r1, [r0, #CLK_SRC6_OFFSET]          *DRAM选择SCLKMPLL

/* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<28)
bic r1, r1, #(0x7<<12) @; ONENAND_RATIO: 0 *SCLK_ONENAND = MOUTFLASH / (ONENAND_RATIO + 1)
orr r1, r1, #0x30000000                     *SCLK_ONEDRAM = MOUTONEDR / (ONEDRAM_RATIO + 1)
str r1, [r0, #CLK_DIV6_OFFSET]

#elif defined (CONFIG_MCP_N)
/* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
mov r1, #0x00000000
str r1, [r0, #CLK_SRC6_OFFSET]

/* CLK_DIV6[31:28] -> 0=1/1 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
mov r1, #0x00000000
str r1, [r0, #CLK_DIV6_OFFSET]


#elif defined (CONFIG_MCP_H)

/* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<24)
orr r1, r1, #0x00000000
str r1, [r0, #CLK_SRC6_OFFSET]

/* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<28)
bic r1, r1, #(0x7<<12) @; ONENAND_RATIO: 0
orr r1, r1, #0x00000000
str r1, [r0, #CLK_DIV6_OFFSET]

#elif defined (CONFIG_MCP_B) || defined (CONFIG_MCP_D)

/* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<24)
orr r1, r1, #0x01000000
str r1, [r0, #CLK_SRC6_OFFSET]

/* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<28)
bic r1, r1, #(0x7<<12) @; ONENAND_RATIO: 0
orr r1, r1, #0x30000000
str r1, [r0, #CLK_DIV6_OFFSET]

#elif defined (CONFIG_MCP_SINGLE)

/* CLK_DIV6 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0x7<<12) @; ONENAND_RATIO: 0     *SCLK_ONENAND = MOUTFLASH / (ONENAND_RATIO + 1)
str r1, [r0, #CLK_DIV6_OFFSET]                  *SCLK_ONEDRAM = MOUTONEDR / (ONEDRAM_RATIO + 1)

#endif

mov pc, lr


/*
* uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
* void uart_asm_init(void)
*/
uart_asm_init:

/* set GPIO(GPA) to enable UART */
@ GPIO setting for UART
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x22222222
str    r1, [r0, #GPA0CON_OFFSET]

ldr     r1, =0x2222
str     r1, [r0, #GPA1CON_OFFSET]           *设置GPIO为UART

// HP V210 use. SMDK not use.
#if defined(CONFIG_VOGUES)
ldr    r1, =0x100
str    r1, [r0, #GPC0CON_OFFSET]

ldr    r1, =0x4
str    r1, [r0, #GPC0DAT_OFFSET]
#endif

ldr r0, =ELFIN_UART_CONSOLE_BASE  @0xEC000000
mov r1, #0x0
str r1, [r0, #UFCON_OFFSET]
str r1, [r0, #UMCON_OFFSET]

mov r1, #0x3
str r1, [r0, #ULCON_OFFSET]

ldr r1, =0x3c5
str r1, [r0, #UCON_OFFSET]              *设置位数等

ldr r1, =UART_UBRDIV_VAL
str r1, [r0, #UBRDIV_OFFSET]            *设置波特率

ldr r1, =UART_UDIVSLOT_VAL
str r1, [r0, #UDIVSLOT_OFFSET]          *波特率小数校正

ldr r1, =0x4f4f4f4f
str r1, [r0, #UTXH_OFFSET]  @'O'    *输出u-boot第一个字符‘O’

mov pc, lr

/*
* Nand Interface Init for SMDKC110
*/
nand_asm_init:

/* Setting GPIO for NAND */
/* This setting is NAND initialze code at booting time in iROM. */

ldr r0, =ELFIN_GPIO_BASE

ldr r1, [r0, #MP01CON_OFFSET]
bic r1, r1, #(0xf<<8)
orr r1, r1, #(0x3<<8)                   *0011 = NFCSn[0]  设置nand flash的选通引脚
str r1, [r0, #MP01CON_OFFSET]

*00 = Pull-up/ down disabled
*01 = Pull-down enabled
*10 = Pull-up enabled
*11 = Reserved

ldr r1, [r0, #MP01PUD_OFFSET]
bic r1, r1, #(0x3<<4)                   *取消上拉下拉
str r1, [r0, #MP01PUD_OFFSET]

ldr r1, [r0, #MP03CON_OFFSET]
bic r1, r1, #0xFFFFFF                   *全部设置为nf的功能,CLE ALE WE RE RnB0~3
ldr r2, =0x22222222
orr r1, r1, r2
str r1, [r0, #MP03CON_OFFSET]

ldr r1, [r0, #MP03PUD_OFFSET]
ldr r2, =0x3fff
bic r1, r1, r2
str r1, [r0, #MP03PUD_OFFSET]           *取消上拉下拉

ldr r0, =ELFIN_NAND_BASE

ldr r1, [r0, #NFCONF_OFFSET]
ldr r2, =0x777F
bic r1, r1, r2
ldr r2, =NFCONF_VAL                     *Duration =  HCLK x TACLS  Duration = HCLK x ( TWRPH0 + 1 ) Duration =  HCLK x ( TWRPH1 + 1 )
orr r1, r1, r2                                               7                          7                                   7
str r1, [r0, #NFCONF_OFFSET]            *0 = SLC NAND Flash    1 = 512 Bytes/page     1 = 4 address cycle

ldr r1, [r0, #NFCONT_OFFSET]
ldr r2, =0x707C7
bic r1, r1, r2
ldr r2, =NFCONT_VAL                     *ECC  LOCK   INTERRUPT 等设置
orr r1, r1, r2
str r1, [r0, #NFCONT_OFFSET]

ldr r1, [r0, #NFCONF_OFFSET]
orr r1, r1, #0x70
orr r1, r1, #0x7700
str     r1, [r0, #NFCONF_OFFSET]        *前面已经设置了7770了啊?

ldr r1, [r0, #NFCONT_OFFSET]
orr r1, r1, #0x03
str     r1, [r0, #NFCONT_OFFSET]        *使能NAND控制器

mov pc, lr

/*
* Setting TZPC[TrustZone Protection Controller]
*/
tzpc_init:

ldr r0, =ELFIN_TZPC0_BASE                   无保护区域
  mov r1, #0x0
  str r1, [r0]
  mov r1, #0xff
  str r1, [r0, #TZPC_DECPROT0SET_OFFSET]      取消保护区域译码
  str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  

  ldr  r0, =ELFIN_TZPC1_BASE
  str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  

  ldr r0, =ELFIN_TZPC2_BASE
  str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
str r1, [r0, #TZPC_DECPROT3SET_OFFSET]

  ldr r0, =ELFIN_TZPC3_BASE
  str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  

  mov pc, lr

/*
* OneNAND Interface Init                       *未使用,不分析
*/
onenandcon_init:

@; GPIO setting for OneNAND
ldr r0, =ELFIN_GPIO_BASE @0xE0200000
ldr r1, [r0, #MP01CON_OFFSET]
orr r1, r1, #0x00550000
str r1, [r0, #MP01CON_OFFSET]

ldr r1, [r0, #MP03CON_OFFSET]
orr r1, r1, #0x0550
orr r1, r1, #0x00550000
str r1, [r0, #MP03CON_OFFSET]

ldr r1, =0xFFFF
str r1, [r0, #MP01DRV_SR_OFFSET]
str r1, [r0, #MP03DRV_SR_OFFSET]
str r1, [r0, #MP06DRV_SR_OFFSET]
str r1, [r0, #MP07DRV_SR_OFFSET]

wait_orwb:
@; Read ONENAND_IF_STATUS
ldr r0, =ELFIN_ONENANDCON_BASE @; 0xB0600000
ldr r1, [r0, #ONENAND_IF_STATUS_OFFSET]
bic r1, r1, #0xFFFFFFFE
cmp r1, #0x0

@; ORWB != 0x0
bne wait_orwb

@; write new configuration to onenand system configuration1 register
ldr r1, =0xF006   @; Sync.
ldr r2, =(ELFIN_ONENAND_BASE+0x1E442) @; 0x1E442(REG_SYS_CONF1)
strh r1, [r2]

@; read one dummy halfword
ldrh r1, [r2]
ldrh r1, [r2]

@; write new configuration to ONENAND_IF_CTRL
ldr r0, =ELFIN_ONENANDCON_BASE @; 0xB0600000
@;ldr r1, =0x2F006   @; ONENAND_IF_CTRL_REG_VAL (GCE off)
ldr r1, =0x402F006   @; ONENAND_IF_CTRL_REG_VAL (GCE on)
str r1, [r0, #ONENAND_IF_CTRL_OFFSET]

mov pc, lr


#ifdef CONFIG_ENABLE_MMU

#ifdef CONFIG_MCP_SINGLE
/*
* MMU Table for SMDKC110
* 0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
* 0xB000_0000 -- 0xB7FF_FFFF => A:0xB000_0000 -- 0xB7FF_FFFF
* 0xC000_0000 -- 0xC7FF_FFFF => A:0x3000_0000 -- 0x37FF_FFFF
* 0xC800_0000 -- 0xDFFF_FFFF => Not Allowed
* 0xE000_0000 -- 0xFFFF_FFFF => A:0xE000_0000 -- 0XFFFF_FFFF
*/

/* form a first-level section entry */
.macro FL_SECTION_ENTRY base,ap,d,c,b   // 定义生成描述符的宏,分别控制基地址/访问权限/域/cache/buffer。使用的是1M的section
.word (\base << 20) | (\ap << 10) | \
       (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
.endm
.section .mmudata, "a"                       // 定义MMU数据段,在lds文件里面用到了,“a”表示这是一个需要鉴权的段
.align 14                                           // 一级页表必须14位对齐,因为C2的[31:14]为TLB基地址,虚地址的[31:20]为索引表的[13:2]。
// the following alignment creates the mmu table at address 0x4000.
.globl mmu_table
mmu_table:
.set __base,0
// Access for iRAM
.rept 0x100
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

// Not Allowed
.rept 0x200 - 0x100
.word 0x00000000
.endr

.set __base,0x200                              // __base的值可视为物理地址的高12位
// should be accessed
.rept 0x600 - 0x200                           // rept后的值可视为虚拟地址的高12位
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

.rept 0x800 - 0x600
.word 0x00000000
.endr

.set __base,0x800
// should be accessed
.rept 0xb00 - 0x800
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

/* .rept 0xc00 - 0xb00
.word 0x00000000
.endr */

.set __base,0xB00
.rept 0xc00 - 0xb00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

.set __base,0x200
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1         *0xC000_0000映射到0x2000_0000
.set __base,__base+1
.endr

// access is not allowed.
@.rept 0xD00 - 0xC80
@.word 0x00000000
@.endr

.set __base,0xD00
// 1:1 mapping for debugging with non-cacheable
.rept 0x1000 - 0xD00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

#else // CONFIG_MCP_AC, CONFIG_MCP_H, CONFIG_MCP_B

/*
* MMU Table for SMDKC110
* 0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
* 0xB000_0000 -- 0xB7FF_FFFF => A:0xB000_0000 -- 0xB7FF_FFFF
* 0xC000_0000 -- 0xC7FF_FFFF => A:0x3000_0000 -- 0x37FF_FFFF
* 0xC800_0000 -- 0xDFFF_FFFF => Not Allowed
* 0xE000_0000 -- 0xFFFF_FFFF => A:0xE000_0000 -- 0XFFFF_FFFF
*/

/* form a first-level section entry */
.macro FL_SECTION_ENTRY base,ap,d,c,b
.word (\base << 20) | (\ap << 10) | \
       (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
.endm
.section .mmudata, "a"
.align 14
// the following alignment creates the mmu table at address 0x4000.
.globl mmu_table
mmu_table:
.set __base,0
// Access for iRAM
.rept 0x100
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

// Not Allowed
.rept 0x300 - 0x100
.word 0x00000000
.endr

#if defined(CONFIG_MCP_N)
.set __base,0x300
// should be accessed
.rept 0x400 - 0x300
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
#else
.set __base,0x300
// should be accessed
.rept 0x350 - 0x300
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

// Not Allowed
.rept 0x400 - 0x350
.word 0x00000000
.endr
#endif

.set __base,0x400
// should be accessed
.rept 0x500 - 0x400
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

.rept 0x800 - 0x500
.word 0x00000000
.endr

.set __base,0x800
// should be accessed
.rept 0xb00 - 0x800
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

.set __base,0xB00
.rept 0xc00 - 0xb00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

#if defined(CONFIG_MCP_N)
.set __base,0x300
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
#else
.set __base,0x300
// 80MB for SDRAM with cacheable
.rept 0xC50 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

// Not Allowed
.rept 0xD00 - 0xC50
.word 0x00000000
.endr
#endif

.set __base,0xD00
// 1:1 mapping for debugging with non-cacheable
.rept 0x1000 - 0xD00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
#endif
#endif

点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表