¿Puede el uboot oficial de Lingfei ok6410 arrancar otras versiones del kernel?
La grabación con un clic consiste esencialmente en iniciar uboot en la tarjeta SD, leer los archivos de la tarjeta SD en SRAM a través de Uboot y, finalmente, realizar la grabación con un clic mediante el comando nand. Para este bloque, consulte la línea 529 de smdk6410.h en el código fuente de uboot proporcionado por Lingfei. El código es el siguiente:
Código 1:
#elif está definido (FORLINX_BOOT_SD)
#define FORLINX_DEBUG
#define CONFIG_MMC 1
p>#definir configuración_LCD
#definir configuración para empezar a mover
#definir CFG_ENV_IS_IN_MOVINAND
# define CONFIG _ comando de arranque " NAND led-start; nand erase; fat load MMC 0:1 0x 50008000 u-boot . bin; NAND write . uboot 0x 50008000 0 0x 200000; fat load MMC 0:1 0x 50008000 imagen zi ; NAND escribe. nand extremo del LED "
Como se puede ver en este código, en uboot, a través de la definición de macro, cuando se define como tipo FORLINX_BOOT_sd, las operaciones específicas se completan configurando las variables de entorno correspondientes. Después de definir CONFIG_BOOTCOMMAND, nand se puede investigar automáticamente y uboot se carga desde la tarjeta SD. , etc. . El contenido de este código se analizará más adelante.
Primero, hablemos de un resumen del conocimiento relacionado con tftp y direcciones.
Tftp se refiere a la transferencia de archivos en la red a través del protocolo tftp. Cabe señalar que el uboot de fábrica de ok6410 no es compatible con la red, lo que significa que el sistema de archivos raíz nfs y la descarga del kernel a través de tftp no funcionan. De hecho, es muy sencillo solucionar este problema. Simplemente reemplace los archivos relacionados con la tarjeta de red. El cambio no es grande. Se puede encontrar mucha información sobre esto, por lo que no entraré en detalles aquí. Sin embargo, Lingfei se actualizó en el CD de actualización de septiembre de 2012 y uboot ya admite operaciones de red. Verifique el código fuente, es decir, cambie esos archivos, y luego podrá descargar y grabar la última versión de uboot.
En el funcionamiento de tftp, puede resultar fácil confundirse al principio, pero también es un poco confuso al principio. Por ejemplo, el blog de alguien es tftp c0008000 zImage, la dirección es c0008000 y el video tutorial incrustado en China es c0800000. Son diferentes y no puedo ver la descripción específica, pero la dirección de transmisión USB es 50008000. Con respecto a la asignación del espacio de direcciones, primero debe leer el manual del chip. La disposición del espacio de direcciones en el manual del chip se muestra en la figura.
Cabe señalar que el espacio de direcciones en la imagen es para dispositivos que se ejecutan a través del bus de direcciones y el bus de datos. La dirección correspondiente está determinada por diferentes señales de selección de chip, por lo que el espacio de direcciones de la RAM de 256 M. ok6410 Se puede determinar verificando la imagen, así que descárguela a 0x50008000-0x5ffffff256m a través de tftp, que se carga en la RAM (. Echemos un vistazo preliminar al origen de la dirección 0x50008000.
Echemos un vistazo Mire la dirección 0xc0008000 mencionada en muchos materiales.
Esta parte de la configuración se puede encontrar en la línea 501 del archivo smdk6410.h:
Código 2
//Ubut-2M, Zimag-5M, FS-200M, usuario - Otro
# define CFG_NAND_ERASE_lxc f 00000//200 MB
#Si está definido (FORLINX_BOOT_NAND)
#define CONFIG_BOOT_NAND p>
#define CFG_ENV_IS_IN_NAND
//#define CFG_NAND_LARGEPAGE_SAVEENV
//#define CFG_NAND_FLASH_BBT
# define CONFIG _ comando de arranque " NAND lectura 0xc 0008000 0x 200000 0x 500000; bootm 0xc0008000 "
Esta parte define la división del espacio de direcciones y la dirección de inicio de nand flash: bootm 0xc0008000, lo que significa que el kernel comienza desde esta dirección en la memoria, pero el problema está por encima del máximo. La dirección en la división de direcciones es solo 0x6fffff, 0xc0008000. ¿Dónde está esta dirección? ¡Empieza con el código fuente y sigue buscando!
Esta parte de la configuración también se puede encontrar en la línea 452 del archivo smdk6410.h
Código 3
/* La dirección base de uboot*/
#ifdef configurar habilitar MMU
#definir CFG_UBOOT_BASE TEXT_BASE
#Definir CFG_PHY_UBOOT_BASE(MEMORIA_BASE_DIRECCIÓN+(TEXTO_BASE- 0xc 0000000))
#De lo contrario
#define CFG_UBOOT_BASE TEXT_BASE
#Define CFG_PHY_UBOOT_BASE TEXT_BASE
#endif
Después de leer este fragmento de código, comprenderá que después de habilitar MMU, este código equivale a reasignar la dirección. Después del cálculo mediante (MEMORY_BASE_ADDRESS+(text_BASE-0xc00000000)), dado que MEMORY_BASE_ADDRESS es 0x5000c000 (la definición se puede encontrar al principio del archivo), después del cálculo, es 0xc 0000. 0xc0008000 es la dirección virtual inicial del arranque del kernel, por lo que dicha asignación es necesaria para corresponder al kernel.
Muchas personas aquí pueden tener las mismas dudas que yo, es decir, si tftp quema el sistema de archivos, ¿qué dirección se debe quemar? Volviendo a la tabla de direcciones anterior, dije al principio que esta tabla es para dispositivos que operan usando un bus de direcciones y un bus de datos, por lo que pueden ser direccionados y leídos directamente desde NOR flash, SRAM, DRAM, etc. Para Nand Flash, puede consultar el diagrama del circuito, utilizando 8 operaciones IO, y el controlador Nand a la derecha desvía las operaciones relacionadas, por lo que no hay una dirección absoluta. Observe el cuadro amarillo en el gráfico. One Nand no es un Nand Flash ordinario. La diferencia es que esta Nand, al igual que NOR y SRAM, pasa por el bus de direcciones y el bus de datos, por lo que tiene una dirección. Para el Nand Flash utilizado en la placa, solo hay una dirección de desplazamiento y no una dirección absoluta.
En este punto, las operaciones relacionadas con la descarga tftp del kernel y el sistema de archivos deben estar claras. La dirección específica se puede ver en el código fuente de uboot.
Puede consultar esta parte del código 1:
# define CONFIG _ boot command "NAND led-start; nand erase; fat load MMC 0:1 0x 50008000 u-boot . bin; NAND write . uboot 0x 50008000 0 0x 200000; fat load MMC 0:1 0x 50008000 zi image; NAND write 50008000 0x 00700000 $ nand beep; La operación de selección manual al iniciar la tarjeta SD, debería quedar impresionado. Puede optar por grabar archivos individualmente, por ejemplo, sistemas de archivos individualmente.
La operación es como se muestra en la siguiente figura:
Luego también puede encontrar el código fuente del comando correspondiente, ubicado en la línea common/mian.c 343:
void arm_USBfuse(void)
{
Selección de caracteres sin firmar;
while(1)
{
printf(" \ n # # # # # #Seleccionar función# # # # \ n ");
printf("[1]Flash u-boot \ n ");
printf("[ 2] Kernel Flash\ n ");
printf("[3]Sistema Flash\ n ");
printf("[4]Salir \ n "); p>
printf("Ingrese su selección:");
select = getc();
printf("%c\n ", select>=""& & amp select<= 127? select: "");
void arm_sdfuse(void)
{
Selección de carácter sin firmar;
while(1)
{
printf(" \ n # # # # # flashear desde la tarjeta SD # # # # # \ n ");
printf(" \ n # # # # # #Seleccionar función # # # # \ n ");
printf("[1]Actualizar toda la imagen \ n ");
printf("[2]Flash u-boot \ n ");
printf("[3] Flash core\ n ");
printf("[4] Sistema Flash \ n ");
printf("[5]Salir \ n ");
printf("Ingrese su selección:");
select = getc();
printf("%c\n ", select>=""&&select<= 127? select: "");
Cambiar (seleccionar)
{
Caso "1":
ejecutar cmd(" borrado NAND ");
ejecutar cmd(" carga pesada MMC 0:1 50008000 u-boot . bin ");
ejecutar cmd(" NAND write . uboot 50008000 0 200000 ");
ejecutar cmd( " fat load MMC 0:1 50008000 imagen zi ");
ejecutar cmd(" NAND write . e 50008000 200000 500000 ");
ejecutar cmd(" fat load MMC 0: 1 50008000 rootfs . yaffs 2 ");
ejecutar cmd(" Escritura NAND . yaffs 2 50008000 700000 $ tamaño de archivo ");
Break
Caso" 2":
ejecutar cmd(" NAND erase 0 200000 ");
ejecutar cmd(" fat load MMC 0:1 50008000 u-boot . bin ");
md(" Escritura NAND. uboot 50008000 0 200000 ");
Pausa
Caso "3":
ejecutar cmd(" Borrado NAND 200000 500000 " );
ejecutar cmd(" carga pesada MMC 0:1 50008000 imagen zi ");
ejecutar cmd(" escritura NAND . e 50008000 200000 500000 ");
Pausa;
Caso "4":
ejecutar cmd(" NAND borrar 700000 ");
ejecutar cmd(" carga pesada MMC 0: 1 50008000 rootfs . yaffs 2 ");
ejecutar cmd(" escritura NAND . yaffs 2 50008000 700000 $ tamaño de archivo ");
romper;
caso" 5":
Retorno;
Valor predeterminado:
Interrupción;
}
}
}
Al escribir solo en el kernel o sistema de archivos a través de tftp, solo necesita consultar el comando de escritura con un clic y escribir en la dirección de desplazamiento nand correspondiente.
Fuente: blogs.com/.