zoukankan      html  css  js  c++  java
  • uboot_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

  • 相关阅读:
    信息收集之Nmap
    namp ssl秘钥安全性检测
    msf测试tomcat
    MobaXterm root用户连接虚拟机时出现Access denied
    最长公共子序列C
    web 入门58-70
    oninput,onpropertychange,onchange的用法和区别
    JavaScript判断图片是否加载完成的三种方式---转
    node.js
    SPP-Net
  • 原文地址:https://www.cnblogs.com/Efronc/p/2373668.html
Copyright © 2011-2022 走看看