1.关于启动流程

1.1 启动阶段分为3个,bl0,bl1,bl2。下面只是就功能方面对它们做说明,实际设计的时候,也许会对其具体功能做出调整,也就是说,这几个阶段的划分是就功能而言的,不能看得太死。

      bl0:出厂的时候就固化在irom中一段代码,主要负责拷贝8kb的bl1到s5pv210的一个96kb大小内部sram(Internal SRAM)中运行。值得注意的是s5pv210的Internal SRAM支持的bl1的大小可以达到16kb,容量的扩增是为了适应bootloder变得越来复杂而做的。虽然如此,但目前我们制作出来的bl1的大小仍然可以保持在8kb以内,同样能满足需求。

      bl1:u-boot的前8kb代码(s5pv210也支持16kb大小,原因上一点提过了),除了初始化系统时钟和一些基本的硬件外,主要负责完成代码的搬运工作(我设计成搬运bl1+bl2,而不仅仅是bl2),也就是将完整的u-boot代码(bl1+bl2)从nand flash或者mmcSD等的存储器中读取到内存中,然后跳转到内存中运行u-boot。

      bl2:完成全面的硬件初始化和加载OS到内存中,接着运行OS。

上述几个阶段的流程描述在s5pv210_irom_application手册中有详细描述。见下图1:

                                                                                           图1

1.2 首先把启动部分的代码分为3部分,以start.S为主,另外还有lowlevel_init.S,mem_setup.S,ctr0.S。

      其中lowlevel_init.S主要是一部分硬件的初始化,尤其是系统时钟和DRAM的初始化。如果u-boot一旦被搬运到内存中运行,那么是必须要跳过时钟和DRAM的初始化的,因为这在搬运之前已经做过了。并且如果代码在内存中运行的时侯你却去初始化DRAM,那必然导致崩溃!

     mem_setup.S:DRAM初始化代码和MMU相关代码放在这个文件中。

     ctr0.S:u-boot自带的代码文件,存放汇编函数main。

1.3 启动代码相关的几个文件在u-boot中的路径

    start.S:            /arch/arm/cpu/armv7/start.S (需要自己修改)

    lowlevel_init.S:/board/samsung/zsy210/ lowlevel_init.S  (需要自己修改)

    mem_setup.S:   /board/samsung/zsy210/ mem_setup.S   (u-boot没有,需要自己添加)

    ctr0.S:            /arch/arm/lib/ctr0.S  (u-boot自带,一般不需要修改)

 

2. 启动过程原理

      必须要明白的一点是,当代码从存储介质(nand flash,SD,norflash,onenand等)中搬运到了DRAM中后随即会跳转到内存中运行u-boot,接着会有一个重定位(relocate_code)的过程,relocate_code子函数在start.S中,而给relocate_code子函数传参数的是crt0.S中的main子函数。当判断到当前u-boot在内存的低地址处,那么relocate_code就会工作,把u-boot代码从低地址处再搬运到内存地址的顶端,然后跳转到新的位置去继续运行u-boot。而搬运的目标地址是在board_init_f()函数(此函数在/arch/arm/lib/board.c中)中计算出来的,见图2。

                                                                                        图2

 

       下面,以start.S为主线,画出了其程序流程图,图中同样也表现出启动的整个流程和启动代码文件间的组织关系。所以后面直接贴出start.S的完整代码,大家结合流程图相信都可以看明白,至于逐句汇编的分析不是本文的重点。见图3.

                                                                                    图3

 

3. start.S   lowlevel_init.S  mem_setup.S  crt0.S的完整代码。

 

start.S的完整代码:

 

