← Documents Documentation/hid/hid-alps.rst GitHub 원문 ↗

Linux 6.18.37 · HID

ALPS HID Touchpad Protocol

ALPS U1 HID descriptor, command와 touch·StickPointer packet format을 설명합니다.

Source pathDocumentation/hid/hid-alps.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

hid-alps.rst:1-180

ALPS U1 HID descriptor, command와 touch·StickPointer packet format을 설명합니다.

문서 위치
항목
SourceDocumentation/hid/hid-alps.rst
분량180 source lines
관련0x044E · 0x120B · ReportID-3

Source와 관련 구현·규격입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ==========================
2 ALPS HID Touchpad Protocol
3 ==========================
4
5 Introduction
6 ------------
7 Currently ALPS HID driver supports U1 Touchpad device.
8
9 U1 device basic information.
10
11 ========== ======
12 Vendor ID 0x044E
13 Product ID 0x120B
14 Version ID 0x0121
15 ========== ======
16
17
18 HID Descriptor
19 --------------
20
21 ======= ==================== ===== =======================================
22 Byte Field Value Notes
23 ======= ==================== ===== =======================================
24 0 wHIDDescLength 001E Length of HID Descriptor : 30 bytes
25 2 bcdVersion 0100 Compliant with Version 1.00
26 4 wReportDescLength 00B2 Report Descriptor is 178 Bytes (0x00B2)
27 6 wReportDescRegister 0002 Identifier to read Report Descriptor
28 8 wInputRegister 0003 Identifier to read Input Report
29 10 wMaxInputLength 0053 Input Report is 80 Bytes + 2
30 12 wOutputRegister 0000 Identifier to read Output Report
31 14 wMaxOutputLength 0000 No Output Reports
32 16 wCommandRegister 0005 Identifier for Command Register
33 18 wDataRegister 0006 Identifier for Data Register
34 20 wVendorID 044E Vendor ID 0x044E
35 22 wProductID 120B Product ID 0x120B
36 24 wVersionID 0121 Version 01.21
37 26 RESERVED 0000 RESERVED
38 ======= ==================== ===== =======================================
39
40
41 Report ID
42 ---------
43
44 ========== ================= =========================================
45 ReportID-1 (Input Reports) (HIDUsage-Mouse) for TP&SP
46 ReportID-2 (Input Reports) (HIDUsage-keyboard) for TP
47 ReportID-3 (Input Reports) (Vendor Usage: Max 10 finger data) for TP
48 ReportID-4 (Input Reports) (Vendor Usage: ON bit data) for GP
49 ReportID-5 (Feature Reports) Feature Reports
50 ReportID-6 (Input Reports) (Vendor Usage: StickPointer data) for SP
51 ReportID-7 (Feature Reports) Flash update (Bootloader)
52 ========== ================= =========================================
53
54
55 Data pattern
56 ------------
57
58 ===== ========== ===== =================
59 Case1 ReportID_1 TP/SP Relative/Relative
60 Case2 ReportID_3 TP Absolute
61 ReportID_6 SP Absolute
62 ===== ========== ===== =================
63
64
65 Command Read/Write
66 ------------------
67 To read/write to RAM, need to send a command to the device.
68
69 The command format is as below.
70
71 DataByte(SET_REPORT)
72
73 ===== ======================
74 Byte1 Command Byte
75 Byte2 Address - Byte 0 (LSB)
76 Byte3 Address - Byte 1
77 Byte4 Address - Byte 2
78 Byte5 Address - Byte 3 (MSB)
79 Byte6 Value Byte
80 Byte7 Checksum
81 ===== ======================
82
83 Command Byte is read=0xD1/write=0xD2.
84
85 Address is read/write RAM address.
86
87 Value Byte is writing data when you send the write commands.
88
89 When you read RAM, there is no meaning.
90
91 DataByte(GET_REPORT)
92
93 ===== ======================
94 Byte1 Response Byte
95 Byte2 Address - Byte 0 (LSB)
96 Byte3 Address - Byte 1
97 Byte4 Address - Byte 2
98 Byte5 Address - Byte 3 (MSB)
99 Byte6 Value Byte
100 Byte7 Checksum
101 ===== ======================
102
103 Read value is stored in Value Byte.
104
105
106 Packet Format
107 Touchpad data byte
108 ------------------
109
110
111 ======= ======= ======= ======= ======= ======= ======= ======= =====
112 - b7 b6 b5 b4 b3 b2 b1 b0
113 ======= ======= ======= ======= ======= ======= ======= ======= =====
114 1 0 0 SW6 SW5 SW4 SW3 SW2 SW1
115 2 0 0 0 Fcv Fn3 Fn2 Fn1 Fn0
116 3 Xa0_7 Xa0_6 Xa0_5 Xa0_4 Xa0_3 Xa0_2 Xa0_1 Xa0_0
117 4 Xa0_15 Xa0_14 Xa0_13 Xa0_12 Xa0_11 Xa0_10 Xa0_9 Xa0_8
118 5 Ya0_7 Ya0_6 Ya0_5 Ya0_4 Ya0_3 Ya0_2 Ya0_1 Ya0_0
119 6 Ya0_15 Ya0_14 Ya0_13 Ya0_12 Ya0_11 Ya0_10 Ya0_9 Ya0_8
120 7 LFB0 Zs0_6 Zs0_5 Zs0_4 Zs0_3 Zs0_2 Zs0_1 Zs0_0
121
122 8 Xa1_7 Xa1_6 Xa1_5 Xa1_4 Xa1_3 Xa1_2 Xa1_1 Xa1_0
123 9 Xa1_15 Xa1_14 Xa1_13 Xa1_12 Xa1_11 Xa1_10 Xa1_9 Xa1_8
124 10 Ya1_7 Ya1_6 Ya1_5 Ya1_4 Ya1_3 Ya1_2 Ya1_1 Ya1_0
125 11 Ya1_15 Ya1_14 Ya1_13 Ya1_12 Ya1_11 Ya1_10 Ya1_9 Ya1_8
126 12 LFB1 Zs1_6 Zs1_5 Zs1_4 Zs1_3 Zs1_2 Zs1_1 Zs1_0
127
128 13 Xa2_7 Xa2_6 Xa2_5 Xa2_4 Xa2_3 Xa2_2 Xa2_1 Xa2_0
129 14 Xa2_15 Xa2_14 Xa2_13 Xa2_12 Xa2_11 Xa2_10 Xa2_9 Xa2_8
130 15 Ya2_7 Ya2_6 Ya2_5 Ya2_4 Ya2_3 Ya2_2 Ya2_1 Ya2_0
131 16 Ya2_15 Ya2_14 Ya2_13 Ya2_12 Ya2_11 Ya2_10 Ya2_9 Ya2_8
132 17 LFB2 Zs2_6 Zs2_5 Zs2_4 Zs2_3 Zs2_2 Zs2_1 Zs2_0
133
134 18 Xa3_7 Xa3_6 Xa3_5 Xa3_4 Xa3_3 Xa3_2 Xa3_1 Xa3_0
135 19 Xa3_15 Xa3_14 Xa3_13 Xa3_12 Xa3_11 Xa3_10 Xa3_9 Xa3_8
136 20 Ya3_7 Ya3_6 Ya3_5 Ya3_4 Ya3_3 Ya3_2 Ya3_1 Ya3_0
137 21 Ya3_15 Ya3_14 Ya3_13 Ya3_12 Ya3_11 Ya3_10 Ya3_9 Ya3_8
138 22 LFB3 Zs3_6 Zs3_5 Zs3_4 Zs3_3 Zs3_2 Zs3_1 Zs3_0
139
140 23 Xa4_7 Xa4_6 Xa4_5 Xa4_4 Xa4_3 Xa4_2 Xa4_1 Xa4_0
141 24 Xa4_15 Xa4_14 Xa4_13 Xa4_12 Xa4_11 Xa4_10 Xa4_9 Xa4_8
142 25 Ya4_7 Ya4_6 Ya4_5 Ya4_4 Ya4_3 Ya4_2 Ya4_1 Ya4_0
143 26 Ya4_15 Ya4_14 Ya4_13 Ya4_12 Ya4_11 Ya4_10 Ya4_9 Ya4_8
144 27 LFB4 Zs4_6 Zs4_5 Zs4_4 Zs4_3 Zs4_2 Zs4_1 Zs4_0
145 ======= ======= ======= ======= ======= ======= ======= ======= =====
146
147
148 SW1-SW6:
149 SW ON/OFF status
150 Xan_15-0(16bit):
151 X Absolute data of the "n"th finger
152 Yan_15-0(16bit):
153 Y Absolute data of the "n"th finger
154 Zsn_6-0(7bit):
155 Operation area of the "n"th finger
156
157
158 StickPointer data byte
159 ----------------------
160
161 ======= ======= ======= ======= ======= ======= ======= ======= =====
162 - b7 b6 b5 b4 b3 b2 b1 b0
163 ======= ======= ======= ======= ======= ======= ======= ======= =====
164 Byte1 1 1 1 0 1 SW3 SW2 SW1
165 Byte2 X7 X6 X5 X4 X3 X2 X1 X0
166 Byte3 X15 X14 X13 X12 X11 X10 X9 X8
167 Byte4 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
168 Byte5 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8
169 Byte6 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0
170 Byte7 T&P Z14 Z13 Z12 Z11 Z10 Z9 Z8
171 ======= ======= ======= ======= ======= ======= ======= ======= =====
172
173 SW1-SW3:
174 SW ON/OFF status
175 Xn_15-0(16bit):
176 X Absolute data
177 Yn_15-0(16bit):
178 Y Absolute data
179 Zn_14-0(15bit):
180 Z
181

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`입니다.

ALPS U1 device ID
항목
Vendor ID0x044E
Product ID0x120B
Version ID0x0121

지원 장치의 기본 식별자입니다.

ALPS HID device match
HID transport에서 device 발견Vendor 0x044E 확인Product 0x120B 확인Version 0x0121 확인ALPS U1 protocol 적용

세 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-54

HID 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입니다.

ALPS HID descriptor
OffsetFieldValue의미
0wHIDDescLength001E30byte descriptor
2bcdVersion0100Version 1.00
4wReportDescLength00B2178byte report descriptor
6wReportDescRegister0002Report descriptor register
8wInputRegister0003Input report register
10wMaxInputLength005380byte + 2
12wOutputRegister0000Output report 없음
14wMaxOutputLength0000Output report 없음
16wCommandRegister0005Command register
18wDataRegister0006Data register
20wVendorID044EVendor ID
22wProductID120BProduct ID
24wVersionID0121Version 01.21
26RESERVED0000Reserved

원문 descriptor 표를 한국어 구조로 보존합니다.

Report ID 분기
Report ID 수신1: TP/SP relative mouse2·3: TP keyboard 또는 multi-finger4: GP ON-bit data5·7: feature 또는 bootloader6: StickPointer data

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-106

Case 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에 저장됩니다.

ALPS RAM command
ByteSET_REPORTGET_REPORT
1Command Byte: D1 read / D2 writeResponse Byte
2Address Byte 0 (LSB)Address Byte 0 (LSB)
3Address Byte 1Address Byte 1
4Address Byte 2Address Byte 2
5Address Byte 3 (MSB)Address Byte 3 (MSB)
6Write Value / read 시 무의미Read Value
7ChecksumChecksum

SET_REPORT와 GET_REPORT의 byte layout입니다.

RAM read/write
Read D1 또는 write D2 선택32bit RAM address를 little-endian byte로 배치Write이면 value byte 설정SET_REPORT와 checksum 전송GET_REPORT response 수신Read이면 value byte 추출

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-157

Touchpad 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`입니다.

