¿Dónde se graba uboot en la SD?
De s5pv210_irom_applicationnote_preliminary_20091126.pdf, sé que el inicio de s5pv210 se divide en fases BL0, BL1 y BL2. BL0 es el código solidificado de la IROM interna de s5pv210. Este código selecciona desde qué dispositivo de almacenamiento externo cargar el código del segmento BL1 de acuerdo con el estado de configuración del pin OM (de hecho, el código del segmento BL1 es el primer código de 8K escrito por. nuestro UBOOT. Este código contiene una copia completa de la segunda mitad del código UBOOT y borra las funciones de la parte bss. Por supuesto, queremos iniciar desde la tarjeta SD grabada arriba) (Por supuesto, si queremos iniciar UBOOT desde la SD. tarjeta, el pin OM debe configurarse para arrancar desde la tarjeta SD).
Figura 1
Como se puede ver en la figura anterior, al arrancar desde la tarjeta SD, el código cargado por BL0 comienza a cargar el código desde el byte 512. ¿Por qué se hace esto? ? Debido a la necesidad de una expansión futura, el ingeniero de software de Samsung escribió el código BL0 solidificado en la IROM en el byte 512 del BL1 cargado desde la tarjeta SD y colocamos el UBOOT en la tarjeta SD en la posición que debería. se moverá hacia atrás 512 bytes. Aquí hay una descripción de cómo escribir uboot en la tarjeta SD en la ubicación de comando especificada.
Y asegúrese de prestar atención a los siguientes puntos:
Figura 2
Hay 16 bytes de información de encabezado antes de BL1. En otras palabras, se deben agregar 16 bytes de información de encabezado antes de la primera instrucción del UBOOT real, por lo que hay una parte de definición de macro en el código de uboot y podemos ver el siguiente contenido:
[ cpp ] ver copia simple
#if definido (CONFIG_EVT1) amp; definir(CONFIG_FUSED)
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif
.globl _start
_start.b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
donde
.word 0x2000 representa el tamaño BL1 (8K de longitud), .word 0x0 es un byte reservado, .word 0x0 es una suma de comprobación (más adelante mkbl1 La herramienta se utilizará para calcular la suma de verificación de BL1 y completar esta posición), la última palabra 0x0 también es un byte reservado.
Mire la parte de uboot a continuación. Si bl0 lee bl1 normalmente, el código ingresará a la siguiente sección:
[cpp] ver copia simple
/* Leer. información de arranque */
ldr r0, =PRO_ID_BASE <
ldr r1, [r0, #OMR_OFFSET] // Leer el estado de configuración del pin OM
bic r2 , r1,
#ifdef CONFIG_VOGUES
/* PS_HOLD(GPH0_0) está configurado para generar un nivel alto*/
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x00000001
str r1, [r0, #GPH0CON_OFFSET]
ldr r1, =0x5500
str r1, [r0, # GPH0PUD_OFFSET]
str r1, [r0, #GPH0CON_OFFSET GPH0PUD_OFFSET]
ldr r1, =0x01
str r1, [r0, #GPH0DAT_OFFSET]
#endif
/* NAND BOOT */
cmp r2, #0x0 @ 512B 4 ciclos
moveq r3, #BOOT_NAND //según El estado de configuración del pin OM asigna un valor de configuración al registro R3, que representa dónde comienza el sistema.
cmp r2, #0x2 @ 2KB 5 ciclos
moveq r3, #BOOT_NAND
cmp r2, #0x4 @ 4KB 5 ciclos 8 bits ECC p >
moveq r3, #BOOT_NAND
cmp r2, #0x6 @ 4KB ECC de 5 ciclos y 8 bits
moveq r3, #BOOT_NAND
cmp r2, # 0x6 @ 4KB ECC de 5 ciclos y 16 bits
moveq r3, #BOOT_NAND
cmp r2, #0x8 @ OneNAND Mux
moveq r3 , #BOOT_ONENAND
p>/* SD/MMC BOOT */
cmp r2, #0xc
ldr sp, _TEXT_PHY_BASE /* Establecer puntero de pila temporal*/
sub sp, sp, #12
mov fp, #0 /* No hay un fotograma anterior, por lo que fp=0 */
/* No Necesitamos esto cuando ya estemos ejecutando en ram Relocate U-Boot.
* De hecho, el controlador de memoria debe configurarse antes del U-Boot.
*/
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 lt - la dirección base del código actual */
ldr r2 , _TEXT_BASE /* r1 lt; - dirección base original en ram */ //carga la dirección compilada donde se ejecutará el programa, compárala con la dirección donde se ejecuta el programa ahora
bic r2, r2, r0 /* r0 lt - la dirección base del código actual */
bic r2, r2, r0 /* r0 lt. - la dirección base del código actual Dirección base */
cmp r1, r2 /* compare r0, r1 */
beq after_copy /* r0 == r1 y luego omita la copia flash */ // si dos Si las direcciones son iguales, significa que el programa de código ya se está ejecutando en la DRAM y no es necesario copiarlo nuevamente. Si las direcciones no son iguales, significa que el programa no se ejecuta en la. dirección compilada, y el código debe copiarse a la dirección compilada para ejecutar el programa. Copie el código a la dirección de compilación y finalmente salte a la dirección de compilación correspondiente para ejecutar el código.
ldr r0, =INF_REG_BASE
ldr r1, [r0, #INF_REG3_OFFSET]
cmp r1, #BOOT_NAND /* 0x0 =gt; nand */
beq nand_boot
cmp r1, #BOOT_ONENAND /* 0x1 =gt; el dispositivo de arranque es onenand */
beq onenand_boot
cmp r1, #BOOT_MMCSD
beq mmcsd_boot
arranque desde tarjeta sd
~~~~~ Omitir algún código~~~~~~~~ < / p>
mmcsd_boot:
#if DELETE
ldr sp, _TEXT_PHY_BASE
sub sp, sp, #12
movimiento fp, #0