Skip to content

Commit a707422

Browse files
committed
Add usbc_mux_info command and implement for oryp10
1 parent cbad8e0 commit a707422

File tree

6 files changed

+195
-6
lines changed

6 files changed

+195
-6
lines changed

src/board/system76/common/include/board/usbpd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ void usbpd_init(void);
77
void usbpd_event(void);
88
void usbpd_disable_charging(void);
99
void usbpd_enable_charging(void);
10+
bool usbc_mux_info(uint8_t port, uint16_t * info);
1011

1112
#endif // _BOARD_USBPD_H

src/board/system76/common/smfi.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <board/scratch.h>
2222
#include <board/kbled.h>
2323
#include <board/kbscan.h>
24+
#include <board/usbpd.h>
2425

2526
#if CONFIG_SECURITY
2627
#include <board/security.h>
@@ -262,6 +263,18 @@ static enum Result cmd_security_set(void) {
262263
}
263264
#endif // CONFIG_SECURITY
264265

266+
static enum Result cmd_usbc_mux_info(void) {
267+
uint8_t port = smfi_cmd[SMFI_CMD_DATA];
268+
uint16_t info = 0;
269+
if (usbc_mux_info(port, &info)) {
270+
smfi_cmd[SMFI_CMD_DATA + 1] = (uint8_t)info;
271+
smfi_cmd[SMFI_CMD_DATA + 2] = (uint8_t)(info >> 8);
272+
return RES_OK;
273+
} else {
274+
return RES_ERR;
275+
}
276+
}
277+
265278
#endif // !defined(__SCRATCH__)
266279

267280
#if defined(__SCRATCH__)
@@ -419,6 +432,10 @@ void smfi_event(void) {
419432
break;
420433
#endif // CONFIG_SECURITY
421434

435+
case CMD_USBC_MUX_INFO:
436+
smfi_cmd[SMFI_CMD_RES] = cmd_usbc_mux_info();
437+
break;
438+
422439
#endif // !defined(__SCRATCH__)
423440
case CMD_SPI:
424441
smfi_cmd[SMFI_CMD_RES] = cmd_spi();

src/board/system76/common/usbpd/none.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ void usbpd_event(void) {}
99
void usbpd_disable_charging(void) {}
1010

1111
void usbpd_enable_charging(void) {}
12+
13+
bool usbc_mux_info(uint8_t port, uint16_t * info) {
14+
return false;
15+
}

src/board/system76/common/usbpd/tps65987.c

Lines changed: 130 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,39 @@
77
#include <board/gpio.h>
88
#include <board/power.h>
99
#include <board/usbpd.h>
10+
#include <common/command.h>
1011
#include <common/debug.h>
1112
#include <ec/i2c.h>
1213

1314
#define USBPD_ADDRESS 0x20
1415

16+
#define REG_CMD_1 0x08
17+
#define REG_TX_SINK_CAPABILITIES 0x33
1518
#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
1636

1737
void usbpd_init(void) {
1838
i2c_reset(&I2C_USBPD, true);
1939
}
2040

41+
#if HAVE_USBPD_CHARGING
42+
2143
static int16_t usbpd_current_limit(void) {
2244
uint8_t value[7] = { 0 };
2345
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) {
168190
int16_t res;
169191

170192
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));
172194
if (res < 0) {
173195
return res;
174196
}
@@ -185,7 +207,7 @@ void usbpd_disable_charging(void) {
185207

186208
// Read current value
187209
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));
189211
if (res < 0) {
190212
DEBUG("ERR %04X\n", -res);
191213
return;
@@ -200,7 +222,7 @@ void usbpd_disable_charging(void) {
200222
// Enable only the first TX sink PDO (5V)
201223
value[0] = 1;
202224
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));
204226
if (res < 0) {
205227
DEBUG("ERR %04X\n", -res);
206228
return;
@@ -223,7 +245,7 @@ void usbpd_enable_charging(void) {
223245

224246
// Read current value
225247
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));
227249
if (res < 0) {
228250
DEBUG("ERR %04X\n", -res);
229251
return;
@@ -238,7 +260,7 @@ void usbpd_enable_charging(void) {
238260
// Enable the first two TX sink PDO (5V and 20V)
239261
value[0] = 1;
240262
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));
242264
if (res < 0) {
243265
DEBUG("ERR %04X\n", -res);
244266
return;
@@ -253,3 +275,106 @@ void usbpd_enable_charging(void) {
253275

254276
DEBUG("OK\n");
255277
}
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+
}