[cpp] view plaincopy

  1. /* 
  2.  * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core 
  3.  * 
  4.  * Copyright (c) 2004   Texas Instruments <r-woodruff2@ti.com> 
  5.  * 
  6.  * Copyright (c) 2001   Marius Gröger <mag@sysgo.de> 
  7.  * Copyright (c) 2002   Alex Züpke <azu@sysgo.de> 
  8.  * Copyright (c) 2002   Gary Jennejohn <garyj@denx.de> 
  9.  * Copyright (c) 2003   Richard Woodruff <r-woodruff2@ti.com> 
  10.  * Copyright (c) 2003   Kshitij <kshitij@ti.com> 
  11.  * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com> 
  12.  * 
  13.  * See file CREDITS for list of people who contributed to this 
  14.  * project. 
  15.  * 
  16.  * This program is free software; you can redistribute it and/or 
  17.  * modify it under the terms of the GNU General Public License as 
  18.  * published by the Free Software Foundation; either version 2 of 
  19.  * the License, or (at your option) any later version. 
  20.  * 
  21.  * This program is distributed in the hope that it will be useful, 
  22.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  23.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  24.  * GNU General Public License for more details. 
  25.  * 
  26.  * You should have received a copy of the GNU General Public License 
  27.  * along with this program; if not, write to the Free Software 
  28.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  29.  * MA 02111-1307 USA 
  30.  */  
  31.   
  32. #include <asm-offsets.h>  
  33. #include <config.h>  
  34. #include <version.h>  
  35. #include <asm/system.h>  
  36. #include <linux/linkage.h>  
  37. #include <s5pv210.h>  
  38.   
  39. #ifndef CONFIG_ENABLE_MMU  
  40. #ifndef CONFIG_PHY_UBOOT_BASE  
  41. #define CONFIG_PHY_UBOOT_BASE   CONFIG_UBOOT_BASE  
  42. #endif /* CONFIG_PHY_UBOOT_BASE */  
  43. #endif /* CONFIG_ENABLE_MMU */  
  44.   
  45.   
  46. .globl _start  
  47. _start: b   reset  
  48.     ldr pc, _undefined_instruction  
  49.     ldr pc, _software_interrupt  
  50.     ldr pc, _prefetch_abort  
  51.     ldr pc, _data_abort  
  52.     ldr pc, _not_used  
  53.     ldr pc, _irq  
  54.     ldr pc, _fiq  
  55. #ifdef CONFIG_SPL_BUILD  
  56. _undefined_instruction: .word _undefined_instruction  
  57. _software_interrupt:    .word _software_interrupt  
  58. _prefetch_abort:    .word _prefetch_abort  
  59. _data_abort:        .word _data_abort  
  60. _not_used:      .word _not_used  
  61. _irq:           .word _irq  
  62. _fiq:           .word _fiq  
  63. _pad:           .word 0x12345678 /* now 16*4=64 */  
  64. #else  
  65. _undefined_instruction: .word undefined_instruction  
  66. _software_interrupt:    .word software_interrupt  
  67. _prefetch_abort:    .word prefetch_abort  
  68. _data_abort:        .word data_abort  
  69. _not_used:      .word not_used  
  70. _irq:           .word irq  
  71. _fiq:           .word fiq  
  72. _pad:           .word 0x12345678 /* now 16*4=64 */  
  73. #endif  /* CONFIG_SPL_BUILD */  
  74.   
  75. .global _end_vect  
  76. _end_vect:  
  77.   
  78.     .balignl 16,0xdeadbeef  
  79. /************************************************************************* 
  80.  * 
  81.  * Startup Code (reset vector) 
  82.  * 
  83.  * do important init only if we don’t start from memory! 
  84.  * setup Memory and board specific bits prior to relocation. 
  85.  * relocate armboot to ram 
  86.  * setup stack 
  87.  * 
  88.  *************************************************************************/  
  89.   
  90. .globl _TEXT_BASE  
  91. _TEXT_BASE:  
  92.     .word   CONFIG_SYS_TEXT_BASE  
  93. /* 
  94.  * Below variable is very important because we use MMU in U-Boot. 
  95.  * Without it, we cannot run code correctly before MMU is ON. 
  96.  * by scsuh. 
  97.  */  
  98.  .globl _TEXT_PHY_BASE  
  99. _TEXT_PHY_BASE:  
  100.     .word   CONFIG_PHY_UBOOT_BASE  
  101.   
  102. /* 
  103.  * These are defined in the board-specific linker script. 
  104.  */  
  105. .globl _bss_start_ofs  
  106. _bss_start_ofs:  
  107.     .word __bss_start - _start  
  108.   
  109. .global _image_copy_end_ofs  
  110. _image_copy_end_ofs:  
  111.     .word   __image_copy_end - _start  
  112.   
  113. .globl _bss_end_ofs  
  114. _bss_end_ofs:  
  115.     .word __bss_end__ - _start  
  116.   
  117. .globl _end_ofs  
  118. _end_ofs:  
  119.     .word _end - _start  
  120.   
  121. #ifdef CONFIG_USE_IRQ  
  122. /* IRQ stack memory (calculated at run-time) */  
  123. .globl IRQ_STACK_START  
  124. IRQ_STACK_START:  
  125.     .word   0x0badc0de  
  126.   
  127. /* IRQ stack memory (calculated at run-time) */  
  128. .globl FIQ_STACK_START  
  129. FIQ_STACK_START:  
  130.     .word 0x0badc0de  
  131. #endif  
  132.   
  133. /* IRQ stack memory (calculated at run-time) + 8 bytes */  
  134. .globl IRQ_STACK_START_IN  
  135. IRQ_STACK_START_IN:  
  136.     .word   0x0badc0de  
  137.   
  138. /* 
  139.  * the actual reset code 
  140.  */  
  141.   
  142. reset:  
  143.     bl  save_boot_params  
  144.   
  145.     /* 
  146.      * set the cpu to SVC32 mode and IRQ & FIQ disable 
  147.      */  
  148.     msr cpsr_c, #0xd3       @ I & F disable, Mode: 0x13 - SVC  
  149.   
  150. /* 
  151.  * Setup vector: 
  152.  * (OMAP4 spl TEXT_BASE is not 32 byte aligned. 
  153.  * Continue to use ROM code vector only in OMAP4 spl) 
  154.  */  
  155. #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))  
  156.     /* Set V=0 in CP15 SCTRL register - for VBAR to point to vector */  
  157.     mrc p15, 0, r0, c1, c0, 0   @ Read CP15 SCTRL Register  
  158.     bic r0, #CR_V       @ V = 0  
  159.     mcr p15, 0, r0, c1, c0, 0   @ Write CP15 SCTRL Register  
  160.   
  161.     /* Set vector address in CP15 VBAR register */  
  162.     ldr r0, =_start  
  163.     mcr p15, 0, r0, c12, c0, 0  @Set VBAR  
  164. #endif  
  165. /***************************** zsy add 2013-3-14 *****************************/  
  166. #ifndef CONFIG_EVT1  
  167.     bl  disable_l2cache  
  168.   
  169.     mov r0, #0x0    @  
  170.     mov r1, #0x0    @ i  
  171.     mov r3, #0x0  
  172.     mov r4, #0x0  
  173. lp1:  
  174.     mov r2, #0x0    @ j  
  175. lp2:  
  176.     mov r3, r1, LSL #29     @ r3 = r1(i) <<29  
  177.     mov r4, r2, LSL #6      @ r4 = r2(j) <<6  
  178.     orr r4, r4, #0x2        @ r3 = (i<<29)|(j<<6)|(1<<1)  
  179.     orr r3, r3, r4  
  180.     mov r0, r3          @ r0 = r3  
  181.     bl  CoInvalidateDCacheIndex  
  182.     add r2, #0x1        @ r2(j)++  
  183.     cmp r2, #1024       @ r2 < 1024  
  184.     bne lp2         @ jump to lp2  
  185.     add r1, #0x1        @ r1(i)++  
  186.     cmp r1, #8          @ r1(i) < 8  
  187.     bne lp1         @ jump to lp1  
  188.   
  189.     bl  set_l2cache_auxctrl  
  190.   
  191.     bl  enable_l2cache  
  192. #endif  
  193.   
  194.     bl  disable_l2cache  
  195.   
  196.     bl  set_l2cache_auxctrl_cycle  
  197.   
  198.     bl  enable_l2cache  
  199.   
  200.     bl  zsy210_iic_pm_open  
  201.   
  202. /**************************  end of zsy add 2013-3-14 ****************************/  
  203.     /* the mask ROM code should have PLL and others stable */  
  204. #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  205.     bl  cpu_init_cp15  
  206.     bl  cpu_init_crit  
  207. #endif  
  208. /***************************  zsy add 2013-3-14  ********************************/  
  209.     /* 读取启动模式信息 */  
  210.     ldr r0, =PRO_ID_BASE  
  211.     ldr r1, [r0,#OMR_OFFSET]  
  212.     bic r2, r1, #0xffffffc1  
  213.   
  214.     /* NAND BOOT */  
  215.     cmp r2, #0x0        @ 512B 4-cycle  
  216.     moveq   r3, #BOOT_NAND  
  217.   
  218.     cmp r2, #0x2        @ 2KB 5-cycle  
  219.     moveq   r3, #BOOT_NAND  
  220.   
  221.     cmp r2, #0x4        @ 4KB 5-cycle   8-bit ECC  
  222.     moveq   r3, #BOOT_NAND  
  223.   
  224.     cmp r2, #0x6        @ 4KB 5-cycle   16-bit ECC  
  225.     moveq   r3, #BOOT_NAND  
  226.   
  227.     cmp r2, #0x8        @ OneNAND Mux  
  228.     moveq   r3, #BOOT_ONENAND  
  229.   
  230.     /* SD/MMC BOOT */  
  231.     cmp     r2, #0xc  
  232.     moveq   r3, #BOOT_MMCSD  
  233.   
  234.     /* NOR BOOT */  
  235.     cmp     r2, #0x14  
  236.     moveq   r3, #BOOT_NOR  
  237.   
  238.     /* Uart BOOTONG failed */  
  239.     cmp     r2, #(0x1<<4)  
  240.     moveq   r3, #BOOT_SEC_DEV  
  241.   
  242.     ldr r0, =INF_REG_BASE  
  243.     str r3, [r0, #INF_REG3_OFFSET]  
  244.   
  245.     ldr r0, =0xE010E81C  /* PS_HOLD_CONTROL register */  
  246.     ldr r1, =0x00005301  /* PS_HOLD output high */  
  247.     str r1, [r0]  
  248.   
  249.     /* when we already run in ram, we don’t need to relocate U-Boot. 
  250.      * and actually, memory controller must be configured before U-Boot 
  251.      * is running in ram. 
  252.      */  
  253.     ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)  
  254.     bic sp, sp, #7 /* 8-byte alignment for ABI compliance */  
  255.     ldr r0,=0x00000000  
  256.   
  257.     ldr r1, =0xff000fff  
  258.     bic r2, pc, r1      /* r0 <- current base addr of code */  
  259.     ldr r3, _TEXT_BASE      /* r1 <- original base addr in ram */  
  260.     bic r3, r3, r1      /* r0 <- current base addr of code */  
  261.     cmp r2, r3                  /* compare r0, r1     */  
  262.     beq run_in_ram          /* r0 == r1 then skip sdram init   */  
  263.   
  264. #if defined(CONFIG_EVT1)  
  265.     /* If BL1 was copied from SD/MMC CH2 */  
  266.     ldr r0, =0xD0037488  
  267.     ldr r1, [r0]  
  268.     ldr r2, =0xEB200000  
  269.     cmp r1, r2  
  270.     beq mmcsd_boot  
  271. #endif  
  272.   
  273.     ldr r0, =INF_REG_BASE  
  274.     ldr r1, [r0, #INF_REG3_OFFSET]  
  275.     cmp r1, #BOOT_NAND      /* 0x0 => boot device is nand */  
  276.     beq nand_boot  
  277.     cmp r1, #BOOT_ONENAND   /* 0x1 => boot device is onenand */  
  278.     beq onenand_boot  
  279.     cmp r1, #BOOT_MMCSD  
  280.     beq mmcsd_boot  
  281.     cmp r1, #BOOT_NOR  
  282.     beq nor_boot  
  283.     cmp r1, #BOOT_SEC_DEV  
  284.     beq mmcsd_boot  
  285.   
  286. nand_boot:  
  287.     bl  ledon_1  
  288.     bl  board_init_f_nand  
  289.   
  290. mmcsd_boot:  
  291.     bl  ledon_1  
  292.     bl  board_init_f_movi  
  293.   
  294. nor_boot:  
  295.     bl  ledon  
  296. onenand_boot:  
  297.     bl  ledon  
  298.   
  299. /************************************************************************* 
  300.  * 
  301.  * after_copy 
  302.  * 
  303.  *************************************************************************/  
  304. run_in_ram:  
  305.   
  306. #if defined(CONFIG_ENABLE_MMU)  
  307. enable_mmu:  
  308.     /* enable domain access */  
  309.     ldr r5, =0x0000ffff  
  310.     mcr p15, 0, r5, c3, c0, 0       @load domain access register  
  311.   
  312.     /* Set the TTB register */  
  313.     ldr r0, _mmu_table_base  
  314.     ldr r1, =CONFIG_PHY_UBOOT_BASE  
  315.     ldr r2, =0xfff00000  
  316.     bic r0, r0, r2  
  317.     orr r1, r0, r1  
  318.     mcr p15, 0, r1, c2, c0, 0  
  319.   
  320.     /* Enable the MMU */  
  321. mmu_on:  
  322.     mrc p15, 0, r0, c1, c0, 0  
  323.     orr r0, r0, #1  
  324.     mcr p15, 0, r0, c1, c0, 0  
  325.     nop  
  326.     nop  
  327.     nop  
  328.     nop  
  329. #endif  
  330.     bl ledon_2  
  331.     bl _main  
  332. /**************************  end of zsy add 2013-3-14 ****************************/  
  333. /*——————————————————————————*/  
  334.   
  335. #ifndef CONFIG_SPL_BUILD  
  336. /* 
  337.  * void relocate_code (addr_sp, gd, addr_moni) 
  338.  * 
  339.  * This “function” does not return, instead it continues in RAM 
  340.  * after relocating the monitor code. 
  341.  * 
  342.  */  
  343. ENTRY(relocate_code)  
  344.     mov r4, r0  /* save addr_sp */  
  345.     mov r5, r1  /* save addr of gd */  
  346.     mov r6, r2  /* save addr of destination */  
  347.   
  348.     adr r0, _start  
  349.     cmp r0, r6  
  350.     moveq   r9, #0      /* no relocation. relocation offset(r9) = 0 */  
  351.     beq relocate_done       /* skip relocation */  
  352.     mov r1, r6          /* r1 <- scratch for copy_loop */  
  353.     ldr r3, _image_copy_end_ofs  
  354.     add r2, r0, r3      /* r2 <- source end address      */  
  355.   
  356. copy_loop:  
  357.     ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */  
  358.     stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */  
  359.     cmp r0, r2          /* until source end address [r2]    */  
  360.     blo copy_loop  
  361.   
  362.     /* 
  363.      * fix .rel.dyn relocations 
  364.      */  
  365.     ldr r0, _TEXT_BASE      /* r0 <- Text base */  
  366.     sub r9, r6, r0      /* r9 <- relocation offset */  
  367.     ldr r10, _dynsym_start_ofs  /* r10 <- sym table ofs */  
  368.     add r10, r10, r0        /* r10 <- sym table in FLASH */  
  369.     ldr r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */  
  370.     add r2, r2, r0      /* r2 <- rel dyn start in FLASH */  
  371.     ldr r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */  
  372.     add r3, r3, r0      /* r3 <- rel dyn end in FLASH */  
  373. fixloop:  
  374.     ldr r0, [r2]        /* r0 <- location to fix up, IN FLASH! */  
  375.     add r0, r0, r9      /* r0 <- location to fix up in RAM */  
  376.     ldr r1, [r2, #4]  
  377.     and r7, r1, #0xff  
  378.     cmp r7, #23         /* relative fixup? */  
  379.     beq fixrel  
  380.     cmp r7, #2          /* absolute fixup? */  
  381.     beq fixabs  
  382.     /* ignore unknown type of fixup */  
  383.     b   fixnext  
  384. fixabs:  
  385.     /* absolute fix: set location to (offset) symbol value */  
  386.     mov r1, r1, LSR #4      /* r1 <- symbol index in .dynsym */  
  387.     add r1, r10, r1     /* r1 <- address of symbol in table */  
  388.     ldr r1, [r1, #4]        /* r1 <- symbol value */  
  389.     add r1, r1, r9      /* r1 <- relocated sym addr */  
  390.     b   fixnext  
  391. fixrel:  
  392.     /* relative fix: increase location by offset */  
  393.     ldr r1, [r0]  
  394.     add r1, r1, r9  
  395. fixnext:  
  396.     str r1, [r0]  
  397.     add r2, r2, #8      /* each rel.dyn entry is 8 bytes */  
  398.     cmp r2, r3  
  399.     blo fixloop  
  400.   
  401. relocate_done:  
  402.   
  403.     bx  lr   /*返回到从定位的高端地址执行新的boot code ??*/
  404.   
  405. _rel_dyn_start_ofs:  
  406.     .word __rel_dyn_start - _start  
  407. _rel_dyn_end_ofs:  
  408.     .word __rel_dyn_end - _start  
  409. _dynsym_start_ofs:  
  410.     .word __dynsym_start - _start  
  411. ENDPROC(relocate_code)  
  412.   
  413. #endif  
  414.   
  415. ENTRY(c_runtime_cpu_setup)  
  416. /* 
  417.  * If I-cache is enabled invalidate it 
  418.  */  
  419. #ifndef CONFIG_SYS_ICACHE_OFF  
  420.     mcr p15, 0, r0, c7, c5, 0   @ invalidate icache  
  421.     mcr     p15, 0, r0, c7, c10, 4  @ DSB  
  422.     mcr     p15, 0, r0, c7, c5, 4   @ ISB  
  423. #endif  
  424. /* 
  425.  * Move vector table 
  426.  */  
  427. #if !defined(CONFIG_TEGRA20)  
  428.     /* Set vector address in CP15 VBAR register */  
  429.     ldr     r0, =_start  
  430.     add     r0, r0, r9  
  431.     mcr     p15, 0, r0, c12, c0, 0  @Set VBAR  
  432. #endif /* !Tegra20 */  
  433.   
  434.     bx  lr  
  435.   
  436. ENDPROC(c_runtime_cpu_setup)  
  437.   
  438. /************************************************************************* 
  439.  * 
  440.  * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) 
  441.  *  __attribute__((weak)); 
  442.  * 
  443.  * Stack pointer is not yet initialized at this moment 
  444.  * Don’t save anything to stack even if compiled with -O0 
  445.  * 
  446.  *************************************************************************/  
  447. ENTRY(save_boot_params)  
  448.     bx  lr          @ back to my caller  
  449. ENDPROC(save_boot_params)  
  450.     .weak   save_boot_params  
  451.   
  452. /************************************************************************* 
  453.  * 
  454.  * cpu_init_cp15 
  455.  * 
  456.  * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless 
  457.  * CONFIG_SYS_ICACHE_OFF is defined. 
  458.  * 
  459.  *************************************************************************/  
  460. ENTRY(cpu_init_cp15)  
  461.   
  462.    /* 
  463.     * Invalidate L1 I/D 
  464.     */  
  465.     mov r0, #0                  @ set up for MCR  
  466.     mcr p15, 0, r0, c8, c7, 0   @ invalidate TLBs  
  467.     mcr p15, 0, r0, c7, c5, 0   @ invalidate icache  
  468.   
  469.    /* 
  470.     * disable MMU stuff and caches 
  471.     */  
  472.     mrc p15, 0, r0, c1, c0, 0  
  473.     bic r0, r0, #0x00002000     @ clear bits 13 (–V-)  
  474.     bic r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)  
  475.     orr r0, r0, #0x00000002     @ set bit 1 (–A-) Align  
  476.     orr r0, r0, #0x00000800     @ set bit 12 (Z—) BTB  
  477.     mcr     p15, 0, r0, c1, c0, 0  
  478.   
  479.     mov pc, lr          @ back to my caller  
  480. ENDPROC(cpu_init_cp15)  
  481.   
  482. #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  483. /************************************************************************* 
  484.  * 
  485.  * CPU_init_critical registers 
  486.  * 
  487.  * setup important registers 
  488.  * setup memory timing 
  489.  * 
  490.  *************************************************************************/  
  491. ENTRY(cpu_init_crit)  
  492.     /* 
  493.      * Jump to board specific initialization… 
  494.      * The Mask ROM will have already initialized 
  495.      * basic memory. Go here to bump up clock rate and handle 
  496.      * wake up conditions. 
  497.      */  
  498.     b   lowlevel_init       @ go setup pll,mux,memory  
  499. ENDPROC(cpu_init_crit)  
  500. #endif  
  501.   
  502. /************************************************************************* 
  503.  * 
  504.  * zsy210_iic_pm_open 
  505.  * 
  506.  *************************************************************************/  
  507. ENTRY(zsy210_iic_pm_open)  
  508.     /*电源管理,保持供电*/  
  509. #ifdef CONFIG_ZSY210_IIC_PM_CHIP  
  510.     /* PS_HOLD(GPJ2_5) 设置为高点平 */  
  511.     ldr     r0, =ELFIN_GPIO_BASE  
  512.     ldr     r1, =0x00100000  
  513.     str     r1, [r0, #GPJ2CON_OFFSET]  
  514.   
  515.     ldr     r1, =0x0400  
  516.     str     r1, [r0, #GPJ2PUD_OFFSET]  
  517.   
  518.     ldr     r1, =0x20  
  519.     str     r1, [r0, #GPJ2DAT_OFFSET]  
  520. #endif /* CONFIG_ZSY210_IIC_PM_CHIP */  
  521.     mov pc, lr          @ back to my caller  
  522. ENDPROC(zsy210_iic_pm_open)  
  523.   
  524.   
  525. #if defined(CONFIG_ENABLE_MMU)  
  526. _mmu_table_base:  
  527.     .word mmu_table  
  528. #endif  
  529.   
  530.   
  531. /* 
  532.  * we assume that cache operation is done before. (eg. cleanup_before_linux()) 
  533.  * actually, we don’t need to do anything about cache if not use d-cache in U-Boot 
  534.  * So, in this function we clean only MMU. by scsuh 
  535.  * 
  536.  * void theLastJump(void *kernel, int arch_num, uint boot_params); 
  537.  */  
  538. #if defined(CONFIG_ENABLE_MMU)  
  539.     .globl theLastJump  
  540. theLastJump:  
  541.     mov r9, r0  
  542.     ldr r3, =0xfff00000  
  543.     ldr r4, _TEXT_PHY_BASE  
  544.     adr r5, phy_last_jump  
  545.     bic r5, r5, r3  
  546.     orr r5, r5, r4  
  547.     mov pc, r5  
  548. phy_last_jump:  
  549.     /* 
  550.      * disable MMU stuff 
  551.      */  
  552.     mrc p15, 0, r0, c1, c0, 0  
  553.     bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (–V- –RS) */  
  554.     bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B— -CAM) */  
  555.     orr r0, r0, #0x00000002 /* set bit 2 (A) Align */  
  556.     orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */  
  557.     mcr p15, 0, r0, c1, c0, 0  
  558.   
  559.     mcr p15, 0, r0, c8, c7, 0   /* flush v4 TLB */  
  560.   
  561.     mov r0, #0  
  562.     mov pc, r9  
  563. #endif  
  564.   
  565.   
  566.   
  567. #ifndef CONFIG_SPL_BUILD  
  568. /* 
  569.  ************************************************************************* 
  570.  * 
  571.  * Interrupt handling 
  572.  * 
  573.  ************************************************************************* 
  574.  */  
  575. @  
  576. @ IRQ stack frame.  
  577. @  
  578. #define S_FRAME_SIZE    72  
  579.   
  580. #define S_OLD_R0    68  
  581. #define S_PSR       64  
  582. #define S_PC        60  
  583. #define S_LR        56  
  584. #define S_SP        52  
  585.   
  586. #define S_IP        48  
  587. #define S_FP        44  
  588. #define S_R10       40  
  589. #define S_R9        36  
  590. #define S_R8        32  
  591. #define S_R7        28  
  592. #define S_R6        24  
  593. #define S_R5        20  
  594. #define S_R4        16  
  595. #define S_R3        12  
  596. #define S_R2        8  
  597. #define S_R1        4  
  598. #define S_R0        0  
  599.   
  600. #define MODE_SVC 0x13  
  601. #define I_BIT    0x80  
  602.   
  603. /* 
  604.  * use bad_save_user_regs for abort/prefetch/undef/swi … 
  605.  * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling 
  606.  */  
  607.   
  608.     .macro  bad_save_user_regs  
  609.     sub sp, sp, #S_FRAME_SIZE       @ carve out a frame on current  
  610.                         @ user stack  
  611.     stmia   sp, {r0 - r12}          @ Save user registers (now in  
  612.                         @ svc mode) r0-r12  
  613.     ldr r2, IRQ_STACK_START_IN      @ set base 2 words into abort  
  614.                         @ stack  
  615.     ldmia   r2, {r2 - r3}           @ get values for “aborted” pc  
  616.                         @ and cpsr (into parm regs)  
  617.     add r0, sp, #S_FRAME_SIZE       @ grab pointer to old stack  
  618.   
  619.     add r5, sp, #S_SP  
  620.     mov r1, lr  
  621.     stmia   r5, {r0 - r3}           @ save sp_SVC, lr_SVC, pc, cpsr  
  622.     mov r0, sp              @ save current stack into r0  
  623.                         @ (param register)  
  624.     .endm  
  625.   
  626.     .macro  irq_save_user_regs  
  627.     sub sp, sp, #S_FRAME_SIZE  
  628.     stmia   sp, {r0 - r12}          @ Calling r0-r12  
  629.     add r8, sp, #S_PC           @ !! R8 NEEDS to be saved !!  
  630.                         @ a reserved stack spot would  
  631.                         @ be good.  
  632.     stmdb   r8, {sp, lr}^           @ Calling SP, LR  
  633.     str lr, [r8, #0]            @ Save calling PC  
  634.     mrs r6, spsr  
  635.     str r6, [r8, #4]            @ Save CPSR  
  636.     str r0, [r8, #8]            @ Save OLD_R0  
  637.     mov r0, sp  
  638.     .endm  
  639.   
  640.     .macro  irq_restore_user_regs  
  641.     ldmia   sp, {r0 - lr}^          @ Calling r0 - lr  
  642.     mov r0, r0  
  643.     ldr lr, [sp, #S_PC]         @ Get PC  
  644.     add sp, sp, #S_FRAME_SIZE  
  645.     subs    pc, lr, #4          @ return & move spsr_svc into  
  646.                         @ cpsr  
  647.     .endm  
  648.   
  649.     .macro get_bad_stack  
  650.     ldr r13, IRQ_STACK_START_IN     @ setup our mode stack (enter  
  651.                         @ in banked mode)  
  652.   
  653.     str lr, [r13]           @ save caller lr in position 0  
  654.                         @ of saved stack  
  655.     mrs lr, spsr            @ get the spsr  
  656.     str lr, [r13, #4]           @ save spsr in position 1 of  
  657.                         @ saved stack  
  658.   
  659.     mov r13, #MODE_SVC          @ prepare SVC-Mode  
  660.     @ msr   spsr_c, r13  
  661.     msr spsr, r13           @ switch modes, make sure  
  662.                         @ moves will execute  
  663.     mov lr, pc              @ capture return pc  
  664.     movs    pc, lr              @ jump to next instruction &  
  665.                         @ switch modes.  
  666.     .endm  
  667.   
  668.     .macro get_bad_stack_swi  
  669.     sub r13, r13, #4            @ space on current stack for  
  670.                         @ scratch reg.  
  671.     str r0, [r13]           @ save R0’s value.  
  672.     ldr r0, IRQ_STACK_START_IN      @ get data regions start  
  673.                         @ spots for abort stack  
  674.     str lr, [r0]            @ save caller lr in position 0  
  675.                         @ of saved stack  
  676.     mrs r0, spsr            @ get the spsr  
  677.     str lr, [r0, #4]            @ save spsr in position 1 of  
  678.                         @ saved stack  
  679.     ldr r0, [r13]           @ restore r0  
  680.     add r13, r13, #4            @ pop stack entry  
  681.     .endm  
  682.   
  683.     .macro get_irq_stack            @ setup IRQ stack  
  684.     ldr sp, IRQ_STACK_START  
  685.     .endm  
  686.   
  687.     .macro get_fiq_stack            @ setup FIQ stack  
  688.     ldr sp, FIQ_STACK_START  
  689.     .endm  
  690.   
  691. /* 
  692.  * exception handlers 
  693.  */  
  694.     .align  5  
  695. undefined_instruction:  
  696.     get_bad_stack  
  697.     bad_save_user_regs  
  698.     bl  do_undefined_instruction  
  699.   
  700.     .align  5  
  701. software_interrupt:  
  702.     get_bad_stack_swi  
  703.     bad_save_user_regs  
  704.     bl  do_software_interrupt  
  705.   
  706.     .align  5  
  707. prefetch_abort:  
  708.     get_bad_stack  
  709.     bad_save_user_regs  
  710.     bl  do_prefetch_abort  
  711.   
  712.     .align  5  
  713. data_abort:  
  714.     get_bad_stack  
  715.     bad_save_user_regs  
  716.     bl  do_data_abort  
  717.   
  718.     .align  5  
  719. not_used:  
  720.     get_bad_stack  
  721.     bad_save_user_regs  
  722.     bl  do_not_used  
  723.   
  724. #ifdef CONFIG_USE_IRQ  
  725.   
  726.     .align  5  
  727. irq:  
  728.     get_irq_stack  
  729.     irq_save_user_regs  
  730.     bl  do_irq  
  731.     irq_restore_user_regs  
  732.   
  733.     .align  5  
  734. fiq:  
  735.     get_fiq_stack  
  736.     /* someone ought to write a more effective fiq_save_user_regs */  
  737.     irq_save_user_regs  
  738.     bl  do_fiq  
  739.     irq_restore_user_regs  
  740.   
  741. #else  
  742.   
  743.     .align  5  
  744. irq:  
  745.     get_bad_stack  
  746.     bad_save_user_regs  
  747.     bl  do_irq  
  748.   
  749.     .align  5  
  750. fiq:  
  751.     get_bad_stack  
  752.     bad_save_user_regs  
  753.     bl  do_fiq  
  754.   
  755. #endif /* CONFIG_USE_IRQ */  
  756. #endif /* CONFIG_SPL_BUILD */  

 

 

 

 

 

 


lowlevel_init.S的完整代码:

 

[cpp] view plaincopy

  1. /* 
  2.  * Copyright (C) 2009 Samsung Electronics 
  3.  * Kyungmin Park <kyungmin.park@samsung.com> 
  4.  * Minkyu Kang <mk7.kang@samsung.com> 
  5.  * 
  6.  * See file CREDITS for list of people who contributed to this 
  7.  * project. 
  8.  * 
  9.  * This program is free software; you can redistribute it and/or 
  10.  * modify it under the terms of the GNU General Public License as 
  11.  * published by the Free Software Foundation; either version 2 of 
  12.  * the License, or (at your option) any later version. 
  13.  * 
  14.  * This program is distributed in the hope that it will be useful, 
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  17.  * GNU General Public License for more details. 
  18.  * 
  19.  * You should have received a copy of the GNU General Public License 
  20.  * along with this program; if not, write to the Free Software 
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  22.  * MA 02111-1307 USA 
  23.  */  
  24.   
  25. #include <config.h>  
  26. #include <version.h>  
  27. #include <asm/arch/cpu.h>  
  28. #include <asm/arch/power.h>  
  29. #include <s5pv210.h>  
  30. #include “zsy210_val.h”  
  31. /* 
  32.  * Register usages: 
  33.  * 
  34.  * r5 has zero always 
  35.  */  
  36.   
  37. _TEXT_BASE:  
  38.     .word   CONFIG_SYS_TEXT_BASE  
  39.   
  40.     .globl lowlevel_init  
  41. lowlevel_init:  
  42.     mov r9, lr  
  43.   
  44.     /* check reset status  */  
  45.     ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)  
  46.     ldr r1, [r0]  
  47.     bic r1, r1, #0xfff6ffff  
  48.     cmp r1, #0x10000  
  49.     beq wakeup_reset_pre  
  50.     cmp r1, #0x80000  
  51.     beq wakeup_reset_from_didle  
  52.   
  53.     /* IO Retention release */  
  54.     ldr r0, =(ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)  
  55.     ldr r1, [r0]  
  56.     ldr r2, =IO_RET_REL  
  57.     orr r1, r1, r2  
  58.     str r1, [r0]  
  59.   
  60.     /* Disable Watchdog */  
  61.     ldr r0, =ELFIN_WATCHDOG_BASE    /* 0xE2700000 */  
  62.     mov r1, #0  
  63.     str r1, [r0]  
  64.     /* SRAM(2MB) init for SMDKC110 */  
  65.     /* GPJ1 SROM_ADDR_16to21 */  
  66.     ldr r0, =ELFIN_GPIO_BASE  
  67.   
  68.     ldr r1, [r0, #GPJ1CON_OFFSET]  
  69.     bic r1, r1, #0xFFFFFF  
  70.     ldr r2, =0x444444  
  71.     orr r1, r1, r2  
  72.     str r1, [r0, #GPJ1CON_OFFSET]  
  73.   
  74.     ldr r1, [r0, #GPJ1PUD_OFFSET]  
  75.     ldr r2, =0x3ff  
  76.     bic r1, r1, r2  
  77.     str r1, [r0, #GPJ1PUD_OFFSET]  
  78.   
  79.     /* GPJ4 SROM_ADDR_16to21 */  
  80.     ldr r1, [r0, #GPJ4CON_OFFSET]  
  81.     bic r1, r1, #(0xf<<16)  
  82.     ldr r2, =(0x4<<16)  
  83.     orr r1, r1, r2  
  84.     str r1, [r0, #GPJ4CON_OFFSET]  
  85.   
  86.     ldr r1, [r0, #GPJ4PUD_OFFSET]  
  87.     ldr r2, =(0x3<<8)  
  88.     bic r1, r1, r2  
  89.     str r1, [r0, #GPJ4PUD_OFFSET]  
  90.   
  91.     /* CS0 - 16bit sram, enable nBE, Byte base address */  
  92.     ldr r0, =ELFIN_SROM_BASE    /* 0xE8000000 */  
  93.     mov r1, #0x1  
  94.     str r1, [r0]  
  95.   
  96.     /* PS_HOLD pin(GPH0_0) set to high */  
  97.     ldr r0, =(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET)  
  98.     ldr r1, [r0]  
  99.     orr r1, r1, #0x300  
  100.     orr r1, r1, #0x1  
  101.     str r1, [r0]  
  102.   
  103.     /* when we already run in ram, we don’t need to relocate U-Boot. 
  104.      * and actually, memory controller must be configured before U-Boot 
  105.      * is running in ram. 
  106.      */  
  107.     ldr r0, =0xff000fff  
  108.     bic r1, pc, r0      /* r0 <- current base addr of code */  
  109.     ldr r2, _TEXT_BASE      /* r1 <- original base addr in ram */  
  110.     bic r2, r2, r0      /* r0 <- current base addr of code */  
  111.     cmp     r1, r2                  /* compare r0, r1     */  
  112.     beq     1f          /* r0 == r1 then skip sdram init   */  
  113.   
  114.     /* init PMIC chip */  
  115. #ifdef CONFIG_ZSY210_IIC_PM_CHIP  
  116.     bl PMIC_InitIp  
  117. #endif  
  118.   
  119.     /* init system clock */  
  120.     bl system_clock_init  
  121.     /* Memory initialize */  
  122.     bl mem_ctrl_asm_init  
  123.   
  124. 1:  
  125.     /* for UART */  
  126.     bl uart_asm_init  
  127.   
  128.     /* for TZPC */  
  129.     bl tzpc_asm_init  
  130.   
  131. #if defined(CONFIG_NAND)  
  132.     /* simple init for NAND */  
  133.     bl nand_asm_init  
  134. #endif  
  135.     /* check reset status  */  
  136.   
  137.     ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)  
  138.     ldr r1, [r0]  
  139.     bic r1, r1, #0xfffeffff  
  140.     cmp r1, #0x10000  
  141.     beq wakeup_reset_pre  
  142.   
  143.     /* ABB disable */  
  144.     ldr r0, =0xE010C300  
  145.     orr r1, r1, #(0x1<<23)  
  146.     str r1, [r0]  
  147.   
  148.     /* Print ‘K’ */  
  149.     ldr r0, =ELFIN_UART_CONSOLE_BASE  
  150.     ldr r1, =0x4b4b4b4b  
  151.     str r1, [r0, #UTXH_OFFSET]  
  152.   
  153.     mov lr, r9  
  154.     mov pc, lr  
  155.   
  156.   
  157. /* 
  158.  * uart_asm_init: Initialize UART’s pins 
  159.  */  
  160. uart_asm_init:  
  161.     /* set GPIO(GPA) to enable UART */  
  162.     @ GPIO setting for UART  
  163.     ldr r0, =ELFIN_GPIO_BASE  
  164.     ldr r1, =0x22222222  
  165.     str     r1, [r0, #GPA0CON_OFFSET]  
  166.   
  167.     ldr     r1, =0x2222  
  168.     str     r1, [r0, #GPA1CON_OFFSET]  
  169.   
  170.     ldr r0, =ELFIN_UART_CONSOLE_BASE        @0xEC000000  
  171.     mov r1, #0x0  
  172.     str r1, [r0, #UFCON_OFFSET]  
  173.     str r1, [r0, #UMCON_OFFSET]  
  174.   
  175.     mov r1, #0x3  
  176.     str r1, [r0, #ULCON_OFFSET]  
  177.   
  178.     ldr r1, =0x3c5  
  179.     str r1, [r0, #UCON_OFFSET]  
  180.   
  181.     ldr r1, =UART_UBRDIV_VAL  
  182.     str r1, [r0, #UBRDIV_OFFSET]  
  183.   
  184.     ldr r1, =UART_UDIVSLOT_VAL  
  185.     str r1, [r0, #UDIVSLOT_OFFSET]  
  186.   
  187.     ldr r1, =0x4f4f4f4f  
  188.     str r1, [r0, #UTXH_OFFSET]      @’O’  
  189.   
  190.     mov pc, lr  
  191.   
  192. /* 
  193.  * tzpc_asm_init: Initialize TZPC 
  194.  */  
  195. tzpc_asm_init:  
  196.   
  197.     ldr r0, =ELFIN_TZPC0_BASE  
  198.     mov r1, #0x0  
  199.     str r1, [r0]  
  200.     mov r1, #0xff  
  201.     str r1, [r0, #TZPC_DECPROT0SET_OFFSET]  
  202.     str r1, [r0, #TZPC_DECPROT1SET_OFFSET]  
  203.     str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  
  204.   
  205.     ldr     r0, =ELFIN_TZPC1_BASE  
  206.     str r1, [r0, #TZPC_DECPROT0SET_OFFSET]  
  207.     str r1, [r0, #TZPC_DECPROT1SET_OFFSET]  
  208.     str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  
  209.   
  210.     ldr r0, =ELFIN_TZPC2_BASE  
  211.     str r1, [r0, #TZPC_DECPROT0SET_OFFSET]  
  212.     str r1, [r0, #TZPC_DECPROT1SET_OFFSET]  
  213.     str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  
  214.     str r1, [r0, #TZPC_DECPROT3SET_OFFSET]  
  215.   
  216.     ldr r0, =ELFIN_TZPC3_BASE  
  217.     str r1, [r0, #TZPC_DECPROT0SET_OFFSET]  
  218.     str r1, [r0, #TZPC_DECPROT1SET_OFFSET]  
  219.     str r1, [r0, #TZPC_DECPROT2SET_OFFSET]  
  220.   
  221.     mov pc, lr  
  222.   
  223.   
  224. /******************** zsy add 2013.3.14 *******************************/  
  225. /* 
  226.  * Nand Interface Init for SMDKC110 
  227.  */  
  228. nand_asm_init:  
  229.   
  230.     /* Setting GPIO for NAND */  
  231.     /* This setting is NAND initialze code at booting time in iROM. */  
  232.   
  233.     ldr     r0, =ELFIN_GPIO_BASE  
  234.   
  235.     ldr     r1, [r0, #MP01CON_OFFSET]  
  236.     bic     r1, r1, #(0xf<<8)  
  237.     orr     r1, r1, #(0x3<<8)  
  238.     str     r1, [r0, #MP01CON_OFFSET]  
  239.   
  240.     ldr     r1, [r0, #MP01PUD_OFFSET]  
  241.     bic     r1, r1, #(0x3<<4)  
  242.     str     r1, [r0, #MP01PUD_OFFSET]  
  243.   
  244.     ldr     r1, [r0, #MP03CON_OFFSET]  
  245.     bic     r1, r1, #0xFFFFFF  
  246.     ldr     r2, =0x22222222  
  247.     orr     r1, r1, r2  
  248.     str     r1, [r0, #MP03CON_OFFSET]  
  249.   
  250.     ldr     r1, [r0, #MP03PUD_OFFSET]  
  251.     ldr     r2, =0x3fff  
  252.     bic     r1, r1, r2  
  253.     str     r1, [r0, #MP03PUD_OFFSET]  
  254.   
  255.     ldr     r0, =ELFIN_NAND_BASE  
  256.   
  257.     ldr     r1, [r0, #NFCONF_OFFSET]  
  258.     ldr     r2, =0x777F  
  259.     bic     r1, r1, r2  
  260.     ldr     r2, =NFCONF_VAL  
  261.     orr     r1, r1, r2  
  262.     str     r1, [r0, #NFCONF_OFFSET]  
  263.   
  264.     ldr     r1, [r0, #NFCONT_OFFSET]  
  265.     ldr     r2, =0x707C7  
  266.     bic     r1, r1, r2  
  267.     ldr     r2, =NFCONT_VAL  
  268.     orr     r1, r1, r2  
  269.     str     r1, [r0, #NFCONT_OFFSET]  
  270.   
  271.     ldr     r1, [r0, #NFCONF_OFFSET]  
  272.     orr     r1, r1, #0x70  
  273.     orr     r1, r1, #0x7700  
  274.     str     r1, [r0, #NFCONF_OFFSET]  
  275.   
  276.     ldr     r1, [r0, #NFCONT_OFFSET]  
  277.     orr     r1, r1, #0x03  
  278.     str     r1, [r0, #NFCONT_OFFSET]  
  279.   
  280.     mov     pc, lr  
  281.   
  282.   
  283. /******************** zsy add 2013.3.14 *******************************/  
  284.     wakeup_reset_from_didle:  
  285.     /* Wait when APLL is locked */  
  286.     ldr r0, =ELFIN_CLOCK_POWER_BASE  
  287. lockloop:  
  288.     ldr r1, [r0, #APLL_CON0_OFFSET]  
  289.     and r1, r1, #(1<<29)  
  290.     cmp r1, #(1<<29)  
  291.     bne     lockloop  
  292.     beq exit_wakeup  
  293.   
  294. wakeup_reset_pre:  
  295.     mrc p15, 0, r1, c1, c0, 1   @Read CP15 Auxiliary control register  
  296.     and r1, r1, #0x80000000 @Check L2RD is disable or not  
  297.     cmp r1, #0x80000000  
  298.     bne wakeup_reset        @if L2RD is not disable jump to wakeup_reset  
  299.   
  300.     bl  disable_l2cache  
  301.     bl  v7_flush_dcache_all  
  302.     /* L2 cache enable at sleep.S of kernel 
  303.      * bl   enable_l2cache 
  304.      */  
  305. #ifdef CONFIG_ZSY210  
  306.     bl  enable_l2cache  
  307. #endif  
  308.   
  309. wakeup_reset:  
  310.     /* init system clock */  
  311.     bl system_clock_init  
  312.     bl mem_ctrl_asm_init  
  313.     bl tzpc_asm_init  
  314. #if defined(CONFIG_NAND)  
  315.     bl nand_asm_init  
  316. #endif  
  317.   
  318. exit_wakeup:  
  319.     /*Load return address and jump to kernel*/  
  320.     ldr r0, =(INF_REG_BASE+INF_REG0_OFFSET)  
  321.     ldr r1, [r0]    /* r1 = physical address of s5pc110_cpu_resume function*/  
  322.   
  323.     mov pc, r1      /*Jump to kernel */  
  324.     nop  
  325.     nop  
  326.   
  327. /* 
  328.  * system_clock_init: Initialize core clock and bus clock. 
  329.  * void system_clock_init(void) 
  330.  */  
  331. system_clock_init:  
  332.   
  333.     ldr r0, =ELFIN_CLOCK_POWER_BASE @0xe0100000  
  334.   
  335.     /* Set Mux to FIN */  
  336.     ldr r1, =0x0  
  337.     str r1, [r0, #CLK_SRC0_OFFSET]  
  338.   
  339.     ldr r1, =APLL_LOCKTIME_VAL  
  340.     str r1, [r0, #APLL_LOCK_OFFSET]  
  341.   
  342.     /* Disable PLL */  
  343. #if defined(CONFIG_CHECK_MPLL_LOCK)  
  344. retryloop:  
  345. #endif  
  346.     ldr r1, =0x0  
  347.     str r1, [r0, #APLL_CON0_OFFSET]  
  348.     ldr r1, =0x0  
  349.     str r1, [r0, #MPLL_CON_OFFSET]  
  350.   
  351.     ldr r1, =0x0  
  352.     str r1, [r0, #MPLL_CON_OFFSET]  
  353.   
  354.     ldr     r1, [r0, #CLK_DIV0_OFFSET]  
  355.     ldr r2, =CLK_DIV0_MASK  
  356.     bic r1, r1, r2  
  357.   
  358.     ldr r2, =CLK_DIV0_VAL  
  359.     orr r1, r1, r2  
  360.     str r1, [r0, #CLK_DIV0_OFFSET]  
  361.   
  362.     ldr r1, =APLL_VAL  
  363.     str r1, [r0, #APLL_CON0_OFFSET]  
  364.   
  365.     ldr r1, =MPLL_VAL  
  366.     str r1, [r0, #MPLL_CON_OFFSET]  
  367.   
  368.     ldr r1, =VPLL_VAL  
  369.     str r1, [r0, #VPLL_CON_OFFSET]  
  370. #if defined(CONFIG_EVT1)  
  371.     ldr r1, =AFC_ON  
  372.     str r1, [r0, #APLL_CON1_OFFSET]  
  373. #endif  
  374.     mov r1, #0x10000  
  375. 1:  subs    r1, r1, #1  
  376.     bne 1b  
  377.   
  378. #if defined(CONFIG_CHECK_MPLL_LOCK)  
  379.     /* MPLL software workaround */  
  380.     ldr r1, [r0, #MPLL_CON_OFFSET]  
  381.     orr     r1, r1, #(1<<28)  
  382.     str r1, [r0, #MPLL_CON_OFFSET]  
  383.   
  384.     mov r1, #0x100  
  385. 1:  subs    r1, r1, #1  
  386.     bne 1b  
  387.   
  388.     ldr r1, [r0, #MPLL_CON_OFFSET]  
  389.     and r1, r1, #(1<<29)  
  390.     cmp r1, #(1<<29)  
  391.     bne     retryloop  
  392.   
  393.     /* H/W lock detect disable */  
  394.     ldr r1, [r0, #MPLL_CON_OFFSET]  
  395.     bic     r1, r1, #(1<<28)  
  396.     str r1, [r0, #MPLL_CON_OFFSET]  
  397. #endif  
  398.   
  399.     ldr r1, [r0, #CLK_SRC0_OFFSET]  
  400.     ldr r2, =0x10001111  
  401.     orr r1, r1, r2  
  402.     str r1, [r0, #CLK_SRC0_OFFSET]  
  403.   
  404. #if defined(CONFIG_MCP_AC)  
  405.   
  406.     /* CLK_SRC6[25:24] -> OneDRAM clock sel = MPLL */  
  407.     ldr r1, [r0, #CLK_SRC6_OFFSET]  
  408.     bic r1, r1, #(0x3<<24)  
  409.     orr r1, r1, #0x01000000  
  410.     str r1, [r0, #CLK_SRC6_OFFSET]  
  411.   
  412.     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */  
  413.     ldr r1, [r0, #CLK_DIV6_OFFSET]  
  414.     bic r1, r1, #(0xF<<28)  
  415.     bic r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0  
  416.     orr r1, r1, #0x30000000  
  417.     str r1, [r0, #CLK_DIV6_OFFSET]  
  418.   
  419. #elif defined (CONFIG_MCP_N)  
  420.     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */  
  421.     ldr r1, [r0, #CLK_SRC6_OFFSET]  
  422.     mov r1, #0x00000000  
  423.     str r1, [r0, #CLK_SRC6_OFFSET]  
  424.   
  425.     /* CLK_DIV6[31:28] -> 0=1/1 */  
  426.     ldr r1, [r0, #CLK_DIV6_OFFSET]  
  427.     mov r1, #0x00000000  
  428.     str r1, [r0, #CLK_DIV6_OFFSET]  
  429.   
  430.   
  431. #elif defined (CONFIG_MCP_H)  
  432.   
  433.     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */  
  434.     ldr r1, [r0, #CLK_SRC6_OFFSET]  
  435.     bic r1, r1, #(0x3<<24)  
  436.     orr r1, r1, #0x00000000  
  437.     str r1, [r0, #CLK_SRC6_OFFSET]  
  438.   
  439.     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */  
  440.     ldr r1, [r0, #CLK_DIV6_OFFSET]  
  441.     bic r1, r1, #(0xF<<28)  
  442.     bic r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0  
  443.     orr r1, r1, #0x00000000  
  444.     str r1, [r0, #CLK_DIV6_OFFSET]  
  445.   
  446. #elif defined (CONFIG_MCP_B) || defined (CONFIG_MCP_D)  
  447.   
  448.     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */  
  449.     ldr r1, [r0, #CLK_SRC6_OFFSET]  
  450.     bic r1, r1, #(0x3<<24)  
  451.     orr r1, r1, #0x01000000  
  452.     str r1, [r0, #CLK_SRC6_OFFSET]  
  453.   
  454.     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */  
  455.     ldr r1, [r0, #CLK_DIV6_OFFSET]  
  456.     bic r1, r1, #(0xF<<28)  
  457.     bic r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0  
  458.     orr r1, r1, #0x30000000  
  459.     str r1, [r0, #CLK_DIV6_OFFSET]  
  460.   
  461. #elif defined (CONFIG_MCP_SINGLE)  
  462.   
  463.     /* CLK_DIV6 */  
  464.     ldr r1, [r0, #CLK_DIV6_OFFSET]  
  465.     bic r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0  
  466.     str r1, [r0, #CLK_DIV6_OFFSET]  
  467.   
  468. #endif  
  469.     mov pc, lr  
  470.   
  471.   
  472.   
  473.   
  474. #ifdef CONFIG_ENABLE_MMU  
  475.   
  476. #ifdef CONFIG_MCP_SINGLE  
  477. /* 
  478.  * MMU Table for SMDKC110 
  479.  * 0x0000_0000 – 0xBFFF_FFFF => Not Allowed 
  480.  * 0xB000_0000 – 0xB7FF_FFFF => A:0xB000_0000 – 0xB7FF_FFFF 
  481.  * 0xC000_0000 – 0xC7FF_FFFF => A:0x3000_0000 – 0x37FF_FFFF 
  482.  * 0xC800_0000 – 0xDFFF_FFFF => Not Allowed 
  483.  * 0xE000_0000 – 0xFFFF_FFFF => A:0xE000_0000 – 0XFFFF_FFFF 
  484.  */  
  485.   
  486.     /* form a first-level section entry */  
  487. .macro FL_SECTION_ENTRY base,ap,d,c,b  
  488.     .word (\base << 20) | (\ap << 10) | \  
  489.           (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)  
  490. .endm  
  491. .section .mmudata, ”a”  
  492.     .align 14  
  493.     // the following alignment creates the mmu table at address 0x4000.  
  494.     .globl mmu_table  
  495. mmu_table:  
  496.     .set __base,0  
  497.     // Access for iRAM  
  498.     .rept 0x100  
  499.     FL_SECTION_ENTRY __base,3,0,0,0  
  500.     .set __base,__base+1  
  501.     .endr  
  502.   
  503.     // Not Allowed  
  504.     .rept 0x200 - 0x100  
  505.     .word 0x00000000  
  506.     .endr  
  507. #ifdef CONFIG_ZSY10_1G  
  508.     .set __base,0x200  
  509.     // should be accessed  
  510.     .rept 0x600 - 0x200  
  511.     FL_SECTION_ENTRY __base,3,0,1,1  
  512.     .set __base,__base+1  
  513.     .endr  
  514. #else  
  515.     .set __base,0x200  
  516.     // should be accessed  
  517.     .rept 0x600 - 0x200  
  518.     FL_SECTION_ENTRY __base,3,0,1,1  
  519.     .set __base,__base+1  
  520.     .endr  
  521. /* 
  522.     .set __base,0x400 
  523.     // should be accessed 
  524.     .rept 0x500 - 0x400 
  525.     FL_SECTION_ENTRY __base,3,0,1,1 
  526.     .set __base,__base+1 
  527.     .endr*/  
  528. #endif /* CONFIG_ZSY10_1G */  
  529.     .rept 0x800 - 0x600  
  530.     .word 0x00000000  
  531.     .endr  
  532.   
  533.   
  534.     .set __base,0x800  
  535.     // should be accessed  
  536.     .rept 0xb00 - 0x800  
  537.     FL_SECTION_ENTRY __base,3,0,0,0  
  538.     .set __base,__base+1  
  539.     .endr  
  540.   
  541. /*  .rept 0xc00 - 0xb00 
  542.     .word 0x00000000 
  543.     .endr */  
  544.   
  545.     .set __base,0xB00  
  546.     .rept 0xc00 - 0xb00  
  547.     FL_SECTION_ENTRY __base,3,0,0,0  
  548.     .set __base,__base+1  
  549.     .endr  
  550. #ifdef CONFIG_ZSY10_1G  
  551.     .set __base,0x200  
  552.     // 256MB for SDRAM with cacheable  
  553.     .rept 0xD00 - 0xC00  
  554.     FL_SECTION_ENTRY __base,3,0,1,1  
  555.     .set __base,__base+1  
  556.     .endr  
  557.   
  558.     // access is not allowed.  
  559.     @.rept 0xD00 - 0xC80  
  560.     @.word 0x00000000  
  561.     @.endr  
  562.   
  563.     .set __base,0xD00  
  564.     // 1:1 mapping for debugging with non-cacheable  
  565.     .rept 0x1000 - 0xD00  
  566.     FL_SECTION_ENTRY __base,3,0,0,0  
  567.     .set __base,__base+1  
  568.     .endr  
  569. #else  
  570.     .set __base,0x200  
  571.     // 256MB for SDRAM with cacheable  
  572.     .rept 0xD00 - 0xC00  
  573.     FL_SECTION_ENTRY __base,3,0,1,1  
  574.     .set __base,__base+1  
  575.     .endr  
  576.   
  577.     // access is not allowed.  
  578.     @.rept 0xD00 - 0xC80  
  579.     @.word 0x00000000  
  580.     @.endr  
  581.   
  582.     .set __base,0xD00  
  583.     // 1:1 mapping for debugging with non-cacheable  
  584.     .rept 0x1000 - 0xD00  
  585.     FL_SECTION_ENTRY __base,3,0,0,0  
  586.     .set __base,__base+1  
  587.     .endr  
  588. #endif /* CONFIG_ZSY10_1G */  
  589.     #else   // CONFIG_MCP_AC, CONFIG_MCP_H, CONFIG_MCP_B  
  590.   
  591. /* 
  592.  * MMU Table for SMDKC110 
  593.  * 0x0000_0000 – 0xBFFF_FFFF => Not Allowed 
  594.  * 0xB000_0000 – 0xB7FF_FFFF => A:0xB000_0000 – 0xB7FF_FFFF 
  595.  * 0xC000_0000 – 0xC7FF_FFFF => A:0x3000_0000 – 0x37FF_FFFF 
  596.  * 0xC800_0000 – 0xDFFF_FFFF => Not Allowed 
  597.  * 0xE000_0000 – 0xFFFF_FFFF => A:0xE000_0000 – 0XFFFF_FFFF 
  598.  */  
  599.   
  600.     /* form a first-level section entry */  
  601. .macro FL_SECTION_ENTRY base,ap,d,c,b  
  602.     .word (\base << 20) | (\ap << 10) | \  
  603.           (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)  
  604. .endm  
  605. .section .mmudata, ”a”  
  606.     .align 14  
  607.     // the following alignment creates the mmu table at address 0x4000.  
  608.     .globl mmu_table  
  609. mmu_table:  
  610.     .set __base,0  
  611.     // Access for iRAM  
  612.     .rept 0x100  
  613.     FL_SECTION_ENTRY __base,3,0,0,0  
  614.     .set __base,__base+1  
  615.     .endr  
  616.   
  617.     // Not Allowed  
  618.     .rept 0x300 - 0x100  
  619.     .word 0x00000000  
  620.     .endr  
  621.   
  622. #if defined(CONFIG_MCP_N)  
  623.     .set __base,0x300  
  624.     // should be accessed  
  625.     .rept 0x400 - 0x300  
  626.     FL_SECTION_ENTRY __base,3,0,1,1  
  627.     .set __base,__base+1  
  628.     .endr  
  629. #else  
  630.     .set __base,0x300  
  631.     // should be accessed  
  632.     .rept 0x350 - 0x300  
  633.     FL_SECTION_ENTRY __base,3,0,1,1  
  634.     .set __base,__base+1  
  635.     .endr  
  636.   
  637.     // Not Allowed  
  638.     .rept 0x400 - 0x350  
  639.     .word 0x00000000  
  640.     .endr  
  641. #endif  
  642.   
  643.     .set __base,0x400  
  644.     // should be accessed  
  645.     .rept 0x500 - 0x400  
  646.     FL_SECTION_ENTRY __base,3,0,1,1  
  647.     .set __base,__base+1  
  648.     .endr  
  649.   
  650.     .rept 0x800 - 0x500  
  651.     .word 0x00000000  
  652.     .endr  
  653.   
  654.     .set __base,0x800  
  655.     // should be accessed  
  656.     .rept 0xb00 - 0x800  
  657.     FL_SECTION_ENTRY __base,3,0,0,0  
  658.     .set __base,__base+1  
  659.     .endr  
  660.   
  661.     .set __base,0xB00  
  662.     .rept 0xc00 - 0xb00  
  663.     FL_SECTION_ENTRY __base,3,0,0,0  
  664.     .set __base,__base+1  
  665.     .endr  
  666.   
  667. #if defined(CONFIG_MCP_N)  
  668.     .set __base,0x300  
  669.     // 256MB for SDRAM with cacheable  
  670.     .rept 0xD00 - 0xC00  
  671.     FL_SECTION_ENTRY __base,3,0,1,1  
  672.     .set __base,__base+1  
  673.     .endr  
  674. #else  
  675.     .set __base,0x300  
  676.     // 80MB for SDRAM with cacheable  
  677.     .rept 0xC50 - 0xC00  
  678.     FL_SECTION_ENTRY __base,3,0,1,1  
  679.     .set __base,__base+1  
  680.     .endr  
  681.   
  682.     // Not Allowed  
  683.     .rept 0xD00 - 0xC50  
  684.     .word 0x00000000  
  685.     .endr  
  686. #endif  
  687.   
  688.     .set __base,0xD00  
  689.     // 1:1 mapping for debugging with non-cacheable  
  690.     .rept 0x1000 - 0xD00  
  691.     FL_SECTION_ENTRY __base,3,0,0,0  
  692.     .set __base,__base+1  
  693.     .endr  
  694.     #endif  
  695. #endif  


 

 

 

 

 

mem_setup.S的完整代码:

 

[cpp] view plaincopy

  1. #include <config.h>  
  2. #include <s5pv210.h>  
  3.   
  4.     .globl mem_ctrl_asm_init  
  5. mem_ctrl_asm_init:  
  6.   
  7. #ifndef CONFIG_EVT1  
  8.   
  9.     ldr     r0, =ASYNC_MSYS_DMC0_BASE  
  10.   
  11.     ldr     r1, =0x0  
  12.     str     r1, [r0, #0x0]  
  13.   
  14.     /* This register is removed at EVT1 of C110. */  
  15.     ldr     r1, =0x0  
  16.     str     r1, [r0, #0xC]  
  17.    
  18. #endif  
  19.   
  20. #ifdef CONFIG_MCP_SINGLE  
  21.   
  22.     /* DMC0 Drive Strength (Setting 2X) */  
  23.   
  24.     ldr r0, =ELFIN_GPIO_BASE  
  25.   
  26.     ldr r1, =0x0000AAAA  
  27.     str r1, [r0, #MP1_0DRV_SR_OFFSET]  
  28.   
  29.     ldr r1, =0x0000AAAA  
  30.     str r1, [r0, #MP1_1DRV_SR_OFFSET]  
  31.   
  32.     ldr r1, =0x0000AAAA  
  33.     str r1, [r0, #MP1_2DRV_SR_OFFSET]  
  34.   
  35.     ldr r1, =0x0000AAAA  
  36.     str r1, [r0, #MP1_3DRV_SR_OFFSET]  
  37.   
  38.     ldr r1, =0x0000AAAA  
  39.     str r1, [r0, #MP1_4DRV_SR_OFFSET]  
  40.   
  41.     ldr r1, =0x0000AAAA  
  42.     str r1, [r0, #MP1_5DRV_SR_OFFSET]  
  43.   
  44.     ldr r1, =0x0000AAAA  
  45.     str r1, [r0, #MP1_6DRV_SR_OFFSET]  
  46.   
  47.     ldr r1, =0x0000AAAA  
  48.     str r1, [r0, #MP1_7DRV_SR_OFFSET]  
  49.   
  50.     ldr r1, =0x00002AAA  
  51.     str r1, [r0, #MP1_8DRV_SR_OFFSET]  
  52.   
  53.   
  54.     /* DMC1 Drive Strength (Setting 2X) */  
  55.   
  56.     ldr r0, =ELFIN_GPIO_BASE  
  57.   
  58.     ldr r1, =0x0000AAAA  
  59.     str r1, [r0, #MP2_0DRV_SR_OFFSET]  
  60.   
  61.     ldr r1, =0x0000AAAA  
  62.     str r1, [r0, #MP2_1DRV_SR_OFFSET]  
  63.   
  64.     ldr r1, =0x0000AAAA  
  65.     str r1, [r0, #MP2_2DRV_SR_OFFSET]  
  66.   
  67.     ldr r1, =0x0000AAAA  
  68.     str r1, [r0, #MP2_3DRV_SR_OFFSET]  
  69.   
  70.     ldr r1, =0x0000AAAA  
  71.     str r1, [r0, #MP2_4DRV_SR_OFFSET]  
  72.   
  73.     ldr r1, =0x0000AAAA  
  74.     str r1, [r0, #MP2_5DRV_SR_OFFSET]  
  75.   
  76.     ldr r1, =0x0000AAAA  
  77.     str r1, [r0, #MP2_6DRV_SR_OFFSET]  
  78.   
  79.     ldr r1, =0x0000AAAA  
  80.     str r1, [r0, #MP2_7DRV_SR_OFFSET]  
  81.   
  82.     ldr r1, =0x00002AAA  
  83.     str r1, [r0, #MP2_8DRV_SR_OFFSET]  
  84.   
  85.     /* DMC0 initialization at single Type*/  
  86.     ldr r0, =APB_DMC_0_BASE  
  87.   
  88.     ldr r1, =0x00101000             @PhyControl0 DLL parameter setting, manual 0x00101000  
  89.     str r1, [r0, #DMC_PHYCONTROL0]  
  90.   
  91.     ldr r1, =0x00000086             @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case  
  92.     str r1, [r0, #DMC_PHYCONTROL1]  
  93.   
  94.     ldr r1, =0x00101002             @PhyControl0 DLL on  
  95.     str r1, [r0, #DMC_PHYCONTROL0]  
  96.   
  97.     ldr r1, =0x00101003             @PhyControl0 DLL start  
  98.     str r1, [r0, #DMC_PHYCONTROL0]  
  99.   
  100. find_lock_val:  
  101.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  102.     and r2, r1, #0x7  
  103.     cmp r2, #0x7                @Loop until DLL is locked  
  104.     bne find_lock_val  
  105.   
  106.     and r1, #0x3fc0  
  107.     mov r2, r1, LSL #18  
  108.     orr r2, r2, #0x100000  
  109.     orr r2 ,r2, #0x1000  
  110.   
  111.     orr r1, r2, #0x3                @Force Value locking  
  112.     str r1, [r0, #DMC_PHYCONTROL0]  
  113.   
  114. #if 0   /* Memory margin test 10.01.05 */  
  115.     orr r1, r2, #0x1                @DLL off  
  116.     str r1, [r0, #DMC_PHYCONTROL0]  
  117. #endif  
  118.     /* setting DDR2 */  
  119.     ldr r1, =0x0FFF2010             @ConControl auto refresh off  
  120.     str r1, [r0, #DMC_CONCONTROL]  
  121.   
  122.     ldr r1, =0x00212400             @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  123.     str r1, [r0, #DMC_MEMCONTROL]  
  124.   
  125.     ldr r1, =DMC0_MEMCONFIG_0           @MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed  
  126.     str r1, [r0, #DMC_MEMCONFIG0]  
  127.   
  128.     ldr r1, =DMC0_MEMCONFIG_1           @MemConfig1  
  129.     str r1, [r0, #DMC_MEMCONFIG1]  
  130.   
  131.     ldr r1, =0xFF000000             @PrechConfig  
  132.     str r1, [r0, #DMC_PRECHCONFIG]  
  133.   
  134.     ldr r1, =DMC0_TIMINGA_REF           @TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)  
  135.     str r1, [r0, #DMC_TIMINGAREF]  
  136.   
  137.     ldr r1, =DMC0_TIMING_ROW            @TimingRow  for @200MHz  
  138.     str r1, [r0, #DMC_TIMINGROW]  
  139.   
  140.     ldr r1, =DMC0_TIMING_DATA           @TimingData CL=3  
  141.     str r1, [r0, #DMC_TIMINGDATA]  
  142.   
  143.     ldr r1, =DMC0_TIMING_PWR            @TimingPower  
  144.     str r1, [r0, #DMC_TIMINGPOWER]  
  145.   
  146.     ldr r1, =0x07000000             @DirectCmd  chip0 Deselect  
  147.     str r1, [r0, #DMC_DIRECTCMD]  
  148.   
  149.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  150.     str r1, [r0, #DMC_DIRECTCMD]  
  151.   
  152.     ldr r1, =0x00020000             @DirectCmd  chip0 EMRS2  
  153.     str r1, [r0, #DMC_DIRECTCMD]  
  154.   
  155.     ldr r1, =0x00030000             @DirectCmd  chip0 EMRS3  
  156.     str r1, [r0, #DMC_DIRECTCMD]  
  157.   
  158.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (MEM DLL on, DQS# disable)  
  159.     str r1, [r0, #DMC_DIRECTCMD]  
  160.   
  161.     ldr r1, =0x00000542             @DirectCmd  chip0 MRS (MEM DLL reset) CL=4, BL=4  
  162.     str r1, [r0, #DMC_DIRECTCMD]  
  163.   
  164.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  165.     str r1, [r0, #DMC_DIRECTCMD]  
  166.   
  167.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  168.     str r1, [r0, #DMC_DIRECTCMD]  
  169.   
  170.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  171.     str r1, [r0, #DMC_DIRECTCMD]  
  172.   
  173.     ldr r1, =0x00000442             @DirectCmd  chip0 MRS (MEM DLL unreset)  
  174.     str r1, [r0, #DMC_DIRECTCMD]  
  175.   
  176.     ldr r1, =0x00010780             @DirectCmd  chip0 EMRS1 (OCD default)  
  177.     str r1, [r0, #DMC_DIRECTCMD]  
  178.   
  179.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (OCD exit)  
  180.     str r1, [r0, #DMC_DIRECTCMD]  
  181.   
  182.     ldr r1, =0x07100000             @DirectCmd  chip1 Deselect  
  183.     str r1, [r0, #DMC_DIRECTCMD]  
  184.   
  185.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  186.     str r1, [r0, #DMC_DIRECTCMD]  
  187.   
  188.     ldr r1, =0x00120000             @DirectCmd  chip1 EMRS2  
  189.     str r1, [r0, #DMC_DIRECTCMD]  
  190.   
  191.     ldr r1, =0x00130000             @DirectCmd  chip1 EMRS3  
  192.     str r1, [r0, #DMC_DIRECTCMD]  
  193.   
  194.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (MEM DLL on, DQS# disable)  
  195.     str r1, [r0, #DMC_DIRECTCMD]  
  196.   
  197.     ldr r1, =0x00100542             @DirectCmd  chip1 MRS (MEM DLL reset) CL=4, BL=4  
  198.     str r1, [r0, #DMC_DIRECTCMD]  
  199.   
  200.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  201.     str r1, [r0, #DMC_DIRECTCMD]  
  202.   
  203.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  204.     str r1, [r0, #DMC_DIRECTCMD]  
  205.   
  206.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  207.     str r1, [r0, #DMC_DIRECTCMD]  
  208.   
  209.     ldr r1, =0x00100442             @DirectCmd  chip1 MRS (MEM DLL unreset)  
  210.     str r1, [r0, #DMC_DIRECTCMD]  
  211.   
  212.     ldr r1, =0x00110780             @DirectCmd  chip1 EMRS1 (OCD default)  
  213.     str r1, [r0, #DMC_DIRECTCMD]  
  214.   
  215.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (OCD exit)  
  216.     str r1, [r0, #DMC_DIRECTCMD]  
  217.   
  218.     ldr r1, =0x0FF02030             @ConControl auto refresh on  
  219.     str r1, [r0, #DMC_CONCONTROL]  
  220.   
  221.     ldr r1, =0xFFFF00FF             @PwrdnConfig  
  222.     str r1, [r0, #DMC_PWRDNCONFIG]  
  223.   
  224.     ldr r1, =0x00202400             @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  225.     str r1, [r0, #DMC_MEMCONTROL]  
  226.   
  227.     /* DMC1 initialization */  
  228.     ldr r0, =APB_DMC_1_BASE  
  229.   
  230.     ldr r1, =0x00101000             @Phycontrol0 DLL parameter setting  
  231.     str r1, [r0, #DMC_PHYCONTROL0]  
  232.   
  233.     ldr r1, =0x00000086             @Phycontrol1 DLL parameter setting  
  234.     str r1, [r0, #DMC_PHYCONTROL1]  
  235.   
  236.     ldr r1, =0x00101002             @PhyControl0 DLL on  
  237.     str r1, [r0, #DMC_PHYCONTROL0]  
  238.   
  239.     ldr r1, =0x00101003             @PhyControl0 DLL start  
  240.     str r1, [r0, #DMC_PHYCONTROL0]  
  241. find_lock_val1:  
  242.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  243.     and r2, r1, #0x7  
  244.     cmp r2, #0x7                @Loop until DLL is locked  
  245.     bne find_lock_val1  
  246.   
  247.     and r1, #0x3fc0  
  248.     mov r2, r1, LSL #18  
  249.     orr r2, r2, #0x100000  
  250.     orr r2, r2, #0x1000  
  251.   
  252.     orr r1, r2, #0x3                @Force Value locking  
  253.     str r1, [r0, #DMC_PHYCONTROL0]  
  254.   
  255. #if 0   /* Memory margin test 10.01.05 */  
  256.     orr r1, r2, #0x1                @DLL off  
  257.     str r1, [r0, #DMC_PHYCONTROL0]  
  258. #endif  
  259.   
  260.     /* settinf fot DDR2 */  
  261.     ldr r0, =APB_DMC_1_BASE  
  262.   
  263.     ldr r1, =0x0FFF2010             @auto refresh off  
  264.     str r1, [r0, #DMC_CONCONTROL]  
  265.   
  266.     ldr r1, =DMC1_MEMCONTROL            @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  267.     str r1, [r0, #DMC_MEMCONTROL]  
  268.   
  269.     ldr r1, =DMC1_MEMCONFIG_0           @MemConfig0 512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed  
  270.     str r1, [r0, #DMC_MEMCONFIG0]  
  271.   
  272.     ldr r1, =DMC1_MEMCONFIG_1           @MemConfig1  
  273.     str r1, [r0, #DMC_MEMCONFIG1]  
  274.   
  275.     ldr r1, =0xFF000000  
  276.     str r1, [r0, #DMC_PRECHCONFIG]  
  277.   
  278.     ldr r1, =DMC1_TIMINGA_REF           @TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4  
  279.     str r1, [r0, #DMC_TIMINGAREF]  
  280.   
  281.     ldr r1, =DMC1_TIMING_ROW            @TimingRow  for @200MHz  
  282.     str r1, [r0, #DMC_TIMINGROW]  
  283.   
  284.     ldr r1, =DMC1_TIMING_DATA           @TimingData CL=3  
  285.     str r1, [r0, #DMC_TIMINGDATA]  
  286.   
  287.     ldr r1, =DMC1_TIMING_PWR            @TimingPower  
  288.     str r1, [r0, #DMC_TIMINGPOWER]  
  289.   
  290.   
  291.     ldr r1, =0x07000000             @DirectCmd  chip0 Deselect  
  292.     str r1, [r0, #DMC_DIRECTCMD]  
  293.   
  294.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  295.     str r1, [r0, #DMC_DIRECTCMD]  
  296.   
  297.     ldr r1, =0x00020000             @DirectCmd  chip0 EMRS2  
  298.     str r1, [r0, #DMC_DIRECTCMD]  
  299.   
  300.     ldr r1, =0x00030000             @DirectCmd  chip0 EMRS3  
  301.     str r1, [r0, #DMC_DIRECTCMD]  
  302.   
  303.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (MEM DLL on, DQS# disable)  
  304.     str r1, [r0, #DMC_DIRECTCMD]  
  305.   
  306.     ldr r1, =0x00000542             @DirectCmd  chip0 MRS (MEM DLL reset) CL=4, BL=4  
  307.     str r1, [r0, #DMC_DIRECTCMD]  
  308.   
  309.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  310.     str r1, [r0, #DMC_DIRECTCMD]  
  311.   
  312.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  313.     str r1, [r0, #DMC_DIRECTCMD]  
  314.   
  315.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  316.     str r1, [r0, #DMC_DIRECTCMD]  
  317.   
  318.     ldr r1, =0x00000442             @DirectCmd  chip0 MRS (MEM DLL unreset)  
  319.     str r1, [r0, #DMC_DIRECTCMD]  
  320.   
  321.     ldr r1, =0x00010780             @DirectCmd  chip0 EMRS1 (OCD default)  
  322.     str r1, [r0, #DMC_DIRECTCMD]  
  323.   
  324.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (OCD exit)  
  325.     str r1, [r0, #DMC_DIRECTCMD]  
  326.   
  327.     ldr r1, =0x07100000             @DirectCmd  chip1 Deselect  
  328.     str r1, [r0, #DMC_DIRECTCMD]  
  329.   
  330.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  331.     str r1, [r0, #DMC_DIRECTCMD]  
  332.   
  333.     ldr r1, =0x00120000             @DirectCmd  chip1 EMRS2  
  334.     str r1, [r0, #DMC_DIRECTCMD]  
  335.   
  336.     ldr r1, =0x00130000             @DirectCmd  chip1 EMRS3  
  337.     str r1, [r0, #DMC_DIRECTCMD]  
  338.   
  339.     ldr r1, =0x00110440             @DirectCmd  chip1 EMRS1 (MEM DLL on, DQS# disable)  
  340.     str r1, [r0, #DMC_DIRECTCMD]  
  341.   
  342.     ldr r1, =0x00100542             @DirectCmd  chip1 MRS (MEM DLL reset) CL=4, BL=4  
  343.     str r1, [r0, #DMC_DIRECTCMD]  
  344.   
  345.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  346.     str r1, [r0, #DMC_DIRECTCMD]  
  347.   
  348.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  349.     str r1, [r0, #DMC_DIRECTCMD]  
  350.   
  351.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  352.     str r1, [r0, #DMC_DIRECTCMD]  
  353.   
  354.     ldr r1, =0x00100442             @DirectCmd  chip1 MRS (MEM DLL unreset)  
  355.     str r1, [r0, #DMC_DIRECTCMD]  
  356.   
  357.     ldr r1, =0x00110780             @DirectCmd  chip1 EMRS1 (OCD default)  
  358.     str r1, [r0, #DMC_DIRECTCMD]  
  359.   
  360.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (OCD exit)  
  361.     str r1, [r0, #DMC_DIRECTCMD]  
  362.   
  363.     ldr r1, =0x0FF02030             @ConControl auto refresh on  
  364.     str r1, [r0, #DMC_CONCONTROL]  
  365.   
  366.     ldr r1, =0xFFFF00FF             @PwrdnConfig  
  367.     str r1, [r0, #DMC_PWRDNCONFIG]  
  368.   
  369.     ldr r1, =DMC1_MEMCONTROL            @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  370.     str r1, [r0, #DMC_MEMCONTROL]  
  371.   
  372. #else   /* CONFIG_MCP_SINGLE */  
  373.   
  374.     /* DMC0 initialization */  
  375.     ldr r0, =APB_DMC_0_BASE  
  376.   
  377.     ldr r1, =0x00101000             @Phycontrol0 DLL parameter setting  
  378.     str r1, [r0, #DMC_PHYCONTROL0]  
  379.   
  380.     ldr r1, =0x00000084             @Phycontrol1 DLL parameter setting  
  381.     str r1, [r0, #DMC_PHYCONTROL1]  
  382.   
  383.     ldr r1, =0x00101002             @Phycontrol2 DLL parameter setting  
  384.     str r1, [r0, #DMC_PHYCONTROL0]  
  385.   
  386.     ldr r1, =0x00101003             @Dll on  
  387.     str r1, [r0, #DMC_PHYCONTROL0]  
  388.   
  389. find_lock_val:  
  390.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  391.     and     r2, r1, #0x7  
  392.     cmp r2, #0x7                @Loop until DLL is locked  
  393.     bne find_lock_val  
  394.   
  395.     and r1, #0x3fc0  
  396.     mov r2, r1, LSL #18  
  397.     orr r2, r2, #0x100000  
  398.     orr r2, r2, #0x1000  
  399.   
  400.     orr r1, r2, #0x3                @Force Value locking  
  401.     str r1, [r0, #DMC_PHYCONTROL0]  
  402. #if 1 /* DRAM margin test 10.01.06 */  
  403.     orr r1, r2, #0x1                @DLL off  
  404.     str r1, [r0, #DMC_PHYCONTROL0]  
  405. #endif  
  406.     ldr r1, =0x0fff1010             @auto refresh off  
  407.     str r1, [r0, #DMC_CONCONTROL]  
  408.   
  409.     ldr r1, =0x00212100  
  410.     str r1, [r0, #DMC_MEMCONTROL]  
  411.   
  412.     ldr r1, =DMC0_MEMCONFIG_0  
  413.     str r1, [r0, #DMC_MEMCONFIG0]  
  414.   
  415.     ldr r1, =DMC0_MEMCONFIG_1  
  416.     str r1, [r0, #DMC_MEMCONFIG1]  
  417.   
  418.     ldr r1, =0xff000000  
  419.     str r1, [r0, #DMC_PRECHCONFIG]  
  420.   
  421.     ldr r1, =DMC0_TIMINGA_REF  
  422.     str r1, [r0, #DMC_TIMINGAREF]  
  423.   
  424.     ldr r1, =DMC0_TIMING_ROW            @TimingRow  @133MHz  
  425.     str r1, [r0, #DMC_TIMINGROW]  
  426.   
  427.     ldr r1, =DMC0_TIMING_DATA  
  428.     str r1, [r0, #DMC_TIMINGDATA]  
  429.   
  430.     ldr r1, =DMC0_TIMING_PWR            @Timing Power  
  431.     str r1, [r0, #DMC_TIMINGPOWER]  
  432.   
  433.     ldr r1, =0x07000000             @chip0 Deselect  
  434.     str r1, [r0, #DMC_DIRECTCMD]  
  435.   
  436.     ldr r1, =0x01000000             @chip0 PALL  
  437.     str r1, [r0, #DMC_DIRECTCMD]  
  438.   
  439.     ldr r1, =0x05000000             @chip0 REFA  
  440.     str r1, [r0, #DMC_DIRECTCMD]  
  441.   
  442.     ldr r1, =0x05000000             @chip0 REFA  
  443.     str r1, [r0, #DMC_DIRECTCMD]  
  444.   
  445.     ldr r1, =0x00000032             @chip0 MRS  
  446.     str r1, [r0, #DMC_DIRECTCMD]  
  447.   
  448.     ldr r1, =0x07100000             @chip1 Deselect  
  449.     str r1, [r0, #DMC_DIRECTCMD]  
  450.   
  451.     ldr r1, =0x01100000             @chip1 PALL  
  452.     str r1, [r0, #DMC_DIRECTCMD]  
  453.   
  454.     ldr r1, =0x05100000             @chip1 REFA  
  455.     str r1, [r0, #DMC_DIRECTCMD]  
  456.   
  457.     ldr r1, =0x05100000             @chip1 REFA  
  458.     str r1, [r0, #DMC_DIRECTCMD]  
  459.   
  460.     ldr r1, =0x00100032             @chip1 MRS  
  461.     str r1, [r0, #DMC_DIRECTCMD]  
  462.   
  463.     ldr r1, =0x0FFF20B0         @ConControl auto refresh on  
  464.     str r1, [r0, #DMC_CONCONTROL]  
  465.   
  466.     ldr r1, =0xFFFF00FF             @PwrdnConfig  
  467.     str r1, [r0, #DMC_PWRDNCONFIG]  
  468.   
  469.     ldr r1, =0x00212113             @MemControl  
  470.     str r1, [r0, #DMC_MEMCONTROL]  
  471.   
  472. /* DMC1 initialization */  
  473.     ldr r0, =APB_DMC_1_BASE  
  474.   
  475.     ldr r1, =0x00101000             @Phycontrol0 DLL parameter setting  
  476.     str r1, [r0, #DMC_PHYCONTROL0]  
  477.   
  478.     ldr r1, =0x00000084             @Phycontrol1 DLL parameter setting  
  479.     str r1, [r0, #DMC_PHYCONTROL1]  
  480.   
  481.     ldr r1, =0x00101002             @Phycontrol2 DLL parameter setting  
  482.     str r1, [r0, #DMC_PHYCONTROL0]  
  483.   
  484.     ldr r1, =0x00101003             @Dll on  
  485.     str r1, [r0, #DMC_PHYCONTROL0]  
  486.   
  487. find_lock_val1:  
  488.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  489.     and     r2, r1, #0x7  
  490.     cmp r2, #0x7                @Loop until DLL is locked  
  491.     bne find_lock_val1  
  492.   
  493.     and r1, #0x3fc0  
  494.     mov r2, r1, LSL #18  
  495.     orr r2, r2, #0x100000  
  496.     orr r2, r2, #0x1000  
  497.   
  498.     orr r1, r2, #0x3                @Force Value locking  
  499.     str r1, [r0, #DMC_PHYCONTROL0]  
  500.   
  501. #if 1   /* Memory margin test 10.01.05 */  
  502.     orr r1, r2, #0x1                @DLL off  
  503.     str r1, [r0, #DMC_PHYCONTROL0]  
  504. #endif  
  505.     ldr r0, =APB_DMC_1_BASE  
  506.   
  507.     ldr r1, =0x0FFF1010             @auto refresh off  
  508.     str r1, [r0, #DMC_CONCONTROL]  
  509.   
  510.     ldr r1, =DMC1_MEMCONTROL  
  511.     str r1, [r0, #DMC_MEMCONTROL]  
  512.   
  513.     ldr r1, =DMC1_MEMCONFIG_0  
  514.     str r1, [r0, #DMC_MEMCONFIG0]  
  515.   
  516.     ldr r1, =DMC1_MEMCONFIG_1  
  517.     str r1, [r0, #DMC_MEMCONFIG1]  
  518.   
  519.     ldr r1, =0xff000000  
  520.     str r1, [r0, #DMC_PRECHCONFIG]  
  521.   
  522.     ldr r1, =DMC1_TIMINGA_REF  
  523.     str r1, [r0, #DMC_TIMINGAREF]  
  524.   
  525.     ldr r1, =DMC1_TIMING_ROW            @TimingRow  @133MHz  
  526.     str r1, [r0, #DMC_TIMINGROW]  
  527.   
  528.     ldr r1, =DMC1_TIMING_DATA  
  529.     str r1, [r0, #DMC_TIMINGDATA]  
  530.   
  531.     ldr r1, =DMC1_TIMING_PWR            @Timing Power  
  532.     str r1, [r0, #DMC_TIMINGPOWER]  
  533.   
  534.     ldr r1, =0x07000000             @chip0 Deselect  
  535.     str r1, [r0, #DMC_DIRECTCMD]  
  536.   
  537.     ldr r1, =0x01000000             @chip0 PALL  
  538.     str r1, [r0, #DMC_DIRECTCMD]  
  539.   
  540.     ldr r1, =0x05000000             @chip0 REFA  
  541.     str r1, [r0, #DMC_DIRECTCMD]  
  542.   
  543.     ldr r1, =0x05000000             @chip0 REFA  
  544.     str r1, [r0, #DMC_DIRECTCMD]  
  545.   
  546.     ldr r1, =0x00000032             @chip0 MRS  
  547.     str r1, [r0, #DMC_DIRECTCMD]  
  548.   
  549.     ldr r1, =0x00020020             @chip0 EMRS  
  550.     str r1, [r0, #DMC_DIRECTCMD]  
  551.   
  552.     ldr r1, =0x07100000             @chip1 Deselect  
  553.     str r1, [r0, #DMC_DIRECTCMD]  
  554.   
  555.     ldr r1, =0x01100000             @chip1 PALL  
  556.     str r1, [r0, #DMC_DIRECTCMD]  
  557.   
  558.     ldr r1, =0x05100000             @chip1 REFA  
  559.     str r1, [r0, #DMC_DIRECTCMD]  
  560.   
  561.     ldr r1, =0x05100000             @chip1 REFA  
  562.     str r1, [r0, #DMC_DIRECTCMD]  
  563.   
  564.     ldr r1, =0x00100032             @chip1 MRS  
  565.     str r1, [r0, #DMC_DIRECTCMD]  
  566.   
  567.     ldr r1, =0x00120020             @chip0 EMRS  
  568.     str r1, [r0, #DMC_DIRECTCMD]  
  569.   
  570.     ldr r1, =0x0FFF10B0             @ConControl auto refresh on  
  571.     str r1, [r0, #DMC_CONCONTROL]  
  572.   
  573.     ldr r1, =0xFFFF00FF             @PwrdnConfig  
  574.     str r1, [r0, #DMC_PWRDNCONFIG]  
  575.   
  576.     ldr r1, =0x00212113             @MemControl  
  577.     str r1, [r0, #DMC_MEMCONTROL]  
  578.   
  579. #endif  /* CONFIG_MCP_AC / CONFIG_MCP_H / CONFIG_MCP_B / CONFIG_MCP_D / CONFIG_MCP_N */  
  580.   
  581.     mov pc, lr  
  582.   
  583. /* 
  584.  *     v7_flush_dcache_all() 
  585.  * 
  586.  *     Flush the whole D-cache. 
  587.  * 
  588.  *     Corrupted registers: r0-r5, r7, r9-r11 
  589.  * 
  590.  *     - mm    - mm_struct describing address space 
  591.  */  
  592.        .align 5  
  593. .global v7_flush_dcache_all  
  594. v7_flush_dcache_all:  
  595.   
  596.     ldr r0, =0xffffffff  
  597.     mrc p15, 1, r0, c0, c0, 1       @ Read CLIDR  
  598.     ands    r3, r0, #0x7000000  
  599.     mov r3, r3, LSR #23             @ Cache level value (naturally aligned)  
  600.     beq     Finished  
  601.     mov r10, #0  
  602. Loop1:  
  603.     add r2, r10, r10, LSR #1        @ Work out 3xcachelevel  
  604.     mov r1, r0, LSR r2              @ bottom 3 bits are the Ctype for this level  
  605.     and r1, r1, #7                  @ get those 3 bits alone  
  606.     cmp r1, #2  
  607.     blt Skip                        @ no cache or only instruction cache at this level  
  608.     mcr p15, 2, r10, c0, c0, 0      @ write the Cache Size selection register  
  609.     mov r1, #0  
  610.     mcr p15, 0, r1, c7, c5, 4       @ PrefetchFlush to sync the change to the CacheSizeID reg  
  611.     mrc p15, 1, r1, c0, c0, 0       @ reads current Cache Size ID register  
  612.     and r2, r1, #0x7                @ extract the line length field  
  613.     add r2, r2, #4                  @ add 4 for the line length offset (log2 16 bytes)  
  614.     ldr r4, =0x3FF  
  615.     ands    r4, r4, r1, LSR #3          @ R4 is the max number on the way size (right aligned)  
  616.     clz r5, r4                      @ R5 is the bit position of the way size increment  
  617.     ldr r7, =0x00007FFF  
  618.     ands    r7, r7, r1, LSR #13         @ R7 is the max number of the index size (right aligned)  
  619. Loop2:  
  620.     mov r9, r4                          @ R9 working copy of the max way size (right aligned)  
  621. Loop3:  
  622.     orr r11, r10, r9, LSL r5            @ factor in the way number and cache number into R11  
  623.     orr r11, r11, r7, LSL r2            @ factor in the index number  
  624.     mcr p15, 0, r11, c7, c6, 2      @ invalidate by set/way  
  625.     subs    r9, r9, #1                  @ decrement the way number  
  626.     bge Loop3  
  627.     subs    r7, r7, #1                  @ decrement the index  
  628.     bge Loop2  
  629. Skip:  
  630.     add r10, r10, #2                    @ increment the cache number  
  631.     cmp r3, r10  
  632.     bgt Loop1  
  633. Finished:  
  634.     mov pc, lr  
  635.   
  636.        .align  5  
  637. .global disable_l2cache  
  638. disable_l2cache:  
  639.     mrc     p15, 0, r0, c1, c0, 1  
  640.     bic     r0, r0, #(1<<1)  
  641.     mcr     p15, 0, r0, c1, c0, 1  
  642.     mov pc, lr  
  643.   
  644.   
  645.        .align  5  
  646. .global enable_l2cache  
  647. enable_l2cache:  
  648.     mrc     p15, 0, r0, c1, c0, 1  
  649.     orr     r0, r0, #(1<<1)  
  650.     mcr     p15, 0, r0, c1, c0, 1  
  651.     mov     pc, lr  
  652.   
  653.        .align  5  
  654. .global set_l2cache_auxctrl  
  655. set_l2cache_auxctrl:  
  656.     mov r0, #0x0  
  657.     mcr     p15, 1, r0, c9, c0, 2  
  658.     mov     pc, lr  
  659.   
  660.        .align  5  
  661. .global set_l2cache_auxctrl_cycle  
  662. set_l2cache_auxctrl_cycle:  
  663.     mrc     p15, 1, r0, c9, c0, 2  
  664.     bic     r0, r0, #(0x1<<29)  
  665.     bic     r0, r0, #(0x1<<21)  
  666.     bic     r0, r0, #(0x7<<6)  
  667.     bic     r0, r0, #(0x7<<0)  
  668.     mcr     p15, 1, r0, c9, c0, 2  
  669.     mov     pc,lr  
  670.   
  671.     .align 5  
  672. CoInvalidateDCacheIndex:  
  673.     ;/* r0 = index */  
  674.     mcr     p15, 0, r0, c7, c6, 2  
  675.     mov     pc,lr  
  676.   
  677.   
  678. /* Below code is for ARM926EJS and ARM1026EJS */  
  679.     .globl cleanDCache  
  680. cleanDCache:  
  681.     mrc p15, 0, pc, c7, c10, 3  /* test/clean D-Cache */  
  682.     bne cleanDCache  
  683.     mov pc, lr  
  684.   
  685.     .globl cleanFlushDCache  
  686. cleanFlushDCache:  
  687.     mrc p15, 0, pc, c7, c14, 3  /* test/cleanflush D-Cache */  
  688.     bne cleanFlushDCache  
  689.     mov pc, lr  
  690.   
  691.     .globl cleanFlushCache  
  692. cleanFlushCache:  
  693.     mrc p15, 0, pc, c7, c14, 3  /* test/cleanflush D-Cache */  
  694.     bne cleanFlushCache  
  695.     mcr p15, 0, r0, c7, c5, 0   /* flush I-Cache */  
  696.     mov pc, lr  
  697.   
  698.     .ltorg  
  699.   
  700.   
  701.   
  702.     .globl ledon_1  
  703. ledon_1:  
  704.     /*打开led,0x00全灭,0x08为led3亮,0x10为led4亮,0x18为led3,4均亮*/  
  705.     ldr r0, =ELFIN_GPIO_BASE  
  706.     ldr r1, =0x11000  
  707.     str r1, [r0, #GPC0CON_OFFSET]  
  708.     ldr r2, [r0, #GPC0CON_OFFSET]  
  709.     orr r2, r2, #0x08  
  710.     str r2, [r0, #GPC0DAT_OFFSET]  
  711.     mov pc, lr  
  712.   
  713.     .globl ledon_2  
  714. ledon_2:  
  715.     /*打开led,0x00全灭,0x08为led3亮,0x10为led4亮,0x18为led3,4均亮*/  
  716.     ldr r0, =ELFIN_GPIO_BASE  
  717.     ldr r1, =0x11000  
  718.     str r1, [r0, #GPC0CON_OFFSET]  
  719.     ldr r2, [r0, #GPC0CON_OFFSET]  
  720.     orr r2, r2, #0x10  
  721.     str r2, [r0, #GPC0DAT_OFFSET]  
  722.     mov pc, lr  
  723.   
  724.     .globl ledon  
  725. ledon:  
  726.     /*打开led,0x00全灭,0x08为led3亮,0x10为led4亮,0x18为led3,4均亮*/  
  727.     ldr r0, =ELFIN_GPIO_BASE  
  728.     ldr r1, =0x11000  
  729.     str r1, [r0, #GPC0CON_OFFSET]  
  730.     ldr r2, =0x18  
  731.     str r2, [r0, #GPC0DAT_OFFSET]  
  732.     mov pc, lr  
  733.   
  734.     .globl ledoff  
  735. ledoff:  
  736.     /*打开led,0x00全灭,0x08为led3亮,0x10为led4亮,0x18为led3,4均亮*/  
  737.     ldr r0, =ELFIN_GPIO_BASE  
  738.     ldr r1, =0x11000  
  739.     str r1, [r0, #GPC0CON_OFFSET]  
  740.     ldr r2, =0x00  
  741.     str r2, [r0, #GPC0DAT_OFFSET]  
  742.     mov pc, lr  


 

 

 

 

 

crt0.S的完整代码(这个代码u-boot本身就有,并且不需要改动,但这里也贴出来):

 

[cpp] view plaincopy

  1. /* 
  2.  *  crt0 - C-runtime startup Code for ARM U-Boot 
  3.  * 
  4.  *  Copyright (c) 2012  Albert ARIBAUD <albert.u.boot@aribaud.net> 
  5.  * 
  6.  * See file CREDITS for list of people who contributed to this 
  7.  * project. 
  8.  * 
  9.  * This program is free software; you can redistribute it and/or 
  10.  * modify it under the terms of the GNU General Public License as 
  11.  * published by the Free Software Foundation; either version 2 of 
  12.  * the License, or (at your option) any later version. 
  13.  * 
  14.  * This program is distributed in the hope that it will be useful, 
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  17.  * GNU General Public License for more details. 
  18.  * 
  19.  * You should have received a copy of the GNU General Public License 
  20.  * along with this program; if not, write to the Free Software 
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  22.  * MA 02111-1307 USA 
  23.  */  
  24.   
  25. #include <config.h>  
  26. #include <asm-offsets.h>  
  27.   
  28. /* 
  29.  * This file handles the target-independent stages of the U-Boot 
  30.  * start-up where a C runtime environment is needed. Its entry point 
  31.  * is _main and is branched into from the target’s start.S file. 
  32.  * 
  33.  * _main execution sequence is: 
  34.  * 
  35.  * 1. Set up initial environment for calling board_init_f(). 
  36.  *    This environment only provides a stack and a place to store 
  37.  *    the GD (‘global data’) structure, both located in some readily 
  38.  *    available RAM (SRAM, locked cache…). In this context, VARIABLE 
  39.  *    global data, initialized or not (BSS), are UNAVAILABLE; only 
  40.  *    CONSTANT initialized data are available. 
  41.  * 
  42.  * 2. Call board_init_f(). This function prepares the hardware for 
  43.  *    execution from system RAM (DRAM, DDR…) As system RAM may not 
  44.  *    be available yet, , board_init_f() must use the current GD to 
  45.  *    store any data which must be passed on to later stages. These 
  46.  *    data include the relocation destination, the future stack, and 
  47.  *    the future GD location. 
  48.  * 
  49.  * (the following applies only to non-SPL builds) 
  50.  * 
  51.  * 3. Set up intermediate environment where the stack and GD are the 
  52.  *    ones allocated by board_init_f() in system RAM, but BSS and 
  53.  *    initialized non-const data are still not available. 
  54.  * 
  55.  * 4. Call relocate_code(). This function relocates U-Boot from its 
  56.  *    current location into the relocation destination computed by 
  57.  *    board_init_f(). 
  58.  * 
  59.  * 5. Set up final environment for calling board_init_r(). This 
  60.  *    environment has BSS (initialized to 0), initialized non-const 
  61.  *    data (initialized to their intended value), and stack in system 
  62.  *    RAM. GD has retained values set by board_init_f(). Some CPUs 
  63.  *    have some work left to do at this point regarding memory, so 
  64.  *    call c_runtime_cpu_setup. 
  65.  * 
  66.  * 6. Branch to either nand_boot() or board_init_r(). 
  67.  */  
  68.   
  69. /* 
  70.  * declare nand_boot() or board_init_r() to jump to at end of crt0 
  71.  */  
  72.   
  73. #if defined(CONFIG_NAND_SPL)  
  74.   
  75. .globl nand_boot  
  76.   
  77.   
  78. #elif !defined(CONFIG_SPL_BUILD)  
  79.   
  80. .globl board_init_r  
  81.   
  82. #endif  
  83.   
  84. /* 
  85.  * start and end of BSS 
  86.  */  
  87.   
  88. .globl __bss_start  
  89. .globl __bss_end__  
  90.   
  91. /* 
  92.  * entry point of crt0 sequence 
  93.  */  
  94.   
  95. .global _main  
  96.   
  97. _main:  
  98.   
  99. /* 
  100.  * Set up initial C runtime environment and call board_init_f(0). 
  101.  */  
  102.   
  103. #if defined(CONFIG_NAND_SPL)  
  104.     /* deprecated, use instead CONFIG_SPL_BUILD */  
  105.     ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)  
  106. #elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)  
  107.     ldr sp, =(CONFIG_SPL_STACK)  
  108. #else  
  109.     ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)  
  110. #endif  
  111.     bic sp, sp, #7  /* 8-byte alignment for ABI compliance */  
  112.     sub sp, #GD_SIZE    /* allocate one GD above SP */  
  113.     bic sp, sp, #7  /* 8-byte alignment for ABI compliance */  
  114.     mov r8, sp      /* GD is above SP */  
  115.     mov r0, #0  
  116.     bl  board_init_f  
  117.   
  118. #if ! defined(CONFIG_SPL_BUILD)  
  119.   
  120. /* 
  121.  * Set up intermediate environment (new sp and gd) and call 
  122.  * relocate_code(addr_sp, gd, addr_moni). Trick here is that 
  123.  * we’ll return ‘here’ but relocated. 
  124.  */  
  125.   
  126.     ldr sp, [r8, #GD_START_ADDR_SP] /* r8 = gd->start_addr_sp */  
  127.     bic sp, sp, #7  /* 8-byte alignment for ABI compliance */  
  128.     ldr r8, [r8, #GD_BD]        /* r8 = gd->bd */  
  129.     sub r8, r8, #GD_SIZE        /* new GD is below bd */  
  130.   
  131.     adr lr, here  
  132.     ldr r0, [r8, #GD_RELOC_OFF]     /* lr = gd->start_addr_sp */  
  133.     add lr, lr, r0  
  134.     ldr r0, [r8, #GD_START_ADDR_SP] /* r0 = gd->start_addr_sp */  
  135.     mov r1, r8              /* r1 = gd */  
  136.     ldr r2, [r8, #GD_RELOCADDR]     /* r2 = gd->relocaddr */  
  137.     b   relocate_code  
  138. here:  
  139.   
  140. /* Set up final (full) environment */  
  141.   
  142.     bl  c_runtime_cpu_setup /* we still call old routine here */  
  143.   
  144.     ldr r0, =__bss_start    /* this is auto-relocated! */  
  145.     ldr r1, =__bss_end__    /* this is auto-relocated! */  
  146.   
  147.     mov r2, #0x00000000     /* prepare zero to clear BSS */  
  148.   
  149. clbss_l:cmp r0, r1          /* while not at end of BSS */  
  150.     strlo   r2, [r0]        /* clear 32-bit BSS word */  
  151.     addlo   r0, r0, #4      /* move to next */  
  152.     blo clbss_l  
  153.   
  154.     bl coloured_LED_init  
  155.     bl red_led_on  
  156.   
  157. #if defined(CONFIG_NAND_SPL)  
  158.   
  159.     /* call _nand_boot() */  
  160.     ldr     pc, =nand_boot  
  161.   
  162. #else  
  163.     /* call board_init_r(gd_t *id, ulong dest_addr) */  
  164.     mov r0, r8          /* gd_t */  
  165.     ldr r1, [r8, #GD_RELOCADDR] /* dest_addr */  
  166.     /* call board_init_r */  
  167.     ldr pc, =board_init_r   /* this is auto-relocated! */  
  168.   
  169. #endif  
  170.   
  171.     /* we should not return here. */  
  172.   
  173. #endif  
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 使用spark生成测试大数据

    一、大数据场景下一份测试数据可能要几十G、几百G,用单机生成即浪费空间时间还长。可以用mapreduce或者spark来并行生成。 需求:使用spark生成1份几百G的测试数据,根据一年12个月均匀分布。一开始没拐过弯来的是:spark要先有rdd,这个rdd怎么建,建个hdfs上空目录的rdd?此…...

    2024/5/6 4:07:04
  2. CDH-中级操作

    集群中添加节点 hdfs中添加DN 需求:节点已经添加到CDH中,但这些节点没有添加dn和nm服务。 process 主页状态服务列表-hdfs下拉框-添加角色实例这里配的是dn的目录如果只增加dn,点重新部署,如果nm也增加了,直接重启即可。重新平衡:很费时间,2T跑了3小时,用的默认命令,这…...

    2024/4/20 13:36:30
  3. Android Studio下载Gradle一直失败,使用正确的下载地址

    检查gradle-wrapper.properties:错误:https\://services.gradle.org/distributions/gradle-5.6.4-all.zip正确:https\://downloads.gradle-dn.com/distributions/gradle-5.6.4-all.zip...

    2024/5/6 8:05:48
  4. JAVA new URL引起死机一例

    这个问题一直存在,出错位置附属进程(?)的EditorPane.setPage()。吾还纳闷。后来专门跟踪了一下,死机竟然是new URL()。原因是这个URL指向的文件不存在。加了个判断,之后问题消失。...

    2024/5/6 7:06:04
  5. shell脚本天天练-检测磁盘使用率

    [root@ecs-c13b ~]# cat fdisk.sh #!/bin/bash # 截取IP IP=`ifconfig eth0 |awk -F " " NR==2{print $2}` # 定义使用率,并转换为数字 SPACE=`df -Ph |awk {print int($5)}` for i in $SPACE do if [ $i -ge 90 ] thenecho "$IP的磁盘使用率已经超过了90%,请…...

    2024/4/22 1:07:40
  6. tableau必知必会之用 Fixed 函数实现客户回购分析

    有客户的购买数据,我想按季度统计客户的重复购买情况。想看客户回购的周期(通常多久会进行回购),应该怎么做呢?补充一点:按季度统计,如果第一季度买过,第一季度再次购买也得算重复购买哦~最近,一位 Tableau 用户提出如上的分析需求,其实这样的应用场景是很普遍的。市…...

    2024/4/11 20:14:48
  7. 技术图文:Matlab VS. Numpy 常见矩阵

    背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。 这是第 4 篇,对比 Matlab 与 Numpy 中经常用到的各种矩阵,比如零矩阵、单位矩阵、全1矩阵、对角矩阵、均匀分布的随机矩阵、标准正态分布的随机矩阵等。虽然 Numpy 定义了 matrix …...

    2024/5/1 14:10:25
  8. MyCat + MySQL 主从部署问题汇总

    背景 本周研究了一下数据库中间件 MyCat ,并验证了 MyCat 单机+MySQL 主从复制 的部署方案,本文来记录一下部署过程中遇到的问题。 什么是 MyCat一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库; 一个可以视为MySQL集群的企业…...

    2024/4/9 15:56:46
  9. Markdown 调整图片位置与大小

    使用 Markdown 编写文档或博客时,经常需要对图片的位置与尺寸进行调整。 插入图片后,Markdown 表示图片的语法格式如下: ![图片描述](图片URL地址)调整图片位置 居左 (1)方法一:添加位置标识。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200822014538211.png…...

    2024/5/2 23:20:44
  10. 计算机组成原理--数制与编码(校验码,CRC,汉明码详解)

    文章目录一、考纲1. 数制与编码2.定点数的表示和运算3.浮点数的表示和运算4.算术逻辑单元(ALU)二、数制与编码1.进制及其转换:1.非十进制数转换成十进制数2.十进制数转换成非十进制数3.  八进制数、二进制数互转3.  十六进制数、二进制数互转2.真值和机器数的互换原码,补码…...

    2024/4/28 14:18:29
  11. Linux基础:如何理解id -Z的返回信息

    这篇文章介绍一下CentOS下的SELINUX的一些非常基础的知识。 环境说明 [root@liumiaocn ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@liumiaocn ~]# 现象 当我们执行id命令的时候,可能会出现如下内容, [root@liumiaocn ~]# id uid=0(root) gid…...

    2024/4/24 3:11:45
  12. 听说你还不会Spring 5.2.x 源码本地环境搭建?

    1 克隆Spring源码 github 下载可能较慢,可以先 fork 官方仓库到自己的账户下,再从 gitee 导入。 使用 sourceTree 拉取代码到本地。切换到5.2.x版本 git checkout origin/5.2.x添加阿里云镜像 将下面这行代码粘贴到build.gradle文件中的repositories节点下即可 , maven { ur…...

    2024/4/24 17:51:13
  13. Linux基础:通过setools-console查看SELinux信息

    这篇文章介绍一下setools-console中包含的常用命令seinfo和sesearch,用于查看SELinux的角色用户类型等信息。 安装 CentOS下,setools-console缺省未安装,需要自行安装。安装命令:yum install setools-console -y[root@liumiaocn ~]# yum install setools-console -y Loaded…...

    2024/5/4 11:07:33
  14. Linux基础:通过semanage管理SELinux

    semanage诚如其名,对SELinux中的安全上下文能够起到操作的作用。使用非常广泛,比如Rancher的轻量级的Kubernetes:K3S对于在SELinux下设定支持就是使用的semanage,所以安装时需要首先安装semanage所用到的包。这篇文章介绍一下使用semanage查看SELinux的方法。 安装 缺省方式…...

    2024/4/22 0:15:19
  15. 分析java进程假死

    一.引言 1.编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照。 2.编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况。经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况。简单描述下该台tomcat当时具体的表现:…...

    2024/4/25 11:04:26
  16. SQL 语法整理

    近期工作中多少会涉及到SQL 相关的内容,尤其是leader在做分布式存储引擎底座的设计过程中提到:各种分布式事务,二级索引,还有剖析B+树的实现 ,并和我们rocksdb 的LSM实现差异等等,真的是让之前对分布式存储领域涉事不深的我云里雾里。 特此将SQL相关的知识也做一个总结,…...

    2024/4/22 18:26:29
  17. 美团二季度营收247亿元,到店、酒店等业务下滑13.4%,将继续受疫情严重影响

    美团(3690.HK)8月21日发布2020年二季度财报。财报显示,美团二季度到店、酒店及旅游业务收入45.4亿元,同比下降13.4%,占占总收入18.4%。美团称,由于消费者需要更多时间才能恢复选择到店消费的信心,因此到店分部复苏速度仍然低于餐饮外卖业务的复苏速度。酒店业务继续受到疫…...

    2024/4/22 6:53:16
  18. 2020制冷与空调设备运行操作考试题及制冷与空调设备运行操作实操考试视频

    题库来源:安全生产模拟考试一点通公众号小程序2020制冷与空调设备运行操作考试题及制冷与空调设备运行操作实操考试视频,包含制冷与空调设备运行操作考试题答案解析及制冷与空调设备运行操作实操考试视频练习。由安全生产模拟考试一点通公众号结合国家制冷与空调设备运行操作…...

    2024/5/5 15:25:09
  19. SDC Ptotocol | SDCP | DeFi 2.0产品

    本文来自 ConsenSys,其在 The Block,DeFi Pulse,Delphi Digital 等关于 DeFi 报告的基础上成文。ConsenSys 由以太坊联合创始人 Joseph Lubin 创立,是业界知名的区块链技术公司,致力于构建去中心世界的基础设施、应用和落地,尤其是以太坊生态系统。以下为正文。 去中心化…...

    2024/4/28 15:13:14
  20. 学习笔记(4):零基础掌握 Python 入门到实战-列表与元祖到底该用哪个?(二)

    立即学习:https://edu.csdn.net/course/play/26676/338778?utm_source=blogtoedu列表的方法append 追加一个对象,加在末尾的执行append的方法 无返回值r = lst.append("laoqi") 无返回值 r是None可迭代对象的元素扩展这个列表...

    2024/4/29 10:54:06

最新文章

  1. 知识图谱和大语言模型的共存之道

    导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织新KG视点系列文章—…...

    2024/5/6 8:48:16
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Chrome 浏览器无法保存或自动填充密码

    Chrome 浏览器无法保存或自动填充密码 分类 平时使用 Chrome 浏览器都会对网站的用户名密码自动填充&#xff0c;今天发现突然不行了&#xff0c;找到一个解决办法&#xff1a; 1、退出 Chrome 浏览器。2、打开 Chrome 安装目录下的的 Profile 目录&#xff0c;删除 Login Da…...

    2024/5/5 11:47:02
  4. 比nestjs更优雅的ts控制反转策略-依赖查找

    一、Cabloy5.0内测预告 Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构&#xff0c;并且提供了更加优雅的ts控制反转策略&#xff0c;让我们的业务开发更加快捷顺畅 1. 新旧技术栈对比&#xff1a; 后端前端旧版js、egg2.0、mysqljs、vue2、framework7新版ts、egg3…...

    2024/5/6 2:59:50
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/5 18:19:03
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/5 12:22:20
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/5 19:59:54
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/6 7:24:07
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/5 15:25:47
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/6 6:01:13
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/6 7:24:06
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/6 1:08:53
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/5 18:50:00
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/6 0:27:44
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/6 7:24:04
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/6 7:24:04
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/5 13:14:22
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/6 7:24:03
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/5 17:03:52
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/5 21:10:50
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/6 7:24:02
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/6 7:24:01
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/5 17:03:21
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/5 15:25:31
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57