umcpmio_hid_reports.h revision 1.1 1 /* $NetBSD: umcpmio_hid_reports.h,v 1.1 2024/12/16 16:37:38 brad Exp $ */
2
3 /*
4 * Copyright (c) 2024 Brad Spencer <brad (at) anduin.eldar.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19
20 #ifndef _UMCPMIO_HID_REPORTS_H_
21 #define _UMCPMIO_HID_REPORTS_H_
22
23
24 #include <sys/types.h>
25
26
27 /* It is nice that all HID reports want a 64 byte request and return a 64 byte
28 * response.
29 */
30
31 #define MCP2221_REQ_BUFFER_SIZE 64
32 #define MCP2221_RES_BUFFER_SIZE 64
33
34 #define MCP2221_CMD_STATUS 0x10
35
36 #define MCP2221_CMD_I2C_FETCH_READ_DATA 0x40
37
38 #define MCP2221_CMD_SET_GPIO_CFG 0x50
39 #define MCP2221_CMD_GET_GPIO_CFG 0x51
40
41 #define MCP2221_CMD_SET_SRAM 0x60
42 #define MCP2221_CMD_GET_SRAM 0x61
43
44 #define MCP2221_I2C_WRITE_DATA 0x90
45 #define MCP2221_I2C_READ_DATA 0x91
46 #define MCP2221_I2C_WRITE_DATA_RS 0x92
47 #define MCP2221_I2C_READ_DATA_RS 0x93
48 #define MCP2221_I2C_WRITE_DATA_NS 0x94
49
50 #define MCP2221_CMD_GET_FLASH 0xb0
51 #define MCP2221_CMD_SET_FLASH 0xb1
52 #define MCP2221_CMD_SEND_FLASH_PASSWORD 0xb2
53
54 #define MCP2221_CMD_COMPLETE_OK 0x00
55 #define MCP2221_CMD_COMPLETE_NO_SUPPORT 0x02
56 #define MCP2221_CMD_COMPLETE_EPERM 0x03
57
58 #define MCP2221_I2C_DO_CANCEL 0x10
59 #define MCP2221_INTERNAL_CLOCK 12000000
60 #define MCP2221_DEFAULT_I2C_SPEED 100000
61 #define MCP2221_I2C_SET_SPEED 0x20
62
63 /* The request and response structures are, perhaps, over literal. */
64
65 struct mcp2221_status_req {
66 uint8_t cmd; /* MCP2221_CMD_STATUS */
67 uint8_t dontcare1;
68 uint8_t cancel_transfer;
69 uint8_t set_i2c_speed;
70 uint8_t i2c_clock_divider;
71 uint8_t dontcare2[59];
72 };
73
74 #define MCP2221_I2C_SPEED_SET 0x20
75 #define MCP2221_I2C_SPEED_BUSY 0x21
76 #define MCP2221_ENGINE_T1_MASK_NACK 0x40
77
78 struct mcp2221_status_res {
79 uint8_t cmd;
80 uint8_t completion;
81 uint8_t cancel_transfer;
82 uint8_t set_i2c_speed;
83 uint8_t i2c_clock_divider;
84 uint8_t dontcare2[3];
85 uint8_t internal_i2c_state;
86 uint8_t lsb_i2c_req_len;
87 uint8_t msb_i2c_req_len;
88 uint8_t lsb_i2c_trans_len;
89 uint8_t msb_i2c_trans_len;
90 uint8_t internal_i2c_bcount;
91 uint8_t i2c_speed_divider;
92 uint8_t i2c_timeout_value;
93 uint8_t lsb_i2c_address;
94 uint8_t msb_i2c_address;
95 uint8_t dontcare3a[2];
96 uint8_t internal_i2c_state20;
97 uint8_t dontcare3b;
98 uint8_t scl_line_value;
99 uint8_t sda_line_value;
100 uint8_t interrupt_edge_state;
101 uint8_t i2c_read_pending;
102 uint8_t dontcare4[20];
103 uint8_t mcp2221_hardware_rev_major;
104 uint8_t mcp2221_hardware_rev_minor;
105 uint8_t mcp2221_firmware_rev_major;
106 uint8_t mcp2221_firmware_rev_minor;
107 uint8_t adc_channel0_lsb;
108 uint8_t adc_channel0_msb;
109 uint8_t adc_channel1_lsb;
110 uint8_t adc_channel1_msb;
111 uint8_t adc_channel2_lsb;
112 uint8_t adc_channel2_msb;
113 uint8_t dontcare5[8];
114 };
115
116 #define MCP2221_GPIO_CFG_ALTER 0xff
117
118 struct mcp2221_set_gpio_cfg_req {
119 uint8_t cmd; /* MCP2221_CMD_SET_GPIO_CFG */
120 uint8_t dontcare1;
121
122 uint8_t alter_gp0_value;
123 uint8_t new_gp0_value;
124 uint8_t alter_gp0_dir;
125 uint8_t new_gp0_dir;
126
127 uint8_t alter_gp1_value;
128 uint8_t new_gp1_value;
129 uint8_t alter_gp1_dir;
130 uint8_t new_gp1_dir;
131
132 uint8_t alter_gp2_value;
133 uint8_t new_gp2_value;
134 uint8_t alter_gp2_dir;
135 uint8_t new_gp2_dir;
136
137 uint8_t alter_gp3_value;
138 uint8_t new_gp3_value;
139 uint8_t alter_gp3_dir;
140 uint8_t new_gp3_dir;
141
142 uint8_t reserved[46];
143 };
144
145 struct mcp2221_set_gpio_cfg_res {
146 uint8_t cmd;
147 uint8_t completion;
148
149 uint8_t alter_gp0_value;
150 uint8_t new_gp0_value;
151 uint8_t alter_gp0_dir;
152 uint8_t new_gp0_dir;
153
154 uint8_t alter_gp1_value;
155 uint8_t new_gp1_value;
156 uint8_t alter_gp1_dir;
157 uint8_t new_gp1_dir;
158
159 uint8_t alter_gp2_value;
160 uint8_t new_gp2_value;
161 uint8_t alter_gp2_dir;
162 uint8_t new_gp2_dir;
163
164 uint8_t alter_gp3_value;
165 uint8_t new_gp3_value;
166 uint8_t alter_gp3_dir;
167 uint8_t new_gp3_dir;
168
169 uint8_t dontcare[46];
170 };
171
172 struct mcp2221_get_gpio_cfg_req {
173 uint8_t cmd; /* MCP2221_CMD_GET_GPIO_CFG */
174 uint8_t dontcare[63];
175 };
176
177 #define MCP2221_GPIO_CFG_VALUE_NOT_GPIO 0xEE
178 #define MCP2221_GPIO_CFG_DIR_NOT_GPIO 0xEF
179 #define MCP2221_GPIO_CFG_DIR_INPUT 0x01
180 #define MCP2221_GPIO_CFG_DIR_OUTPUT 0x00
181
182 struct mcp2221_get_gpio_cfg_res {
183 uint8_t cmd;
184 uint8_t completion;
185
186 uint8_t gp0_pin_value;
187 uint8_t gp0_pin_dir;
188
189 uint8_t gp1_pin_value;
190 uint8_t gp1_pin_dir;
191
192 uint8_t gp2_pin_value;
193 uint8_t gp2_pin_dir;
194
195 uint8_t gp3_pin_value;
196 uint8_t gp3_pin_dir;
197
198 uint8_t dontcare[54];
199 };
200
201 #define MCP2221_SRAM_GPIO_CHANGE_DCCD 0x80
202
203 #define MCP2221_SRAM_GPIO_CLOCK_DC_MASK 0x18
204 #define MCP2221_SRAM_GPIO_CLOCK_DC_75 0x18
205 #define MCP2221_SRAM_GPIO_CLOCK_DC_50 0x10
206 #define MCP2221_SRAM_GPIO_CLOCK_DC_25 0x08
207 #define MCP2221_SRAM_GPIO_CLOCK_DC_0 0x00
208
209 #define MCP2221_SRAM_GPIO_CLOCK_CD_MASK 0x07
210 #define MCP2221_SRAM_GPIO_CLOCK_CD_375KHZ 0x07
211 #define MCP2221_SRAM_GPIO_CLOCK_CD_750KHZ 0x06
212 #define MCP2221_SRAM_GPIO_CLOCK_CD_1P5MHZ 0x05
213 #define MCP2221_SRAM_GPIO_CLOCK_CD_3MHZ 0x04
214 #define MCP2221_SRAM_GPIO_CLOCK_CD_6MHZ 0x03
215 #define MCP2221_SRAM_GPIO_CLOCK_CD_12MHZ 0x02
216 #define MCP2221_SRAM_GPIO_CLOCK_CD_24MHZ 0x01
217
218 #define MCP2221_SRAM_CHANGE_DAC_VREF 0x80
219 #define MCP2221_SRAM_DAC_IS_VRM 0x20
220 #define MCP2221_SRAM_DAC_VRM_MASK 0xC0
221 #define MCP2221_SRAM_DAC_VRM_4096V 0xC0
222 #define MCP2221_SRAM_DAC_VRM_2048V 0x80
223 #define MCP2221_SRAM_DAC_VRM_1024V 0x40
224 #define MCP2221_SRAM_DAC_VRM_OFF 0x00
225 #define MCP2221_SRAM_CHANGE_DAC_VALUE 0x80
226 #define MCP2221_SRAM_DAC_VALUE_MASK 0x1F
227
228 #define MCP2221_SRAM_CHANGE_ADC_VREF 0x80
229 #define MCP2221_SRAM_ADC_IS_VRM 0x04
230 #define MCP2221_SRAM_ADC_VRM_MASK 0x18
231 #define MCP2221_SRAM_ADC_VRM_4096V 0x18
232 #define MCP2221_SRAM_ADC_VRM_2048V 0x10
233 #define MCP2221_SRAM_ADC_VRM_1024V 0x08
234 #define MCP2221_SRAM_ADC_VRM_OFF 0x00
235
236 #define MCP2221_SRAM_ALTER_IRQ 0x80
237 #define MCP2221_SRAM_ALTER_POS_EDGE 0x10
238 #define MCP2221_SRAM_ENABLE_POS_EDGE 0x08
239 #define MCP2221_SRAM_ALTER_NEG_EDGE 0x04
240 #define MCP2221_SRAM_ENABLE_NEG_EDGE 0x02
241 #define MCP2221_SRAM_CLEAR_IRQ 0x01
242
243 #define MCP2221_SRAM_ALTER_GPIO 0xff
244 #define MCP2221_SRAM_GPIO_HIGH 0x0f
245 #define MCP2221_SRAM_GPIO_OUTPUT_HIGH 0x10
246 #define MCP2221_SRAM_GPIO_TYPE_MASK 0x08
247 #define MCP2221_SRAM_GPIO_INPUT 0x08
248 #define MCP2221_SRAM_PIN_TYPE_MASK 0x07
249 #define MCP2221_SRAM_PIN_IS_GPIO 0x00
250 #define MCP2221_SRAM_PIN_IS_DED 0x01
251 #define MCP2221_SRAM_PIN_IS_ALT0 0x02
252 #define MCP2221_SRAM_PIN_IS_ALT1 0x03
253 #define MCP2221_SRAM_PIN_IS_ALT2 0x04
254
255
256 struct mcp2221_set_sram_req {
257 uint8_t cmd; /* MCP2221_CMD_SET_SRAM */
258 uint8_t dontcare1;
259
260 uint8_t clock_output_divider;
261 uint8_t dac_voltage_reference;
262 uint8_t set_dac_output_value;
263 uint8_t adc_voltage_reference;
264 uint8_t irq_config;
265
266 uint8_t alter_gpio_config;
267 uint8_t gp0_settings;
268 uint8_t gp1_settings;
269 uint8_t gp2_settings;
270 uint8_t gp3_settings;
271
272 uint8_t reserved[52];
273 };
274
275 struct mcp2221_set_sram_res {
276 uint8_t cmd;
277 uint8_t completion;
278 uint8_t dontcare[62];
279 };
280
281 struct mcp2221_get_sram_req {
282 uint8_t cmd; /* MCP2221_CMD_GET_SRAM */
283 uint8_t dontcare[63];
284 };
285
286 struct mcp2221_get_sram_res {
287 uint8_t cmd;
288 uint8_t completion;
289
290 uint8_t len_chip_setting;
291 uint8_t len_gpio_setting;
292
293 uint8_t sn_initial_ps_cs;
294 uint8_t clock_divider;
295 uint8_t dac_reference_voltage;
296 uint8_t irq_adc_reference_voltage;
297
298 uint8_t lsb_usb_vid;
299 uint8_t msb_usb_vid;
300 uint8_t lsb_usb_pid;
301 uint8_t msb_usb_pid;
302
303 uint8_t usb_power_attributes;
304 uint8_t usb_requested_ma;
305
306 uint8_t current_password_byte_1;
307 uint8_t current_password_byte_2;
308 uint8_t current_password_byte_3;
309 uint8_t current_password_byte_4;
310 uint8_t current_password_byte_5;
311 uint8_t current_password_byte_6;
312 uint8_t current_password_byte_7;
313 uint8_t current_password_byte_8;
314
315 uint8_t gp0_settings;
316 uint8_t gp1_settings;
317 uint8_t gp2_settings;
318 uint8_t gp3_settings;
319
320 uint8_t dontcare[38];
321 };
322
323 #define MCP2221_I2C_ENGINE_BUSY 0x01
324 #define MCP2221_ENGINE_STARTTIMEOUT 0x12
325 #define MCP2221_ENGINE_REPSTARTTIMEOUT 0x17
326 #define MCP2221_ENGINE_STOPTIMEOUT 0x62
327 #define MCP2221_ENGINE_ADDRSEND 0x21
328 #define MCP2221_ENGINE_ADDRTIMEOUT 0x23
329 #define MCP2221_ENGINE_PARTIALDATA 0x41
330 #define MCP2221_ENGINE_READMORE 0x43
331 #define MCP2221_ENGINE_WRITETIMEOUT 0x44
332 #define MCP2221_ENGINE_READTIMEOUT 0x52
333 #define MCP2221_ENGINE_READPARTIAL 0x54
334 #define MCP2221_ENGINE_READCOMPLETE 0x55
335 #define MCP2221_ENGINE_ADDRNACK 0x25
336 #define MCP2221_ENGINE_WRITINGNOSTOP 0x45
337
338 struct mcp2221_i2c_req {
339 uint8_t cmd; /* MCP2221_I2C_WRITE_DATA
340 * MCP2221_I2C_READ_DATA
341 * MCP2221_I2C_WRITE_DATA_RS
342 * MCP2221_I2C_READ_DATA_RS
343 * MCP2221_I2C_WRITE_DATA_NS
344 */
345 uint8_t lsblen;
346 uint8_t msblen;
347 uint8_t slaveaddr;
348 uint8_t data[60];
349 };
350
351 struct mcp2221_i2c_res {
352 uint8_t cmd;
353 uint8_t completion;
354 uint8_t internal_i2c_state;
355 uint8_t dontcare[61];
356 };
357
358 #define MCP2221_FETCH_READ_PARTIALDATA 0x41
359 #define MCP2221_FETCH_READERROR 0x7F
360
361 struct mcp2221_i2c_fetch_req {
362 uint8_t cmd; /* MCP2221_CMD_I2C_FETCH_READ_DATA */
363 uint8_t dontcare[63];
364 };
365
366 struct mcp2221_i2c_fetch_res {
367 uint8_t cmd;
368 uint8_t completion;
369 uint8_t internal_i2c_state;
370 uint8_t fetchlen;
371 uint8_t data[60];
372 };
373
374 #define MCP2221_FLASH_SUBCODE_CS 0x00
375 #define MCP2221_FLASH_SUBCODE_GP 0x01
376 #define MCP2221_FLASH_SUBCODE_USBMAN 0x02
377 #define MCP2221_FLASH_SUBCODE_USBPROD 0x03
378 #define MCP2221_FLASH_SUBCODE_USBSN 0x04
379 #define MCP2221_FLASH_SUBCODE_CHIPSN 0x05
380
381 struct mcp2221_get_flash_req {
382 uint8_t cmd; /* MCP2221_CMD_GET_FLASH */
383 uint8_t subcode;
384 uint8_t reserved[62];
385 };
386
387 struct mcp2221_get_flash_res {
388 uint8_t cmd;
389 uint8_t completion;
390 uint8_t res_len;
391 union {
392 struct {
393 uint8_t dontcare;
394 uint8_t uartenum_led_protection;
395 uint8_t clock_divider;
396 uint8_t dac_reference_voltage;
397 uint8_t irq_adc_reference_voltage;
398 uint8_t lsb_usb_vid;
399 uint8_t msb_usb_vid;
400 uint8_t lsb_usb_pid;
401 uint8_t msb_usb_pid;
402 uint8_t usb_power_attributes;
403 uint8_t usb_requested_ma;
404 uint8_t dontcare2[50];
405 } cs;
406 struct {
407 uint8_t dontcare;
408 uint8_t gp0_settings;
409 uint8_t gp1_settings;
410 uint8_t gp2_settings;
411 uint8_t gp3_settings;
412 uint8_t dontcare2[56];
413 } gp;
414 struct {
415 uint8_t always0x03;
416 uint8_t unicode_man_descriptor[60];
417 } usbman;
418 struct {
419 uint8_t always0x03;
420 uint8_t unicode_product_descriptor[60];
421 } usbprod;
422 struct usbsn {
423 uint8_t always0x03;
424 uint8_t unicode_serial_number[60];
425 } usbsn;
426 struct {
427 uint8_t dontcare;
428 uint8_t factory_serial_number[60];
429 } chipsn;
430 } u;
431 };
432
433 #define MCP2221_FLASH_GPIO_HIGH 0x0f
434 #define MCP2221_FLASH_GPIO_VALUE_MASK 0x10
435 #define MCP2221_FLASH_GPIO_TYPE_MASK 0x08
436 #define MCP2221_FLASH_GPIO_INPUT 0x08
437 #define MCP2221_FLASH_PIN_TYPE_MASK 0x07
438 #define MCP2221_FLASH_PIN_IS_GPIO 0x00
439 #define MCP2221_FLASH_PIN_IS_DED 0x01
440 #define MCP2221_FLASH_PIN_IS_ALT0 0x02
441 #define MCP2221_FLASH_PIN_IS_ALT1 0x03
442 #define MCP2221_FLASH_PIN_IS_ALT2 0x04
443
444 struct mcp2221_put_flash_req {
445 uint8_t cmd; /* MCP2221_CMD_SET_FLASH */
446 uint8_t subcode;
447 union {
448 struct {
449 uint8_t uartenum_led_protection;
450 uint8_t clock_divider;
451 uint8_t dac_reference_voltage;
452 uint8_t irq_adc_reference_voltage;
453 uint8_t lsb_usb_vid;
454 uint8_t msb_usb_vid;
455 uint8_t lsb_usb_pid;
456 uint8_t msb_usb_pid;
457 uint8_t usb_power_attributes;
458 uint8_t usb_requested_ma;
459 uint8_t password_byte_1;
460 uint8_t password_byte_2;
461 uint8_t password_byte_3;
462 uint8_t password_byte_4;
463 uint8_t password_byte_5;
464 uint8_t password_byte_6;
465 uint8_t password_byte_7;
466 uint8_t password_byte_8;
467 uint8_t dontcare[44];
468 } cs;
469 struct {
470 uint8_t gp0_settings;
471 uint8_t gp1_settings;
472 uint8_t gp2_settings;
473 uint8_t gp3_settings;
474 uint8_t dontcare[58];
475 } gp;
476 struct {
477 uint8_t len;
478 uint8_t always0x03;
479 uint8_t unicode_man_descriptor[60];
480 } usbman;
481 struct {
482 uint8_t len;
483 uint8_t always0x03;
484 uint8_t unicode_product_descriptor[60];
485 } usbprod;
486 struct {
487 uint8_t len;
488 uint8_t always0x03;
489 uint8_t unicode_serial_number[60];
490 } usbsn;
491 } u;
492 };
493
494 struct mcp2221_put_flash_res {
495 uint8_t cmd;
496 uint8_t completion;
497 uint8_t dontcare[62];
498 };
499
500 /* XXX - missing is the submit password call to unlock the chip */
501
502 #endif
503