src/board/system76/oryp10/board.mk

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ CFLAGS+=-DI2C_SMBUS=I2C_4
3030
# Set touchpad PS2 bus
3131
CFLAGS+=-DPS2_TOUCHPAD=PS2_3
3232

33+
# Set USB-PD I2C bus
34+
CFLAGS+=-DI2C_USBPD=I2C_1
35+
3336
# Set smart charger parameters
3437
# TODO: actually bq24800
3538
# FIXME: Verify parts and values.
@@ -40,9 +43,13 @@ CFLAGS+=\
4043
-DCHARGER_CHARGE_VOLTAGE=13050 \
4144
-DCHARGER_INPUT_CURRENT=11500
4245

46+
# Set USB-PD parameters
47+
USBPD=tps65987
48+
CFLAGS+=-DHAVE_USBPD_CHARGING=0
49+
4350
# Set CPU power limits in watts
4451
CFLAGS+=\
45-
-DPOWER_LIMIT_AC=180 \
52+
-DPOWER_LIMIT_AC=230 \
4653
-DPOWER_LIMIT_DC=45
4754

4855
# Disable syncing fan speeds

src/common/include/common/command.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ enum Command {
5050
CMD_SECURITY_GET = 20,
5151
// Set security state
5252
CMD_SECURITY_SET = 21,
53+
// Get USB-C mux info (for coreboot)
54+
CMD_USBC_MUX_INFO = 23,
5355
//TODO
5456
};
5557

@@ -85,4 +87,37 @@ enum SecurityState {
8587
SECURITY_STATE_PREPARE_UNLOCK = 3,
8688
};
8789

90+
enum UsbcMuxInfoFlags {
91+
// DisplayPort connected if set
92+
CMD_USBC_MUX_INFO_DP = (1 << 0),
93+
// USB connected if set
94+
CMD_USBC_MUX_INFO_USB = (1 << 1),
95+
// Active cable if set, passive if not set
96+
CMD_USBC_MUX_INFO_CABLE = (1 << 2),
97+
// Polarity of device, flipped if set, normal if not set
98+
CMD_USBC_MUX_INFO_POLARITY = (1 << 3),
99+
// HPD level assert
100+
CMD_USBC_MUX_INFO_HPD_LVL = (1 << 4),
101+
// HPD IRQ assert
102+
CMD_USBC_MUX_INFO_HPD_IRQ = (1 << 5),
103+
// UFP if set, DFP if not set
104+
CMD_USBC_MUX_INFO_UFP = (1 << 6),
105+
// Debug accessory if set
106+
CMD_USBC_MUX_INFO_DBG_ACC = (1 << 7),
107+
// Mask for DP pin mode
108+
CMD_USBC_MUX_INFO_DP_MODE_MASK = (0xF << 8),
109+
// DP pin mode A
110+
CMD_USBC_MUX_INFO_DP_MODE_A = (1 << 8),
111+
// DP pin mode B
112+
CMD_USBC_MUX_INFO_DP_MODE_B = (2 << 8),
113+
// DP pin mode C
114+
CMD_USBC_MUX_INFO_DP_MODE_C = (3 << 8),
115+
// DP pin mode D
116+
CMD_USBC_MUX_INFO_DP_MODE_D = (4 << 8),
117+
// DP pin mode E
118+
CMD_USBC_MUX_INFO_DP_MODE_E = (5 << 8),
119+
// DP pin mode F
120+
CMD_USBC_MUX_INFO_DP_MODE_F = (6 << 8),
121+
};
122+
88123
#endif // _COMMON_COMMAND_H

0 commit comments

Comments
 (0)