Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Dónde se graba uboot en la SD?

¿Dónde se graba uboot en la SD?

En pocas palabras, comience a grabar UBOOT con la tarjeta SD, inicie UBOOT desde 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

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