Odroid U3: Último kernel (4.12, 4.14, 4.15) y último u-boot (2017-05)

Actualización 23/09/2017: La guía funciona también para el kernel 4.14, podéis actualizar el kernel del 4.12 al 4.14 siguiendo únicamente los pasos del punto ‘Descarga y compilación del kernel’.

Actualización 2/12/2017: La guía funciona también para el kernel 4.15.

En esta entrada le vamos a dar un buen meneo a la vieja Odroid U3 que tan bien está funcionando durante los últimos años. Hace tiempo que se quedó sin soporte por parte del fabricante y seguía con un kernel bastante antiguo de la serie 3.8.

En los últimos kernels, el chipset Sansung Exynos 4412, que es el corazón de nuestro Odroid U3 ya está definitivamente incorporado a la rama estable. Para hacer esta actualización vamos a necesitar los siguientes ingredientes:

  1. Conversor serie a USB: para actualizar el kernel, primero hay que actualizar el gestor de arranque u-boot, y para ello hay que hacer uso de la consola serie que trae nuestra Odroid.
  2. Una tarjeta micro USB: si algo no va bien durante el proceso de actualización, haremos uso de una imagen de recuperación (un recovery de emergencia), que nos restaurará el u-boot, de forma que podamos arrancar la placa como si no hubiera pasado nada. Yo usaré una de 1Gb.
  3. El adaptador eMMC a microSD, y un adaptador microSD a USB: Antes de empezar a hacer nada, haremos una imagen de la tarjeta eMMC por si algo va mal.

Los que hayáis leído mis entradas anteriores, sabréis que tengo una tarjeta eMMC para el sistema operativo, y una tarjeta micro USB para la partición /var y algún otro dato variable. Así que este será nuestro escenario inicial, una Odroid U3 con eMMC de 8Gb y micro SD de 32Gb.

 

Empezamos: la copia de seguridad y el recovery

Siempre, siempre, siempre hay que hacer una copia antes de empezar a trastear nada, y más si se trata del kernel y el gestor de arranque. Y lo dice alguien que es un temerario en este tipo de cosas: haced una copia antes de nada.

 

Bastará con quitar la tarjeta eMMC de la Odroid, conectarla al adaptador y ejecutar el siguiente comando:

[13:20] jose@titanio:~$ sudo ddrescue /dev/sdd odroidu3.img

En mi caso, el lector de tarjetas es el dispositivo /dev/sdd. Al cambo de unos minutos tendréis la copia lista. De la tarjeta microSD hacemos copia de la misma forma:

[13:30] jose@titanio:~$ sudo ddrescue /dev/sdd odroidu3_sd.img

Ya tenemos las copias hechas. Ahora grabaremos la imagen del recovery en una tarjeta microSD. Este paso no es estrictamente necesario, pero si algo va mal en el proceso (a mi me ha pasado), será nuestra tabla de salvación ya que nos permitirá restaurar el u-boot original y volver a arrancar el sistema. Ponemos la tarjeta de 1Gb en el adaptador USB y continuamos (este procedimiento, está descrito en la wiki oficial):

[14:09] jose@titanio:~$ wget -O recovery.zip https://forum.odroid.com/download/file.php?id=6005

[14:09] jose@titanio:~$ unzip recovery.zip
Archive: recovery.zip
inflating: emmc_recovery_pegasus_20140629.img

[14:10] jose@titanio:~$ sudo dd if=emmc_recovery_pegasus_20140629.img of=/dev/sdd

Hecho hecho ya podemos guardar bien esta tarjeta por si hay que hacer uso de ella (al final de la entrada explicaré como usarla, si llega el caso).

 

Descarga y compilación del kernel

Ahora nos vamos a descargar el ultimo kernel disponible, y lo vamos a compilar para nuestra Odroid U3:

apt-get update
apt-get install live-boot u-boot-tools
git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git linux_odroid
cd linux_odroid
curl -o .config http://pastebin.com/raw/NveRajaZ
make menuconfig
make prepare modules_prepare
make -j4 bzImage modules dtbs
make modules_install
cp arch/arm/boot/dts/exynos4412-odroidu3.dtb /boot/exynos4412-odroidu3_next.dtb
cp arch/arm/boot/zImage /boot/zImage_next
cp .config /boot/config-`cat include/config/kernel.release`
update-initramfs -c -k `cat include/config/kernel.release`
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-`cat include/config/kernel.release` /boot/uInitrd-`cat include/config/kernel.release`

