martes, 21 de julio de 2015

Device Tree Overlays con LCD de 7" (waveshare)

En este tutorial se va a enseñar como configurar los pines que utiliza el LCD junto con los pines que van a ser usados para controlar las señales que van a funcionar con Machinekit (LinuxCNC) para controladores de motores, sensores, leds, ventiladores, etc. Esto permite que no haya conflictos al momento de utilizar el LCD junto con Machinekit.

La siguiente imagen representa el esquema del circuito que utiliza el LCD de waveshare, los pines que están dentro del recuadro de color rojo son los que conectan el LCD de 7" a la Beaglebone Black.



Para estar seguro que solo esos son los pines que usa el LCD hay que tambien revisar  el .dts del LCD (DVK530-LCD7-01-00A0.dts), este es uno de los archivos que están dentro del archivo rar que se puede descargar del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit.

Esta es una parte del archivo  DVK530-LCD7-01-00A0.dts donde indica que pines usa el LCD de 7 pulgadas.

  "P8.45", /* lcd: lcd_data0 */
  "P8.46", /* lcd: lcd_data1 */
  "P8.43", /* lcd: lcd_data2 */
  "P8.44", /* lcd: lcd_data3 */
  "P8.41", /* lcd: lcd_data4 */
  "P8.42", /* lcd: lcd_data5 */
  "P8.39", /* lcd: lcd_data6 */
  "P8.40", /* lcd: lcd_data7 */
  "P8.37", /* lcd: lcd_data8 */
  "P8.38", /* lcd: lcd_data9 */
  "P8.36", /* lcd: lcd_data10 */
  "P8.34", /* lcd: lcd_data11 */
  "P8.35", /* lcd: lcd_data12 */
  "P8.33", /* lcd: lcd_data13 */
  "P8.31", /* lcd: lcd_data14 */
  "P8.32", /* lcd: lcd_data15 */
  "P8.27", /* lcd: lcd_vsync */
  "P8.29", /* lcd: lcd_hsync */
  "P8.28", /* lcd: lcd_pclk */
  "P8.30", /* lcd: lcd_ac_bias_en */
  "P9.14", /* pwm: ehrpwm1a */
  /* the hardware IP uses */
  "gpio1_19",
  "gpio0_3",
  "gpio0_12",
  "ehrpwm1a",
  "lcd"; 

En el esquema eléctrico del LCD de 7 pulgadas se ve que este utiliza los pines 11, 12, 13, 14, 15, 16, 17 y 19 del Header 8 "P8"; pero en el Device Tree Overlay del LCD de 7" esos pines no están declarados y para que funcione el lcd no interesa si estan o no conectados los pines mencionados. Los nombres gpio1_19, gpio0_3, gpio0_12 que corresponden a los pines P9.16, P9.21 y P9.20 respectivamente no se utilizan en ninguna parte del dts del LCD por lo que los he eliminado y me funciona correctamente el LCD.

