DATQ1THD6B0 touch screen module

From Random Projects
Jump to: navigation, search

DATQ1THD6B0 touch screen module from a TFT touch screen.

Hardware

  • Maxim MAX3420E
  • NXP LPC3230FET296
  • ST ISP1760ET
  • 2x Macronix MX29LV800C
  • Diodes Inc. AP1212
  • 2x Diodes Inc. AP1533
  • 2x PixArt (PXI) PAP7701QN
  • Atmel AT25F512
  • Macronix MX25L512

Photos

Logic analyzer traces

I captured the communication of some of the ICs on these boards and put them into the sigrok-dumps repo of the sigrok project (you can view them e.g. via PulseView).

Decoding via sigrok-cli can also be done, for example:

$ sigrok-cli -i max3420e_poweron.sr -P usb_signalling:dp='USB D+':dm='USB D-',usb_packet,usb_request -A usb_request | grep -v timeout
usb_request-1: SETUP in: [ 80 06 00 01 00 00 40 00 ][ 12 01 10 01 00 00 00 40 08 04 00 30 00 00 01 02 00 01 ] : ACK
usb_request-1: SETUP out: [ 00 05 03 00 00 00 00 00 ][ ] : ACK
usb_request-1: SETUP in: [ 80 06 00 01 00 00 12 00 ][ 12 01 10 01 00 00 00 40 08 04 00 30 00 00 01 02 00 01 ] : ACK
usb_request-1: SETUP in: [ 80 06 00 02 00 00 09 00 ][ 09 02 22 00 01 01 00 80 32 ] : ACK
usb_request-1: SETUP in: [ 80 06 00 02 00 00 22 00 ][ 09 02 22 00 01 01 00 80 32 09 04 00 00 01 03 00 00 00 09 21 10 01 00 01 22 DA 00 07 05 83 03 40 00 08 ] : ACK
usb_request-1: SETUP in: [ 80 06 00 03 00 00 FF 00 ][ 04 03 09 04 ] : ACK
usb_request-1: SETUP in: [ 80 06 02 03 09 04 FF 00 ][ 2A 03 4F 00 70 00 74 00 69 00 63 00 61 00 6C 00 20 00 54 00 6F 00 75 00 63 00 68 00 20 00 53 00 63 00 72 00 65 00 65 00 6E 00 ] : ACK
usb_request-1: SETUP in: [ 80 06 01 03 09 04 FF 00 ][ 2A 03 51 00 75 00 61 00 6E 00 74 00 61 00 20 00 43 00 6F 00 6D 00 70 00 75 00 74 00 65 00 72 00 20 00 49 00 6E 00 63 00 2E 00 ] : ACK
usb_request-1: SETUP out: [ 00 09 01 00 00 00 00 00 ][ ] : ACK
usb_request-1: SETUP out: [ 21 0A 00 00 00 00 00 00 ][ ] : ACK
usb_request-1: SETUP in: [ 81 06 00 22 00 00 DA 00 ][ 05 0D 09 04 A1 01 85 01 09 22 A1 02 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0E 65 11 09 30 35 00 46 4B 11 26 3F 06 81 02 09 31 46 BB 09 26 83 03 81 02 C0 A1 02 05 0D 09 42 15 00 25 01 75 01 95 01 81 02 09 32 81 02 09 47 81 02 95 05 81 03 75 08 09 51 95 01 81 02 05 01 75 10 55 0E 65 11 09 30 35 00 46 4B 11 26 3F 06 81 02 46 BB 09 26 83 03 09 31 81 02 C0 05 0D 09 54 15 00 26 FF 00 95 01 75 08 81 02 09 55 25 02 95 01 85 02 B1 02 06 00 FF 09 01 26 FF 00 75 08 95 2F 85 03 B1 02 09 01 96 FF 03 85 04 B1 02 09 01 95 0B 85 05 B1 02 09 01 96 FF 03 85 06 B1 02 09 01 95 0F 85 0A B1 02 C0 ] : ACK
usb_request-1: SETUP in: [ A1 01 02 03 00 00 02 00 ][ 02 02 ] : ACK

You can also export the decoded data into PCAP format for further/alternative analysis in wireshark:

$ sigrok-cli -i max3420e_poweron.sr -P usb_signalling:dp='USB D+':dm='USB D-',usb_packet,usb_request -B usb_request=pcap > max3420e_poweron.pcap

Analysis

Random notes

  • Enumerates as USB HID device (obviously), VID/PID is 0408:3000. See below for the lsusb.
  • The USB connections towards the USB host / PC is done via the Maxim MAX3420E.
  • The MAX3420E is connected to the LPC3230FET296 via SPI (5 MHz SPI clock).
  • The two additional PCBs are connected via USB high-speed to the ISP1760ET USB host controller IC.
  • Both PCBs have a PAP7701QN USB camera controller, which gets firmware and/or calibration data from an SPI flash.
    • The left board has an Atmel AT25F512 chip, the right board has a Macronix MX25L512 chip (both 64kByte in size).
    • Upon powerup, both SPI flash chips are read by the PAP7701QN on each board (1.85 MHz SPI clock).
    • The PAP7701QN reads exactly 4700 bytes of data (from address 0) from both chips, probably firmware (?)
    • After reading those 4700 bytes, an additional 16 bytes are read from address 0x8010.
      • The 16-byte data on both chips is the same (mostly 0xff) except for a single bit that seems to differ, probably used to differentiate left/right PCB (?)

