7
7
#include <board/gpio.h>
8
8
#include <board/power.h>
9
9
#include <board/usbpd.h>
10
+ #include <common/command.h>
10
11
#include <common/debug.h>
11
12
#include <ec/i2c.h>
12
13
13
14
#define USBPD_ADDRESS 0x20
14
15
16
+ #define REG_CMD_1 0x08
17
+ #define REG_TX_SINK_CAPABILITIES 0x33
15
18
#define REG_ACTIVE_CONTRACT_PDO 0x34
19
+ #define REG_DATA_STATUS 0x5F
20
+ #define REG_DATA_STATUS_DATA_ORIENTATION (1 << 1)
21
+ #define REG_DATA_STATUS_ACTIVE_CABLE (1 << 2)
22
+ #define REG_DATA_STATUS_USB3_CONNECTION (1 << 5)
23
+ #define REG_DATA_STATUS_USB_DATA_ROLE (1 << 7)
24
+ #define REG_DATA_STATUS_DP_CONNECTION (1 << 8)
25
+ #define REG_DATA_STATUS_DP_PIN_ASSIGNMENT_MASK (0b11 << 10)
26
+ #define REG_DATA_STATUS_DP_PIN_ASSIGNMENT_AB (0b10 << 10)
27
+ #define REG_DATA_STATUS_DP_PIN_ASSIGNMENT_CD (0b01 << 10)
28
+ #define REG_DATA_STATUS_DP_PIN_ASSIGNMENT_EF (0b00 << 10)
29
+ #define REG_DATA_STATUS_DEBUG_ACCESSORY_MODE (1 << 12)
30
+ #define REG_DATA_STATUS_HPD_IRQ (1 << 14)
31
+ #define REG_DATA_STATUS_HPD_LEVEL (1 << 15)
32
+
33
+ #ifndef HAVE_USBPD_CHARGING
34
+ #define HAVE_USBPD_CHARGING 1
35
+ #endif // HAVE_USBPD_CHARGING
16
36
17
37
void usbpd_init (void ) {
18
38
i2c_reset (& I2C_USBPD , true);
19
39
}
20
40
41
+ #if HAVE_USBPD_CHARGING
42
+
21
43
static int16_t usbpd_current_limit (void ) {
22
44
uint8_t value [7 ] = { 0 };
23
45
int16_t res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , REG_ACTIVE_CONTRACT_PDO , value , sizeof (value ));
@@ -168,7 +190,7 @@ static int16_t usbpd_aneg(void) {
168
190
int16_t res ;
169
191
170
192
uint8_t cmd [5 ] = { 4 , 'A' , 'N' , 'e' , 'g' };
171
- res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , 0x08 , cmd , sizeof (cmd ));
193
+ res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , REG_CMD_1 , cmd , sizeof (cmd ));
172
194
if (res < 0 ) {
173
195
return res ;
174
196
}
@@ -185,7 +207,7 @@ void usbpd_disable_charging(void) {
185
207
186
208
// Read current value
187
209
uint8_t value [2 ] = { 0 };
188
- res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , 0x33 , value , sizeof (value ));
210
+ res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , REG_TX_SINK_CAPABILITIES , value , sizeof (value ));
189
211
if (res < 0 ) {
190
212
DEBUG ("ERR %04X\n" , - res );
191
213
return ;
@@ -200,7 +222,7 @@ void usbpd_disable_charging(void) {
200
222
// Enable only the first TX sink PDO (5V)
201
223
value [0 ] = 1 ;
202
224
value [1 ] = 1 ;
203
- res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , 0x33 , value , sizeof (value ));
225
+ res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , REG_TX_SINK_CAPABILITIES , value , sizeof (value ));
204
226
if (res < 0 ) {
205
227
DEBUG ("ERR %04X\n" , - res );
206
228
return ;
@@ -223,7 +245,7 @@ void usbpd_enable_charging(void) {
223
245
224
246
// Read current value
225
247
uint8_t value [2 ] = { 0 };
226
- res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , 0x33 , value , sizeof (value ));
248
+ res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , REG_TX_SINK_CAPABILITIES , value , sizeof (value ));
227
249
if (res < 0 ) {
228
250
DEBUG ("ERR %04X\n" , - res );
229
251
return ;
@@ -238,7 +260,7 @@ void usbpd_enable_charging(void) {
238
260
// Enable the first two TX sink PDO (5V and 20V)
239
261
value [0 ] = 1 ;
240
262
value [1 ] = 2 ;
241
- res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , 0x33 , value , sizeof (value ));
263
+ res = i2c_set (& I2C_USBPD , USBPD_ADDRESS , REG_TX_SINK_CAPABILITIES , value , sizeof (value ));
242
264
if (res < 0 ) {
243
265
DEBUG ("ERR %04X\n" , - res );
244
266
return ;
@@ -253,3 +275,106 @@ void usbpd_enable_charging(void) {
253
275
254
276
DEBUG ("OK\n" );
255
277
}
278
+
279
+ #else // HAVE_USBPD_CHARGING
280
+
281
+ void usbpd_event (void ) {
282
+ bool update = false;
283
+
284
+ static bool last_ac_in = false;
285
+ bool ac_in = !gpio_get (& ACIN_N );
286
+ if (ac_in != last_ac_in ) {
287
+ last_ac_in = ac_in ;
288
+ update = true;
289
+
290
+ DEBUG ("AC_IN %d\n" , ac_in );
291
+ }
292
+
293
+ if (update ) {
294
+ int16_t res ;
295
+
296
+ DEBUG ("USBPD DATA STATUS " );
297
+
298
+ // Read current value
299
+ uint8_t value [6 ] = { 0 };
300
+ res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , REG_DATA_STATUS , value , sizeof (value ));
301
+ if (res < 0 ) {
302
+ DEBUG ("ERR %04X\n" , - res );
303
+ } else {
304
+ DEBUG ("OK %02x = %02X, %02X%02X%02X%02X\n" , value [0 ], value [5 ], value [4 ], value [3 ], value [2 ], value [1 ]);
305
+ }
306
+ }
307
+ }
308
+
309
+ void usbpd_disable_charging (void ) {}
310
+
311
+ #endif // HAVE_USBPD_CHARGING
312
+
313
+ bool usbc_mux_info (uint8_t port , uint16_t * info ) {
314
+ if (port != 0 ) {
315
+ // Only port 0 is supported right now
316
+ WARN ("usbc_mux_info does not support port %d\n" , port );
317
+ return false;
318
+ }
319
+
320
+ uint8_t value [6 ] = { 0 };
321
+ int16_t res = i2c_get (& I2C_USBPD , USBPD_ADDRESS , REG_DATA_STATUS , value , sizeof (value ));
322
+ if (res < 0 ) {
323
+ DEBUG ("ERR %04X\n" , - res );
324
+ return false;
325
+ } else {
326
+ DEBUG ("OK %02X, %02x = %02X, %02X%02X%02X%02X\n" , res , value [0 ], value [5 ], value [4 ], value [3 ], value [2 ], value [1 ]);
327
+ uint32_t data_status = ((uint32_t )value [1 ]) | (((uint32_t )value [2 ]) << 8 ) |
328
+ (((uint32_t )value [3 ]) << 16 ) | (((uint32_t )value [4 ]) << 24 );
329
+ * info = 0 ;
330
+ if (data_status & REG_DATA_STATUS_DP_CONNECTION ) {
331
+ * info |= CMD_USBC_MUX_INFO_DP ;
332
+ }
333
+ if (data_status & REG_DATA_STATUS_USB3_CONNECTION ) {
334
+ * info |= CMD_USBC_MUX_INFO_USB ;
335
+ }
336
+ if (data_status & REG_DATA_STATUS_ACTIVE_CABLE ) {
337
+ * info |= CMD_USBC_MUX_INFO_CABLE ;
338
+ }
339
+ if (data_status & REG_DATA_STATUS_DATA_ORIENTATION ) {
340
+ * info |= CMD_USBC_MUX_INFO_POLARITY ;
341
+ }
342
+ if (data_status & REG_DATA_STATUS_HPD_LEVEL ) {
343
+ * info |= CMD_USBC_MUX_INFO_HPD_LVL ;
344
+ }
345
+ if (data_status & REG_DATA_STATUS_HPD_IRQ ) {
346
+ * info |= CMD_USBC_MUX_INFO_HPD_IRQ ;
347
+ }
348
+ if (data_status & REG_DATA_STATUS_USB_DATA_ROLE ) {
349
+ * info |= CMD_USBC_MUX_INFO_UFP ;
350
+ }
351
+ if (data_status & REG_DATA_STATUS_DEBUG_ACCESSORY_MODE ) {
352
+ * info |= CMD_USBC_MUX_INFO_DBG_ACC ;
353
+ }
354
+ switch (data_status & REG_DATA_STATUS_DP_PIN_ASSIGNMENT_MASK ) {
355
+ case REG_DATA_STATUS_DP_PIN_ASSIGNMENT_AB :
356
+ if (data_status & REG_DATA_STATUS_USB3_CONNECTION ) {
357
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_B ;
358
+ } else {
359
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_A ;
360
+ }
361
+ break ;
362
+ case REG_DATA_STATUS_DP_PIN_ASSIGNMENT_CD :
363
+ if (data_status & REG_DATA_STATUS_USB3_CONNECTION ) {
364
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_D ;
365
+ } else {
366
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_C ;
367
+ }
368
+ break ;
369
+ case REG_DATA_STATUS_DP_PIN_ASSIGNMENT_EF :
370
+ if (data_status & REG_DATA_STATUS_USB3_CONNECTION ) {
371
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_F ;
372
+ } else {
373
+ * info |= CMD_USBC_MUX_INFO_DP_MODE_E ;
374
+ }
375
+ break ;
376
+ }
377
+ DEBUG ("USBC_MUX_INFO: %04X\n" , * info );
378
+ return true;
379
+ }
380
+ }
0 commit comments