Método básico de edición de device tree en Beagle Bone

Cómo obtener el directorio que contiene archivos de device tree

Las distribuciones de Linux tienen un directorio en el que se almacenan los device tree en formato binario con extensión dtb. El objetivo es modificar el device tree para que en vez de usar el controlador de dispositivo estándar para un periférico, el sistema use nuestro controlador.

Lamentablemente las diferentes distribuciones usan su propio directorio para almacenar los archivos dtb. Por ejemplo, en versiones modernas de Debian el directorio es /boot/dtbs/<versión kernel>.

Si no existe ese directorio, lo más conveniente es ir al directorio raíz, y logueado como root, ejecutar el comando find -name *.dtb. En general habrá un solo directorio con archivos dtb. Si no es así, habrá que elegir el que incluya el texto dtbs dentro del nombre de directorio.

A partir de este momento suponemos que el directorio actual es el que contiene los archivos dtb.

Editando el device tree

Para poder editar el device tree, necesitamos convertir el formato binario a texto. Eso se logra mediante el comando dtc:

dtc -I dtb -O dts -o am335x.dts am335x-boneblack.dtb

La opción -I indica el formato de entrada (binario), la opción -O el formato de salida (texto) y la opción -o el archivo de salida.

Suponiendo que queremos escribir un controlador de dispositivos que maneje el I2C número 2, que de acuerdo al manual del procesador Sitara AM3359 se encuentra en la dirección física 0x4819c000, debemos buscar la cadena @4819c000 y luego reemplazamos la entrada para que quede de la siguiente manera:

i2c_td3@4819c000 {
  compatible = "td3,omap4-i2c";
  #address-cells = <0x1>;
  #size-cells = <0x0>;
  ti,hwmods = "i2c3";
  reg = <0x4819c000 0x1000>;
  interrupts = <0x1e>;
   .
   .
   .
  }
 

Las líneas modificadas son aquéllas que incluyen el texto td3.

Una vez realizada la modificación, salvamos el archivo dts.

Generación del nuevo archivo binario de device tree

Al arrancar el sistema, Linux puede obtener información para el device tree de otros archivos dtb. Para no tener ese inconveniente, borramos todos los archivos dtb de Beagle Bone mediante el comando rm *beaglebone*.dtb.

Para generar el nuevo archivo dtb en base al fuente que acabamos de modificar ejecutamos:

dtc -I dts -O dtb -o am335x-boneblack.dtb am335x.dts

En este caso el formato de entrada es texto (dts) y de salida en binario (dtb).

Verificación de nuestros cambios en el device tree

Una vez generado el archivo binario am335x-boneblack.dtb, reseteamos el Beagle Bone. Para probar que el cambio anduvo bien, vamos al directorio /proc/device-tree/ocp y ejecutamos el comando ls | grep -i td3 i2c_td3@4819c000. Si está todo bien, debería aparecer la entrada del device tree en pantalla.

Es sumamente importante seguir los pasos como se indica en este instructivo, ya que si se modifica incorrectamente el device tree, corremos el riesgo de que el Beagle Bone no arranque.

Método alternativo de edición de device tree en Beagle Bone

Se deben repetir los pasos 1 y 2 pero el dtb modificado se guarda con un nombre no default (por ejemplo td3-BBB.dtb)

Desactivación de los dtbo y elección del dtb a cargar

Se abre el archivo uEnv.txt dentro de la carpeta /boot/ [para debian] y se modifican las siguientes líneas:

Se comenta la siguiente línea:

#enable_uboot_overlays=1

Se eliminan los comentarios de las siguientes líneas:

disable_uboot_overlay_emmc=1

disable_uboot_overlay_video=1

disable_uboot_overlay_audio=1

disable_uboot_overlay_wireless=1

disable_uboot_overlay_adc=1

Se agrega la siguiente línea (se puede usar otro nombre pero siempre que se respete en el dtb generado):

dtb=td3-BBB.dtb

Resultado

Si todo salío bien el kernel realizará el boot con el nuevo dtb elegido y sin los dtbo. La verificación se realiza del mismo modo que en el procedimiento anterior

U-Boot SPL 2017.09-rc2-00002-g7c9353e752 (Aug 31 2017 - 09:25:14)

Trying to boot from MMC1

U-Boot 2017.09-rc2-00002-g7c9353e752 (Aug 31 2017 - 09:25:14 -0500), Build: jenkins-github_Bootloader-Builder-596

CPU : AM335X-GP rev 2.1

I2C: ready

DRAM: 512 MiB

No match for driver 'omap_hsmmc'

No match for driver 'omap_hsmmc'

Some drivers were not found

Reset Source: Power-on reset has occurred.

MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1

Using default environment

Checking for: /uEnv.txt …

Checking for: /boot.scr …

Checking for: /boot/boot.scr …

Checking for: /boot/uEnv.txt …

gpio: pin 55 (gpio 55) value is 1

2051 bytes read in 56 ms (35.2 KiB/s)

Loaded environment from /boot/uEnv.txt

debug: [dtb=td3-BBB.dtb] … Using: dtb=td3-BBB.dtb …

Checking if uname_r is set in /boot/uEnv.txt…

gpio: pin 56 (gpio 56) value is 1

Running uname_boot …

loading /boot/vmlinuz-4.9.45-ti-r57 …

9464664 bytes read in 645 ms (14 MiB/s)

loading /boot/dtbs/4.9.45-ti-r57/td3-BBB.dtb ...

56827 bytes read in 131 ms (422.9 KiB/s)

uboot_overlays: add [enable_uboot_overlays=1] to /boot/uEnv.txt to enable…

loading /boot/initrd.img-4.9.45-ti-r57 …

5908180 bytes read in 426 ms (13.2 MiB/s)

debug: [console=ttyO0,115200n8 root=/dev/mmcblk0p1 ro rootfstype=ext4 rootwait coherent_pool=1M net.ifnames=0 quiet] …

debug: [bootz 0x82000000 0x88080000:5a26d4 0x88000000] …

## Flattened Device Tree blob at 88000000

 Booting using the fdt blob at 0x88000000
 
 Loading Ramdisk to 8fa5d000, end 8ffff6d4 ... OK
 
 Loading Device Tree to 8fa4c000, end 8fa5cdfa ... OK
 

Starting kernel …

[ 0.000848] clocksource_probe: no matching clocksources found

[ 2.305683] wkup_m3_ipc 44e11324.wkup_m3_ipc: could not get rproc handle

[ 2.432383] cpu cpu0: “ti,syscon-efuse” is missing, cannot use OPPv2 table.

[ 2.525903] ti_emif_sram 4c000000.emif: Unable to get sram pool for ocmcram data

[ 2.545563] omap_voltage_late_init: Voltage driver support not added

Debian GNU/Linux 9 beaglebone ttyS0

BeagleBoard.org Debian Image 2017-08-31

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

default username:password is [debian:temppwd]''