diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c index ed830434b265d..db5084404b2ce 100644 --- a/drivers/input/touchscreen/ti_am335x_tsc.c +++ b/drivers/input/touchscreen/ti_am335x_tsc.c @@ -32,7 +32,7 @@ #include #define ADCFSM_STEPID 0x10 -#define SEQ_SETTLE 275 +#define SEQ_SETTLE 315 #define MAX_12BIT ((1 << 12) - 1) static const int config_pins[] = { @@ -53,7 +53,11 @@ struct titsc { u32 config_inp[4]; u32 bit_xp, bit_xn, bit_yp, bit_yn; u32 inp_xp, inp_xn, inp_yp, inp_yn; - unsigned int prevZ; +#define TOUCH_TYPE_LCD_NORM 0 +#define TOUCH_TYPE_LCD43 1 +#define TOUCH_TYPE_LCD7 2 + int touch_type; + unsigned bckup_x, bckup_y; }; static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) @@ -61,6 +65,19 @@ static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) return readl(ts->mfd_tscadc->tscadc_base + reg); } +static u32 reg_read(unsigned addr) { return readl((const volatile void*)addr); } +static int dump_regs(char* name, unsigned addr, int size) { + int i; + u32 reg; + + for (i = 0; i < size; i += sizeof(int)) { + reg = reg_read(addr + i); + printk("%s[%.4X] = 0x%.8X\n", name, i, reg); + } + return 0; +} + + static void titsc_writel(struct titsc *tsc, unsigned int reg, unsigned int val) { @@ -176,15 +193,15 @@ static void titsc_step_config(struct titsc *ts_dev) /* Charge step configuration */ config = ts_dev->bit_xp | ts_dev->bit_yn | STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR | - STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_yp); + STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_xn); titsc_writel(ts_dev, REG_CHARGECONFIG, config); titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY); /* coordinate_readouts * 2 … coordinate_readouts * 2 + 2 is for Z */ config = STEPCONFIG_MODE_HWSYNC | - STEPCONFIG_AVG_16 | ts_dev->bit_yp | - ts_dev->bit_xn | STEPCONFIG_INM_ADCREFM | + STEPCONFIG_AVG_16 | STEPCONFIG_YPN | + STEPCONFIG_XNP | STEPCONFIG_INM_ADCREFM | STEPCONFIG_INP(ts_dev->inp_xp); titsc_writel(ts_dev, REG_STEPCONFIG(end_step), config); titsc_writel(ts_dev, REG_STEPDELAY(end_step), @@ -205,10 +222,11 @@ static void titsc_read_coordinates(struct titsc *ts_dev, u32 *x, u32 *y, u32 *z1, u32 *z2) { unsigned int fifocount = titsc_readl(ts_dev, REG_FIFO0CNT); - unsigned int read; + unsigned int prev_val_x = ~0, prev_val_y = ~0; + unsigned int prev_diff_x = ~0, prev_diff_y = ~0; + unsigned int read, diff; unsigned int i, channel; unsigned int creads = ts_dev->coordinate_readouts; - unsigned int nX, nY; *z1 = *z2 = 0; if (fifocount % (creads * 2 + 2)) @@ -221,21 +239,27 @@ static void titsc_read_coordinates(struct titsc *ts_dev, * algorithm compares the difference with that of a present value, * if true the value is reported to the sub system. */ - *x=0; - *y=0; - nX=0; - nY=0; for (i = 0; i < fifocount; i++) { read = titsc_readl(ts_dev, REG_FIFO0); channel = (read & 0xf0000) >> 16; read &= 0xfff; if (channel < creads) { - (*x)+=read; - nX++; + diff = abs(read - prev_val_x); + if (diff < prev_diff_x) { + prev_diff_x = diff; + *x = read; + } + prev_val_x = read; + } else if (channel < creads * 2) { - (*y)+=read; - nY++; + diff = abs(read - prev_val_y); + if (diff < prev_diff_y) { + prev_diff_y = diff; + *y = read; + } + prev_val_y = read; + } else if (channel < creads * 2 + 1) { *z1 = read; @@ -243,12 +267,6 @@ static void titsc_read_coordinates(struct titsc *ts_dev, *z2 = read; } } - if (nX != 0) { - (*x)/=nX; - } - if (nY != 0) { - (*y)/=nY; - } } static irqreturn_t titsc_irq(int irq, void *dev) @@ -258,8 +276,8 @@ static irqreturn_t titsc_irq(int irq, void *dev) unsigned int status, irqclr = 0; unsigned int x = 0, y = 0; unsigned int z1, z2, z; - int deltaZ; unsigned int fsm; + unsigned int config; status = titsc_readl(ts_dev, REG_IRQSTATUS); /* @@ -273,9 +291,31 @@ static irqreturn_t titsc_irq(int irq, void *dev) (status & IRQENB_FIFO1OVRRUN) || (status & IRQENB_FIFO1UNDRFLW)) return IRQ_NONE; - else if (status & IRQENB_FIFO0THRES) { + else if ((status & IRQENB_FIFO0OVRRUN) || + (status & IRQENB_FIFO0UNDRFLW)) { + config = titsc_readl(ts_dev, REG_CTRL); + config &= ~(CNTRLREG_TSCSSENB); + titsc_writel(ts_dev, REG_CTRL, config); + + if (status & IRQENB_FIFO0UNDRFLW) + titsc_writel(ts_dev, REG_IRQSTATUS, + (status | IRQENB_FIFO0UNDRFLW)); + else + titsc_writel(ts_dev, REG_IRQSTATUS, + (status | IRQENB_FIFO0OVRRUN)); + + titsc_writel(ts_dev, REG_CTRL, + (config | CNTRLREG_TSCSSENB)); + return IRQ_HANDLED; + } else if (status & IRQENB_FIFO0THRES) { + unsigned int diffx = 0, diffy = 0; titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2); + + diffx = abs(x - ts_dev->bckup_x); + diffy = abs(y - ts_dev->bckup_y); + ts_dev->bckup_x = x; + ts_dev->bckup_y = y; if (ts_dev->pen_down && z1 != 0 && z2 != 0) { /* @@ -283,21 +323,29 @@ static irqreturn_t titsc_irq(int irq, void *dev) * Resistance(touch) = x plate resistance * * x postion/4096 * ((z2 / z1) - 1) */ - z = z1 - z2; + z = z2 - z1; z *= x; z *= ts_dev->x_plate_resistance; - z /= z2; + z /= z1; z = (z + 2047) >> 12; - // calculate the deltaZ : - deltaZ= z - ts_dev->prevZ; - // save the last z calculated : - ts_dev->prevZ=z; - pr_debug("x %d y %d deltaZ %d\n", x, y, deltaZ); - - if (z <= MAX_12BIT && deltaZ>=0 && deltaZ<=10 ) { + if (diffx < 30 && diffy < 30 && z <= MAX_12BIT) { + if (ts_dev->touch_type != TOUCH_TYPE_LCD_NORM) { + x &= ~0x0007; + y &= ~0x0007; + } + #if 0 + if (ts_dev->touch_type == TOUCH_TYPE_LCD7) { + input_report_abs(input_dev, ABS_X, 4096 - y); + input_report_abs(input_dev, ABS_Y, x - 256); + } else if (ts_dev->touch_type == TOUCH_TYPE_LCD43) { + input_report_abs(input_dev, ABS_X, 4096 - x); + input_report_abs(input_dev, ABS_Y, 3840 - y); + } else { + #endif input_report_abs(input_dev, ABS_X, x); input_report_abs(input_dev, ABS_Y, y); + //} input_report_abs(input_dev, ABS_PRESSURE, z); input_report_key(input_dev, BTN_TOUCH, 1); input_sync(input_dev); @@ -318,6 +366,8 @@ static irqreturn_t titsc_irq(int irq, void *dev) fsm = titsc_readl(ts_dev, REG_ADCFSM); if (fsm == ADCFSM_STEPID) { ts_dev->pen_down = false; + ts_dev->bckup_x = 0; + ts_dev->bckup_y = 0; input_report_key(input_dev, BTN_TOUCH, 0); input_report_abs(input_dev, ABS_PRESSURE, 0); input_sync(input_dev); @@ -326,9 +376,9 @@ static irqreturn_t titsc_irq(int irq, void *dev) } irqclr |= IRQENB_PENUP; } + irqclr |= IRQENB_HW_PEN; if (status & IRQENB_HW_PEN) { - titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00); titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); } @@ -372,6 +422,11 @@ static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev, if (err < 0) return err; + err = of_property_read_u32(node, "ti,touch-type", &ts_dev->touch_type); + if (err < 0) { + ts_dev->touch_type = TOUCH_TYPE_LCD_NORM; + } + return of_property_read_u32_array(node, "ti,wire-config", ts_dev->config_inp, ARRAY_SIZE(ts_dev->config_inp)); } @@ -432,7 +487,8 @@ static int titsc_probe(struct platform_device *pdev) goto err_free_mem; } - titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES); + titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES + | IRQENB_FIFO0OVRRUN | IRQENB_FIFO0UNDRFLW); err = titsc_config_wires(ts_dev); if (err) { dev_err(&pdev->dev, "wrong i/p wire configuration\n"); @@ -452,15 +508,14 @@ static int titsc_probe(struct platform_device *pdev) input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0); - /*init prev Z*/ - ts_dev->prevZ=0; - /* register to the input system */ err = input_register_device(input_dev); if (err) goto err_free_irq; platform_set_drvdata(pdev, ts_dev); + + dump_regs("TSC", (unsigned)ts_dev->mfd_tscadc->tscadc_base, REG_FIFO0); return 0; err_free_irq: diff --git a/firmware/Makefile b/firmware/Makefile index f6a56c3ad56d1..91551310a8c71 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -157,6 +157,8 @@ fw-shipped-$(CONFIG_CAPE_BEAGLEBONE) += \ BB-BONE-LCD7-01-00A2.dtbo \ BB-BONE-LCD7-01-00A3.dtbo \ BB-BONE-LCD7-01-00A4.dtbo \ + BB-VIEW-LCD4-01-00A0.dtbo \ + BB-VIEW-LCD7-01-00A0.dtbo \ BB-BONE-eMMC1-01-00A0.dtbo \ BB-BONE-GPEVT-00A0.dtbo \ BB-BONE-RTC-00A0.dtbo \ diff --git a/firmware/capes/BB-VIEW-LCD4-01-00A0.dts b/firmware/capes/BB-VIEW-LCD4-01-00A0.dts new file mode 100755 index 0000000000000..0cbf614945f55 --- /dev/null +++ b/firmware/capes/BB-VIEW-LCD4-01-00A0.dts @@ -0,0 +1,280 @@ +/* + * 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 = "BB-VIEW-LCD4-01"; + version = "00A0"; + + /* 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.27", /* lcd: gpio3_19 */ + "P9.12", /* led: gpio1_28 */ + "P9.14", /* pwm: ehrpwm1a */ + "P9.15", /* keys: gpio1_16 */ + "P9.23", /* keys: gpio1_17 */ + "P9.16", /* keys: gpio1_19 */ + "P9.21", /* keys: gpio0_3 */ + /* the hardware IP uses */ + "gpio3_19", + "gpio1_28", + "gpio1_16", + "gpio1_17", + "gpio1_19", + "gpio0_3", + "gpio0_12", + "lcd", + "ehrpwm1a"; + + fragment@0 { + target = <&am33xx_pinmux>; + __overlay__ { + + bb_view_lcd_cape_led_pins: pinmux_bb_view_lcd_cape_led_pins { + pinctrl-single,pins = < + 0x078 0x2f /* gpmc_be1n.gpio1_28, INPUT | PULLDIS | MODE7 */ + 0x178 0x2f /* uart1_ctsn.gpio0_12,INPUT | PULLDIS | MODE7 */ + >; + }; + + pwm_bl_pins: pinmux_pwm_bl_pins { + pinctrl-single,pins = < + 0x48 0x06 /* gpmc_a2.ehrpwm1a, OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT */ + >; + }; + + bb_view_lcd_cape_pins: pinmux_bb_view_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 */ + >; + }; + + bb_view_lcd_cape_keys_pins: pinmux_bb_view_lcd_cape_keys_pins { + pinctrl-single,pins = < + 0x4C 0x27 /* gpmc_a3.gpio1_19, INPUT | MODE7 */ + 0x184 0x27 /* uart1_txd.gpio0_15, INPUT | MODE7 */ + 0x44 0x27 /* gpmc_a1.gpio1_17, INPUT | MODE7 */ + 0x70 0x27 /* gpmc_wait0.gpio0_30,INPUT | MODE7 */ + >; + }; + + }; + }; + + 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 0>; + pwm-names = "LCD4"; + 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 = <1>; + ti,wire-config = <0x00 0x11 0x22 0x33>; + }; + + adc { + ti,adc-channels = <4 5 6 7>; + }; + }; + + gpio-leds-cape-lcd { + compatible = "gpio-leds"; + pinctrl-names = "default"; + + pinctrl-0 = <&bb_view_lcd_cape_led_pins>; + + bb_view_led0 { + label = "bb-view:led0"; + gpios = <&gpio2 28 0>; + linux,default-trigger = "none"; + default-state = "off"; + }; + + bb_view_led1 { + label = "bb-view:led1"; + gpios = <&gpio1 12 0>; + linux,default-trigger = "none"; + default-state = "off"; + }; + }; + + bb_view_gpio_keys { + compatible = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <&bb_view_lcd_cape_keys_pins>; + + #address-cells = <1>; + #size-cells = <0>; + + button@1 { + debounce_interval = <50>; + label = "bb-view:usr0"; + linux,code = <0x100>; + gpios = <&gpio2 19 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@2 { + debounce_interval = <50>; + label = "bb-view:usr1"; + linux,code = <0x101>; + gpios = <&gpio1 15 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@3 { + debounce_interval = <50>; + label = "bb-view:usr2"; + linux,code = <0x102>; + gpios = <&gpio2 17 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@4 { + debounce_interval = <50>; + label = "bb-view:usr3"; + linux,code = <0x103>; + gpios = <&gpio1 30 0x0>; + gpio-key,wakeup; + autorepeat; + }; + }; + + /* Embest 4.3 inch LCD cape: */ + panel { + compatible = "tilcdc,panel"; + pinctrl-names = "default"; + pinctrl-0 = <&bb_view_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: 480x272 { + hactive = <480>; + vactive = <272>; + hback-porch = <44>; + hfront-porch = <9>; + hsync-len = <5>; + vback-porch = <13>; + vfront-porch = <4>; + vsync-len = <10>; + clock-frequency = <9000000>; + hsync-active = <0>; + vsync-active = <0>; + }; + }; + }; + + fb { + compatible = "ti,am33xx-tilcdc"; + reg = <0x4830e000 0x1000>; + interrupt-parent = <&intc>; + interrupts = <36>; + ti,hwmods = "lcdc"; + }; + + }; + }; +}; diff --git a/firmware/capes/BB-VIEW-LCD7-01-00A0.dts b/firmware/capes/BB-VIEW-LCD7-01-00A0.dts new file mode 100755 index 0000000000000..8fb89dce45879 --- /dev/null +++ b/firmware/capes/BB-VIEW-LCD7-01-00A0.dts @@ -0,0 +1,280 @@ +/* + * 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 = "BB-VIEW-LCD7-01"; + version = "00A0"; + + /* 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.27", /* lcd: gpio3_19 */ + "P9.12", /* led: gpio1_28 */ + "P9.14", /* pwm: ehrpwm1a */ + "P9.15", /* keys: gpio1_16 */ + "P9.23", /* keys: gpio1_17 */ + "P9.16", /* keys: gpio1_19 */ + "P9.21", /* keys: gpio0_3 */ + /* the hardware IP uses */ + "gpio3_19", + "gpio1_28", + "gpio1_16", + "gpio1_17", + "gpio1_19", + "gpio0_3", + "gpio0_12", + "lcd", + "ehrpwm1a"; + + fragment@0 { + target = <&am33xx_pinmux>; + __overlay__ { + + bb_view_lcd_cape_led_pins: pinmux_bb_view_lcd_cape_led_pins { + pinctrl-single,pins = < + 0x078 0x2f /* gpmc_be1n.gpio1_28, INPUT | PULLDIS | MODE7 */ + 0x178 0x2f /* uart1_ctsn.gpio0_12,INPUT | PULLDIS | MODE7 */ + >; + }; + + pwm_bl_pins: pinmux_pwm_bl_pins { + pinctrl-single,pins = < + 0x48 0x06 /* gpmc_a2.ehrpwm1a, OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT */ + >; + }; + + bb_view_lcd_cape_pins: pinmux_bb_view_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 */ + >; + }; + + bb_view_lcd_cape_keys_pins: pinmux_bb_view_lcd_cape_keys_pins { + pinctrl-single,pins = < + 0x4C 0x27 /* gpmc_a3.gpio1_19, INPUT | MODE7 */ + 0x184 0x27 /* uart1_txd.gpio0_15, INPUT | MODE7 */ + 0x44 0x27 /* gpmc_a1.gpio1_17, INPUT | MODE7 */ + 0x70 0x27 /* gpmc_wait0.gpio0_30,INPUT | MODE7 */ + >; + }; + + }; + }; + + 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 0>; + pwm-names = "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>; + }; + }; + + gpio-leds-cape-lcd { + compatible = "gpio-leds"; + pinctrl-names = "default"; + + pinctrl-0 = <&bb_view_lcd_cape_led_pins>; + + bb_view_led0 { + label = "bb-view:led0"; + gpios = <&gpio2 28 0>; + linux,default-trigger = "none"; + default-state = "off"; + }; + + bb_view_led1 { + label = "bb-view:led1"; + gpios = <&gpio1 12 0>; + linux,default-trigger = "none"; + default-state = "off"; + }; + }; + + bb_view_gpio_keys { + compatible = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <&bb_view_lcd_cape_keys_pins>; + + #address-cells = <1>; + #size-cells = <0>; + + button@1 { + debounce_interval = <50>; + label = "bb-view:usr0"; + linux,code = <0x100>; + gpios = <&gpio2 19 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@2 { + debounce_interval = <50>; + label = "bb-view:usr1"; + linux,code = <0x101>; + gpios = <&gpio1 15 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@3 { + debounce_interval = <50>; + label = "bb-view:usr2"; + linux,code = <0x102>; + gpios = <&gpio2 17 0x0>; + gpio-key,wakeup; + autorepeat; + }; + button@4 { + debounce_interval = <50>; + label = "bb-view:usr3"; + linux,code = <0x103>; + gpios = <&gpio1 30 0x0>; + gpio-key,wakeup; + autorepeat; + }; + }; + + /* Embest 7 inch LCD cape: */ + panel { + compatible = "tilcdc,panel"; + pinctrl-names = "default"; + pinctrl-0 = <&bb_view_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 = <27000000>; + hsync-active = <0>; + vsync-active = <0>; + }; + }; + }; + + fb { + compatible = "ti,am33xx-tilcdc"; + reg = <0x4830e000 0x1000>; + interrupt-parent = <&intc>; + interrupts = <36>; + ti,hwmods = "lcdc"; + }; + + }; + }; +};