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.

No hay comentarios.:

Publicar un comentario