miércoles, 15 de enero de 2014

Raspberry Pi: ¿Tiene BIOS? ¿Qué es config.txt?


La Raspberry Pi no tiene BIOS tal cual la entendemos en el mundo del PC, pero si tiene un firmware de código cerrado en el SoC (el chip de mayor tamaño de los dos que vemos en la placa, el otro es un controlador de red Ethernet). 
El SoC ha sido diseñado por Broadcom y es un BCM2835 e integra: una CPU ARM 1176JZF-S a 700Mhz, una GPU Broadcom VideoCore IV, un DSP para el tratamiento de la señal, memoria SDRAM de 512MiB compartidos con la GPU y el controlador USB. El diseñador ha integrado en él el firmware necesario para el arranque, pero desgraciadamente no es de código abierto. 

Este “BIOS”, por llamarle de algún modo, se encarga de iniciar un gestor de arranque que se encuentra en la tarjeta SD. El gestor de arranque (bootloader) monta la partición FAT32 y pasa a la segunda etapa de inicio, que está programada en el SoC y no puede ser modificada. En el segundo paso entra en escena bootcode.bin, el cual prepara e inicia el firmware de la GPU. Después, un tercer paso (start.elf) se pone en marcha la CPU y un fichero llamado fixup.dat se emplea para crear  la partición necesaria en la SDRAM (para repartir los recursos de memoria entre CPU y GPU). Finalmente se ejecuta el código de usuario, que normalmente son binarios ejecutables o imágenes como el kernel Linux (kernel.img), pero también podría ser otro cargador de arranque e incluso alguna aplicación. 
El firmware que se encuentra grabado en una ROM dentro del SoC, está programado para arrancar bootcode.bin desde la tarjeta SD, es por eso que al no poderse modificar, la Raspberry Pi no puede arrancar desde otro medio que no sea la tarjeta de memoria. En los PCs con BIOS o EFI no ocurre esto, ya que puede configurarse para arrancar desde una unidad USB, desde la red, desde el disco duro o desde una unidad óptica, etc. 
Otra particularidad que podemos observar es que comienza iniciándose con la GPU y no con la CPU, como en un equipo doméstico normal. La GPU de la Raspberry Pi ejecuta un “sistema operativo” muy simple que necesita para funcionar y se llama VCOS (Video Core Operating System) y éste se comunica con Linux. Es algo raro, pero es así, de hecho la GPU no solo se encarga de los gráficos y de iniciar, sino que también controla el reloj del sistema y el audio. 
En principio puede parecer que al estar cerrado no podemos hacer nada para configurar el arranque, pero no es así. Existe un fichero config.txt localizado en el directorio /boot. Si abrimos /boot/config.txt con algún editor de texto (ya sea desde la Raspi o insertando la SD en nuestro equipo Mac OS X, Linux o Windows, aunque desde éste último SO a veces no esté visible en función del esquema de particiones de la SD), podremos configurar ciertos parámetros. 
El fichero config.txt es leido por la GPU tras iniciar el ARM core, en él se encuentran algunas configuraciones o instrucciones que el SoC seguirá durante el arranque y que por supuesto podemos modificar (memoria dedicada, refresco de la memoria, deshabilitar el acceso a la cache L2, tocar la configuración CMA, habilitar o deshabilitar el LED de la cámara, cambiar las opciones del modo de video, codecs, overclocking, opciones de arranque, ...). 
Puedes ver un ejemplo de contig.txt en la zona de descargas de este blog, descargando el archivo número 13. Y en esta página se describe como se puede configurar más detalladamente (en inglés). Pronto editaré otro post para describir el proceso de configuración en ESPAÑOL...