Explorar o código

i2c für 7 Zoll wrk

Reinhard Russinger hai 4 meses
pai
achega
f78c20bf4b

+ 2 - 1
board/GfA/Display001/DTS_4.4/Display001_4.dts

@@ -219,7 +219,8 @@
 
 &i2c2 {
         polytouch: edt-ft5x06@38 {
-                compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
+                compatible = "edt,edt-ft5406", "edt-ft5x06";
+		status = "okay";
                 reg = <0x38>;
                 pinctrl-names = "default";
                 pinctrl-0 = <&edt_ft5x06_pins>;

+ 2 - 2
board/GfA/Display001/DTS_4.4/Display001_7.dts

@@ -99,8 +99,8 @@
 
                 i2c2_pins: pinmux_i2c2_pins {
                         pinctrl-single,pins = <
-                                0x150 (PIN_INPUT | MUX_MODE2)    /* spi0_sclk.i2c2_sda */
-                                0x154 (PIN_INPUT | MUX_MODE2)    /* spi0_d0.i2c2_scl */
+                                0x150 (PIN_INPUT_PULLUP | MUX_MODE2)    /* spi0_sclk.i2c2_sda */
+                                0x154 (PIN_INPUT_PULLUP | MUX_MODE2)    /* spi0_d0.i2c2_scl */
                         >;
                 };
 

+ 4 - 46
board/GfA/Display001/DTS_4.4/Display002_7.dts

@@ -96,11 +96,10 @@
 			>;
 		};
 
-
-                i2c_gpio_pins: pinmux_i2c_gpio_pins {
+                i2c2_pins: pinmux_i2c2_pins {
                         pinctrl-single,pins = <
-                                0x150 (PIN_INPUT | MUX_MODE7)    /* spi0_sclk.i2c2_sda */
-                                0x154 (PIN_INPUT | MUX_MODE7)    /* spi0_d0.i2c2_scl */
+                                0x150 (PIN_INPUT | MUX_MODE2)    /* spi0_sclk.i2c2_sda */
+                                0x154 (PIN_INPUT | MUX_MODE2)    /* spi0_d0.i2c2_scl */
                         >;
                 };
 
@@ -206,34 +205,13 @@
 };
 
 &i2c2 {
-    polytouch: edt-ft5x06@38 {
-        compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
-        reg = <0x38>;
-        pinctrl-names = "default";
-        pinctrl-0 = <&edt_ft5x06_pins>;
-        interrupt-parent = <&gpio2>;
-        interrupts = <1 8>;
-        reset-gpios = <&gpio3 21 1>;
-        };
-
-        polytouch: edt-ft5x06@38 {
-                        compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
-                        reg = <0x38>;
-                        pinctrl-names = "default";
-                        pinctrl-0 = <&edt_ft5x06_pins>;
-                        interrupt-parent = <&gpio2>;
-                        interrupts = <1 8>;
-                        reset-gpios = <&gpio3 21 1>;
-			max_x = <800>;
-			max_y = <480>;
-                };
-
         maxtouch: atmel_mxt_ts@4a {
                         compatible = "atmel,maxtouch";
                    	invert_y;
 			reg = <0x4a>;
                         pinctrl-names = "default";
                         pinctrl-0 = <&edt_ft5x06_pins>;
+			reset-gpios = <&gpio3 21 1>;
                         interrupt-parent = <&gpio2>;
                         interrupts = <1 8>;
                 };
@@ -251,14 +229,6 @@
 	clock-frequency = <1000000>;
         status = "okay";
 
-/*
-	spi1_0{
-		compatible = "spidev";
-                reg = <0>;
-		spi-max-frequency = <10000000>;
-        };
-*/
-
 	gpio_gfa: gpio_gfa@0 {
 		compatible = "fairchild,74hc595";
 		reg = <0>;
@@ -324,18 +294,6 @@
   };
 };
 
-/*
-&tscadc {
-        status = "okay";
-        tsc {
-                ti,wires = <4>;
-                ti,x-plate-resistance = <200>;
-                ti,coordinate-readouts = <5>; 
-                ti,wire-config = <0x00 0x11 0x22 0x33>;
-        };
-};
-*/
-
 &tscadc {
         status = "okay";
 };

+ 4 - 39
board/GfA/Display001/DTS_4.4/Display002_7_rs485.dts

@@ -96,8 +96,7 @@
 			>;
 		};
 