NOTA: 03/06/2017, he añadido la última linea en el listado anterior, que se me había olvidado… 🙁

El archivo .config es el de este blog, http://rglinuxtech.com/?p=1656, os lo aconsejo, es muy muy interesante. Si lo que queréis es la configuración estándar podéis ejecutar el comando make exynos_defconfig, en lugar de bajar el de esa web.

Ahora editamos el archivo /boot/boot.txt que debe quedar más o menos así:

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage_next; fatload mmc 0:1 0x42000000 uInitrd-4.12.0-rc4-next-20170609; fatload mmc 0:1 0x44000000 exynos4412-odroidu3_next.dtb; bootz 0x40008000 0x42000000 0x44000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 root=/dev/mmcblk1p2 rootwait rw mem=2047M"
boot

¡ATENCIÓN!: La linea del bootcmd donde le decimos la imagen uInitrd-4.12.0-rc4-next-20170609 a vosotros os cambiará, dependiendo de la versión del kernel que compiléis. Si no la cambiáis por la que os corresponda, ¡no os arrancará el sistema! (la podéis ver haciendo un ls /boot).

Después de editar el archivo boot.txt, lo guardáis y generáis el boot.scr con los siguientes comandos:

cd /boot
mkimage -C none -A arm -T script -d boot.txt boot.scr
sync

 

Descarga y compilación de u-boot

Para compilar e instalar la última versión de u-boot vamos a necesitar su código fuente, así como unos binarios de Hardkernel/Samsung que nos permitirán arrancar con el secure boot (suena más complicado de lo que es). Además para instalar el u-boot, necesitaremos el módulo serie-USB y otro equipo, para cargarle los archivos usando la funcionalidad fastboot (también suena más complicado de lo que es). Vamos a ello.

Parte 1, en la Odroid:

cd /mnt/Data/upgrade
apt-get install device-tree-compiler
wget http://odroid.in/guides/ubuntu-lfs/boot.tar.gz
tar xzf boot.tar.gz
wget ftp://ftp.denx.de/pub/u-boot/u-boot-2017.05.tar.bz2
tar xjf u-boot-2017.05.tar.bz2
cd u-boot-2017.05
make odroid_config
make
cp u-boot-dtb.bin ../boot/u-boot.bin
cd ../boot

 

Ya tenemos el u-boot compilado, y todos los archivos necesarios en la ruta actual:

root@jdomo:/mnt/Data/upgrade/boot# ls -ali
total 696
312202 drwxr-xr-x 2 node-red 125 4096 dic 23 2012 .
261880 drwxr-xr-x 5 root root 4096 jun 11 18:54 ..
312203 -rw-r--r-- 1 node-red 125 16384 dic 22 2012 bl2.signed.bin
312204 -rw-r--r-- 1 node-red 125 15360 dic 22 2012 E4412_S.bl1.HardKernel.bin
312206 -rw-r--r-- 1 node-red 125 159744 dic 22 2012 E4412_S.tzsw.signed.bin
312205 -rw-r--r-- 1 node-red 125 1281 dic 23 2012 sd_fusing.sh
312207 -rw-r--r-- 1 node-red 125 504025 jun 11 18:58 u-boot.bin

Tenemos que pasarnos los archivos .bin al otro equipo, para poder cargarlos vía fastboot (los podemos pasar por SSH, con un pincho USB, o como nos venga mejor (yo uso SSH con el Midnight Commander)). Antes de continuar conectamos vía conversor serie-usb, la Odroid U3 al otro equipo (en mi caso un portátil), y también vía puerto micro USB como veis en la foto:

Resumiendo: tenemos nuestra Odroid U3, conectada al portátil con el conversor y con el cable USB. Tenemos el kernel instalado en la Odroid U3 en /boot, y los archivos del u-boot en el portátil.

Parte 2, en el otro equipo:

Antes de nada, necesitamos instalar las utilidades para subir los archivos a la Odroid a través de fastboot:

