[COMO] Actualizacion software para la ampliacion de memoria.

Hola a todos. Desde hace tiempo llevo con ganas de realizar una ampliación de memoria en mi Slug. Finalmente, me he buscado la vida para meter un par de chips 16Mx16 (marca Micron, son relativamente fáciles de encontrar.). Una vez se ha hecho la ampliación y crees que ya está, lo normal es darse cuenta de que aun queda trabajo por delante ;) Lo que pretendo en este documento es explicar los pasos que he dado para actualizar el cargador de arranque de primer nivel y también el de segundo nivel (introducido en la RC1 de Debian Etch). Para hacer esto necesitarás: - NSLU2 con la memoria ampliada. - Una plaquita con un MAX3232, ICL3232 o similar para sacar el puerto serie. - El código fuente de Apex. - Un interfaz JTAG, te puedes hacer uno casero tipo Wiggler (Opcional pero muy recomendado por si algo va mal). - Un toolchain para armv5b (arm big-endian) y otro para arm (arm little-endian). Para arm BE puedes usar el toolchain que se genera con el MasterMakefile de openslug y para arm LE el que proporciona emdebian. Empecemos suponiendo que tienes todo lo anterior, el puerto serie funciona y tienes el fuente de Apex preparado. El primer paso es sustituir el Redboot por Apex para habilitar toda la memoria. Después, en el caso de que se use Debian, es necesario sustituir el cargador de segundo nivel por otro que sea capaz de pasar la linea de comando correcta al kernel. ¡Manos a la obra! 1 PASO: SUSTITUIR REDBOOT POR APEX Copia la configuración de Apex para openslug y entra en el menú de configuracion. cd /usr/src/apex cp src/mach-ixp42x/openslug_config .config make menuconfig Entra en General Setup, vete a la opción Cross compiler prefix y mete el prefijo del compilador armv5b, en mi caso: /opt/armv5b-softfloat-linux/gcc-3.3.5-glibc-2.2.5/bin/armv5b-softfloat-linux- Ahora vete a Platform Setup para configurar el cargador según tu actualización de memoria. Si tienes 2 chips selecciona Enable SDRAM bank 0 y deja sin seleccionar Enable SDRAM bank 1. Si tienes 4 chips entonces selecciona los dos. En Size, in bytes, of each SDRAM bank introduce el tamaño hexadecimal en bytes de cada pareja de chips. En mi caso tengo 64MB en un solo banco (dos chips) asi que selecciono solo el banco 0 y pongo 0x04000000 de tamaño. Ya que estamos liados tambien conviene dejarlo todo para que si usamos openslug se pueda utilizar toda la memoria. Asi que vete a Environment, selecciona Default kernel command line y añade al final mem=64M@0x0. Sal del programa de configuración, guardalo todo y compílalo. make Con esto ya tienes el binario del primer bootloader ("apex.bin"), pero antes de grabarlo conviene probarlo para asegurarnos de que funciona. Si no funciona y lo grabas solo podrás restaurar el Slug usando JTAG ¡Así que ojito! Pon el circuito para el puerto serie y arranca el minicom (o cualquier derivado, pero debes asegurarte que tiene soporte para xmodem). Cuando enciendas el slug te aparecerá un "+". Pulsa Ctrl+C en este punto, espera unos segundos y aparecera la linea de comandos de Redboot. Ahora vamos a copiar el bootloader a RAM: RedBoot> load -b 0x1000000 -r -m xmodem Transfiere la imagen de Apex ("apex.bin") mediante xmodem. En el minicom se hace pulsando Ctrl+A para entrar en modo comando y luego una S para enviar ficheros. Una vez se tiene el Apex en RAM solo queda ejecutarlo: RedBoot> g 0x1000000 Aparecerá algo como esto: APEX Boot Loader 1.4.7 -- Copyright (c) 2004,2005,2006 Marc Singer APEX comes with ABSOLUTELY NO WARRANTY. It is free software and you are welcome to redistribute it under certain circumstances. For details, refer to the file COPYING in the program source. apex => mem:0x00200000+0xdb20 (56096 bytes) env => nor:120k+8k (no-write) Use the command 'help help' to get started. # copy nor:0x60010+0xffff0 0x00008000 1048560 bytes transferred Presiona Ctrl+C para parar el proceso de arranque. Si todo ha ido bien hasta este punto, ya se puede sobreescribir el RedBoot. Para ello haz lo siguiente: apex> erase nor:0 apex> copy $apex nor:0 No hace falta volver a transferirlo por xmodem ya que se copia la imagen previamente grabada en RAM. Ahora reinicia el Slug y mira a ver si te carga correctamente el Apex. apex> reset Si lo hace, ya has hecho lo mas complicado. Si no, deberás utilizar el JTAG para restaurar el firmware. 2 PASO: SUSTITUIR EL CARGADOR DE SEGUNDO NIVEL DE DEBIAN POR APEX CON LA LINEA DE COMANDOS APROPIADA A partir de este punto ya se puede probar, meter la pata y estar tranquilos de que podremos recuperar el Slug sin necesidad de JTAG (a no ser que seas muy bruto y te cargues la partición 0 de la flash). El primer paso es preparar el segundo binario de Apex. Esta vez es algo mas complicado pero nada fuera de lo comun. Copia la configuración de Apex para NSLU2 arm y entra en el menú de configuración cd /usr/src/apex cp src/mach-ixp42x/debian-nslu2-arm_config .config make menuconfig Entra en General Setup, vete a la opción Cross compiler prefix y mete el prefijo del compilador arm, en mi caso: /opt/arm-xscale-linux-gnu/gcc-4.0.3-glibc-2.3.6/bin/arm-xscale-linux-gnu- Vuelve a configurar la memoria en Platform Setup (esto no es necesario pero por si acaso) Ahora vete a Environment, selecciona Default kernel command line y añade al final mem=64M@0x0. Sal del programa de configuración, guardalo todo y compílalo. make El binario que se obtiene es para little-endian así que ahora hay que hacer un "byteswapping" con el siguiente script (cortesia de Peter Korsgaard): #!/usr/bin/python # swap every 32bit word in input and write it to output import array, sys if len(sys.argv) != 3: sys.stderr.write('Invalid arguments.\n') sys.stderr.write('Usage: %s \n' % sys.argv[0]) sys.exit(1) if sys.argv[1] == '-': file = sys.stdin else: file = open(sys.argv[1], 'rb') input = file.read() a = array.array('I') # add padding if needed a.fromstring(input + '\0' * (4-len(input)&3)) a.byteswap() if sys.argv[2] == '-': file = sys.stdout else: file = open(sys.argv[2], 'wb') a.tofile(file) ./byteswap.py apex.bin apex-swap.bin Igual que antes, conviene probarlo antes de grabarlo a flash. Pon el circuito del puerto serie, abre el minicom y arranca el Slug. Presiona Ctrl+C para detener el arranque. Ahora vamos a transferir el binario por xmodem. apex> xreceive 0x1000000 Aparecera una "C", en ese momento transfiere el binario "apex-swap.bin" por xmodem. Ejecuta el nuevo cargador apex> go 0x1000000 En este punto, por si acaso deberías probar si es capaz de arrancar debian asi que no pares el proceso de carga con Ctrl+C. Si arranca bien vamos a grabarlo en flash. Es muy importante grabarlo desde el primer Bootloader, NUNCA DESDE EL SEGUNDO. Arranca el Slug y presiona Ctrl+C para entrar a la linea de comandos del Apex (REPITO, EL PRIMER APEX). Y ahora haz lo siguiente: apex> xreceive 0x1000000 Transfiere "apex-swap.bin" por xmodem pero no lo arranques. Anotate el tamaño del fichero en hexadecimal. Ahora grabalo en flash: apex> erase nor:0x60000+0x20000 apex> copy mem:0x1000000+0xYYYY nor:0x60010 (donde 0xYYYY es el tamaño del fichero) Ahora ya debería estar todo en su sitio asi que reinicia y comprueba que todo funciona bien. p2p@pitufo:~$ free total used free shared buffers cached Mem: 62568 61160 1408 0 388 30212 -/+ buffers/cache: 30560 32008 Swap: 65528 24 65504 Si no arranca recuerda que siempre se puede volver a grabar el firmware que quieras con el primer Apex sin necesidad de utilizar el JTAG. NOTA: Este proceso que describo me ha funcionado perfectamente y es seguro si se toman las precauciones necesarias. No obstante, no me responsabilizo de cualquier daño derivado de seguir esta guía.

¿como poder compartir mis carpetas del nslu2 a traves de internet?