1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
/*
* The MIT License (MIT)
*
* Copyright (c) 2023 Ha Thach (tinyusb.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* This file is part of the TinyUSB stack.
*/
#ifndef _TUSB_PD_TYPES_H_
#define _TUSB_PD_TYPES_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include "common/tusb_compiler.h"
// Start of all packed definitions for compiler without per-type packed
TU_ATTR_PACKED_BEGIN
TU_ATTR_BIT_FIELD_ORDER_BEGIN
//--------------------------------------------------------------------+
// TYPE-C
//--------------------------------------------------------------------+
typedef enum {
TUSB_TYPEC_PORT_SRC,
TUSB_TYPEC_PORT_SNK,
TUSB_TYPEC_PORT_DRP
} tusb_typec_port_type_t;
enum {
PD_CTRL_RESERVED = 0, // 0b00000: 0
PD_CTRL_GOOD_CRC, // 0b00001: 1
PD_CTRL_GO_TO_MIN, // 0b00010: 2
PD_CTRL_ACCEPT, // 0b00011: 3
PD_CTRL_REJECT, // 0b00100: 4
PD_CTRL_PING, // 0b00101: 5
PD_CTRL_PS_READY, // 0b00110: 6
PD_CTRL_GET_SOURCE_CAP, // 0b00111: 7
PD_CTRL_GET_SINK_CAP, // 0b01000: 8
PD_CTRL_DR_SWAP, // 0b01001: 9
PD_CTRL_PR_SWAP, // 0b01010: 10
PD_CTRL_VCONN_SWAP, // 0b01011: 11
PD_CTRL_WAIT, // 0b01100: 12
PD_CTRL_SOFT_RESET, // 0b01101: 13
PD_CTRL_DATA_RESET, // 0b01110: 14
PD_CTRL_DATA_RESET_COMPLETE, // 0b01111: 15
PD_CTRL_NOT_SUPPORTED, // 0b10000: 16
PD_CTRL_GET_SOURCE_CAP_EXTENDED, // 0b10001: 17
PD_CTRL_GET_STATUS, // 0b10010: 18
PD_CTRL_FR_SWAP, // 0b10011: 19
PD_CTRL_GET_PPS_STATUS, // 0b10100: 20
PD_CTRL_GET_COUNTRY_CODES, // 0b10101: 21
PD_CTRL_GET_SINK_CAP_EXTENDED, // 0b10110: 22
PD_CTRL_GET_SOURCE_INFO, // 0b10111: 23
PD_CTRL_REVISION, // 0b11000: 24
};
enum {
PD_DATA_RESERVED = 0, // 0b00000: 0
PD_DATA_SOURCE_CAP, // 0b00001: 1
PD_DATA_REQUEST, // 0b00010: 2
PD_DATA_BIST, // 0b00011: 3
PD_DATA_SINK_CAP, // 0b00100: 4
PD_DATA_BATTERY_STATUS, // 0b00101: 5
PD_DATA_ALERT, // 0b00110: 6
PD_DATA_GET_COUNTRY_INFO, // 0b00111: 7
PD_DATA_ENTER_USB, // 0b01000: 8
PD_DATA_EPR_REQUEST, // 0b01001: 9
PD_DATA_EPR_MODE, // 0b01010: 10
PD_DATA_SRC_INFO, // 0b01011: 11
PD_DATA_REVISION, // 0b01100: 12
PD_DATA_RESERVED_13, // 0b01101: 13
PD_DATA_RESERVED_14, // 0b01110: 14
PD_DATA_VENDOR_DEFINED, // 0b01111: 15
};
enum {
PD_REV_10 = 0x0,
PD_REV_20 = 0x1,
PD_REV_30 = 0x2,
};
enum {
PD_DATA_ROLE_UFP = 0x0,
PD_DATA_ROLE_DFP = 0x1,
};
enum {
PD_POWER_ROLE_SINK = 0x0,
PD_POWER_ROLE_SOURCE = 0x1,
};
typedef struct TU_ATTR_PACKED {
uint16_t msg_type : 5; // [0:4]
uint16_t data_role : 1; // [5] SOP only: 0 UFP, 1 DFP
uint16_t specs_rev : 2; // [6:7]
uint16_t power_role : 1; // [8] SOP only: 0 Sink, 1 Source
uint16_t msg_id : 3; // [9:11]
uint16_t n_data_obj : 3; // [12:14]
uint16_t extended : 1; // [15]
} pd_header_t;
TU_VERIFY_STATIC(sizeof(pd_header_t) == 2, "size is not correct");
typedef struct TU_ATTR_PACKED {
uint16_t data_size : 9; // [0:8]
uint16_t reserved : 1; // [9]
uint16_t request_chunk : 1; // [10]
uint16_t chunk_number : 4; // [11:14]
uint16_t chunked : 1; // [15]
} pd_header_extended_t;
TU_VERIFY_STATIC(sizeof(pd_header_extended_t) == 2, "size is not correct");
//--------------------------------------------------------------------+
// Source Capability
//--------------------------------------------------------------------+
// All table references are from USBPD Specification rev3.1 version 1.8
enum {
PD_PDO_TYPE_FIXED = 0, // Vmin = Vmax
PD_PDO_TYPE_BATTERY,
PD_PDO_TYPE_VARIABLE, // non-battery
PD_PDO_TYPE_APDO, // Augmented Power Data Object
};
// Fixed Power Data Object (PDO) table 6-9
typedef struct TU_ATTR_PACKED {
uint32_t current_max_10ma : 10; // [9..0] Max current in 10mA unit
uint32_t voltage_50mv : 10; // [19..10] Voltage in 50mV unit
uint32_t current_peak : 2; // [21..20] Peak current
uint32_t reserved : 1; // [22] Reserved
uint32_t epr_mode_capable : 1; // [23] epr_mode_capable
uint32_t unchunked_ext_msg_support : 1; // [24] UnChunked Extended Message Supported
uint32_t dual_role_data : 1; // [25] Dual Role Data
uint32_t usb_comm_capable : 1; // [26] USB Communications Capable
uint32_t unconstrained_power : 1; // [27] Unconstrained Power
uint32_t usb_suspend_supported : 1; // [28] USB Suspend Supported
uint32_t dual_role_power : 1; // [29] Dual Role Power
uint32_t type : 2; // [30] Fixed Supply type = PD_PDO_TYPE_FIXED
} pd_pdo_fixed_t;
TU_VERIFY_STATIC(sizeof(pd_pdo_fixed_t) == 4, "Invalid size");
// Battery Power Data Object (PDO) table 6-12
typedef struct TU_ATTR_PACKED {
uint32_t power_max_250mw : 10; // [9..0] Max allowable power in 250mW unit
uint32_t voltage_min_50mv : 10; // [19..10] Minimum voltage in 50mV unit
uint32_t voltage_max_50mv : 10; // [29..20] Maximum voltage in 50mV unit
uint32_t type : 2; // [31..30] Battery type = PD_PDO_TYPE_BATTERY
} pd_pdo_battery_t;
TU_VERIFY_STATIC(sizeof(pd_pdo_battery_t) == 4, "Invalid size");
// Variable Power Data Object (PDO) table 6-11
typedef struct TU_ATTR_PACKED {
uint32_t current_max_10ma : 10; // [9..0] Max current in 10mA unit
uint32_t voltage_min_50mv : 10; // [19..10] Minimum voltage in 50mV unit
uint32_t voltage_max_50mv : 10; // [29..20] Maximum voltage in 50mV unit
uint32_t type : 2; // [31..30] Variable Supply type = PD_PDO_TYPE_VARIABLE
} pd_pdo_variable_t;
TU_VERIFY_STATIC(sizeof(pd_pdo_variable_t) == 4, "Invalid size");
// Augmented Power Data Object (PDO) table 6-13
typedef struct TU_ATTR_PACKED {
uint32_t current_max_50ma : 7; // [6..0] Max current in 50mA unit
uint32_t reserved1 : 1; // [7] Reserved
uint32_t voltage_min_100mv : 8; // [15..8] Minimum Voltage in 100mV unit
uint32_t reserved2 : 1; // [16] Reserved
uint32_t voltage_max_100mv : 8; // [24..17] Maximum Voltage in 100mV unit
uint32_t reserved3 : 2; // [26..25] Reserved
uint32_t pps_power_limited : 1; // [27] PPS Power Limited
uint32_t spr_programmable : 2; // [29..28] SPR Programmable Power Supply
uint32_t type : 2; // [31..30] Augmented Power Data Object = PD_PDO_TYPE_APDO
} pd_pdo_apdo_t;
TU_VERIFY_STATIC(sizeof(pd_pdo_apdo_t) == 4, "Invalid size");
//--------------------------------------------------------------------+
// Request
//--------------------------------------------------------------------+
typedef struct TU_ATTR_PACKED {
uint32_t current_extremum_10ma : 10; // [9..0] Max (give back = 0) or Min (give back = 1) current in 10mA unit
uint32_t current_operate_10ma : 10; // [19..10] Operating current in 10mA unit
uint32_t reserved : 2; // [21..20] Reserved
uint32_t epr_mode_capable : 1; // [22] EPR mode capable
uint32_t unchunked_ext_msg_support : 1; // [23] UnChunked Extended Message Supported
uint32_t no_usb_suspend : 1; // [24] No USB Suspend
uint32_t usb_comm_capable : 1; // [25] USB Communications Capable
uint32_t capability_mismatch : 1; // [26] Capability Mismatch
uint32_t give_back_flag : 1; // [27] GiveBack Flag: 0 = Max, 1 = Min
uint32_t object_position : 4; // [31..28] Object Position
} pd_rdo_fixed_variable_t;
TU_VERIFY_STATIC(sizeof(pd_rdo_fixed_variable_t) == 4, "Invalid size");
typedef struct TU_ATTR_PACKED {
uint32_t power_extremum_250mw : 10; // [9..0] Max (give back = 0) or Min (give back = 1) operating power in 250mW unit
uint32_t power_operate_250mw : 10; // [19..10] Operating power in 250mW unit
uint32_t reserved : 2; // [21..20] Reserved
uint32_t epr_mode_capable : 1; // [22] EPR mode capable
uint32_t unchunked_ext_msg_support : 1; // [23] UnChunked Extended Message Supported
uint32_t no_usb_suspend : 1; // [24] No USB Suspend
uint32_t usb_comm_capable : 1; // [25] USB Communications Capable
uint32_t capability_mismatch : 1; // [26] Capability Mismatch
uint32_t give_back_flag : 1; // [27] GiveBack Flag: 0 = Max, 1 = Min
uint32_t object_position : 4; // [31..28] Object Position
} pd_rdo_battery_t;
TU_VERIFY_STATIC(sizeof(pd_rdo_battery_t) == 4, "Invalid size");
TU_ATTR_PACKED_END // End of all packed definitions
TU_ATTR_BIT_FIELD_ORDER_END
#ifdef __cplusplus
}
#endif
#endif
|