El siguiente código pertenece al archivo completo del DVK530-LCD7-01-00A0.dts pero modificado y cambiado la version del archivo para diferenciar del archivo original. El archivo nuevo se llama DVK530-LCD7-01-00A1.dts y esta en el link de descarga del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit (wget).

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

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

 /* identification */
 part-number = "DVK551-LCD7-01";
 version = "00A1";

 /* state the resources this cape uses */
 exclusive-use =
  /* the pin header uses */
  "P8.45", /* lcd: lcd_data0 */
  "P8.46", /* lcd: lcd_data1 */
  "P8.43", /* lcd: lcd_data2 */
  "P8.44", /* lcd: lcd_data3 */
  "P8.41", /* lcd: lcd_data4 */
  "P8.42", /* lcd: lcd_data5 */
  "P8.39", /* lcd: lcd_data6 */
  "P8.40", /* lcd: lcd_data7 */
  "P8.37", /* lcd: lcd_data8 */
  "P8.38", /* lcd: lcd_data9 */
  "P8.36", /* lcd: lcd_data10 */
  "P8.34", /* lcd: lcd_data11 */
  "P8.35", /* lcd: lcd_data12 */
  "P8.33", /* lcd: lcd_data13 */
  "P8.31", /* lcd: lcd_data14 */
  "P8.32", /* lcd: lcd_data15 */
  "P8.27", /* lcd: lcd_vsync */
  "P8.29", /* lcd: lcd_hsync */
  "P8.28", /* lcd: lcd_pclk */
  "P8.30", /* lcd: lcd_ac_bias_en */
  "P9.14", /* pwm: ehrpwm1a */
  /* the hardware IP uses */
  "ehrpwm1a",
  "lcd";

 fragment@0 {
  target = <&am33xx_pinmux>;
  __overlay__ {
   pwm_bl_pins: pinmux_pwm_bl_pins {
    pinctrl-single,pins = <
     0x48 0x06       /* gpmc_a2.ehrpwm1a, OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT */
    >;
   };

   lcd_cape_pins: pinmux_lcd_cape_pins {
    pinctrl-single,pins = <
     0xa0 0x08 /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xa4 0x08 /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xa8 0x08 /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xac 0x08 /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb0 0x08 /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb4 0x08 /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb8 0x08 /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xbc 0x08 /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc0 0x08 /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc4 0x08 /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc8 0x08 /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xcc 0x08 /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd0 0x08 /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd4 0x08 /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd8 0x08 /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xdc 0x08 /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xe0 0x00 /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xe4 0x00 /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xe8 0x00 /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
    >;
   };
  };
 };

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

 fragment@2 {
  target = <&ehrpwm1>;
  __overlay__ {
   status = "okay";
  };
 };

 fragment@3 {
  target = <&ocp>;

  __overlay__ {

   /* avoid stupid warning */
   #address-cells = <1>;
   #size-cells = <1>;

   backlight {
    compatible      = "pwm-backlight";
     pinctrl-names   = "default";
    pinctrl-0       = <&pwm_bl_pins>;

    pwms = <&ehrpwm1 0 500000 1>;
    pwm-names = "DVK551-LCD7";
    brightness-levels = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100>;
    default-brightness-level = <101>; /* index to the array above */
    status = "okay";
    };

   tscadc {
    compatible = "ti,ti-tscadc";
    reg = <0x44e0d000 0x1000>;

    interrupt-parent = <&intc>;
    interrupts = <16>;
    ti,hwmods = "adc_tsc";
    status = "okay";

    tsc {
     ti,wires = <4>;
     ti,x-plate-resistance = <200>;
     ti,coordinate-readouts = <5>;
     ti,touch-type = <2>;
     ti,wire-config = <0x00 0x11 0x22 0x33>;
    };

    adc {
     ti,adc-channels = <4 5 6 7>;
    };
   }; 

   /* Embest 7 inch LCD cape: */
   panel {
    compatible = "tilcdc,panel";
    pinctrl-names = "default";
    pinctrl-0 = <&lcd_cape_pins>;
    panel-info {
     ac-bias           = <255>;
     ac-bias-intrpt    = <0>;
     dma-burst-sz      = <16>;
     bpp               = <32>;
     fdd               = <0x80>;
     tft-alt-mode      = <0>;
     stn-565-mode      = <0>;
     mono-8bit-mode    = <0>;
     sync-edge         = <0>;
     sync-ctrl         = <1>;
     raster-order      = <0>;
     fifo-th           = <0>;
    };
    display-timings {
     native-mode = <&timing0>;
     timing0: 800x480 {
      hactive         = <800>;
      vactive         = <480>;
      hback-porch     = <40>;
      hfront-porch    = <40>;
      hsync-len       = <48>;
      vback-porch     = <30>;
      vfront-porch    = <13>;
      vsync-len       = <3>;
      clock-frequency = <30000000>;
      hsync-active    = <0>;
      vsync-active    = <0>;
     };
    };
   };

   fb {
    compatible = "ti,am33xx-tilcdc";
    reg = <0x4830e000 0x1000>;
    interrupt-parent = <&intc>;
    interrupts = <36>;
    ti,hwmods = "lcdc";
   };
  };
 };
};  

Para activar la función táctil del LCD se ocupa los canales ADC y en este caso están activos 4 para leer la posicion de x+, x-, y+, y-; utilizando los pines P9.37(AIN0), P9.38(AIN1), P9.39(AIN2), P9.40(AIN3).

Para compilar el archivo .dts modificado hay que poner el nombre correcto, cambiando 00A0 por 00A1:

dtc -O dtb -o DVK530-LCD7-01-00A1.dtbo -b 0 -@ DVK530-LCD7-01-00A1.dts  

##LCD7
optargs=capemgr.enable_partno=DVK530-LCD7-01:00A1

sudo nano /etc/default/capemgr
CAPE=DVK530-LCD7-01:00A1

Realizar los mismos pasos del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit, cambiando al nombre DVK530-LCD7-01-00A1.dtbo. 


Para saber mas de los Device Tree Overlays visitar los siguientes links:

http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/

https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md

http://devicetree.org/Device_Tree_Usage

No hay comentarios.:

Publicar un comentario