ALPS touchpad packet bits
Byteb7b6b5b4b3b2b1b0
100SW6SW5SW4SW3SW2SW1
2000FcvFn3Fn2Fn1Fn0
3Xa0_7Xa0_6Xa0_5Xa0_4Xa0_3Xa0_2Xa0_1Xa0_0
4Xa0_15Xa0_14Xa0_13Xa0_12Xa0_11Xa0_10Xa0_9Xa0_8
5Ya0_7Ya0_6Ya0_5Ya0_4Ya0_3Ya0_2Ya0_1Ya0_0
6Ya0_15Ya0_14Ya0_13Ya0_12Ya0_11Ya0_10Ya0_9Ya0_8
7LFB0Zs0_6Zs0_5Zs0_4Zs0_3Zs0_2Zs0_1Zs0_0
8Xa1_7Xa1_6Xa1_5Xa1_4Xa1_3Xa1_2Xa1_1Xa1_0
9Xa1_15Xa1_14Xa1_13Xa1_12Xa1_11Xa1_10Xa1_9Xa1_8
10Ya1_7Ya1_6Ya1_5Ya1_4Ya1_3Ya1_2Ya1_1Ya1_0
11Ya1_15Ya1_14Ya1_13Ya1_12Ya1_11Ya1_10Ya1_9Ya1_8
12LFB1Zs1_6Zs1_5Zs1_4Zs1_3Zs1_2Zs1_1Zs1_0
13Xa2_7Xa2_6Xa2_5Xa2_4Xa2_3Xa2_2Xa2_1Xa2_0
14Xa2_15Xa2_14Xa2_13Xa2_12Xa2_11Xa2_10Xa2_9Xa2_8
15Ya2_7Ya2_6Ya2_5Ya2_4Ya2_3Ya2_2Ya2_1Ya2_0
16Ya2_15Ya2_14Ya2_13Ya2_12Ya2_11Ya2_10Ya2_9Ya2_8
17LFB2Zs2_6Zs2_5Zs2_4Zs2_3Zs2_2Zs2_1Zs2_0
18Xa3_7Xa3_6Xa3_5Xa3_4Xa3_3Xa3_2Xa3_1Xa3_0
19Xa3_15Xa3_14Xa3_13Xa3_12Xa3_11Xa3_10Xa3_9Xa3_8
20Ya3_7Ya3_6Ya3_5Ya3_4Ya3_3Ya3_2Ya3_1Ya3_0
21Ya3_15Ya3_14Ya3_13Ya3_12Ya3_11Ya3_10Ya3_9Ya3_8
22LFB3Zs3_6Zs3_5Zs3_4Zs3_3Zs3_2Zs3_1Zs3_0
23Xa4_7Xa4_6Xa4_5Xa4_4Xa4_3Xa4_2Xa4_1Xa4_0
24Xa4_15Xa4_14Xa4_13Xa4_12Xa4_11Xa4_10Xa4_9Xa4_8
25Ya4_7Ya4_6Ya4_5Ya4_4Ya4_3Ya4_2Ya4_1Ya4_0
26Ya4_15Ya4_14Ya4_13Ya4_12Ya4_11Ya4_10Ya4_9Ya4_8
27LFB4Zs4_6Zs4_5Zs4_4Zs4_3Zs4_2Zs4_1Zs4_0

원문의 27byte bit 표를 그대로 구조화했습니다.

다섯 finger packet decode
Byte 1에서 SW1..SW6 상태 읽기Byte 2에서 Fcv·Fn0..Fn3 읽기Finger 0: bytes 3..7Finger 1: bytes 8..12Finger 2: bytes 13..17Finger 3: bytes 18..22Finger 4: bytes 23..27각 record에서 X16·Y16·LFB·Z7 조합

공통 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-180

StickPointer 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를 구성합니다.

ALPS StickPointer packet bits
Byteb7b6b5b4b3b2b1b0
111101SW3SW2SW1
2X7X6X5X4X3X2X1X0
3X15X14X13X12X11X10X9X8
4Y7Y6Y5Y4Y3Y2Y1Y0
5Y15Y14Y13Y12Y11Y10Y9Y8
6Z7Z6Z5Z4Z3Z2Z1Z0
7T&PZ14Z13Z12Z11Z10Z9Z8

원문의 7byte bit 표를 구조화했습니다.

StickPointer decode
Byte 1 signature 11101 확인SW1..SW3 상태 추출Bytes 2·3에서 X16 조립Bytes 4·5에서 Y16 조립Bytes 6·7에서 Z15 조립T&P flag와 axis event 보고

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