NetBSD para el Odroid-C2

Desde que NetBSD anunciara que estaban haciendo de ARM una arquitectura de nivel 1, he estado siguiendo su trabajo de desarrollo. Hace unas semanas, en la lista de correo de los desarrolladores de ARM de NetBSD, Jared McNeill dijo: “... el kernel GENERIC64 ahora admite el SoC Amlogic S905 utilizado en la placa ODROID-C2. Ethernet, USB y SD / eMMC funcionan..." Inmediatamente me hice con una imagen y empecé a hacer pruebas. Quiera comentar cual ha sido el resultado y animar a otros a que lo prueben. No es habitual que ODROID reciba un nuevo sistema operativo que no sea Linux.

$ uname -a
NetBSD odroid-c2 8.99.37 NetBSD 8.99.37 (GENERIC64) #0: Sat Apr 6 17:42:28 UTC 2019 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC64 evbarm
En el par de semanas que lo he estado usando, a pesar de que actualmente es una imagen de desarrollo, da la impresión de que es bastante estable. No he tenido ningún problema con Ethernet, USB o SD /eMMC. Todavía no hay un driver de memoria de imagen, así que toda la interacción se realiza a través de la consola serie o ssh. Recientemente, tanto Armv7 como Arm64 para NetBSD han sido movidos a un arranque EFI utilizando el último U-Boot y lo que parece ser el U-Boot Driver Model (DM). Hay una presentación de FOSDEM'19 U-Boot y diapositivas que cubren algunas de estas características.

https://video.fosdem.org/2019/K.4.401/hw_uboot.mp4https://fosdem.org/2019/schedule/event/hw_uboot/attachments/slides/3324/export/events/attachments/hw_uboot/slides/3324/Jagan_Teki___U_Boot_from_Scratch_v2019_01_edition_v2.pdf

Actualización de NetBSD de Benny Siegert en FOSDEM'19 https://video.fosdem.org/2019/K.3.401/netbsd_update.mp4

U-Boot NetBSD Odroid-C2