-
-                i2c_gpio_pins: pinmux_i2c_gpio_pins {
+                i2c2_pins: pinmux_i2c2_pins {
                         pinctrl-single,pins = <
                                 0x150 (PIN_INPUT | MUX_MODE2)    /* spi0_sclk.i2c2_sda */
                                 0x154 (PIN_INPUT | MUX_MODE2)    /* spi0_d0.i2c2_scl */
@@ -220,26 +219,14 @@
 };
 
 &i2c2 {
-        polytouch: edt-ft5x06@38 {
-                        compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
-                        reg = <0x38>;
-                        pinctrl-names = "default";
-                        pinctrl-0 = <&edt_ft5x06_pins>;
-                        interrupt-parent = <&gpio2>;
-                        interrupts = <1 8>;
-                        reset-gpios = <&gpio3 21 1>;
-			max_x = <800>;
-			max_y = <480>;
-                };
-
         maxtouch: atmel_mxt_ts@4a {
-                        compatible = "atmel,atmel_mxt_ts";
+                        compatible = "atmel,maxtouch";
 			reg = <0x4a>;
-                        reset-gpios = <&gpio3 21 1>;
                         pinctrl-names = "default";
                         pinctrl-0 = <&edt_ft5x06_pins>;
+                        reset-gpios = <&gpio3 21 1>;
                         interrupt-parent = <&gpio2>;
-                        interrupts = <1 2>;
+                        interrupts = <1 8>;
                 };
 
 	mcp7940x: rtc@6f {
@@ -255,14 +242,6 @@
 	clock-frequency = <1000000>;
         status = "okay";
 
-/*
-	spi1_0{
-		compatible = "spidev";
-                reg = <0>;
-		spi-max-frequency = <10000000>;
-        };
-*/
-
 	gpio_gfa: gpio_gfa@0 {
 		compatible = "fairchild,74hc595";
 		reg = <0>;
@@ -278,8 +257,6 @@
                 reg = <1>;
 		spi-max-frequency = <10000000>;
         };
-
-
 };
 
 &lcdc {
@@ -328,18 +305,6 @@
   };
 };
 
-/*
-&tscadc {
-        status = "okay";
-        tsc {
-                ti,wires = <4>;
-                ti,x-plate-resistance = <200>;
-                ti,coordinate-readouts = <5>; 
-                ti,wire-config = <0x00 0x11 0x22 0x33>;
-        };
-};
-*/
-
 &tscadc {
         status = "okay";
 };

+ 0 - 0
board/GfA/Display001/linux_4.4.94_rt19/linux-036-i2c-omap-add-slave-functionality.patch → board/GfA/Display001/linux_4.4.94_rt19/linux-036-i2c-omap-add-slave-functionality.__patch


+ 0 - 93
board/GfA/Display001/linux_4.4.94_rt19/linux-041_i2c-omap_bus_busy_handling.patch

@@ -1,93 +0,0 @@
-diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
-index ccfc49f..77819c3 100644
---- a/drivers/i2c/busses/i2c-omap.c
-+++ b/drivers/i2c/busses/i2c-omap.c
-@@ -474,6 +474,73 @@ static int omap_i2c_init(struct omap_i2c_dev *omap)
- 	return 0;
- }
- 
-+static void omap_i2c_clock_pulse(struct omap_i2c_dev *dev)
-+{
-+	u32 reg;
-+	int i;
-+
-+	/* Enable testmode */
-+	reg = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-+	reg |= OMAP_I2C_SYSTEST_ST_EN;
-+	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
-+
-+	for (i = 0; i < 9; i++) {
-+		reg |= OMAP_I2C_SYSTEST_SCL_O;
-+		omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
-+		mdelay(100);
-+		reg &= ~OMAP_I2C_SYSTEST_SCL_O;
-+		omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
-+		mdelay(100);
-+	}
-+
-+	/* Disable testmode */
-+	reg &= ~OMAP_I2C_SYSTEST_ST_EN;
-+	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
-+}
-+
-+static void omap_i2c_bus_recover(struct omap_i2c_dev *dev)
-+{
-+	u32 reg1;
-+	u32 reg2;
-+
-+	/*
-+	 * First differentiate SCL stuck low from SDA stuck low using our
-+	 * SYSTEST register. Depending on which line is stuck low, we will
-+	 * either Reset our I2C IP (SCL stuck low) or drive 9 clock pulses on
-+	 * SCL (SDA stuck low) to tell the device to release the bus.
-+	 *
-+	 * If, after 9 clock pulses on SCL device still doesn't release the
-+	 * bus, there's nothing more we can do; we will still try to Reset
-+	 * our I2C IP anyway.
-+	 */
-+
-+	reg1 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-+	msleep(1);
-+	reg2 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-+
-+	if (!(reg1 & OMAP_I2C_SYSTEST_SCL_I_FUNC) &&
-+			!(reg2 & OMAP_I2C_SYSTEST_SCL_I_FUNC)) {
-+		dev_err(dev->dev, "SCL is stuck low, resetting\n");
-+		omap_i2c_reset(dev);
-+	}
-+
-+	if (!(reg1 & OMAP_I2C_SYSTEST_SDA_I_FUNC) &&
-+			!(reg2 & OMAP_I2C_SYSTEST_SDA_I_FUNC)) {
-+		dev_err(dev->dev, "SDA is stuck low, driving 9 pulses on SCL\n");
-+		omap_i2c_clock_pulse(dev);
-+
-+		reg1 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-+		msleep(1);
-+		reg2 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-+
-+		if ((reg1 & OMAP_I2C_SYSTEST_SDA_I_FUNC) &&
-+				(reg2 & OMAP_I2C_SYSTEST_SDA_I_FUNC)) {
-+			dev_err(dev->dev, "SDA still stuck, resetting\n");
-+			omap_i2c_reset(dev);
-+		}
-+	}
-+}
-+
- /*
-  * Waiting on Bus Busy
-  */
-@@ -483,8 +550,12 @@ static int omap_i2c_wait_for_bb(struct omap_i2c_dev *omap)
- 
- 	timeout = jiffies + OMAP_I2C_TIMEOUT;
- 	while (omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
--		if (time_after(jiffies, timeout))
--			return i2c_recover_bus(&omap->adapter);
-+		if (time_after(jiffies, timeout)) {
-+			//return i2c_recover_bus(&omap->adapter);
-+			dev_err(omap->dev, "Timeout on BusBusy -> recover\n");
-+			omap_i2c_bus_recover(omap);
-+			return 0;
-+			}
- 		msleep(1);
- 	}
- 

