Gustavo Sied > Sin categoría > Portar Genode al hardware comercial. Episode1: B & N Nook HD +
Portar Genode al hardware comercial. Episode1: B & N Nook HD +
Gustavo
5 febrero, 2014
¡Hola!
En este post voy a describir brevemente mis esfuerzos en el proceso de hacer el OS Marco Genode se ejecuta en el HD + tableta de B & N Nook.
pensamientos generales sobre microkernels
Si bien durante mi trabajo en KSYS Labs LLC tengo que trabajar en el desarrollo Genode, este era mi proyecto de tiempo libre. Me fascinó la concepción microkernel y el marco Genode, y yo quiero tener un linux completamente virtualizado en OMAP4 con el PowerVR GPU de trabajo. Sería agradable ver cómo kernelizing el núcleo del sistema mejorará la estabilidad y debuggability. Aunque, en la actualidad Linux en ARM está muy optimizada en términos de rendimiento y consumo de energía (debido a los inmensos esfuerzos de 10 + años de desarrollo y algoritmos ingeniosos para la programación, la gestión de memoria y la máquina de estado de energía), y sólo unas pocas soluciones de código cerrado ofrecer un servicio comparable o mejor (es decir, QNX, VxWorks y Windows Embedded Pacto). La mayoría de los micronúcleos y tiempos de ejecución (L4Re, Genode) carecen de cualquier tipo de administración de energía, los algoritmos de planificación y de asignación de memoria, además, están primitivo, con sencillez y fiabilidad valorado en más de eficiencia de aplicación, por lo tanto, están mejor utilizados como hipervisores en lugar de los sistemas operativos de propósito general. Además, el controlador de Linux han sido elaborados por los fabricantes de hardware, mientras que ellos no están particularmente interesados en el desarrollo microkernel de código abierto, por lo tanto, la compatibilidad de controladores para las nuevas tecnologías sin duda le van a la zaga sistemas operativos convencionales. Sin embargo, sigo pensando que es interesante desarrollar una pila de software FOSS para dispositivos embebidos.
Motivación
Así que, ¿por qué el Nook HD +? Aunque he portado alrealy Genode para el teléfono Samsung Galaxy Nexus para la sesión de demostración FOSDEM 2013, decidí dar otro dispositivo intentarlo por las siguientes razones:
- en forma de tabletas, se tiene mucho menos hardware (al menos, no hay teléfono) para apoyar con el fin de ser un conductor diario
- Algunos periféricos y configuración del hardware varía entre éste y el Nexus, por lo que puede ayudar a exponer a nuevos errores o hardcodery
- Tiene la ranura microSD conectada a mmc0 OMAP4 con la configuración de voltaje estándar (el bit VMODE). Esto es muy útil, ya que permite utilizar directamente el conductor Genode MMC y es fácil de configurar un sistema de archivos de MBR / VFAT en la tarjeta microSD. Galaxy Nexus, por el contrario, no tiene ranura para tarjeta de memoria externa, y para acceder a la memoria interna, es necesario implementar un pequeño cambio en el controlador de MMC e implementar el analizador partición EFI GPT
- Tiene una pantalla Full HD, y tengo pasión por las pantallas de alta resolución de. Además, hi-res es una manera de realizar pruebas de esfuerzo del subsistema de memoria y el rendimiento de este dispositivo
- Porque puedo
U-boot
Arranque de software personalizado en un dispositivo comercial generalmente está conectado con algunos obstáculos, como la ruptura de la cadena de confianza. Un enfoque típico (que he utilizado por muchos dispositivos, incluyendo Acer Iconia A500, Samsung Galaxy S2 y Samsung Galaxy Nexus) está portando el gestor de arranque u-boot ser un chainloader intermedia, brilló en lugar del núcleo de Linux.
El B & N Nook HD + no cuentan con la cadena basada en el kernel firmado de confianza para la memoria interna de máster Erasmus Mundus, pero permite el arranque sin firmar MLO, xloader y u-boot desde el exterior tarjeta microSD. Es decir, ya existe el puerto u-boot, pero para hacer que arranque Genode, se necesitaban muchos cambios.
En primer lugar, he obtenido la imagen de recuperación CWM androide para la tarjeta SD de la HD B & N Nook + foro xda-developers.com [créditos van a los miembros del foro verygreen y grasa de neumáticos]. Después de escribir la imagen en la tarjeta SD y la fijación de distribución de la partición de fdisk, terminé con una partición VFAT contiene el MLO, u-BOOT.bin y uImage. El MLO es el archivo de encabezado de la CPU OMAP4 que combina la tabla de inicialización de la memoria con el gestor de arranque x-loader. El u-BOOT.bin es el B & N u-boot casi vainilla que inicializa la pantalla y botas de la uImage [que en el caso de arranque sd es también u-boot]. Vamos a estar reemplazando la uImage con el u-boot personalizado.
Puede obtener el código fuente de mi u-boot de https://github .com / astarasikov / uboot-bn-nook-hd-fastboot y a continuación es la lista de los problemas que he resuelto
- Extracción de la [que no sean necesarios para nosotros] máster Erasmus Mundus y sd arranque opciones.
- Habilitación fastboot. El gestor de arranque se escucha en USB para la conexión fastboot. «Fastboot continuar» permite arrancar el archivos «ramdisk» «kernel», y desde la tarjeta sd
- inicialización Display fijo. Resulta que el código en el uImage estaba roto, y no REINIT la pantalla correctamente. Las razones fueron que carecía de una GPIO potencia (lo que causaría que nunca vienen después de reinicio en algunas revisiones de hardware, mi tableta de ser uno de los desafortunados), y el error en una de las fronteras de sincronización de trama (lo que causó todo tipo de letra símbolos para ser un píxel de altura). El código de inicialización de la pantalla se dispersó alrededor de 4 ficheros, contenía definiciones codificados para otra tabla. La inicialización framebuffer se hizo en el controlador de MMC (sic). Creo que me he escrito una queja al respecto hace un año, pero nada cambia. Software integrado más comercial es una mierda. Bueno, la mayoría del software es una mierda de cualquier manera, pero el nivel del crappiness en el software de código abierto se reduce cuando alguien se encuentra en la necesidad de añadir el soporte para una nueva configuración, y la comunidad hace hardcoding no bienvenida y romper el código antiguo.
- arranque fijo «ANDROID!» imágenes de arranque más de fastboot con el comando «booti». El código contiene muchas suposiciones incorrectas sobre el diseño de la imagen.
- movió la base de u-boot en la memoria RAM y el aumento de la memoria intermedia de fastboot para permitir la descarga de imágenes enormes (hasta 496M). Esto me permite arrancar imágenes Genode con el disco de memoria integrado con el sistema de archivos raíz, mientras que yo no he terminado el apoyo GPT
- habilitado la consola framebuffer para depurar
Genode
que tuve que hacer algunos cambios para que Genode plazo. Voy a discutir brevemente algunos elementos notables.
Fiasco.OC compilación cruzada
Recientemente, la tripulación Genode actualizado a la última revisión de un microkernel Fiasco.OC y parece contener algo hardcoded nombre compilador cruzado para ARM. Me resistía a bien arreglarlo o descargar el compilador de «adecuado» (sobre todo sabiendo que el de la cadena de herramientas Genode funciona para OMAP4)
Así que, esto es lo que he hecho:.
- Hecho un nuevo directorio y añade a la variable PATH (añadir « export PATH = / ruta / al / que / muy / dir /: $ PATH «a su bashrc si no tienes más mínima idea de lo que estoy hablando)
- Hecho enlaces simbólicos para la falsificación.» arm-linux «apuntando cadena de herramientas a genode con « for i in` ls / usr / local / genode-gcc / bin / genode brazo * `; hacer ln-s $ i $ {i / / * genode-arm/arm-linux}; hecho «
Aumentar nitpicker cuota de memoria.
Actualmente nitpicker [gestor de ventanas proporciona marcos de buffer] está codificado para algunas pantallas de 1024×768 (creo porque nadie, incluso a genode, considera seriamente utilizar Genode a diario como conductor en la actualidad), por lo que necesitamos para fijar el límite de la memoria constante de la siguiente manera:
— a / os / include / nitpicker_session / connection.h
#bf9000;»> @ @ -43,8 +43,8 @ @ nitpicker espacio de nombres {
#bf9000;»> argbuf [0] = 0;
– Genode :: ram_quota size_t = 1600 * 1024;
+ Genode :: ram_quota size_t = 1920 * 1280 * 2;
Añadir soporte para LCD framebuffer OMAP4
Actualmente, framebuffer OMAP4 sólo admite la Interfaz de TV para HDMI. Para que sea reajustada y configurar la interfaz de LCD (que se utiliza en los teléfonos inteligentes y tabletas), tenemos que añadir algunas definiciones de registro [y fijar la definición incorrecta del registro de dirección de base, mientras que estamos en él] para el código de acuerdo a la Manual subsistema OMAP4 DSS
índice 23f80df .. ea9f602 100644
#bf9000;»> + + + b / os / src / drivers / framebuffer / omap4/dispc.h
#bf9000;»> * /
#bf9000;»> {
+ struct Lcd_enable: Bitfield <0, 1> {};
#bf9000;»>
+ struct Go_lcd: Bitfield <5, 1>
+ {
+ enum {HW_UPDATE_DONE = 0x0, / * establecer por HW después de la actualización * /
+};
{
#bf9000;»> @ @ -46,11 +52,17 @ @ struct Dispc: Genode :: MMIO
#bf9000;»> struct Altura: Bitfield <16, 11> {};
blue;»> + struct Size_lcd: Register <0x7c, 32> ;
+ struct Ancho: Bitfield <0, 11> {};
blue;»> +};
/ **
#bf9000;»> , * /
blue;»> + struct Gfx_ba0: Register <0x80, 32> {} ;
#bf9000;»>
/ **
#bf9000;»> diff – git a/os/src/drivers/framebuffer/omap4/driver.hb/os/src/drivers/framebuffer/omap4/driver.h
d754a97 índice .. 53517a3 100644
#bf9000;»> + + + b/os/src/drivers/framebuffer/omap4/driver.h
}
#bf9000;»>
#bf9000;»> _dispc.write (phys_base );
_dispc.write (ancho (modo) – 1);
hacking en Nook HD + pantalla de ayuda.
Yo quería hacer el trabajo de visualización de una manera rápida y sucia , por lo que he comentado el código de inicialización de HDMI y lo reemplazó con un código simple que reconfiguró la dirección framebuffer para el LCD (que llevan a cuestas en el u-boot para inicializar la pantalla). Recuerde, los niños, nunca jamás pensar en hacer esto en .. producción Estoy profundamente avergonzado de havind hecho de que cualquier manera, te voy a mostrar el código, y el controlador de framebuffer quiere mal algunos cambios:
- Adición LCD adecuado para la inicialización
- resolución configurable a través de la configuración
- Apoyo a la inicialización de la interfaz JMS / DPI y los controladores personalizados del panel
- Rotación y HW blitting
Ok, basta de hablar, he aquí el parche
índice 53517a3 .. 9287cdc 100644
#bf9000;»> + + + b / os/src/drivers/framebuffer/omap4/driver.h
#bf9000;»>
#bf9000;»> {
#bf9000;»> switch (modo) {
#bf9000;»> }
@ @ -84,6 +85,7 @ @ class Framebuffer :: Conductor
#bf9000;»> {
#bf9000;»> switch (modo) {
}
@ @ -117,12 +119,17 @ @ bool Framebuffer :: Conductor :: init (Framebuffer :: Modo Controlador :: Mode,
{
blue;»> + # if 0
#bf9000;»> _dispc.write , (1);
blue;»> +
+ _dispc.write (0);
#bf9000;»> _dispc.write<Dispc::Config1::Load_mode>(Dispc::Config1::Load_mode::DATA_EVERY_FRAME);
#bf9000;»> _hdmi.write (0);
#bf9000;»> if (! _hdmi.issue_pwr_pll_command (Hdmi :: Pwr_ctrl :: ALL_OFF, _delayer)) {
#bf9000;»> _dispc.write <; Dispc :: Size_tv :: Altura> (altura (modo) – 1);
#bf9000;»> _hdmi.write (1);
blue;»> +
+ _dispc.write (ancho (modo) – 1);
+ _dispc.write (altura (modo) – 1);
#bf9000;»> ; interruptor (formato) {
#bf9000;»> _dispc.write (0x6d2240);
#bf9000;»> _dispc.write<Dispc::Gfx_attributes::Channelout>(Dispc::Gfx_attributes::Channelout::TV);
_dispc.write<Dispc::Gfx_attributes::Channelout2>(Dispc::Gfx_attributes::Channelout2::PRIMARY_LCD);
PERR (» Go_tv Tiempo de espera agotado «);
return false;
}
blue;»> + _dispc.write (1);
#bf9000;»>
}
archivo de configuración
Genode se configura a través del archivo de configuración XML. Aquí están algunas notas
- Estamos utilizando el controlador usb_drv dde_kit proporcionar recibos de trabajo en red y la entrada de los conductores
- El nic_bridge proxifies la creación de redes de dos instancias L4Linux
nitpicker
- y nit_fb se utilizan para dividir la pantalla en framebuffers virtuales
- tanto nic_bridge y nit_fb están utilizando los conceptos Genode de las interfaces de servicio y enrutamiento de servicios. Estamos configurar los servicios de tal manera que están usando el servicio específico si es necesario, y se basan en los padres para proporcionar el servicio predeterminado si nosotros no «atención. Por ejemplo, tomar una mire cómo está configurado nic_bridge. El usb_drv ofrece «ofrece» la sección que declara que interconecta el servicio está en condiciones de brindar. Estos pueden ser usados en la sección de «ruta» de los servicios a los clientes. Por defecto, Genode cuenta con un negar todos la política, por lo que si no se configura algo, usted no tiene acceso a la misma.
- usb_drv tiene alguna pérdida de memoria (o tenía vuelta en el invierno y yo era perezoso para mirar en él) así que he aumentado la cuota de RAM y esperaba que sobreviviera. Lo hizo.
< proporciona >
Nic » />
proporciona >
< Ruta span> >
Nic «> usb_drv «/>
ruta span> >
Compilación y ejecución
así, ¿qué hay de tratar de hacerlo por su cuenta?
Instale la cadena de herramientas Genode (consultar la página web Genode y proyecto sourceforge) y crear los enlaces simbólicos como se explicó anteriormente.
Obtener el código fuente u-boot
black; color: lime;»>
Compile U-boot. Recomiendo el uso de la CodeSourcery 2010Q1-188 cadena de herramientas (ya que no todos producen cadenas de herramientas de código de trabajo)
export PATH = / ruta / al / CodeSourcery / cadena de herramientas / bin: $ PATH
de exportación ARCH = brazo
black; color: lime;»> U_BOARD = bn_ovation
make clean
hacer $ {} U_BOARD _config
black; color: lime;»>. / tools / mkimage-Un brazo-O linux-kernel-T C ninguno-a 0x88000000-e 0x88000000-n foo-d u-BOOT.bin uImage
Copiar el código marco genode fuente
git checkout nook_staging
Ahora, para cada directorio en el árbol genode ( base foc y directorios que no sean de bases), ir a ellos y ejecutar «make prepararse» para descargar las librerías necesarias. Bueno, libports está fuertemente rotos y muchos paquetes (openssl, zlib, más?) dejar de descargar. Puede omitir libports y qt4 por ahora
Prepare el directorio de construcción
/ herramienta / create_builddir foc_panda BUILD_DIR = / mi / build / dir
Edite el / mi / build / dir / etc / build.conf