요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
==========================
ALPS HID Touchpad Protocol
==========================
Introduction
------------
Currently ALPS HID driver supports U1 Touchpad device.
U1 device basic information.
========== ======
Vendor ID 0x044E
Product ID 0x120B
Version ID 0x0121
========== ======
HID Descriptor
--------------
======= ==================== ===== =======================================
Byte Field Value Notes
======= ==================== ===== =======================================
0 wHIDDescLength 001E Length of HID Descriptor : 30 bytes
2 bcdVersion 0100 Compliant with Version 1.00
4 wReportDescLength 00B2 Report Descriptor is 178 Bytes (0x00B2)
6 wReportDescRegister 0002 Identifier to read Report Descriptor
8 wInputRegister 0003 Identifier to read Input Report
10 wMaxInputLength 0053 Input Report is 80 Bytes + 2
12 wOutputRegister 0000 Identifier to read Output Report
14 wMaxOutputLength 0000 No Output Reports
16 wCommandRegister 0005 Identifier for Command Register
18 wDataRegister 0006 Identifier for Data Register
20 wVendorID 044E Vendor ID 0x044E
22 wProductID 120B Product ID 0x120B
24 wVersionID 0121 Version 01.21
26 RESERVED 0000 RESERVED
======= ==================== ===== =======================================
Report ID
---------
========== ================= =========================================
ReportID-1 (Input Reports) (HIDUsage-Mouse) for TP&SP
ReportID-2 (Input Reports) (HIDUsage-keyboard) for TP
ReportID-3 (Input Reports) (Vendor Usage: Max 10 finger data) for TP
ReportID-4 (Input Reports) (Vendor Usage: ON bit data) for GP
ReportID-5 (Feature Reports) Feature Reports
ReportID-6 (Input Reports) (Vendor Usage: StickPointer data) for SP
ReportID-7 (Feature Reports) Flash update (Bootloader)
========== ================= =========================================
Data pattern
------------
===== ========== ===== =================
Case1 ReportID_1 TP/SP Relative/Relative
Case2 ReportID_3 TP Absolute
ReportID_6 SP Absolute
===== ========== ===== =================
Command Read/Write
------------------
To read/write to RAM, need to send a command to the device.
The command format is as below.
DataByte(SET_REPORT)
===== ======================
Byte1 Command Byte
Byte2 Address - Byte 0 (LSB)
Byte3 Address - Byte 1
Byte4 Address - Byte 2
Byte5 Address - Byte 3 (MSB)
Byte6 Value Byte
Byte7 Checksum
===== ======================
Command Byte is read=0xD1/write=0xD2.
Address is read/write RAM address.
Value Byte is writing data when you send the write commands.
When you read RAM, there is no meaning.
DataByte(GET_REPORT)
===== ======================
Byte1 Response Byte
Byte2 Address - Byte 0 (LSB)
Byte3 Address - Byte 1
Byte4 Address - Byte 2
Byte5 Address - Byte 3 (MSB)
Byte6 Value Byte
Byte7 Checksum
===== ======================
Read value is stored in Value Byte.
Packet Format
Touchpad data byte
------------------
======= ======= ======= ======= ======= ======= ======= ======= =====
- b7 b6 b5 b4 b3 b2 b1 b0
======= ======= ======= ======= ======= ======= ======= ======= =====
1 0 0 SW6 SW5 SW4 SW3 SW2 SW1
2 0 0 0 Fcv Fn3 Fn2 Fn1 Fn0
3 Xa0_7 Xa0_6 Xa0_5 Xa0_4 Xa0_3 Xa0_2 Xa0_1 Xa0_0
4 Xa0_15 Xa0_14 Xa0_13 Xa0_12 Xa0_11 Xa0_10 Xa0_9 Xa0_8
5 Ya0_7 Ya0_6 Ya0_5 Ya0_4 Ya0_3 Ya0_2 Ya0_1 Ya0_0
6 Ya0_15 Ya0_14 Ya0_13 Ya0_12 Ya0_11 Ya0_10 Ya0_9 Ya0_8
7 LFB0 Zs0_6 Zs0_5 Zs0_4 Zs0_3 Zs0_2 Zs0_1 Zs0_0
8 Xa1_7 Xa1_6 Xa1_5 Xa1_4 Xa1_3 Xa1_2 Xa1_1 Xa1_0
9 Xa1_15 Xa1_14 Xa1_13 Xa1_12 Xa1_11 Xa1_10 Xa1_9 Xa1_8
10 Ya1_7 Ya1_6 Ya1_5 Ya1_4 Ya1_3 Ya1_2 Ya1_1 Ya1_0
11 Ya1_15 Ya1_14 Ya1_13 Ya1_12 Ya1_11 Ya1_10 Ya1_9 Ya1_8
12 LFB1 Zs1_6 Zs1_5 Zs1_4 Zs1_3 Zs1_2 Zs1_1 Zs1_0
13 Xa2_7 Xa2_6 Xa2_5 Xa2_4 Xa2_3 Xa2_2 Xa2_1 Xa2_0
14 Xa2_15 Xa2_14 Xa2_13 Xa2_12 Xa2_11 Xa2_10 Xa2_9 Xa2_8
15 Ya2_7 Ya2_6 Ya2_5 Ya2_4 Ya2_3 Ya2_2 Ya2_1 Ya2_0
16 Ya2_15 Ya2_14 Ya2_13 Ya2_12 Ya2_11 Ya2_10 Ya2_9 Ya2_8
17 LFB2 Zs2_6 Zs2_5 Zs2_4 Zs2_3 Zs2_2 Zs2_1 Zs2_0
18 Xa3_7 Xa3_6 Xa3_5 Xa3_4 Xa3_3 Xa3_2 Xa3_1 Xa3_0
19 Xa3_15 Xa3_14 Xa3_13 Xa3_12 Xa3_11 Xa3_10 Xa3_9 Xa3_8
20 Ya3_7 Ya3_6 Ya3_5 Ya3_4 Ya3_3 Ya3_2 Ya3_1 Ya3_0
21 Ya3_15 Ya3_14 Ya3_13 Ya3_12 Ya3_11 Ya3_10 Ya3_9 Ya3_8
22 LFB3 Zs3_6 Zs3_5 Zs3_4 Zs3_3 Zs3_2 Zs3_1 Zs3_0
23 Xa4_7 Xa4_6 Xa4_5 Xa4_4 Xa4_3 Xa4_2 Xa4_1 Xa4_0
24 Xa4_15 Xa4_14 Xa4_13 Xa4_12 Xa4_11 Xa4_10 Xa4_9 Xa4_8
25 Ya4_7 Ya4_6 Ya4_5 Ya4_4 Ya4_3 Ya4_2 Ya4_1 Ya4_0
26 Ya4_15 Ya4_14 Ya4_13 Ya4_12 Ya4_11 Ya4_10 Ya4_9 Ya4_8
27 LFB4 Zs4_6 Zs4_5 Zs4_4 Zs4_3 Zs4_2 Zs4_1 Zs4_0
======= ======= ======= ======= ======= ======= ======= ======= =====
SW1-SW6:
SW ON/OFF status
Xan_15-0(16bit):
X Absolute data of the "n"th finger
Yan_15-0(16bit):
Y Absolute data of the "n"th finger
Zsn_6-0(7bit):
Operation area of the "n"th finger
StickPointer data byte
----------------------
======= ======= ======= ======= ======= ======= ======= ======= =====
- b7 b6 b5 b4 b3 b2 b1 b0
======= ======= ======= ======= ======= ======= ======= ======= =====
Byte1 1 1 1 0 1 SW3 SW2 SW1
Byte2 X7 X6 X5 X4 X3 X2 X1 X0
Byte3 X15 X14 X13 X12 X11 X10 X9 X8
Byte4 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
Byte5 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8
Byte6 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0
Byte7 T&P Z14 Z13 Z12 Z11 Z10 Z9 Z8
======= ======= ======= ======= ======= ======= ======= ======= =====
SW1-SW3:
SW ON/OFF status
Xn_15-0(16bit):
X Absolute data
Yn_15-0(16bit):
Y Absolute data
Zn_14-0(15bit):
Z
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
ALPS U1 HID touchpad 기본 정보
1-17현재 ALPS HID driver는 U1 Touchpad device를 지원합니다.
U1의 Vendor ID는 `0x044E`, Product ID는 `0x120B`, Version ID는 `0x0121`입니다.
지원 장치의 기본 식별자입니다.
세 ID로 U1 touchpad를 식별합니다.
==========================
ALPS HID Touchpad Protocol
==========================
Introduction
------------
Currently ALPS HID driver supports U1 Touchpad device.
U1 device basic information.
========== ======
Vendor ID 0x044E
Product ID 0x120B
Version ID 0x0121
========== ======
HID descriptor와 Report ID
18-54HID descriptor 길이 `wHIDDescLength`는 `0x001E`, 즉 30byte이고 `bcdVersion=0x0100`으로 HID over I2C Version 1.00을 따릅니다. Report descriptor는 `wReportDescLength=0x00B2`, 즉 178byte이며 register `0x0002`에서 읽습니다.
Input report register는 `0x0003`, 최대 input 길이는 `0x0053`으로 80byte에 2byte를 더한 값입니다. Output report register와 최대 길이는 모두 `0x0000`이므로 output report는 없습니다. Command register는 `0x0005`, data register는 `0x0006`입니다.
Descriptor의 Vendor ID `0x044E`, Product ID `0x120B`, Version ID `0x0121`이 기본 정보와 일치하며 마지막 2byte는 reserved `0x0000`입니다.
`ReportID-1`은 TP·SP용 relative mouse input, `ReportID-2`는 TP keyboard input, `ReportID-3`은 TP의 최대 10 finger vendor input, `ReportID-4`는 GP의 ON bit vendor input, `ReportID-5`는 feature report, `ReportID-6`은 SP StickPointer input, `ReportID-7`은 bootloader flash update feature report입니다.
원문 descriptor 표를 한국어 구조로 보존합니다.
Input·feature report를 용도별로 해석합니다.
HID Descriptor
--------------
======= ==================== ===== =======================================
Byte Field Value Notes
======= ==================== ===== =======================================
0 wHIDDescLength 001E Length of HID Descriptor : 30 bytes
2 bcdVersion 0100 Compliant with Version 1.00
4 wReportDescLength 00B2 Report Descriptor is 178 Bytes (0x00B2)
6 wReportDescRegister 0002 Identifier to read Report Descriptor
8 wInputRegister 0003 Identifier to read Input Report
10 wMaxInputLength 0053 Input Report is 80 Bytes + 2
12 wOutputRegister 0000 Identifier to read Output Report
14 wMaxOutputLength 0000 No Output Reports
16 wCommandRegister 0005 Identifier for Command Register
18 wDataRegister 0006 Identifier for Data Register
20 wVendorID 044E Vendor ID 0x044E
22 wProductID 120B Product ID 0x120B
24 wVersionID 0121 Version 01.21
26 RESERVED 0000 RESERVED
======= ==================== ===== =======================================
Report ID
---------
========== ================= =========================================
ReportID-1 (Input Reports) (HIDUsage-Mouse) for TP&SP
ReportID-2 (Input Reports) (HIDUsage-keyboard) for TP
ReportID-3 (Input Reports) (Vendor Usage: Max 10 finger data) for TP
ReportID-4 (Input Reports) (Vendor Usage: ON bit data) for GP
ReportID-5 (Feature Reports) Feature Reports
ReportID-6 (Input Reports) (Vendor Usage: StickPointer data) for SP
ReportID-7 (Feature Reports) Flash update (Bootloader)
========== ================= =========================================
Data pattern과 RAM read/write command
55-106Case 1은 Report ID 1을 사용하며 TP와 SP 모두 relative data입니다. Case 2는 TP absolute data에 Report ID 3, SP absolute data에 Report ID 6을 사용합니다.
RAM을 읽거나 쓰려면 device에 command를 보내야 합니다. `SET_REPORT`의 7byte는 command byte, 32bit address의 byte 0(LSB)부터 byte 3(MSB), value byte, checksum 순서입니다.
Command byte는 read `0xD1`, write `0xD2`입니다. Address는 대상 RAM address입니다. Write command에서는 value byte가 쓸 data이고 read command를 보낼 때는 의미가 없습니다.
`GET_REPORT` response도 response byte, 32bit address, value byte, checksum의 7byte 형식이며 읽은 값은 value byte에 저장됩니다.
SET_REPORT와 GET_REPORT의 byte layout입니다.
Command와 response packet의 왕복입니다.
Data pattern
------------
===== ========== ===== =================
Case1 ReportID_1 TP/SP Relative/Relative
Case2 ReportID_3 TP Absolute
ReportID_6 SP Absolute
===== ========== ===== =================
Command Read/Write
------------------
To read/write to RAM, need to send a command to the device.
The command format is as below.
DataByte(SET_REPORT)
===== ======================
Byte1 Command Byte
Byte2 Address - Byte 0 (LSB)
Byte3 Address - Byte 1
Byte4 Address - Byte 2
Byte5 Address - Byte 3 (MSB)
Byte6 Value Byte
Byte7 Checksum
===== ======================
Command Byte is read=0xD1/write=0xD2.
Address is read/write RAM address.
Value Byte is writing data when you send the write commands.
When you read RAM, there is no meaning.
DataByte(GET_REPORT)
===== ======================
Byte1 Response Byte
Byte2 Address - Byte 0 (LSB)
Byte3 Address - Byte 1
Byte4 Address - Byte 2
Byte5 Address - Byte 3 (MSB)
Byte6 Value Byte
Byte7 Checksum
===== ======================
Read value is stored in Value Byte.
Packet Format
Touchpad 27byte packet
107-157Touchpad packet은 처음 2byte의 switch·finger 상태 뒤에 최대 다섯 finger의 absolute X·Y와 7bit operation-area 값이 이어지는 27byte 형식입니다.
Byte 1의 `SW1`~`SW6`는 switch ON/OFF 상태입니다. 각 finger `n`의 `Xan_15-0`과 `Yan_15-0`은 16bit absolute X·Y data이고, `Zsn_6-0`은 7bit operation area입니다. 각 finger의 Z byte 최상위 bit는 `LFBn`입니다.
원문의 27byte bit 표를 그대로 구조화했습니다.
공통 5byte finger record를 반복 해석합니다.
Touchpad data byte
------------------
======= ======= ======= ======= ======= ======= ======= ======= =====
- b7 b6 b5 b4 b3 b2 b1 b0
======= ======= ======= ======= ======= ======= ======= ======= =====
1 0 0 SW6 SW5 SW4 SW3 SW2 SW1
2 0 0 0 Fcv Fn3 Fn2 Fn1 Fn0
3 Xa0_7 Xa0_6 Xa0_5 Xa0_4 Xa0_3 Xa0_2 Xa0_1 Xa0_0
4 Xa0_15 Xa0_14 Xa0_13 Xa0_12 Xa0_11 Xa0_10 Xa0_9 Xa0_8
5 Ya0_7 Ya0_6 Ya0_5 Ya0_4 Ya0_3 Ya0_2 Ya0_1 Ya0_0
6 Ya0_15 Ya0_14 Ya0_13 Ya0_12 Ya0_11 Ya0_10 Ya0_9 Ya0_8
7 LFB0 Zs0_6 Zs0_5 Zs0_4 Zs0_3 Zs0_2 Zs0_1 Zs0_0
8 Xa1_7 Xa1_6 Xa1_5 Xa1_4 Xa1_3 Xa1_2 Xa1_1 Xa1_0
9 Xa1_15 Xa1_14 Xa1_13 Xa1_12 Xa1_11 Xa1_10 Xa1_9 Xa1_8
10 Ya1_7 Ya1_6 Ya1_5 Ya1_4 Ya1_3 Ya1_2 Ya1_1 Ya1_0
11 Ya1_15 Ya1_14 Ya1_13 Ya1_12 Ya1_11 Ya1_10 Ya1_9 Ya1_8
12 LFB1 Zs1_6 Zs1_5 Zs1_4 Zs1_3 Zs1_2 Zs1_1 Zs1_0
13 Xa2_7 Xa2_6 Xa2_5 Xa2_4 Xa2_3 Xa2_2 Xa2_1 Xa2_0
14 Xa2_15 Xa2_14 Xa2_13 Xa2_12 Xa2_11 Xa2_10 Xa2_9 Xa2_8
15 Ya2_7 Ya2_6 Ya2_5 Ya2_4 Ya2_3 Ya2_2 Ya2_1 Ya2_0
16 Ya2_15 Ya2_14 Ya2_13 Ya2_12 Ya2_11 Ya2_10 Ya2_9 Ya2_8
17 LFB2 Zs2_6 Zs2_5 Zs2_4 Zs2_3 Zs2_2 Zs2_1 Zs2_0
18 Xa3_7 Xa3_6 Xa3_5 Xa3_4 Xa3_3 Xa3_2 Xa3_1 Xa3_0
19 Xa3_15 Xa3_14 Xa3_13 Xa3_12 Xa3_11 Xa3_10 Xa3_9 Xa3_8
20 Ya3_7 Ya3_6 Ya3_5 Ya3_4 Ya3_3 Ya3_2 Ya3_1 Ya3_0
21 Ya3_15 Ya3_14 Ya3_13 Ya3_12 Ya3_11 Ya3_10 Ya3_9 Ya3_8
22 LFB3 Zs3_6 Zs3_5 Zs3_4 Zs3_3 Zs3_2 Zs3_1 Zs3_0
23 Xa4_7 Xa4_6 Xa4_5 Xa4_4 Xa4_3 Xa4_2 Xa4_1 Xa4_0
24 Xa4_15 Xa4_14 Xa4_13 Xa4_12 Xa4_11 Xa4_10 Xa4_9 Xa4_8
25 Ya4_7 Ya4_6 Ya4_5 Ya4_4 Ya4_3 Ya4_2 Ya4_1 Ya4_0
26 Ya4_15 Ya4_14 Ya4_13 Ya4_12 Ya4_11 Ya4_10 Ya4_9 Ya4_8
27 LFB4 Zs4_6 Zs4_5 Zs4_4 Zs4_3 Zs4_2 Zs4_1 Zs4_0
======= ======= ======= ======= ======= ======= ======= ======= =====
SW1-SW6:
SW ON/OFF status
Xan_15-0(16bit):
X Absolute data of the "n"th finger
Yan_15-0(16bit):
Y Absolute data of the "n"th finger
Zsn_6-0(7bit):
Operation area of the "n"th finger
StickPointer 7byte packet
158-180StickPointer packet은 7byte입니다. Byte 1의 상위 고정 bit는 `11101`이고 하위 세 bit `SW3`~`SW1`은 switch ON/OFF 상태입니다.
Byte 2·3은 16bit absolute X의 low·high byte, byte 4·5는 16bit absolute Y의 low·high byte입니다. Byte 6은 Z의 low 8bit, byte 7은 `T&P`와 Z의 bit 14..8을 담아 총 15bit Z를 구성합니다.
원문의 7byte bit 표를 구조화했습니다.
7byte에서 switch와 absolute axis를 조립합니다.
StickPointer data byte
----------------------
======= ======= ======= ======= ======= ======= ======= ======= =====
- b7 b6 b5 b4 b3 b2 b1 b0
======= ======= ======= ======= ======= ======= ======= ======= =====
Byte1 1 1 1 0 1 SW3 SW2 SW1
Byte2 X7 X6 X5 X4 X3 X2 X1 X0
Byte3 X15 X14 X13 X12 X11 X10 X9 X8
Byte4 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
Byte5 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8
Byte6 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0
Byte7 T&P Z14 Z13 Z12 Z11 Z10 Z9 Z8
======= ======= ======= ======= ======= ======= ======= ======= =====
SW1-SW3:
SW ON/OFF status
Xn_15-0(16bit):
X Absolute data
Yn_15-0(16bit):
Y Absolute data
Zn_14-0(15bit):
Z
요약·해설
hid-alps.rst:1-180ALPS U1 HID descriptor, command와 touch·StickPointer packet format을 설명합니다.
Source와 관련 구현·규격입니다.