Lamp-Da 0.1
A compact lantern project
Loading...
Searching...
No Matches
FUSB302.h
1/*
2 FUSB302.h - Library for interacting with the FUSB302B chip.
3 Copyright 2010 The Chromium OS Authors
4 Copyright 2017 Jason Cerundolo
5 Released under an MIT license. See LICENSE file.
6*/
7
8#ifndef fusb302_H
9#define fusb302_H
10
11#include <stdint.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17#include "../../../../src/system/bsp/pd/tcpm/usb_pd_tcpm.h"
18#include "../../../../src/system/bsp/pd/usb_pd.h"
19
20/* Chip Device ID - 302A or 302B */
21#define fusb302_DEVID_302A 0x08
22#define fusb302_DEVID_302B 0x09
23
24/* I2C slave address varies by part number */
25/* FUSB302BUCX / FUSB302BMPX */
26#define fusb302_I2C_SLAVE_ADDR 0x22 // 7-bit address
27/* FUSB302B01MPX */
28#define fusb302_I2C_SLAVE_ADDR_B01 0x23
29/* FUSB302B10MPX */
30#define fusb302_I2C_SLAVE_ADDR_B10 0x24
31/* FUSB302B11MPX */
32#define fusb302_I2C_SLAVE_ADDR_B11 0x25
33
34/* Default retry count for transmitting */
35#define PD_RETRY_COUNT 3
36
37/* Time to wait for TCPC to complete transmit */
38#define PD_T_TCPC_TX_TIMEOUT (100 * MSEC_US)
39
40#ifndef DIV_ROUND_NEAREST
41#define DIV_ROUND_NEAREST(x, y) (((x) + ((y) / 2)) / (y))
42#endif
43
44#define TCPC_REG_DEVICE_ID 0x01
45
46#define TCPC_REG_SWITCHES0 0x02
47#define TCPC_REG_SWITCHES0_CC2_PU_EN (1 << 7)
48#define TCPC_REG_SWITCHES0_CC1_PU_EN (1 << 6)
49#define TCPC_REG_SWITCHES0_VCONN_CC2 (1 << 5)
50#define TCPC_REG_SWITCHES0_VCONN_CC1 (1 << 4)
51#define TCPC_REG_SWITCHES0_MEAS_CC2 (1 << 3)
52#define TCPC_REG_SWITCHES0_MEAS_CC1 (1 << 2)
53#define TCPC_REG_SWITCHES0_CC2_PD_EN (1 << 1)
54#define TCPC_REG_SWITCHES0_CC1_PD_EN (1 << 0)
55
56#define TCPC_REG_SWITCHES1 0x03
57#define TCPC_REG_SWITCHES1_POWERROLE (1 << 7)
58#define TCPC_REG_SWITCHES1_SPECREV1 (1 << 6)
59#define TCPC_REG_SWITCHES1_SPECREV0 (1 << 5)
60#define TCPC_REG_SWITCHES1_DATAROLE (1 << 4)
61#define TCPC_REG_SWITCHES1_AUTO_GCRC (1 << 2)
62#define TCPC_REG_SWITCHES1_TXCC2_EN (1 << 1)
63#define TCPC_REG_SWITCHES1_TXCC1_EN (1 << 0)
64
65#define TCPC_REG_MEASURE 0x04
66#define TCPC_REG_MEASURE_VBUS (1 << 6)
67#define TCPC_REG_MEASURE_MDAC_MASK 0x3f
68#define TCPC_REG_MEASURE_MDAC_MV(mv) (DIV_ROUND_NEAREST((mv), 42) & 0x3f)
69
70#define TCPC_REG_CONTROL0 0x06
71#define TCPC_REG_CONTROL0_TX_FLUSH (1 << 6)
72#define TCPC_REG_CONTROL0_INT_MASK (1 << 5)
73#define TCPC_REG_CONTROL0_HOST_CUR_MASK (3 << 2)
74#define TCPC_REG_CONTROL0_HOST_CUR_3A0 (3 << 2)
75#define TCPC_REG_CONTROL0_HOST_CUR_1A5 (2 << 2)
76#define TCPC_REG_CONTROL0_HOST_CUR_USB (1 << 2)
77#define TCPC_REG_CONTROL0_TX_START (1 << 0)
78
79#define TCPC_REG_CONTROL1 0x07
80#define TCPC_REG_CONTROL1_ENSOP2DB (1 << 6)
81#define TCPC_REG_CONTROL1_ENSOP1DB (1 << 5)
82#define TCPC_REG_CONTROL1_BIST_MODE2 (1 << 4)
83#define TCPC_REG_CONTROL1_RX_FLUSH (1 << 2)
84#define TCPC_REG_CONTROL1_ENSOP2 (1 << 1)
85#define TCPC_REG_CONTROL1_ENSOP1 (1 << 0)
86
87#define TCPC_REG_CONTROL2 0x08
88/* two-bit field, valid values below */
89#define TCPC_REG_CONTROL2_MODE_MASK (0x3 << TCPC_REG_CONTROL2_MODE_POS)
90#define TCPC_REG_CONTROL2_MODE (1 << 1)
91#define TCPC_REG_CONTROL2_MODE_DFP (0x3)
92#define TCPC_REG_CONTROL2_MODE_UFP (0x2)
93#define TCPC_REG_CONTROL2_MODE_DRP (0x1)
94#define TCPC_REG_CONTROL2_MODE_POS (1)
95#define TCPC_REG_CONTROL2_TOGGLE (1 << 0)
96
97#define TCPC_REG_CONTROL3 0x09
98#define TCPC_REG_CONTROL3_SEND_HARDRESET (1 << 6)
99#define TCPC_REG_CONTROL3_BIST_TMODE (1 << 5) /* 302B Only */
100#define TCPC_REG_CONTROL3_AUTO_HARDRESET (1 << 4)
101#define TCPC_REG_CONTROL3_AUTO_SOFTRESET (1 << 3)
102/* two-bit field */
103#define TCPC_REG_CONTROL3_N_RETRIES (1 << 1)
104#define TCPC_REG_CONTROL3_N_RETRIES_POS (1)
105#define TCPC_REG_CONTROL3_N_RETRIES_SIZE (2)
106#define TCPC_REG_CONTROL3_AUTO_RETRY (1 << 0)
107
108#define TCPC_REG_MASK 0x0A
109#define TCPC_REG_MASK_VBUSOK (1 << 7)
110#define TCPC_REG_MASK_ACTIVITY (1 << 6)
111#define TCPC_REG_MASK_COMP_CHNG (1 << 5)
112#define TCPC_REG_MASK_CRC_CHK (1 << 4)
113#define TCPC_REG_MASK_ALERT (1 << 3)
114#define TCPC_REG_MASK_WAKE (1 << 2)
115#define TCPC_REG_MASK_COLLISION (1 << 1)
116#define TCPC_REG_MASK_BC_LVL (1 << 0)
117
118#define TCPC_REG_POWER 0x0B
119#define TCPC_REG_POWER_PWR (1 << 0) /* four-bit field */
120#define TCPC_REG_POWER_PWR_LOW 0x1 /* Bandgap + Wake circuitry */
121#define TCPC_REG_POWER_PWR_MEDIUM 0x3 /* LOW + Receiver + Current refs */
122#define TCPC_REG_POWER_PWR_HIGH 0x7 /* MEDIUM + Measure block */
123#define TCPC_REG_POWER_PWR_ALL 0xF /* HIGH + Internal Oscillator */
124
125#define TCPC_REG_RESET 0x0C
126#define TCPC_REG_RESET_PD_RESET (1 << 1)
127#define TCPC_REG_RESET_SW_RESET (1 << 0)
128
129#define TCPC_REG_MASKA 0x0E
130#define TCPC_REG_MASKA_OCP_TEMP (1 << 7)
131#define TCPC_REG_MASKA_TOGDONE (1 << 6)
132#define TCPC_REG_MASKA_SOFTFAIL (1 << 5)
133#define TCPC_REG_MASKA_RETRYFAIL (1 << 4)
134#define TCPC_REG_MASKA_HARDSENT (1 << 3)
135#define TCPC_REG_MASKA_TX_SUCCESS (1 << 2)
136#define TCPC_REG_MASKA_SOFTRESET (1 << 1)
137#define TCPC_REG_MASKA_HARDRESET (1 << 0)
138
139#define TCPC_REG_MASKB 0x0F
140#define TCPC_REG_MASKB_GCRCSENT (1 << 0)
141
142#define TCPC_REG_STATUS0A 0x3C
143#define TCPC_REG_STATUS0A_SOFTFAIL (1 << 5)
144#define TCPC_REG_STATUS0A_RETRYFAIL (1 << 4)
145#define TCPC_REG_STATUS0A_POWER (1 << 2) /* two-bit field */
146#define TCPC_REG_STATUS0A_RX_SOFT_RESET (1 << 1)
147#define TCPC_REG_STATUS0A_RX_HARD_RESET (1 << 0)
148
149#define TCPC_REG_STATUS1A 0x3D
150/* three-bit field, valid values below */
151#define TCPC_REG_STATUS1A_TOGSS (1 << 3)
152#define TCPC_REG_STATUS1A_TOGSS_RUNNING 0x0
153#define TCPC_REG_STATUS1A_TOGSS_SRC1 0x1
154#define TCPC_REG_STATUS1A_TOGSS_SRC2 0x2
155#define TCPC_REG_STATUS1A_TOGSS_SNK1 0x5
156#define TCPC_REG_STATUS1A_TOGSS_SNK2 0x6
157#define TCPC_REG_STATUS1A_TOGSS_AA 0x7
158#define TCPC_REG_STATUS1A_TOGSS_POS (3)
159#define TCPC_REG_STATUS1A_TOGSS_MASK (0x7)
160
161#define TCPC_REG_STATUS1A_RXSOP2DB (1 << 2)
162#define TCPC_REG_STATUS1A_RXSOP1DB (1 << 1)
163#define TCPC_REG_STATUS1A_RXSOP (1 << 0)
164
165#define TCPC_REG_INTERRUPTA 0x3E
166#define TCPC_REG_INTERRUPTA_OCP_TEMP (1 << 7)
167#define TCPC_REG_INTERRUPTA_TOGDONE (1 << 6)
168#define TCPC_REG_INTERRUPTA_SOFTFAIL (1 << 5)
169#define TCPC_REG_INTERRUPTA_RETRYFAIL (1 << 4)
170#define TCPC_REG_INTERRUPTA_HARDSENT (1 << 3)
171#define TCPC_REG_INTERRUPTA_TX_SUCCESS (1 << 2)
172#define TCPC_REG_INTERRUPTA_SOFTRESET (1 << 1)
173#define TCPC_REG_INTERRUPTA_HARDRESET (1 << 0)
174
175#define TCPC_REG_INTERRUPTB 0x3F
176#define TCPC_REG_INTERRUPTB_GCRCSENT (1 << 0)
177
178#define TCPC_REG_STATUS0 0x40
179#define TCPC_REG_STATUS0_VBUSOK (1 << 7)
180#define TCPC_REG_STATUS0_ACTIVITY (1 << 6)
181#define TCPC_REG_STATUS0_COMP (1 << 5)
182#define TCPC_REG_STATUS0_CRC_CHK (1 << 4)
183#define TCPC_REG_STATUS0_ALERT (1 << 3)
184#define TCPC_REG_STATUS0_WAKE (1 << 2)
185#define TCPC_REG_STATUS0_BC_LVL1 (1 << 1) /* two-bit field */
186#define TCPC_REG_STATUS0_BC_LVL0 (1 << 0) /* two-bit field */
187
188#define TCPC_REG_STATUS1 0x41
189#define TCPC_REG_STATUS1_RXSOP2 (1 << 7)
190#define TCPC_REG_STATUS1_RXSOP1 (1 << 6)
191#define TCPC_REG_STATUS1_RX_EMPTY (1 << 5)
192#define TCPC_REG_STATUS1_RX_FULL (1 << 4)
193#define TCPC_REG_STATUS1_TX_EMPTY (1 << 3)
194#define TCPC_REG_STATUS1_TX_FULL (1 << 2)
195
196#define TCPC_REG_INTERRUPT 0x42
197#define TCPC_REG_INTERRUPT_VBUSOK (1 << 7)
198#define TCPC_REG_INTERRUPT_ACTIVITY (1 << 6)
199#define TCPC_REG_INTERRUPT_COMP_CHNG (1 << 5)
200#define TCPC_REG_INTERRUPT_CRC_CHK (1 << 4)
201#define TCPC_REG_INTERRUPT_ALERT (1 << 3)
202#define TCPC_REG_INTERRUPT_WAKE (1 << 2)
203#define TCPC_REG_INTERRUPT_COLLISION (1 << 1)
204#define TCPC_REG_INTERRUPT_BC_LVL (1 << 0)
205
206#define TCPC_REG_FIFOS 0x43
207
208 /* Tokens defined for the FUSB302 TX FIFO */
209 enum fusb302_txfifo_tokens
210 {
211 fusb302_TKN_TXON = 0xA1,
212 fusb302_TKN_SYNC1 = 0x12,
213 fusb302_TKN_SYNC2 = 0x13,
214 fusb302_TKN_SYNC3 = 0x1B,
215 fusb302_TKN_RST1 = 0x15,
216 fusb302_TKN_RST2 = 0x16,
217 fusb302_TKN_PACKSYM = 0x80,
218 fusb302_TKN_JAMCRC = 0xFF,
219 fusb302_TKN_EOP = 0x14,
220 fusb302_TKN_TXOFF = 0xFE,
221 };
222
223 extern const struct tcpm_drv fusb302_tcpm_drv;
224
225#ifdef __cplusplus
226}
227#endif
228
229#endif /* fusb302_H */
Definition: usb_pd_tcpm.h:268