+ 0 - 92
board/GfA/Display001/linux_4.4.94_rt19/linux-044_i2c-omap-fix-sda-clocking.patch

@@ -1,92 +0,0 @@
-diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
-index 5d784d4..946f850 100644
---- a/drivers/i2c/busses/i2c-omap.c
-+++ b/drivers/i2c/busses/i2c-omap.c
-@@ -474,34 +474,11 @@ static int omap_i2c_init(struct omap_i2c_dev *omap)
- 	return 0;
- }
- 
--static void omap_i2c_clock_pulse(struct omap_i2c_dev *dev)
--{
--	u32 reg;
--	int i;
--
--	/* Enable testmode */
--	reg = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
--	reg |= OMAP_I2C_SYSTEST_ST_EN;
--	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
--
--	for (i = 0; i < 9; i++) {
--		reg |= OMAP_I2C_SYSTEST_SCL_O;
--		omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
--		mdelay(100);
--		reg &= ~OMAP_I2C_SYSTEST_SCL_O;
--		omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
--		mdelay(100);
--	}
--
--	/* Disable testmode */
--	reg &= ~OMAP_I2C_SYSTEST_ST_EN;
--	omap_i2c_write_reg(dev, OMAP_I2C_SYSTEST_REG, reg);
--}
--
--static void omap_i2c_bus_recover(struct omap_i2c_dev *dev)
-+static int omap_i2c_bus_recover(struct omap_i2c_dev *dev)
- {
- 	u32 reg1;
- 	u32 reg2;
-+	int ret = 0;
- 
- 	/*
- 	 * First differentiate SCL stuck low from SDA stuck low using our
-@@ -513,7 +490,7 @@ static void omap_i2c_bus_recover(struct omap_i2c_dev *dev)
- 	 * bus, there's nothing more we can do; we will still try to Reset
- 	 * our I2C IP anyway.
- 	 */
--
-+	dev_err(dev->dev, "--> omap_i2c_bus_recover called!\n");
- 	reg1 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
- 	msleep(1);
- 	reg2 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
-@@ -527,18 +504,21 @@ static void omap_i2c_bus_recover(struct omap_i2c_dev *dev)
- 	if (!(reg1 & OMAP_I2C_SYSTEST_SDA_I_FUNC) &&
- 			!(reg2 & OMAP_I2C_SYSTEST_SDA_I_FUNC)) {
- 		dev_err(dev->dev, "SDA is stuck low, driving 9 pulses on SCL\n");
--		omap_i2c_clock_pulse(dev);
-+		i2c_generic_scl_recovery(&dev->adapter);
- 
- 		reg1 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
- 		msleep(1);
- 		reg2 = omap_i2c_read_reg(dev, OMAP_I2C_SYSTEST_REG);
- 
--		if ((reg1 & OMAP_I2C_SYSTEST_SDA_I_FUNC) &&
--				(reg2 & OMAP_I2C_SYSTEST_SDA_I_FUNC)) {
-+		if (!(reg1 & OMAP_I2C_SYSTEST_SDA_I_FUNC) &&
-+				!(reg2 & OMAP_I2C_SYSTEST_SDA_I_FUNC)) {
- 			dev_err(dev->dev, "SDA still stuck, resetting\n");
-+			ret = -EBUSY;
- 			omap_i2c_reset(dev);
- 		}
- 	}
-+	
-+	return 0;
- }
- 
- /*
-@@ -776,10 +756,13 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
- 	timeout = wait_for_completion_timeout(&omap->cmd_complete,
- 						OMAP_I2C_TIMEOUT);
- 	if (timeout == 0) {
-+		int ret;
-+		
- 		dev_err(omap->dev, "controller timed out\n");
--		omap_i2c_reset(omap);
--		__omap_i2c_init(omap);
--		return -ETIMEDOUT;
-+                if((ret = omap_i2c_bus_recover(omap)))
-+                        return ret;
-+                        else
-+                        return -ETIMEDOUT;
- 	}
- 
- 	if (likely(!omap->cmd_err))

+ 37 - 0
board/GfA/Display001/linux_4.4.94_rt19/linux-045-i2c-omap-isr-handling.patch

@@ -0,0 +1,37 @@
+diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
+index 1ebb5e9..1ad1b0c 100644
+--- a/drivers/i2c/busses/i2c-omap.c
++++ b/drivers/i2c/busses/i2c-omap.c
+@@ -1009,6 +1009,7 @@  omap_i2c_isr_thread(int this_irq, void *dev_id)
+ 	struct omap_i2c_dev *omap = dev_id;
+ 	u16 bits;
+ 	u16 stat;
++	u16 buf;
+ 	int err = 0, count = 0;
+ 
+ 	do {
+@@ -1016,11 +1017,21 @@  omap_i2c_isr_thread(int this_irq, void *dev_id)
+ 		stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
+ 		stat &= bits;
+ 
+-		/* If we're in receiver mode, ignore XDR/XRDY */
+-		if (omap->receiver)
++		/* If we're in receiver mode, ignore XDR/XRDY and vice versa */
++		if (omap->receiver && stat & (OMAP_I2C_STAT_XDR |
++				OMAP_I2C_STAT_XRDY)) {
++			dev_err(omap->dev, "ignoring TX interrupts\n");
+ 			stat &= ~(OMAP_I2C_STAT_XDR | OMAP_I2C_STAT_XRDY);
+-		else
++		} else if (!omap->receiver && stat & (OMAP_I2C_STAT_RDR |
++				OMAP_I2C_STAT_RRDY)) {
++			dev_err(omap->dev, "ignoring RX interrupts\n");
+ 			stat &= ~(OMAP_I2C_STAT_RDR | OMAP_I2C_STAT_RRDY);
++			buf = omap_i2c_read_reg(omap, OMAP_I2C_BUF_REG);
++			buf |= OMAP_I2C_BUF_RXFIF_CLR;
++			omap_i2c_write_reg(omap, OMAP_I2C_BUF_REG, buf);
++			omap_i2c_ack_stat(omap,
++				OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR);
++		}
+ 
+ 		if (!stat) {
+ 			/* my work here is done */

+ 18 - 0
board/GfA/Display001/linux_4.4.94_rt19/linux-046-bus-recover.patch

@@ -0,0 +1,18 @@
+diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
+index b4a3994..ed3e6ca 100644
+--- a/drivers/i2c/busses/i2c-omap.c
++++ b/drivers/i2c/busses/i2c-omap.c
+@@ -481,8 +481,11 @@ static int omap_i2c_wait_for_bb(struct omap_i2c_dev *omap)
+ 
+ 	timeout = jiffies + OMAP_I2C_TIMEOUT;
+ 	while (omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
+-		if (time_after(jiffies, timeout))
+-			return i2c_recover_bus(&omap->adapter);
++		if (time_after(jiffies, timeout)) {
++			dev_err(omap->dev, "Timeout on BusBusy -> recover\n");
++			i2c_recover_bus(&omap->adapter);
++			return 0;
++			}
+ 		msleep(1);
+ 	}
+