SPI flash chips

Running strings on the 4700 bytes read from the SPI flash chips (MD5: 588f07c64857401c7b334aecec65afea) yields:

22PA
';M]n
ZZZZZZZZZZZZZZZZ
>tq%>
t@5=
YUY2
YUY2
>tl%>
t>5=
""""""
""""""
""""""""
"""""""""""""""""""

The YUY2 in there likely indicates the image format of the data being transmitted to the ISP1760ET.

The first and last few bytes of those 4700 bytes look like this:

00000000  11 5c 96 08 01 01 09 3a  28 00 03 82 40 00 00 22  |.\.....:(...@.."|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
[...]
000011e0  09 c8 e4 f0 a3 74 02 f0  90 09 d2 e4 f0 a3 74 1e  |.....t........t.|
000011f0  f0 90 d0 bc 74 01 f0 12  65 72 12 5b 39 12 4d 94  |....t...er.[9.M.|
00001200  12 32 20 90 d0 bc 74 01  f0 22 22 22 22 22 22 22  |.2 ...t.."""""""|
00001210  22 22 22 22 22 22 22 22  22 22 22 22 00 00 00 00  |""""""""""""....|
00001220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001230  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001240  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001250  00 00 00 00 00 00 00 00  00 00 00 00              |............|

The difference between the two SPI flash chip contents at address 0x8010 looks like this:

-00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
+00000000  ff ff ff fe ff ff ff ff  ff ff ff ff ff ff ff ff  |................|

lsusb

$ lsusb -v
Bus 002 Device 012: ID 0408:3000 Quanta Computer, Inc. Optical dual-touch panel
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0408 Quanta Computer, Inc.
  idProduct          0x3000 Optical dual-touch panel
  bcdDevice            0.00
  iManufacturer           1 Quanta Computer Inc.
  iProduct                2 Optical Touch Screen
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     218
          Report Descriptor: (length is 218)
            Item(Global): Usage Page, data= [ 0x0d ] 13
                            Digitizer
            Item(Local ): Usage, data= [ 0x04 ] 4
                            Touch Screen
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x01 ] 1
            Item(Local ): Usage, data= [ 0x22 ] 34
                            Finger
            Item(Main  ): Collection, data= [ 0x02 ] 2
                            Logical
            Item(Local ): Usage, data= [ 0x42 ] 66
                            Tip Switch
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x32 ] 50
                            In Range
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x47 ] 71
                            Confidence
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Main  ): Input, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Local ): Usage, data= [ 0x51 ] 81
                            Contact ID
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Global): Report Size, data= [ 0x10 ] 16
            Item(Global): Unit Exponent, data= [ 0x0e ] 14
                            Unit Exponent: 14
            Item(Global): Unit, data= [ 0x11 ] 17
                            System: SI Linear, Unit: Centimeter
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Global): Physical Minimum, data= [ 0x00 ] 0
            Item(Global): Physical Maximum, data= [ 0x4b 0x11 ] 4427
            Item(Global): Logical Maximum, data= [ 0x3f 0x06 ] 1599
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Global): Physical Maximum, data= [ 0xbb 0x09 ] 2491
            Item(Global): Logical Maximum, data= [ 0x83 0x03 ] 899
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Main  ): Collection, data= [ 0x02 ] 2
                            Logical
            Item(Global): Usage Page, data= [ 0x0d ] 13
                            Digitizer
            Item(Local ): Usage, data= [ 0x42 ] 66
                            Tip Switch
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x32 ] 50
                            In Range
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x47 ] 71
                            Confidence
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Main  ): Input, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Local ): Usage, data= [ 0x51 ] 81
                            Contact ID
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Global): Report Size, data= [ 0x10 ] 16
            Item(Global): Unit Exponent, data= [ 0x0e ] 14
                            Unit Exponent: 14
            Item(Global): Unit, data= [ 0x11 ] 17
                            System: SI Linear, Unit: Centimeter
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Global): Physical Minimum, data= [ 0x00 ] 0
            Item(Global): Physical Maximum, data= [ 0x4b 0x11 ] 4427
            Item(Global): Logical Maximum, data= [ 0x3f 0x06 ] 1599
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Physical Maximum, data= [ 0xbb 0x09 ] 2491
            Item(Global): Logical Maximum, data= [ 0x83 0x03 ] 899
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x0d ] 13
                            Digitizer
            Item(Local ): Usage, data= [ 0x54 ] 84
                            Contact Count
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x55 ] 85
                            Maximum Contact Number
            Item(Global): Logical Maximum, data= [ 0x02 ] 2
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report ID, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                            (null)
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x2f ] 47
            Item(Global): Report ID, data= [ 0x03 ] 3
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Report Count, data= [ 0xff 0x03 ] 1023
            Item(Global): Report ID, data= [ 0x04 ] 4
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Report Count, data= [ 0x0b ] 11
            Item(Global): Report ID, data= [ 0x05 ] 5
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Report Count, data= [ 0xff 0x03 ] 1023
            Item(Global): Report ID, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Report Count, data= [ 0x0f ] 15
            Item(Global): Report ID, data= [ 0x0a ] 10
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               8
Device Status:     0x0000
  (Bus Powered)