martes, 28 de julio de 2015

Configurar los pines gpio para usar con Machinekit.

Para poder utilizar los pines gpio de la Beaglebone Black con Machinekit es necesario definir si estos se van a usar como entradas o salidas. Para esto se usa un script que es el encargado de verificar si se puden o no usar los pines definidos, hay que revisar el archivo DTBO creado en el anterior tutorial para saber cuales son los pines que estan libres y no tener conflicto con los que usa el LCD.

dtbo_err () {
 echo "Error loading device tree overlay file: $DTBO" >&2
 exit 1
}

pin_err () {
 echo "Error exporting pin:$PIN" >&2
 exit 1
}

dir_err () {
 echo "Error setting direction:$DIR on pin:$PIN" >&2
 exit 1
}  

Las funciones dtbo_err, pin_err y dir_err son las encargadas de lanzar un mensaje de error si algo se configuro mal. La primera función indica si existe el DTBO que se pretende cargar, la segunda si se puede exporta el pin que el ususario a asigando y el tercero si el pin permite usarse como entrada o salida (bidireccional).

SLOTS=/sys/devices/bone_capemgr.*/slots

SLOTS es el path (dirección de la ruta) donde se cargan los archivos DTBO, con esto se verifica si se encuentra o no el archivo DTBO que se requiere para usar con Machinekit.

El siguiente código es el encargado de cargar el archivo BBB-LCNC-MF5 en /sys/devices/bone_capemgr.*/slots, si se ha cargado correctamente muestra el mensaje overlay found, caso contrario lanza el error de la función dtbo_err y finaliza el proceso.

# Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do

 if grep -q $DTBO $SLOTS ; then
  echo $DTBO overlay found
 else
  echo Loading $DTBO overlay
  sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
  sleep 1
 fi
done;

if [ ! -r /sys/class/uio/uio0 ] ; then
 echo PRU control files not found in /sys/class/uio/uio0 >&2
 exit 1;
fi

El siguiente código indica si se han exportado todos los pines designados y si se pueden usar o como entradas o salidas.

Para entradas in y para salida out en dos modos high o low.

Para más información revisar el siguiente link http://www.armhf.com/using-beaglebone-black-gpios/.

# Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules.  There is probably a better way to do this...
while read PIN DIR JUNK ; do
        case "$PIN" in
        ""|\#*) 
  continue ;;
        *)
  [ -r /sys/class/gpio/gpio$PIN ] && continue
                sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
  sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
                ;;
        esac

done <<- EOF

La última parte de la configuración es definir cuales son los pines que se van a usar, los que estan con el símbolo de numeral son pines comentados que ayudan a ver cuales son los pines que pertenecen a otras funciones como los del LCD (HDMI), alimentación, eMMC, etc.

#     # J8.1 GND
#     # J8.2 GND
# eMMC pins     J8.3
#     thru 
#     J8.6
 66 in # J8.7  gpio2_2 -> X Max 
 67 in # J8.8  gpio2_3 -> X Min 
 69 in # J8.9  gpio2_5 -> Y Max 
 67 in # J8.10 gpio2_4 -> Y Min 
 45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
 44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
 23 out # J8.13 gpio0_23-> E0 Step
 26 out # J8.14 gpio0_26-> E1 Dir
 47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
 46 in # J8.16 gpio1_14-> Encoder EQEP2_index
 27 in # J8.17 gpio0_27-> Estop
 65 out # J8.18 gpio2_1 -> Led
 22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins     J8.20 
#     thru 
#     J8.25

 61 out # J8.26 gpio1_29-> ESTOP Out

# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins 

 30 in # J9.11 gpio0_30-> Z Max
 60 out # J9.12 gpio1_28-> E0 Dir
 31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
 48 out # J9.15 gpio1_16-> FET 2 : E0
 51 out # J9.16 gpio1_19-> PWM lathe