=> version
U-Boot 2019.04-rc1-00141-g63f7e3fca3 (Feb 15 2019 - 20:11:48 -0400) odroid-c2
=> dm tree
Class Index Probed Driver Name
-----------------------------------------------------------
root 0 [ + ] root_driver root_driver
firmware 0 [ ] psci |-- psci
clk 0 [ ] fixed_rate_clock |-- xtal-clk
simple_bus 0 [ + ] generic_simple_bus |-- soc
simple_bus 1 [ ] generic_simple_bus | |-- bus@c1100000
reset 0 [ ] meson_reset | | |-- reset-controller@4404
i2c 0 [ ] i2c_meson | | `-- i2c@8500
simple_bus 2 [ + ] generic_simple_bus | |-- bus@c8100000
simple_bus 3 [ ] generic_simple_bus | | |-- sys-ctrl@0
syscon 0 [ ] syscon | | |-- ao-secure@140
serial 0 [ + ] serial_meson | | |-- serial@4c0
pinctrl 0 [ + ] meson-gxbb-pinctrl | | `-- pinctrl@14
pinconfig 0 [ ] pinconfig | | |-- bank@14
pinconfig 1 [ ] pinconfig | | | `-- usb-hub
pinconfig 2 [ + ] pinconfig | | |-- uart_ao_a
pinconfig 3 [ ] pinconfig | | | `-- mux
pinconfig 4 [ ] pinconfig | | |-- uart_ao_a_cts_rts
pinconfig 5 [ ] pinconfig | | | `-- mux
pinconfig 6 [ ] pinconfig | | |-- uart_ao_b
pinconfig 7 [ ] pinconfig | | | `-- mux
pinconfig 8 [ ] pinconfig | | |-- uart_ao_b_cts_rts
pinconfig 9 [ ] pinconfig | | | `-- mux
pinconfig 10 [ ] pinconfig | | |-- remote_input_ao
pinconfig 11 [ ] pinconfig | | | `-- mux
pinconfig 12 [ ] pinconfig | | |-- i2c_ao
pinconfig 13 [ ] pinconfig | | | `-- mux
pinconfig 14 [ ] pinconfig | | |-- pwm_ao_a_3
pinconfig 15 [ ] pinconfig | | | `-- mux
pinconfig 16 [ ] pinconfig | | |-- pwm_ao_a_6
pinconfig 17 [ ] pinconfig | | | `-- mux
pinconfig 18 [ ] pinconfig | | |-- pwm_ao_a_12
pinconfig 19 [ ] pinconfig | | | `-- mux
pinconfig 20 [ ] pinconfig | | |-- pwm_ao_b
pinconfig 21 [ ] pinconfig | | | `-- mux
pinconfig 22 [ ] pinconfig | | |-- i2s_am_clk
pinconfig 23 [ ] pinconfig | | | `-- mux
pinconfig 24 [ ] pinconfig | | |-- i2s_out_ao_clk
pinconfig 25 [ ] pinconfig | | | `-- mux
pinconfig 26 [ ] pinconfig | | |-- i2s_out_lr_clk
pinconfig 27 [ ] pinconfig | | | `-- mux
pinconfig 28 [ ] pinconfig | | |-- i2s_out_ch01_ao
pinconfig 29 [ ] pinconfig | | | `-- mux
pinconfig 30 [ ] pinconfig | | |-- i2s_out_ch23_ao
pinconfig 31 [ ] pinconfig | | | `-- mux
pinconfig 32 [ ] pinconfig | | |-- i2s_out_ch45_ao
pinconfig 33 [ ] pinconfig | | | `-- mux
pinconfig 34 [ ] pinconfig | | |-- spdif_out_ao_6
pinconfig 35 [ ] pinconfig | | | `-- mux
pinconfig 36 [ ] pinconfig | | |-- spdif_out_ao_13
pinconfig 37 [ ] pinconfig | | | `-- mux
pinconfig 38 [ ] pinconfig | | |-- ao_cec
pinconfig 39 [ ] pinconfig | | | `-- mux
pinconfig 40 [ ] pinconfig | | |-- ee_cec
pinconfig 41 [ ] pinconfig | | | `-- mux
gpio 0 [ ] meson-gx-gpio | | `-- meson-gpio
simple_bus 4 [ + ] generic_simple_bus | |-- periphs@c8834000
pinctrl 1 [ + ] meson-gxbb-pinctrl | | `-- pinctrl@4b0
pinconfig 42 [ ] pinconfig | | |-- bank@4b0
pinconfig 43 [ + ] pinconfig | | |-- emmc
pinconfig 44 [ ] pinconfig | | | `-- mux
pinconfig 45 [ + ] pinconfig | | |-- emmc-ds
pinconfig 46 [ ] pinconfig | | | `-- mux
pinconfig 47 [ ] pinconfig | | |-- emmc_clk_gate
pinconfig 48 [ ] pinconfig | | | |-- mux
pinconfig 49 [ ] pinconfig | | | `-- cfg-pull-down
pinconfig 50 [ ] pinconfig | | |-- nor
pinconfig 51 [ ] pinconfig | | | `-- mux
pinconfig 52 [ ] pinconfig | | |-- spi-pins
pinconfig 53 [ ] pinconfig | | | `-- mux
pinconfig 54 [ ] pinconfig | | |-- spi-ss0
pinconfig 55 [ ] pinconfig | | | `-- mux
pinconfig 56 [ + ] pinconfig | | |-- sdcard
pinconfig 57 [ ] pinconfig | | | `-- mux
pinconfig 58 [ ] pinconfig | | |-- sdcard_clk_gate
pinconfig 59 [ ] pinconfig | | | |-- mux
pinconfig 60 [ ] pinconfig | | | `-- cfg-pull-down
pinconfig 61 [ ] pinconfig | | |-- sdio
pinconfig 62 [ ] pinconfig | | | `-- mux
pinconfig 63 [ ] pinconfig | | |-- sdio_clk_gate
pinconfig 64 [ ] pinconfig | | | |-- mux
pinconfig 65 [ ] pinconfig | | | `-- cfg-pull-down
pinconfig 66 [ ] pinconfig | | |-- sdio_irq
pinconfig 67 [ ] pinconfig | | | `-- mux
pinconfig 68 [ ] pinconfig | | |-- uart_a
pinconfig 69 [ ] pinconfig | | | `-- mux
pinconfig 70 [ ] pinconfig | | |-- uart_a_cts_rts
pinconfig 71 [ ] pinconfig | | | `-- mux
pinconfig 72 [ ] pinconfig | | |-- uart_b
pinconfig 73 [ ] pinconfig | | | `-- mux
pinconfig 74 [ ] pinconfig | | |-- uart_b_cts_rts
pinconfig 75 [ ] pinconfig | | | `-- mux
pinconfig 76 [ ] pinconfig | | |-- uart_c
pinconfig 77 [ ] pinconfig | | | `-- mux
pinconfig 78 [ ] pinconfig | | |-- uart_c_cts_rts
pinconfig 79 [ ] pinconfig | | | `-- mux
pinconfig 80 [ ] pinconfig | | |-- i2c_a
pinconfig 81 [ ] pinconfig | | | `-- mux
pinconfig 82 [ ] pinconfig | | |-- i2c_b
pinconfig 83 [ ] pinconfig | | | `-- mux
pinconfig 84 [ ] pinconfig | | |-- i2c_c
pinconfig 85 [ ] pinconfig | | | `-- mux
pinconfig 86 [ + ] pinconfig | | |-- eth-rgmii
pinconfig 87 [ ] pinconfig | | | `-- mux
pinconfig 88 [ ] pinconfig | | |-- eth-rmii
pinconfig 89 [ ] pinconfig | | | `-- mux
pinconfig 90 [ ] pinconfig | | |-- pwm_a_x
pinconfig 91 [ ] pinconfig | | | `-- mux
pinconfig 92 [ ] pinconfig | | |-- pwm_a_y
pinconfig 93 [ ] pinconfig | | | `-- mux
pinconfig 94 [ ] pinconfig | | |-- pwm_b
pinconfig 95 [ ] pinconfig | | | `-- mux
pinconfig 96 [ ] pinconfig | | |-- pwm_d
pinconfig 97 [ ] pinconfig | | | `-- mux
pinconfig 98 [ ] pinconfig | | |-- pwm_e
pinconfig 99 [ ] pinconfig | | | `-- mux
pinconfig 100 [ ] pinconfig | | |-- pwm_f_x
pinconfig 101 [ ] pinconfig | | | `-- mux
pinconfig 102 [ ] pinconfig | | |-- pwm_f_y
pinconfig 103 [ ] pinconfig | | | `-- mux
pinconfig 104 [ ] pinconfig | | |-- hdmi_hpd
pinconfig 105 [ ] pinconfig | | | `-- mux
pinconfig 106 [ ] pinconfig | | |-- hdmi_i2c
pinconfig 107 [ ] pinconfig | | | `-- mux
pinconfig 108 [ ] pinconfig | | |-- i2sout_ch23_y
pinconfig 109 [ ] pinconfig | | | `-- mux
pinconfig 110 [ ] pinconfig | | |-- i2sout_ch45_y
pinconfig 111 [ ] pinconfig | | | `-- mux
pinconfig 112 [ ] pinconfig | | |-- i2sout_ch67_y
pinconfig 113 [ ] pinconfig | | | `-- mux
pinconfig 114 [ ] pinconfig | | |-- spdif_out_y
pinconfig 115 [ ] pinconfig | | | `-- mux
gpio 1 [ + ] meson-gx-gpio | | `-- meson-gpio
simple_bus 5 [ ] generic_simple_bus | |-- bus@c8838000
simple_bus 6 [ + ] generic_simple_bus | |-- bus@c883c000
simple_bus 7 [ + ] generic_simple_bus | | `-- system-controller@0
clk 1 [ + ] meson_clk | | |-- clock-controller
syscon 1 [ + ] syscon | | `-- system-controller@0
clk 2 [ ] meson_clk | | `-- clock-controller
eth 0 [ + ] eth_designware | |-- ethernet@c9410000
simple_bus 8 [ + ] generic_simple_bus | `-- apb@d0000000
mmc 0 [ + ] meson_gx_mmc | |-- mmc@72000
blk 0 [ ] mmc_blk | | `-- mmc@72000.blk
mmc 1 [ + ] meson_gx_mmc | `-- mmc@74000
blk 1 [ ] mmc_blk | `-- mmc@74000.blk
regulator 0 [ ] fixed regulator |-- regulator-usb-pwrs
regulator 1 [ ] fixed regulator |-- regulator-tflash_vdd
regulator 2 [ ] fixed regulator |-- regulator-vcc1v8
regulator 3 [ ] fixed regulator `-- regulator-vcc3v3
En pruebas posteriores descubrí que el módulo WiFi 3 de Hardkernel funciona bien y que el módulo 0 es reconocido, pero tiene un problema de conexión. No he dedicado mucho tiempo intentando solucionar el problema. No dispongo de un módulo 4 para probarlo y los módulos 5 y 5a no los reconoce. Sospecho que es porque no hay driver de kernel para ellos. Tienes los resultados de algunas pruebas básicas con LAN, WiFI, eMMC y USB publicados en un hilo de los Foros Hardkernel https://forum.odroid.com/viewtopic.php?f=138&t=34457

Figura 1 - htop ejecutándose en NetBSD

Carga y configuración básica de NetBSD

Para cualquier persona que quiera probar NetBSD en un ODROID-C2, aquí tiene una guía básica de instalación y configuración. Necesitas una consola serie para iniciar esta imagen. No es una imagen liberada, de modo que las imágenes actuales solo se pueden encontrar en el servidor NetBSD Arm Current. También tienes una imagen ODROID-XU4 y ODROID-C1+. La imagen ODROID-XU4 no se puede utilizar en este momento. La imagen ODROID-C2 funciona con una tarjeta SD o eMMC. En el primer arranque, se cambiará automáticamente el tamaño del sistema de archivos raíz y luego se reiniciará. http://www.invisible.ca/arm/

Descomprime y escribe la imagen usando dd, o utiliza una aplicación como etcher.io o Win32DiskImager:

$ gzip -d NetBSD-evbarm-aarch64-201904061750Z-odroidc2.img.gz
$ dd if=./NetBSD-evbarm-aarch64-201904061750Z-odroidc2.img of=/dev/< your card reader location > e.g. sdb
$ sync
Una vez arrancada, root no tiene contraseña. Para asignarle una contraseña:
$ passwd
Para cambiar el nombre del host:
$ vi /etc/rc.conf
$ hostname=< your hostname >
Para añadir un usuario, el directorio por defecto es /home/
$ useradd -m -G wheel < username >
$ passwd < username >
Ajusta la configuración regional de todo el sistema según tu ubicación.
$ echo "export LANG=\"en_US.UTF-8\"" >> /etc/profile
$ echo "export LC_CTYPE=\"en_US.UTF-8\"" >> /etc/profile
$ echo "export LC_ALL=\"\"" >> /etc/profile

Carga de aplicaciones informáticas

Puesto que se trata de una imagen en desarrollo, no dispones de un entorno de usuario completo. Es una imagen de sistema operativo básica. Además, no existe una lista de binarios de aplicaciones disponibles, así que me centrare en la instalación de binarios (pkg_add), la compilación de código fuente (pkgsrc) y la actualización con conjuntos tar completos.

Obtener paquetes binarios para Aarch64

Los archivos binarios proceden de un servidor no liberado y requiere de una ligera modificación de las prácticas normales.

$ export PKG_PATH="http://www.invisible.ca/arm/packages/arm64/current"
$ pkg_add -v < package name >
Usando un navegador web de otro ordenador, también puede ver lo que hay disponible. Los paquetes se agregan a medida que se van compilando, así que revisalos regularmente si no tienes pensado compilar desde la fuente. http://www.invisible.ca/arm/packages/arm64/current

Coger pkgsrc de CVS (código fuente)

El espacio de usuario completo es de aproximadamente 3.7 GB, así que asegúrese de tener suficiente espacio. Las aplicaciones se agrupan por funcionalidad, de modo que tómate un minuto para familiarizarte con el diseño.

$ cd /usr
$ cvs -d anoncvs@anoncvs.netbsd.org:/cvsroot checkout -P pkgsrc
Para compilar una aplicación específica
$ cd /usr/pkgsrc/< group directory >/< app name >
$ make install
Todas las dependencias se compilarán para la aplicación en concreto e incluso se descargarán si es necesario, así que asegúrate de tener conexión a Internet durante el proceso. Yo compilé bastantes paquetes sin problemas. Si has configurado PKG_PATH previamente, debes desconfigurarla antes de usar pkgsrc o te lo recordará.
$ unset PKG_PATH

Utilizar los conjuntos tar

Puedes usar los conjuntos tar para actualizar al último kernel y el entorno de usuario. En las imágenes de desarrollo, se recomienda actualizar el kernel y el entorno de usuario

Actualizar el kernel

$ mkdir -p /root/tmp/kernel
$ cd /root/tmp/kernel
$ cp /netbsd /onetbsd
$ ftp $ https://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-aarch64/binary/sets/kern-GENERIC64.tgz
$ tar xzvf /root/tmp/kernel/kern-GENERIC64.tgz
$ cp ./netbsd /netbsd
$ cp meson-gxbb-odroidc2.dtb /boot/dtb/amlogic/
$ reboot
Actualizar el entorno excepto para /etc
$ mkdir -p /root/tmp/sets
$ cd /root/tmp/sets
$ for x in base comp games man misc modules tests text xbase xcomp xfont xserver; do ftp https://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-aarch64/binary/sets/$x.tgz; done
$ for x in base comp games man misc modules tests text xbase xcomp xfont xserver; do tar -C / -zxvpf $x.tgz; done
Actualizar configuración /etc/
$ for x in etc xetc; do ftp https://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-aarch64/binary/sets/$x.tgz; done
$ etcupdate -s etc.tgz -s xetc.tgz
$ rm -Rf /root/tmp
$ reboot

Ejemplo con sudo

Una de las típicas aplicaciones que puedes cargar es sudo. Aquí tienes ejemplos usando el repositorio actual de binarios y pkgsrc.

Obteniendo el binario sudo

$ export PKG_PATH="http://www.invisible.ca/arm/packages/arm64/current"
$ pkg_add -v sudo
Compilando sudo desde pkgsrc. Nota: Se supone que has descargado pkgsrc como he descrito con anterioridad
$ unset PKG_PATH
$ cd /usr/pkgsrc/security/sudo
$ make install
Independientemente del método de instalación, debes configurar sudo para que funcione. Usando visudo como se muestra a continuación, elimina el comentario de la línea 88 para permitir que los miembros del grupo sudo puedan ejecutar cualquier comando y el resto de opciones como miembros del grupo wheel (línea 82)
$ groupadd sudo
$ usermod -G sudo < username >
$ visudo
$ %sudo ALL=(ALL) ALL
Futura actualización de aplicaciones Actualizando el paquete binario sudo:
$ pkg_add -uv sudo
Actualizando sudo y todas sus dependencias:
$ pkg_add -fuuv sudo

Notas

Algunos paquetes requieren una configuración adicional y generalmente se te informará de ello en el momento de la instalación. Muchas veces se proporcionan ejemplos, como el ejemplo de instalación de dbus que se indica a continuación:

$ cp /usr/pkg/share/examples/rc.d/dbus /etc/rc.d/
Si vas a cargar y usar git, curl o wget, recuerda cargar los certificados root de CA.
$ pkg_add -v mozilla-rootcerts openssl mozilla-rootcerts-openssl
Otras aplicaciones típicas que se pueden cargar usando pkg_add
$ pkg_add -v bash htop zip p7zip gzip dos2unix

Configuración del WiFi

Localiza el nombre del dispositivo usando ifconfig. Si no está en la lista, probablemente no exista un driver de kernel; revisar dmesg.

$ ifconfig -a
Edita wpa_supplicant y añade las entradas apropiadas
$ vi /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
       ssid=< network name >
       scan_ssid=1
       key_mgmt=WPA-PSK
       psk=< passwordkey >
}
Habilitar en el arranque
$ vi /etc/rc.conf
wpa_supplicant=YES
wpa_supplicant_flags="-i < device name > -c /etc/wpa_supplicant.conf"
Inicia el servicio WiFi
$ chmod 600 /etc/wpa_supplicant.conf
$ /etc/rc.d/wpa_supplicant start
o para la depuración
$ wpa_supplicant -Bd -c /path/to/wpa-supplicant.conf -i < device name >
Añadir "-f file" enviará mensajes de depuración (usar -d) al archivo.

Una última nota, esta es una imagen de desarrollo, así que no es para producción. Como he dicho antes, no he tenido ningún problema ... hasta hoy, cuando he tirado de un reciente lanzamiento con un nuevo kernel. He tenido mi primer fallo de segmentación, aunque el sistema operativo todavía seguía funcionando. Podría tener sentido mantener la versión anterior en estas ocasiones. Estoy seguro de que aparecerán más problemas a medida que avance el desarrollo. Quiero tomarme un minuto y enviarle un gran agradecimiento a la Fundación NetBSD, a su equipo de desarrollo y especialmente a Jared McNeill. ¡Ayudemos respaldando su maravilloso trabajo de llevar NetBSD a ARM y a los ODROIDs de Hardkernel!

Referencias

NetBSD Project https://www.netbsd.org/ NetBSD Guide https://www.netbsd.org/docs/guide/en/index.html NetBSD pkgsrc guide http://www.netbsd.org/docs/pkgsrc/index.html NetBSD pkgsrc browser http://pkgsrc.se/ NetBSD Mailing List https://www.netbsd.org/mailinglists/#port-arm NetBSD Arm Bootable Images http://www.invisible.ca/arm/ NetBSD Index of Arm64 Current http://www.invisible.ca/arm/packages/arm64/current/

Be the first to comment

Leave a Reply