DATQ1THD6B0 touch screen module
DATQ1THD6B0 touch screen module from a TFT touch screen.
Contents
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)