# 5  # J9.17 gpio0_5 -> spi0_cs0
# 4  # J9.18 gpio0_4 -> spi0_d1
#   # J9.19 gpio0_13-> EEPROM/I2C
#   # J9.20 gpio0_12-> EEPROM/I2C
# 3  # J9.21 gpio0_3 -> spi0_d0
# 2  # J9.22 gpio0_2 -> spi0_sclk
 49 out # J9.23 gpio1_17-> Machine Power
 15 out # J9.24 gpio0_15-> E1 Step
 117 out # J9.25 gpio3_21-> A Dir
 14 out # J9.26 gpio0_14 -> FET 1 : E1
 115 out # J9.27 gpio3_19-> Z Dir
 113 out # J9.28 gpio3_17-> Y Dir
 111 out # J9.29 gpio3_15-> X Dir
 112 out # J9.30 gpio3_16-> Y Step
 110 out # J9.31 gpio3_14-> X Step
#   # J9.32 VADC
#   # J9.33 AIN4
#   # J9.34 GND
#   # J9.35 AIN6
#   # J9.36 AIN5
#   # J9.37 lcd-> AIN2 Y+
#   # J9.38 lcd-> AIN3 Y-
#   # J9.39 lcd-> AIN0 X+
#   # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20    set = in => other signal on pin used
 116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7     set = in => other signal on pin used
 114 out # J9.42 gpio3_18-> Z Step
EOF

Esta es la forma más directa de configurar los pines pero ahora se usa la cape-universal y cape-bone-iio en la mayoría de configuraciones ARM como la CRAMPS, Probotix, PocketNC, Xylotex, etc.

La cape-universal contiene toda la información de los pines para configurarlos a estos como PRUS, in, low, high, pull up, pull down, etc. Para poder usar la cape-universal con el LCD hay que modificar los pines que tengan conflicto, para hacelo viene el archivo .dts en la carpeta /opt/source/beaglebone-universal-io y también hay que revisar el archivo config-pin que contiene toda la información de las capas que estan en la ruta anteriormente mencionada.

https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/CRAMPS/setup.sh
https://github.com/cdsteinkuehler/beaglebone-universal-io/blob/master/config-pin
https://github.com/cdsteinkuehler/beaglebone-universal-io

El usar el DTBO cape-bone-iio con el LCD presenta conflictos ya que el LCD usa los pines análogos de la beaglebone black para poder reconocer la posición donde se ha pulsado en la pantalla táctil del LCD.

Las placas como la CRAMPS vienen con una eeprom que se encarga de cargar de forma automática los pines configurados, carga la cape-universal y la cape-bone-iio desde la eeprom cuando bootea la Beaglebone Black.

La solución es usar comunicación SPI o I2C con dispositivos externos para la lectura de temperatura.
En el avance de los tutoriales explicare como utilizar y configurarlos en Machinekit.
 
Para poder designar el registro al que pertenece cada pin se debe aplicar la siguiente fórmula:
Pin Kernel => ((gpio_bank)*32)+gpio_pin

Ejemplo:

J8.7 => GPIO2_2
J8.7=> ((2)*32)+2
J8.7=>  66

J8.17 => GPIO0_27
J8.17 => ((0)*32)+27
J8.17 => 27

J9.42 => GPIO3_18
J9.42 => ((3)*32)+18
J9.42 => 114

En el archivo de excel que deje en el anterior tutorial esta calculado el registro de cada pin en las hojas LinuxCNC Pins P8 y LinuxCNC Pins P9, dejo el link abajo.
BBB_Pins
Descarga.
BBB_Pins.rar 

El código  completo que he personalizado es el siguiente:

#!/bin/bash
#This source file is provided under MIT License terms.
#Copyright (c) 2013 Calypso Ventures, Inc.
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.

dtbo_err () {
 echo "Error loading device tree overlay file: $DTBO" >&2
 exit 1
}

pin_err () {
 echo "Error exporting pin:$PIN" >&2
 exit 1
}

dir_err () {
 echo "Error setting direction:$DIR on pin:$PIN" >&2
 exit 1
}

SLOTS=/sys/devices/bone_capemgr.*/slots

# Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do

 if grep -q $DTBO $SLOTS ; then
  echo $DTBO overlay found
 else
  echo Loading $DTBO overlay
  sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
  sleep 1
 fi
done;

if [ ! -r /sys/class/uio/uio0 ] ; then
 echo PRU control files not found in /sys/class/uio/uio0 >&2
 exit 1;
fi

# Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules.  There is probably a better way to do this...
while read PIN DIR JUNK ; do
        case "$PIN" in
        ""|\#*) 
  continue ;;
        *)
  [ -r /sys/class/gpio/gpio$PIN ] && continue
                sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
  sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
                ;;
        esac

