1 /*
2  * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef _USBC_X_H_
8 #define _USBC_X_H_
9 
10 #define REG8   __IO uint8_t
11 #define REG16  __IO uint16_t
12 #define REG32  __IO uint32_t
13 
14 // =============================================================================
15 //  MACROS
16 // =============================================================================
17 #define SPFIFORAM_SIZE                               (264)
18 #define DIEP_NUM                                     (3)
19 #define DOEP_NUM                                     (2)
20 
21 // =============================================================================
22 //  TYPES
23 // =============================================================================
24 
25 // ============================================================================
26 // USBC_T
27 // -----------------------------------------------------------------------------
28 ///
29 // =============================================================================
30 
31 /* EP0 */
32 struct musb_ep0_regs
33 {
34     REG16   reserved4;
35     REG16   csr0;
36     REG16   reserved5;
37     REG16   reserved6;
38     REG16   count0;
39     REG8    host_type0;
40     REG8    host_naklimit0;
41     REG8    reserved7;
42     REG8    reserved8;
43     REG8    reserved9;
44     REG8    configdata;
45 };
46 
47 
48 /* EP 1-15 */
49 struct musb_epN_regs
50 {
51     REG16   txmaxp;
52     REG16   txcsr;
53     REG16   rxmaxp;
54     REG16   rxcsr;
55     REG16   rxcount;
56     REG8    txtype;
57     REG8    txinterval;
58     REG8    rxtype;
59     REG8    rxinterval;
60     REG8    reserved0;
61     REG8    fifosize;
62 };
63 
64 typedef volatile struct
65 {
66     /* common registers */
67     REG8    faddr;                          //0x0000
68     REG8    power;                          //0x0001
69     REG16   intrtx;                         //0x0002
70     REG16   intrrx;                         //0x0004
71     REG16   intrtxe;                        //0x0006
72     REG16   intrrxe;                        //0x0008
73     REG8    intrusb;                        //0x000a
74     REG8    intrusbe;                       //0x000b
75     REG16   frame;                          //0x000c
76     REG8    index;                          //0x000e
77     REG8    testmode;                       //0x000f
78     /* indexed registers */
79     REG16   txmaxp;                         //0x0010
80     REG16   csr0_txcsr;                     //0x0012
81     REG16   rxmaxp;                         //0x0014
82     REG16   rxcsr;                          //0x0016
83     REG16   rxcount;                        //0x0018
84     REG8    txtype;                         //0x001a
85     REG8    txinterval;                     //0x001b
86     REG8    rxtype;                         //0x001c
87     REG8    rxinterval;                     //0x001d
88     REG8    reserved0;                      //0x001e
89     REG8    cfdt_fifosz;                    //0x001f
90     /* fifo */
91     REG32    fifox[0x10];                   //0x0020
92     /* OTG, dynamic FIFO, version & vendor registers */
93     REG8    devctl;                         //0x0060
94     REG8    reserved1;                      //0x0061
95     REG8    txfifosz;                       //0x0062
96     REG8    rxfifosz;                       //0x0063
97     REG16    txfifoadd;                     //0x0064
98     REG16    rxfifoadd;                     //0x0066
99     REG32    vcontrol;                      //0x0068
100     REG16    hwvers;                        //0x006c
101     REG16    reserved2a[1];                 //0x006e
102     REG8    ulpi_busctl;                    //0x0070
103     REG8    reserved2b[1];                  //0x0071
104     REG16    reserved2[3];                  //0x0072
105     REG8    epinfo;                         //0x0078
106     REG8    raminfo;                        //0x0079
107     REG8    linkinfo;                       //0x007a
108     REG8    vplen;                          //0x007b
109     REG8    hseof1;                         //0x007c
110     REG8    fseof1;                         //0x007d
111     REG8    lseof1;                         //0x007e
112     REG8    soft_rst;                       //0x007f
113     /* target address registers */          //0x0080
114     struct musb_tar_regs
115     {
116         REG8    txfuncaddr;
117         REG8    reserved0;
118         REG8    txhubaddr;
119         REG8    txhubport;
120         REG8    rxfuncaddr;
121         REG8    reserved1;
122         REG8    rxhubaddr;
123         REG8    rxhubport;
124     } tar[0x10];
125     /*
126      * endpoint registers
127      * ep0 elements are valid when array index is 0
128      * otherwise epN is valid
129      */
130     union musb_ep_regs                      //0x0100
131     {
132         struct musb_ep0_regs ep0;
133         struct musb_epN_regs epN;
134     } ep[0x10];
135 
136     //REG32 reserved1fe;                    //0x0200
137     REG32 dmaintr;
138 
139     struct musb_dma_regs
140     {
141         REG32    cntl;                      //0x0204
142         REG32    addr;                      //0x0208
143         REG32    count;                     //0x020c
144         REG32    rsvd;                      //0x0210
145     } dma[0x10];
146 
147 
148     struct musb_rqpktcount
149     {
150         REG32  count;                       //0x0304
151     } rqpktcount[0xf];
152 
153     REG8 dpbrxdisl;                         //0x0340
154     REG8 dpbrxdish;                         //0x0341
155     REG8 dpbtxdisl;                         //0x0342
156     REG8 dpbtxdish;                         //0x0343
157 
158     struct musb_reserved_2
159     {
160         REG32 reserved_2;                      //0x0344
161     } rsvd_2[0x9];
162 
163     REG8    dbgl;                           //0x0368
164     REG8    dbgh;                           //0x0369
165     REG16   reserved_0;                     //0x036a
166     REG32   reserved_1;                     //0x036c
167     REG8    usbcfg;                         //0x0370
168 
169     struct musb_reserved_3
170     {
171         REG8 reserved_3;                    //0x0371~0x3bb
172     } rsvd_3[0x4b];
173 
174     REG8     dbgcntl0;                     //0x3bc
175     REG8     dbgcntl1;                     //0x3bd
176 } __attribute__((packed, aligned(32))) USBC_X_Typedef;
177 
178 
179 
180 #define BIT0                                (0x0001)
181 #define BIT1                                (0x0002)
182 #define BIT2                                (0x0004)
183 #define BIT3                                (0x0008)
184 #define BIT4                                (0x0010)
185 #define BIT5                                (0x0020)
186 #define BIT6                                (0x0040)
187 #define BIT7                                (0x0080)
188 
189 
190 /* CSR0 */
191 #define USB_CSR0_FLUSHFIFO                  (0x0100)
192 #define USB_CSR0_TXPKTRDY                   (0x0002)
193 #define USB_CSR0_RXPKTRDY                   (0x0001)
194 
195 /* CSR0 in Peripheral mode */
196 #define USB_CSR0_P_SVDSETUPEND              (0x0080)
197 #define USB_CSR0_P_SVDRXPKTRDY              (0x0040)
198 #define USB_CSR0_P_SENDSTALL                (0x0020)
199 #define USB_CSR0_P_SETUPEND                 (0x0010)
200 #define USB_CSR0_P_DATAEND                  (0x0008)
201 #define USB_CSR0_P_SENTSTALL                (0x0004)
202 
203 /* CSR0 in Host mode */
204 #define USB_CSR0_H_DIS_PING                 (0x0800)
205 #define USB_CSR0_H_WR_DATATOGGLE            (0x0400)  /* Set to allow setting: */
206 #define USB_CSR0_H_DATATOGGLE               (0x0200)  /* Data toggle control */
207 #define USB_CSR0_H_NAKTIMEOUT               (0x0080)
208 #define USB_CSR0_H_STATUSPKT                (0x0040)
209 #define USB_CSR0_H_REQPKT                   (0x0020)
210 #define USB_CSR0_H_ERROR                    (0x0010)
211 #define USB_CSR0_H_SETUPPKT                 (0x0008)
212 #define USB_CSR0_H_RXSTALL                  (0x0004)
213 
214 
215 /* DEVCTL */
216 #define USB_DEVCTL_BDEVICE                  0x80
217 #define USB_DEVCTL_FSDEV                    0x40
218 #define USB_DEVCTL_LSDEV                    0x20
219 #define USB_DEVCTL_VBUS                     0x18
220 #define USB_DEVCTL_VBUS_SHIFT               3
221 #define USB_DEVCTL_HM                       0x04
222 #define USB_DEVCTL_HR                       0x02
223 #define USB_DEVCTL_SESSION                  0x01
224 
225 /* ULPI VBUSCONTROL */
226 #define ULPI_USE_EXTVBUS                    0x01
227 #define ULPI_USE_EXTVBUSIND                 0x02
228 
229 /* TESTMODE */
230 #define USB_TEST_FORCE_HOST                 0x80
231 #define USB_TEST_FIFO_ACCESS                0x40
232 #define USB_TEST_FORCE_FS                   0x20
233 #define USB_TEST_FORCE_HS                   0x10
234 #define USB_TEST_PACKET                     0x08
235 #define USB_TEST_K                          0x04
236 #define USB_TEST_J                          0x02
237 #define USB_TEST_SE0_NAK                    0x01
238 
239 /* Allocate for double-packet buffering (effectively doubles assigned _SIZE) */
240 #define USB_FIFOSZ_DPB                      0x10
241 /* Allocation size (8, 16, 32, ... 4096) */
242 #define USB_FIFOSZ_SIZE                     0x0f
243 
244 
245 
246 
247 /* TxType/RxType */
248 #define USB_TYPE_SPEED                      0xc0
249 #define USB_TYPE_SPEED_SHIFT                6
250 #define USB_TYPE_SPEED_HIGH                 1
251 #define USB_TYPE_SPEED_FULL                 2
252 #define USB_TYPE_SPEED_LOW                  3
253 #define USB_TYPE_PROTO                      0x30    /* Implicitly zero for ep0 */
254 #define USB_TYPE_PROTO_SHIFT                4
255 #define USB_TYPE_PROTO_CTRL                 0
256 #define USB_TYPE_PROTO_ISO                  1
257 #define USB_TYPE_PROTO_BULK                 2
258 #define USB_TYPE_PROTO_INTR                 3
259 #define USB_TYPE_REMOTE_END                 0xf     /* Implicitly zero for ep0 */
260 
261 /* CONFIGDATA */
262 #define USB_CONFIGDATA_MPRXE                0x80    /* Auto bulk pkt combining */
263 #define USB_CONFIGDATA_MPTXE                0x40    /* Auto bulk pkt splitting */
264 #define USB_CONFIGDATA_BIGENDIAN            0x20    /* Always 0 indicate Little Endian ordering.*/
265 #define USB_CONFIGDATA_HBRXE                0x10    /* HB-ISO for RX */
266 #define USB_CONFIGDATA_HBTXE                0x08    /* HB-ISO for TX */
267 #define USB_CONFIGDATA_DYNFIFO              0x04    /* Dynamic FIFO sizing */
268 #define USB_CONFIGDATA_SOFTCONE             0x02    /* SoftConnect */
269 #define USB_CONFIGDATA_UTMIDW               0x01    /* Data width 0/1 => 8/16bits */
270 
271 #define USB_POWER_ISOUPDATE                 (BIT7)
272 #define USB_POWER_SOFTCONN                  (BIT6)
273 #define USB_POWER_HSENAB                    (BIT5)
274 #define USB_POWER_HSMODE                    (BIT4)
275 #define USB_POWER_RESET                     (BIT3)
276 #define USB_POWER_RESUME                    (BIT2)
277 #define USB_POWER_SUSPENDM                  (BIT1)
278 #define USB_POWER_ENSUSPEND                 (BIT0)
279 
280 #define USB_INTR_VBUSERROR                  (BIT7)
281 #define USB_INTR_SESSREQ                    (BIT6)
282 #define USB_INTR_DISCONNECT                 (BIT5)
283 #define USB_INTR_CONNECT                    (BIT4)
284 #define USB_INTR_SOF                        (BIT3)
285 #define USB_INTR_BABBLE                     (BIT2)
286 #define USB_INTR_RESET                      (BIT2)
287 #define USB_INTR_RESUME                     (BIT1)
288 #define USB_INTR_SUSPEND                    (BIT0)
289 
290 /* TXCSR in Peripheral and Host mode */
291 #define USB_TXCSR_AUTOSET                   (0x8000)
292 #define USB_TXCSR_MODE                      (0x2000)
293 #define USB_TXCSR_DMAENAB                   (0x1000)
294 #define USB_TXCSR_FRCDATATOG                (0x0800)
295 #define USB_TXCSR_DMAMODE                   (0x0400)
296 #define USB_TXCSR_CLRDATATOG                (0x0040)
297 #define USB_TXCSR_FLUSHFIFO                 (0x0008)
298 #define USB_TXCSR_FIFONOTEMPTY              (0x0002)
299 #define USB_TXCSR_TXPKTRDY                  (0x0001)
300 
301 
302 /* TXCSR in Peripheral mode */
303 #define USB_TXCSR_P_ISO                     (0x4000)
304 #define USB_TXCSR_P_INCOMPTX                (0x0080)
305 #define USB_TXCSR_P_SENTSTALL               (0x0020)
306 #define USB_TXCSR_P_SENDSTALL               (0x0010)
307 #define USB_TXCSR_P_UNDERRUN                (0x0004)
308 
309 /* TXCSR in Host mode */
310 #define USB_TXCSR_H_WR_DATATOGGLE           (0x0200)
311 #define USB_TXCSR_H_DATATOGGLE              (0x0100)
312 #define USB_TXCSR_H_NAKTIMEOUT              (0x0080)
313 #define USB_TXCSR_H_RXSTALL                 (0x0020)
314 #define USB_TXCSR_H_ERROR                   (0x0004)
315 
316 
317 #define USB_MAX_EP_NUM                      (16)
318 
319 #define USB_MAX_EP_USED_NUM                 (2)
320 
321 /* HUBADDR */
322 #define USB_HUBADDR_MULTI_TT                0x80
323 
324 //Usb intr mask
325 #define USBC_EP0_INTR_MASK                  (1<<0)
326 
327 /* RXCSR in Peripheral and Host mode */
328 #define USB_RXCSR_AUTOCLEAR                 (0x8000)
329 #define USB_RXCSR_DMAENAB                   (0x2000)
330 #define USB_RXCSR_DISNYET                   (0x1000)
331 #define USB_RXCSR_PID_ERR                   (0x1000)
332 #define USB_RXCSR_DMAMODE                   (0x0800)
333 #define USB_RXCSR_INCOMPRX                  (0x0100)
334 #define USB_RXCSR_CLRDATATOG                (0x0080)
335 #define USB_RXCSR_FLUSHFIFO                 (0x0010)
336 #define USB_RXCSR_DATAERROR                 (0x0008)
337 #define USB_RXCSR_FIFOFULL                  (0x0002)
338 #define USB_RXCSR_RXPKTRDY                  (0x0001)
339 
340 /* RXCSR in Peripheral mode */
341 #define USB_RXCSR_P_ISO                     (0x4000)
342 #define USB_RXCSR_P_SENTSTALL               (0x0040)
343 #define USB_RXCSR_P_SENDSTALL               (0x0020)
344 #define USB_RXCSR_P_OVERRUN                 (0x0004)
345 
346 /* RXCSR in Host mode */
347 #define USB_RXCSR_H_AUTOREQ                 (0x4000)
348 #define USB_RXCSR_H_WR_DATATOGGLE           (0x0400)
349 #define USB_RXCSR_H_DATATOGGLE              (0x0200)
350 #define USB_RXCSR_H_RXSTALL                 (0x0040)
351 #define USB_RXCSR_H_REQPKT                  (0x0020)
352 #define USB_RXCSR_H_ERROR                   (0x0004)
353 
354 
355 
356 
357 /* DMA channel number            0 ~ 8    */
358 #define USB_DMA_CHANNEL1                    1
359 #define USB_DMA_CHANNEL2                    2
360 #define USB_DMA_CHANNEL3                    3
361 #define USB_DMA_CHANNEL4                    4
362 #define USB_DMA_CHANNEL5                    5
363 #define USB_DMA_CHANNEL6                    6
364 #define USB_DMA_CHANNEL7                    7
365 #define USB_DMA_CHANNEL8                    8
366 
367 /* Control register (16-bit) */
368 #define USB_DMACTRL_ENABLE_SHIFT            (0)
369 #define USB_DMACTRL_TRANSMIT_SHIFT          (1)
370 #define USB_DMACTRL_MODE1_SHIFT             (2)
371 #define USB_DMACTRL_IRQENABLE_SHIFT         (3)
372 #define USB_DMACTRL_ENDPOINT_SHIFT          (4)
373 #define USB_DMACTRL_BUSERROR_SHIFT          (8)
374 #define USB_DMACTRL_BURSTMODE_SHIFT         (9)
375 #define USB_DMACTRL_BURSTMODE               (3 << USB_DMACTRL_BURSTMODE_SHIFT)
376 #define USB_DMACTRL_BURSTMODE_UNSPEC        (0)
377 #define USB_DMACTRL_BURSTMODE_INCR4         (1)
378 #define USB_DMACTRL_BURSTMODE_INCR8         (2)
379 #define USB_DMACTRL_BURSTMODE_INCR16        (3)
380 
381 /*Indicates pending DMA interrupts, one bit per DMA channel implemented*/
382 #define USB_DMAINTR_MASK_CHAN1              (1<<0)
383 #define USB_DMAINTR_MASK_CHAN2              (1<<1)
384 #define USB_DMAINTR_MASK_CHAN3              (1<<2)
385 #define USB_DMAINTR_MASK_CHAN4              (1<<3)
386 #define USB_DMAINTR_MASK_CHAN5              (1<<4)
387 #define USB_DMAINTR_MASK_CHAN6              (1<<5)
388 #define USB_DMAINTR_MASK_CHAN7              (1<<6)
389 #define USB_DMAINTR_MASK_CHAN8              (1<<7)
390 
391 
392 
393 #define USB_DMAADDR(n)                      (((n)&0x0FFFFFFF)<<0)
394 
395 /* CSR0 bits to avoid zeroing (write zero clears, write 1 ignored) */
396 #define USB_CSR0_P_WZC_BITS    \
397     (USB_CSR0_P_SENTSTALL)
398 
399 #define USB_CSR0_H_WZC_BITS    \
400     (USB_CSR0_H_NAKTIMEOUT | USB_CSR0_H_RXSTALL \
401     | USB_CSR0_RXPKTRDY)
402 
403 
404 /* TXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
405 #define USB_TXCSR_P_WZC_BITS    \
406     (USB_TXCSR_P_INCOMPTX | USB_TXCSR_P_SENTSTALL \
407     | USB_TXCSR_P_UNDERRUN | USB_TXCSR_FIFONOTEMPTY)
408 #define USB_TXCSR_H_WZC_BITS    \
409     (USB_TXCSR_H_NAKTIMEOUT | USB_TXCSR_H_RXSTALL \
410     | USB_TXCSR_H_ERROR | USB_TXCSR_FIFONOTEMPTY)
411 
412 
413 /* RXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
414 #define USB_RXCSR_P_WZC_BITS    \
415     (USB_RXCSR_P_SENTSTALL | USB_RXCSR_P_OVERRUN \
416     | USB_RXCSR_RXPKTRDY)
417 #define USB_RXCSR_H_WZC_BITS    \
418     (USB_RXCSR_H_RXSTALL | USB_RXCSR_H_ERROR \
419     | USB_RXCSR_DATAERROR | USB_RXCSR_RXPKTRDY)
420 
421 
422 /* RXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
423 #define USB_RXCSR_P_WZC_BITS    \
424     (USB_RXCSR_P_SENTSTALL | USB_RXCSR_P_OVERRUN \
425     | USB_RXCSR_RXPKTRDY)
426 
427 #define USB_RXCSR_H_WZC_BITS    \
428     (USB_RXCSR_H_RXSTALL | USB_RXCSR_H_ERROR \
429     | USB_RXCSR_DATAERROR | USB_RXCSR_RXPKTRDY)
430 
431 /* TXCSR bits to avoid zeroing (write zero clears, write 1 ignored) */
432 #define USB_TXCSR_P_WZC_BITS   \
433     (USB_TXCSR_P_INCOMPTX | USB_TXCSR_P_SENTSTALL \
434     | USB_TXCSR_P_UNDERRUN | USB_TXCSR_FIFONOTEMPTY)
435 
436 #define USB_TXCSR_H_WZC_BITS   \
437     (USB_TXCSR_H_NAKTIMEOUT | USB_TXCSR_H_RXSTALL \
438     | USB_TXCSR_H_ERROR | USB_TXCSR_FIFONOTEMPTY)
439 
440 
441 #endif