sudo apt-get install android-tools-adb android-tools-fastboot

Ahora viene el paso más aparatoso: abrimos un terminal en el portátil para conectar vía serie a la Odroid U3. Personalmente me gusta el programa picocom para estas cosas:

[19:08] jose@titanio:~$ picocom -b 115200 /dev/ttyUSB0
picocom v1.7

port is : /dev/ttyUSB0
flowcontrol : none
baudrate is : 115200
parity is : none
databits are : 8
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv
imap is :
omap is :
emap is : crcrlf,delbs,

Terminal ready

root@jdomo:~#
root@jdomo:~#
root@jdomo:~#

root@jdomo:~# uname -a
Linux jdomo 3.8.13.30 #1 SMP PREEMPT Mon Mar 9 09:23:52 UTC 2015 armv7l armv7l armv7l GNU/Linux

 

Cuando nos aparece el mensaje ‘Terminal ready‘ pulsamos varias veces el la tecla ‘Intro‘ y vemos aparecer la linea de comandos (cuando conectamos vía serie no hace falta meter el usuarios y la contraseña…). Podemos ejecutar el comando uname -a para comprobar lo viejo que es el kernel que estamos usando 🙂

Ahora hay que ser rápido, muy rápido diría yo… Vamos a reiniciar la Odroid y cuando vemos el mensaje para detener la carga del u-boot (Hit any key to stop autoboot), hay que pulsar ‘Intro‘ para que no continue y podamos entrar en el modo fastboot. Solo espera 1 segundo, hay que estar atento (de todas formas si se nos pasa el mensaje, quitamos y ponemos la corriente de la Odroid y repetimos…):

Ya estamos dentro del u-boot, ejecutamos el comando version y veremos cual es la versión que estamos usando:

Exynos4412 # version

U-Boot 2010.12-svn (May 12 2014 - 15:05:46) for Exynox4412

Ahora le instalaremos la última que acabamos de compilar (2017-05), para ello entramos en el modo fastboot, con el comando fastboot, y la Odroid U3 quedará a la espera de que le subamos los archivos desde la otra terminal en el portátil:

Exynos4412 # fastboot
[Partition table on MoviNAND]
ptn 0 name='fwbl1' start=0x1 len=N/A (use hard-coded info. (cmd: movi))
ptn 1 name='bl2' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 2 name='bootloader' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 3 name='tzsw' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 4 name='kernel' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 5 name='ramdisk' start=N/A len=0x0(~16777216KB) (use hard-coded info. (cmd: movi))
ptn 6 name='system' start=0x1 len=0x0(~-840433664KB)
OTG cable Connected!

Y desde la terminal del portátil donde tenemos la los 4 archivos .bin que habíamos copiado:

[19:30] jose@titanio:~/Escritorio/uboot$ ls -ali
total 692
17508190 drwxr-xr-x 2 root root 4096 jun 11 19:02 .
17343885 drwxr-xr-x 32 jose jose 4096 jun 11 19:26 ..
17507068 -rw-r--r-- 1 root root 16384 dic 22 2012 bl2.signed.bin
17507049 -rw-r--r-- 1 root root 15360 dic 22 2012 E4412_S.bl1.HardKernel.bin
17507067 -rw-r--r-- 1 root root 159744 dic 22 2012 E4412_S.tzsw.signed.bin
17507069 -rw-r--r-- 1 root root 504025 jun 11 18:58 u-boot.bin
[19:30] jose@titanio:~/Escritorio/uboot$ sudo fastboot flash bootloader u-boot.bin
sending 'bootloader' (492 KB)...
OKAY [ 0.056s]
writing 'bootloader'...
OKAY [ 0.129s]
finished. total time: 0.185s
[19:30] jose@titanio:~/Escritorio/uboot$ sudo fastboot flash fwbl1 E4412_S.bl1.HardKernel.bin
sending 'fwbl1' (15 KB)...
OKAY [ 0.004s]
writing 'fwbl1'...
OKAY [ 0.059s]
finished. total time: 0.063s
[19:30] jose@titanio:~/Escritorio/uboot$ sudo fastboot flash bl2 bl2.signed.bin
sending 'bl2' (16 KB)...
OKAY [ 0.005s]
writing 'bl2'...
OKAY [ 0.092s]
finished. total time: 0.097s
[19:31] jose@titanio:~/Escritorio/uboot$ sudo fastboot flash tzsw E4412_S.tzsw.signed.bin
sending 'tzsw' (156 KB)...
OKAY [ 0.025s]
writing 'tzsw'...
OKAY [ 0.079s]
finished. total time: 0.104s
[19:31] jose@titanio:~/Escritorio/uboot$ sudo fastboot reboot
rebooting...