done <<- EOF
#     # J8.1 GND
#     # J8.2 GND
# eMMC pins     J8.3
#     thru 
#     J8.6
 66 in # J8.7  gpio2_2 -> X Max 
 67 in # J8.8  gpio2_3 -> X Min 
 69 in # J8.9  gpio2_5 -> Y Max 
 67 in # J8.10 gpio2_4 -> Y Min 
 45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
 44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
 23 out # J8.13 gpio0_23-> E0 Step
 26 out # J8.14 gpio0_26-> E1 Dir
 47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
 46 in # J8.16 gpio1_14-> Encoder EQEP2_index
 27 in # J8.17 gpio0_27-> Estop
 65 out # J8.18 gpio2_1 -> Led
 22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins     J8.20 
#     thru 
#     J8.25

 61 out # J8.26 gpio1_29-> ESTOP Out

# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins 

 30 in # J9.11 gpio0_30-> Z Max
 60 out # J9.12 gpio1_28-> E0 Dir
 31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
 48 out # J9.15 gpio1_16-> FET 2 : E0
 51 out # J9.16 gpio1_19-> PWM lathe
# 5  # J9.17 gpio0_5 -> spi0_cs0
# 4  # J9.18 gpio0_4 -> spi0_d1
#   # J9.19 gpio0_13-> EEPROM/I2C
#   # J9.20 gpio0_12-> EEPROM/I2C
# 3  # J9.21 gpio0_3 -> spi0_d0
# 2  # J9.22 gpio0_2 -> spi0_sclk
 49 out # J9.23 gpio1_17-> Machine Power
 15 out # J9.24 gpio0_15-> E1 Step
 117 out # J9.25 gpio3_21-> A Dir
 14 out # J9.26 gpio0_14 -> FET 1 : E1
 115 out # J9.27 gpio3_19-> Z Dir
 113 out # J9.28 gpio3_17-> Y Dir
 111 out # J9.29 gpio3_15-> X Dir
 112 out # J9.30 gpio3_16-> Y Step
 110 out # J9.31 gpio3_14-> X Step
#   # J9.32 VADC
#   # J9.33 AIN4
#   # J9.34 GND
#   # J9.35 AIN6
#   # J9.36 AIN5
#   # J9.37 lcd-> AIN2 Y+
#   # J9.38 lcd-> AIN3 Y-
#   # J9.39 lcd-> AIN0 X+
#   # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20    set = in => other signal on pin used
 116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7     set = in => other signal on pin used
 114 out # J9.42 gpio3_18-> Z Step
EOF

miércoles, 22 de julio de 2015

Device Tree Overlay personalizada para Machinekit y LCD 7"

El Device Tree Overlay que se explicará a continuación, permite definir cuales son los pines que se pueden usar en Machinekit y cuales se deben comentar para que no interfieran con el DTO compilado del LCD (DVK530-LCD7-01-00A1.dtbo).

El archivo .dts que se indicará a continuación esta basado en la configuración de PMDX-432 de la Beaglebone Black. El Device Tree Overlay de PMDX-432 se llama

BB-BLACK-LCNC-K9-00A0.dts.

Las dos primeras lineas indican cuál es la versión del dts y que el archivo es un plugin, el corchete indica el punto de inicio del programa, compatible es el que va a determinar con que plataformas funcionara el DT  Overlay  y la parte de identification es el nombre y la versión con la que aparecera nuestro DT Overlay.


/dts-v1/;
/plugin/;

