# lxs-touch

## Introduction

This plugin supports firmware updates for the LX Semicon SW42101 touch controller.
It communicates over the HID RAW interface (hidraw) and handles two protocol modes: SWIP and DFUP.

### Protocol Modes

- **SWIP (Software In-Protocol)**: Normal touch operation mode. Version and panel information can be queried.
- **DFUP (Device Firmware Upgrade Protocol)**: Bootloader mode dedicated to firmware updates.

### Firmware Update Flow

1. **Setup**: On device connection, check the protocol mode and read version and panel information.
2. **Detach**: Switch from SWIP mode to DFUP mode (`REG_CTRL_SETTER`, mode=`0x02`) and wait for replug.
3. **Write**: Write firmware to flash in chunks while in DFUP mode.
4. **Attach**: After firmware write completes, restart the device via watchdog reset (`CMD_WATCHDOG_RESET`).

### Flash Write Modes

| Mode   | Chunk size | Transmit unit | Verification     |
|--------|------------|---------------|------------------|
| Normal | 128 bytes  | 16 bytes      | None             |
| 4K     | 4096 bytes | 48 bytes      | Yes (5 retries)  |

4K mode support is auto-detected at runtime by querying the device (`CMD_FLASH_4KB_UPDATE_MODE`).

## Firmware Formats

| Type               | Size  | Flash offset | Description                   |
|--------------------|-------|--------------|-------------------------------|
| Application-only   | 112KB | `0x4000`     | Application area only         |
| Boot + Application | 128KB | `0x0000`     | Bootloader + full application |

## Version Format

The device version used for update comparison consists of three application fields
(excluding the bootloader version):

`{core_ver}.{app_ver}.{param_ver}`

Example: `0000.0400.0000`

The bootloader version is stored separately via `fu_device_set_version_bootloader()`
and is not included in upgrade/downgrade comparisons. This prevents false downgrade
detection when the boot firmware is updated independently of the application firmware.

## Communication Protocol

Uses HID Output Reports (Report ID `0x09`, 64-byte buffer).

Read response header is 4 bytes; payload data starts at offset 4.

## Vendor ID Security

The vendor ID is set from the HID vendor ID, in this instance set
to `HIDRAW:0x1FD2`.

## External Interface Access

This plugin requires ioctl `HIDIOCSFEATURE` and `HIDIOCGFEATURE` access.

## Version Considerations

This plugin has been available since fwupd version `2.1.2`.