finished. total time: 0.102s
[19:32] jose@titanio:~/Escritorio/uboot$

 

En la consola serie de la Odroid podemos ir viendo que todo va bien:

Exynos4412 # version

U-Boot 2010.12-svn (May 12 2014 - 15:05:46) for Exynox4412
Exynos4412 # fastboot
[Partition table on MoviNAND]
ptn 0 name='fwbl1' start=0x1 len=N/A (use hard-coded info. (cmd: movi))
ptn 1 name='bl2' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 2 name='bootloader' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 3 name='tzsw' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 4 name='kernel' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 5 name='ramdisk' start=N/A len=0x0(~16777216KB) (use hard-coded info. (cmd: movi))
ptn 6 name='system' start=0x1 len=0x0(~-840433664KB)
OTG cable Connected!
Starting download of 504025 bytes

downloading of 504025 bytes finished
flashing 'bootloader'
eMMC OPEN Success.!!
!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
writing bootloader..device 0 Start 62, Count 2048
MMC write: dev # 0, block # 62, count 2048 ... 2048 blocks written: OK
completed
eMMC CLOSE Success.!!

Initialize ENV Area!

MMC write: dev # 0, block # 2423, count 32 ... 32 blocks written: OK
partition 'bootloader' flashed
Starting download of 15360 bytes

downloading of 15360 bytes finished
flashing 'fwbl1'
eMMC OPEN Success.!!
!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
writing FWBL1 ..device 0 Start 0, Count 30
MMC write: dev # 0, block # 0, count 30 ... 30 blocks written: OK
completed
eMMC CLOSE Success.!!
partition 'fwbl1' flashed
Starting download of 16384 bytes

downloading of 16384 bytes finished
flashing 'bl2'
eMMC OPEN Success.!!
!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
writing BL2 ..device 0 Start 30, Count 32
MMC write: dev # 0, block # 30, count 32 ... 32 blocks written: OK
completed
eMMC CLOSE Success.!!
partition 'bl2' flashed
Starting download of 159744 bytes

downloading of 159744 bytes finished
flashing 'tzsw'
eMMC OPEN Success.!!
!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
writing 0 TrustZone S/W.. Start 2110, Count 312
MMC write: dev # 0, block # 2110, count 312 ... 312 blocks written: OK
completed
eMMC CLOSE Success.!!
partition 'tzsw' flashed
resetting ...
reset...

Justo en este momento nuestra Odroid U3 se reiniciará, y nuestro nuevo gestor de arranque u-boot, nos cargará el nuevo kernel que habíamos compilado e instalado:

U-Boot 2017.05 (Jun 11 2017 - 18:55:42 +0200)

CPU: Exynos4412 @ 1 GHz
Model: Odroid based on Exynos4412
Board: Odroid based on Exynos4412
Type: u3
DRAM: 2 GiB
LDO20@VDDQ_EMMC_1.8V: set 1800000 uV; enabling
LDO22@VDDQ_EMMC_2.8V: set 2800000 uV; enabling
LDO21@TFLASH_2.8V: set 2800000 uV; enabling
MMC: EXYNOS DWMMC: 0, SAMSUNG SDHCI: 1
*** Warning - bad CRC, using default environment