/ {
 compatible = "ti,beaglebone", "ti,beaglebone-black";

 /* identification */
 part-number = "BBB-LCNC-MF5";
 version = "00A0";  

En exclusive-use se pone todos los pines que se desea utilizar y para poder guiarse se pueden comentar los que no se van a usar, en este pedaso de código los gpio que ocupa la emmc de la beaglebone black se usa porque carga el S.O. Linux Debian desde la emmc pero si no se usara la emmc tranquilamente se podría deshabilitar del archivo /boot/uEnv.txt y descomenta los pines de la eMMC.

Los pines nombrados como Libre son los que están disponibles para usar con Machinekit y que no interfieren con la pantalla LCD, pero pueden interferir con otros pines usados en comunicación SPI o I2C o UART. Si se pretende usar esos pines con otros dts se los debe comentar.

 /* state the resources this cape uses */
 exclusive-use =
  /* the pin header uses */
/*  "J8.3",        gpio1_6  eMMC*/
/*  "J8.4",        gpio1_7  eMMC*/
/*  "J8.5",        gpio1_2  eMMC*/
/*  "J8.6",        gpio1_3  eMMC*/
  "J8.7",     /* gpio2_2 -> Libre*/
  "J8.8",     /* gpio2_3 -> Libre*/
  "J8.9",     /* gpio2_5 -> Libre*/
  "J8.10",    /* gpio2_4 -> Libre*/
  "J8.11",    /* gpio1_13-> lcd R1 -> Libre*/

En la parte de "the hardware IP uses" se ponen los mismos pines que se utilizan en "the pin header uses", como se ve en el pedazo de código gpio1_6, gpio1_7, gpio1_2, gpio1_3; pertenecen a los pines J8.3, J8.4, J8.5 y J8.6 respectivamente, pero estos no se usaran ya que estan comentados. Los demás son los que funcionarán con Machinekit.

  /* the hardware IP uses */
/*  "gpio1_6", */
/*  "gpio1_7", */
/*  "gpio1_2", */
/*  "gpio1_3", */
  "gpio2_2", 
  "gpio2_3", 
  "gpio2_5",  
  "gpio2_4", 
  "gpio1_13", 

En fragment se pone cuales van a ser las funciones que van a realizar los pines habilitados en "exclusive-use", "target" hace referencia al microcontrolador que usa la beaglebone y beaglebone black. "__overlay__" se usa para dar inicio a los pines que van a ser usados según el registro y tipo de modo que se desee.

fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {

"MF5_gpio_pins: MF5_gpio_pins" es el nombre que se le va a dar todo el grupo de pines que se usaran en este DT Overlay. El siguiente archivo que he subido BBB-Pins, contiene la información de las direcciones de los pines y calcula el modo del pin. Descarga: BB-Pins.rar.

La primera columna indica la dirección de los pines esta se calcula con el register offset 44e10*** con una base de 0x800. si el register offset del pin J8.3 es 0x818 (44e10818) y de base siempre se tiene 0x800 (44e10800), entonces se resta el 0x818 - 0x800 = 0x018. El segundo valor de la columna es el modo con el cuál se quiere configurar el pin existen 8 tipos de modos los cuales se indica en el documento de excel. Como utilizár estos indicaré en otro tutorial, por el momento dejando a los pines con el modo default 0x3F funciona perfectamente.
 
MF5_gpio_pins: MF5_gpio_pins {
    pinctrl-single,pins = <
/*     0x018     mmc      J8.3   gpio1_6  */       
/*     0x01C     mmc      J8.4   gpio1_7  */       
/*     0x008     mmc      J8.5   gpio1_2  */       
/*     0x00C     mmc      J8.6   gpio1_3  */       
     0x090     0x3F  /* J8.7   gpio2_2  */       
     0x094     0x3F  /* J8.8   gpio2_3  */       
     0x09C     0x3F  /* J8.9   gpio2_5  */       
     0x098     0x3F  /* J8.10  gpio2_4  */       
     0x034     0x3F  /* J8.11  gpio1_13 */       
     0x030     0x3F  /* J8.12  gpio1_12 */       
     0x024     0x3F  /* J8.13  gpio0_23 */   

El último fragmento es el que habilita toda la configuración que se ha realizado anteriormente en "

pinctrl-0" se pone el mismo nombre que se utilizó para el grupo de pines del DT Overlay.


fragment@1 {
        target = <&pruss>;
        __overlay__ {
            status = "okay";

            pinctrl-names = "default";
            pinctrl-0 = <&MF5_gpio_pins>;

        };
    };

Código completo del .dts

//This source file is provided under MIT License terms.
//Copyright (c) 2013 Calypso Ventures, Inc.
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

/dts-v1/;
/plugin/;

/ {
 compatible = "ti,beaglebone", "ti,beaglebone-black";

 /* identification */
 part-number = "BBB-LCNC-MF5";
 version = "00A0";

 /* state the resources this cape uses */
 exclusive-use =
  /* the pin header uses */
/*  "J8.3",        gpio1_6  eMMC*/
/*  "J8.4",        gpio1_7  eMMC*/
/*  "J8.5",        gpio1_2  eMMC*/
/*  "J8.6",        gpio1_3  eMMC*/
  "J8.7",     /* gpio2_2 -> Libre*/
  "J8.8",     /* gpio2_3 -> Libre*/
  "J8.9",     /* gpio2_5 -> Libre*/
  "J8.10",    /* gpio2_4 -> Libre*/
  "J8.11",    /* gpio1_13-> lcd R1 -> Libre*/
  "J8.12",    /* gpio1_12-> lcd G1 -> Libre*/
  "J8.13",    /* gpio0_23-> lcd G0 -> Libre*/
  "J8.14",    /* gpio0_26-> lcd R0 -> Libre*/
  "J8.15",    /* gpio1_15-> lcd R2 -> Libre*/
  "J8.16",    /* gpio1_14-> lcd B2 -> Libre*/
  "J8.17",    /* gpio0_27-> lcd B1 -> Libre*/
  "J8.18",    /* gpio2_1 -> Libre*/
  "J8.19",    /* gpio0_22-> lcd B0 -> Libre*/
/*  "J8.20",       gpio1_31  eMMC*/
/*  "J8.21",       gpio1_30  eMMC*/
/*  "J8.22",       gpio1_5   eMMC*/
/*  "J8.23",       gpio1_4   eMMC*/
/*  "J8.24",       gpio1_1   eMMC*/
/*  "J8.25",       gpio1_0   eMMC*/
  "J8.26",    /* gpio1_29-> Libre*/
/*  "J8.27",       gpio2_22-> lcd VSYNC*/
/*  "J8.28",       gpio2_24-> lcd PCLK*/
/*  "J8.29",       gpio2_23-> lcd HSYNC*/
/*  "J8.30",       gpio2_25-> lcd DE*/
/*  "J8.31",       gpio0_10-> lcd B6*/
/*  "J8.32",       gpio0_11-> lcd B7*/
/*  "J8.33",       gpio0_9 -> lcd B5*/
/*  "J8.34",       gpio2_17-> lcd B3*/
/*  "J8.35",       gpio0_8 -> lcd B4*/
/*  "J8.36",       gpio2_16-> lcd G7*/
/*  "J8.37",       gpio2_14-> lcd G5*/
/*  "J8.38",       gpio2_15-> lcd G6*/
/*  "J8.39",       gpio2_12-> lcd G3*/
/*  "J8.40",       gpio2_13-> lcd G4*/
/*  "J8.41",       gpio2_10-> lcd R7*/
/*  "J8.42",       gpio2_11-> lcd G2*/
/*  "J8.43",       gpio2_8 -> lcd R5*/
/*  "J8.44",       gpio2_9 -> lcd R6*/
/*  "J8.45",       gpio2_6 -> lcd R3*/
/*  "J8.46",       gpio2_7 -> lcd R4*/
  
  "J9.11",    /* gpio0_30-> Libre*/
  "J9.12",    /* gpio1_28-> Libre*/
  "J9.13",    /* gpio0_31-> Libre*/
/*  "J9.14",       gpio1_18-> LCD ehrpwm1A*/
  "J9.15",    /* gpio1_16-> Libre*/ 
  "J9.16",    /* gpio1_19-> Libre*/
  "J9.17",    /* gpio0_5 -> Libre*/
  "J9.18",    /* gpio0_4 -> Libre*/
/*  "J9.19",       gpio0_13-> EEPROM/I2C*/
/*  "J9.20",       gpio0_12-> EEPROM/I2C*/
  "J9.21",    /* gpio0_3 -> Libre*/
  "J9.22",    /* gpio0_2 -> Libre*/
  "J9.23",    /* gpio1_17-> Libre*/
  "J9.24",    /* gpio0_15-> Libre*/
  "J9.25",    /* gpio3_21-> Libre*/
  "J9.26",    /* gpio0_14-> Libre*/
  "J9.27",    /* gpio3_19-> Libre*/
  "J9.28",    /* gpio3_17-> Libre*/
  "J9.29",    /* gpio3_15-> Libre*/
  "J9.30",    /* gpio3_16-> Libre*/
  "J9.31",    /* gpio3_14-> Libre*/
  "J9.41",    /* gpio3_20-> Libre*/
  "J9.42",    /* gpio3_18-> Libre*/
  
  /* the hardware IP uses */
/*  "gpio1_6", */
/*  "gpio1_7", */
/*  "gpio1_2", */
/*  "gpio1_3", */
  "gpio2_2", 
  "gpio2_3", 
  "gpio2_5",  
  "gpio2_4", 
  "gpio1_13", 
  "gpio1_12", 
  "gpio0_23", 
  "gpio0_26", 
  "gpio1_15", 
  "gpio1_14", 
  "gpio0_27", 
  "gpio2_1", 
  "gpio0_22", 
/*  "gpio1_31", */
/*  "gpio1_30", */
/*  "gpio1_5", */
/*  "gpio1_4", */
/*  "gpio1_1", */
/*  "gpio1_0", */
  "gpio1_29", 
/*  "gpio2_22", */
/*  "gpio2_24", */
/*  "gpio2_23", */
/*  "gpio2_25", */
/*  "gpio0_10", */
/*  "gpio0_11", */
/*  "gpio0_9", */
/*  "gpio2_17", */
/*  "gpio0_8", */
/*  "gpio2_16", */
/*  "gpio2_14", */
/*  "gpio2_15", */
/*  "gpio2_12", */
/*  "gpio2_13", */
/*  "gpio2_10", */
/*  "gpio2_11", */
/*  "gpio2_8", */
/*  "gpio2_9", */
/*  "gpio2_6", */
/*  "gpio2_7", */
  
  "gpio0_30",
  "gpio1_28",
  "gpio0_31",
/*  "gpio1_18", */
  "gpio1_16",
  "gpio1_19", 
  "gpio0_5",
  "gpio0_4",
/*  "gpio0_13", */
/*  "gpio0_12", */
  "gpio0_3", 
  "gpio0_2",
  "gpio1_17",
  "gpio0_15",
  "gpio3_21",
  "gpio0_14",
  "gpio3_19",
  "gpio3_17",
  "gpio3_15",
  "gpio3_16",
  "gpio3_14",
  "gpio3_20",
  "gpio3_18", 
  
  "pru0";

 fragment@0 {
  target = <&am33xx_pinmux>;
  __overlay__ {

   MF5_gpio_pins: MF5_gpio_pins {
    pinctrl-single,pins = <
/*     0x018     mmc      J8.3   gpio1_6  */       
/*     0x01C     mmc      J8.4   gpio1_7  */       
/*     0x008     mmc      J8.5   gpio1_2  */       
/*     0x00C     mmc      J8.6   gpio1_3  */       
     0x090     0x3F  /* J8.7   gpio2_2  */       
     0x094     0x3F  /* J8.8   gpio2_3  */       
     0x09C     0x3F  /* J8.9   gpio2_5  */       
     0x098     0x3F  /* J8.10  gpio2_4  */       
     0x034     0x3F  /* J8.11  gpio1_13 */       
     0x030     0x3F  /* J8.12  gpio1_12 */       
     0x024     0x3F  /* J8.13  gpio0_23 */       
     0x028     0x3F  /* J8.14  gpio0_26 */       
     0x03C     0x3F  /* J8.15  gpio1_15 */       
     0x038     0x3F  /* J8.16  gpio1_14 */       
     0x02C     0x3F  /* J8.17  gpio0_27 */       
     0x08C     0x3F  /* J8.18  gpio2_1  */       
     0x020     0x3F  /* J8.19  gpio0_22 */       
/*     0x084     mmc      J8.20  gpio1_31 */       
/*     0x080     mmc      J8.21  gpio1_30 */       
/*     0x014     mmc      J8.22  gpio1_5  */       
/*     0x010     mmc      J8.23  gpio1_4  */       
/*     0x004     mmc      J8.24  gpio1_1  */       
/*     0x000     mmc      J8.25  gpio1_0  */       
     0x07C     0x3F  /* J8.26  gpio1_29 */       
/*     0x0E0     0x3F     J8.27  gpio2_22 */       
/*     0x0E8     0x3F     J8.28  gpio2_24 */       
/*     0x0E4     0x3F     J8.29  gpio2_23 */       
/*     0x0EC     0x3F     J8.30  gpio2_25 */       
/*     0x0D8     0x3F     J8.31  gpio0_10 */       
/*     0x0DC     0x3F     J8.32  gpio0_11 */       
/*     0x0D4     0x3F     J8.33  gpio0_9  */       
/*     0x0CC     0x3F     J8.34  gpio2_17 */       
/*     0x0D0     0x3F     J8.35  gpio0_8  */       
/*     0x0C8     0x3F     J8.36  gpio2_16 */       
/*     0x0C0     0x3F     J8.37  gpio2_14 */       
/*     0x0C4     ???      J8.38  gpio2_15 */       
/*     0x0B8     0x3F     J8.39  gpio2_12 */       
/*     0x0BC     0x3F     J8.40  gpio2_13 */       
/*     0x0B0     0x3F     J8.41  gpio2_10 */       
/*     0x0B4     0x3F     J8.42  gpio2_11 */       
/*     0x0A8     0x3F     J8.43  gpio2_8  */       
/*     0x0AC     0x3F     J8.44  gpio2_9  */       
/*     0x0A0     0x3F     J8.45  gpio2_6  */       
/*     0x0A4     0x3F     J8.46  gpio2_7  */       
                                   
     0x070     0x3F  /* J9.11  gpio0_30 */       
     0x078     0x3F  /* J9.12  gpio1_28 */       
     0x074     0x3F  /* J9.13  gpio0_31 */       
/*     0x048     0x3F     J9.14  gpio1_18 */       
     0x040     0x3F  /* J9.15  gpio1_16 */       
     0x04C     0x3F  /* J9.16  gpio1_19 */       
     0x15C     0x3F  /* J9.17  gpio0_5  */       
     0x158     0x3F  /* J9.18  gpio0_4  */       
/*     0x17C     N/C      J9.19  gpio0_13 */       
/*     0x178     N/C      J9.20  gpio0_12 */       
     0x154     0x3F  /* J9.21  gpio0_3  */       
     0x150     0x3F  /* J9.22  gpio0_2  */       
     0x044     0x3F  /* J9.23  gpio1_17 */       
     0x184     0x3F  /* J9.24  gpio0_15 */       
     0x1AC     0x3F  /* J9.25  gpio3_21 */       
     0x180     0x3F  /* J9.26  gpio0_14 */       
     0x1A4     0x3F  /* J9.27  gpio3_19 */       
     0x19C     0x3F  /* J9.28  gpio3_17 */       
     0x194     0x3F  /* J9.29  gpio3_15 */       
     0x198     0x3F  /* J9.30  gpio3_16 */       
     0x190     0x3F  /* J9.31  gpio3_14 */          
     0x1A8     0x3F  /* J9.41  gpio3_20 */       
     0x1A0     0x3F  /* J9.42  gpio3_18  */       
    >;
   };
  };
 };

 fragment@1 {
  target = <&pruss>;
  __overlay__ {
   status = "okay";

   pinctrl-names = "default";
   pinctrl-0 = <&MF5_gpio_pins>;

  };
 };
};

Para probarlo crear un archivo llamado BBB-LCNC-MF5-00A0.dts y pegar toda la info de arriba.

touch BBB-LCNC-MF5-00A0.dts
nano BBB-LCNC-MF5-00A0.dts

El siguiente código es un script para compilar el archivo .dts y copiarlo a /lib/firmware.

#!/bin/sh
#This source file is provided under MIT License terms.
#Copyright (c) 2013 Calypso Ventures, Inc.
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.

dtc -O dtb -o BBB-LCNC-MF5-00A0.dtbo -b 0 -@ BBB-LCNC-MF5-00A0.dts && \
cp BBB-LCNC-MF5-00A0.dtbo /lib/firmware/

Para ejecutarlo poner en la misma carpeta que el archivo BBB-LCNC-MF5-00A0.dts.

touch dtc.sh
nano dtc.sh 
(pegar codigo script)
sudo ./dtc.sh

Por ultimo ejecutar el Device Tree Overlay creado.

sudo su
cd /lib/firmware
echo BBB-LCNC-MF5 > /sys/devices/bone_capemgr.*/slots
cd /sys/kernel/debug/pinctrl/44e10800.pinmux
cat pinmux-pins | more

Si todo funcionó perfectamente se verán todos los pines que estan habilitados como los del LCD y BBB-LCNC-MF5.

El siguiente tutorial es como se logra la configuración para exportar los pines como entradas o salidas y utilizarlos con Machinekit (LinuxCNC), estos pines funcionarán en base al DT Overlay creado en este tutorial.