Net: No ethernet found.
Hit any key to stop autoboot: 0
reading boot.scr
450 bytes read in 2 ms (219.7 KiB/s)
## Executing script at 42000000
reading zImage_next
3914176 bytes read in 143 ms (26.1 MiB/s)
reading uInitrd-4.12.0-rc4-next-20170609
3492699 bytes read in 129 ms (25.8 MiB/s)
reading exynos4412-odroidu3_next.dtb
54884 bytes read in 8 ms (6.5 MiB/s)
Kernel image @ 0x40008000 [ 0x000000 - 0x3bb9c0 ]
## Loading init Ramdisk from Legacy Image at 42000000 ...
Image Name: uInitrd
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 3492635 Bytes = 3.3 MiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 44000000
Booting using the fdt blob at 0x44000000
Using Device Tree in place at 44000000, end 44010663

Starting kernel ...

Booting Linux on physical CPU 0xa00
Linux version 4.12.0-rc4-next-20170609 (root@jdomo) (gcc version 4.8.4 (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.3) ) #1 SMP PREEMPT Sun Jun 11 18:22:01 CEST 2017
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
OF: fdt: Machine model: Hardkernel ODROID-U3 board based on Exynos4412
Memory policy: Data cache writealloc
Reserved memory: created DMA memory pool at 0xbf700000, size 8 MiB
OF: reserved mem: initialized node region_mfc_right, compatible id shared-dma-pool
Reserved memory: created DMA memory pool at 0xbd300000, size 36 MiB
OF: reserved mem: initialized node region_mfc_left, compatible id shared-dma-pool
cma: Reserved 64 MiB at 0xb9000000
Samsung CPU ID: 0xe4412220
Running under secure firmware.
percpu: Embedded 16 pages/cpu @eefe1000 s34368 r8192 d22976 u65536
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 511232
Kernel command line: console=tty1 console=ttySAC1,115200n8 root=/dev/mmcblk1p2 rootwait rw mem=2047M
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1955016K/2051072K available (6144K kernel code, 219K rwdata, 1556K rodata, 1024K init, 283K bss, 30520K reserved, 65536K cma-reserved, 1199104K highmem)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xf0800000 - 0xff800000 ( 240 MB)
lowmem : 0xc0000000 - 0xf0000000 ( 768 MB)
pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
.text : 0xc0008000 - 0xc0700000 (7136 kB)
.init : 0xc0900000 - 0xc0a00000 (1024 kB)
.data : 0xc0a00000 - 0xc0a36d40 ( 220 kB)
.bss : 0xc0a3d8d4 - 0xc0a846bc ( 284 kB)
...

Y finalmente:

root@jdomo:~# uname -a
Linux jdomo 4.12.0-rc4-next-20170609 #1 SMP PREEMPT Sun Jun 11 18:22:01 CEST 2017 armv7l armv7l armv7l GNU/Linux

Ouhhh yeahhh!!! 🙂

 

Si algo va mal: uso del recovery

El sistema automático que nos restaura el antiguo u-boot tiene un funcionamiento muy curioso (al menos para mi):

  1. Quitamos la tarjeta eMMC
  2. Quitamos el cable microUSB
  3. Arrancamos la Odroid U3 con la tarjeta microSD del recovery (solo con ella).
  4. Cuando el led azul parpadee, conectamos la tarjeta eMMC (sí, en caliente).
  5. Conectamos el cable micro USB al portátil (conectando el cable le decimos al software del recovery que ya puede comenzar la recuperación, es como si apretáramos un interruptor…)
  6. Cuando el proceso ha terminado (unos 10 segundos), se apagará la Odroid U3.
  7. Colocamos la tarjeta microSD que teníamos originalmente, y reiniciamos la Odroid quitándole la corriente y volviéndosela a colocar.

La verdad es que es un sistema curioso, pero que funciona. El proceso esta documentado en el foro de Hardkernel, concretamente en esta entrada.

 

Reconocimientos

Esta vez, y por el trabajo increíble de recopilación y pruebas que ha hecho, no tengo mas remedio que reconocer el trabajo de Nico Maas, que en esta entrada de su blog ha recopilado toda la información necesaria para realizar el upgrade del u-boot y del kernel. Si leéis su entrada veréis que no coincide exactamente con la mía, ya que cada sistema es un mundo, incluso aunque la placa sea la misma. En su entrada tenéis, como ampliación, como compilar e instalar el módulo que hace que el ventilador de la Odroid U3 funcione (no lo voy a copiar aquí). ¡Muchísimas gracias Nico Maas por compartir tu experiencia!

 

6 comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.