NetBurner 3.5.6
PDF Version
usb_MIMXRT.h
1/*NB_REVISION*/
2
3/*NB_COPYRIGHT*/
4
5#ifndef __USB_MIMXRT_H
6#define __USB_MIMXRT_H
7#ifdef SOMRT1061
8#include <predef.h>
9#include <buffers.h>
10#include <usb.h>
11#include <sim.h>
12
13#define USB_DTD_POOL_SIZE 128
14
15void DumpUSBPHY();
16void UserMain(void *pd);
17namespace nbrtos {
18namespace USB {
19
20#define dTD_PNEXT_TERMINATE 0x00000001 // Transfer descriptor chain Terminate bit
21
22#define dTD_STAT_Halted 0x40 //Checks the Halt status bit in a dQH
23#define dTD_STAT_Active 0x80 //Clears the Active Status bit in a dQH
24#define dTD_STAT_clrActiveHaltBits 0x3F //Clears the Active and Halt Status bits in a dQH
25#define dTD_BUF_PAGE_SIZE 0x1000
26#define dTD_BUF_PAGE_MASK 0xFFFFF000
27
28// USB Transfer Descriptor
29struct dTD;
30typedef dTD * pdTD;
31struct dTD {
32 union {
33 pdTD pNext;
34 uint32_t nextdTDptr;
35 };
36 union {
37 struct {
38 uint8_t flag;
39 uint8_t stat;
40 uint16_t totLen;
41 };
42 uint32_t dTDToken;
43 };
44 uint32_t bufPtr[5]; // whenever the buffer crosses a 4K page boundary,
45 // buf[n+1] must be set to the next buffer address
46 // regardless of whether the next buffer address
47 // is physically contiguous with the previous one
48 union {
49 uint8_t RESERVED[4];
50 PoolPtr pp;
51 };
52 void Init(uint8_t *buf, uint32_t size, bool irqOnComplete, uint8_t multOverride = 0);
53} __attribute__((packed));
54
55// USB Endpoint Queue Head
56// 48 byte hw struct, needs 64 byte alignment
57struct dQH {
58 uint8_t RESERVED0[1];
59 uint8_t irqOnSetup;
60 uint16_t flagAndMaxLen;
61 union {
62 pdTD pCurr;
63 uint32_t currdTDptr;
64 };
65 union {
66 pdTD pNext;
67 uint32_t nextdTDptr;
68 };
69 union {
70 struct {
71 uint8_t flag;
72 uint8_t stat;
73 uint16_t totLen;
74 };
75 uint32_t dTDToken;
76 };
77 uint32_t bufPtr[5]; // See dTD bufPtr comment
78 uint8_t RESERVED1[4];
79 uint8_t setupBuf[8];
80 uint8_t RESERVED2[16];
81
82 void Init(eEndPt_t type, uint8_t isoMult, uint16_t wMaxPacketSize, bool irqOnSetup);
83} __attribute__((packed));
84
85struct USB_dQ {
86 dTD *pool;
87 dTD *head;
88 dTD *tail;
89 OS_SEM sem;
90 uint8_t poolLen;
91 uint8_t next;
92 uint8_t last;
93};
94
95struct HW_SetupBuf : public OS_FIFO_EL {
96 usb_setup_pkt_t pkt;
97 uint8_t hwID;
98 uint8_t epnum;
99 bool inUse;
100};
101
102
103class UDC_MIMXRT : public UDC {
104protected:
105 volatile USB_Type &usb;
106 dQH *qHeads;
107 USB_dQ dTDs[USB_ENDPTCTRL_COUNT*2];
108 HW_SetupBuf setupBuf[USB_ENDPTCTRL_COUNT];
109 bool resetInProgress;
110 uint32_t ctlEPs;
111 uint32_t epBits;
112 uint32_t nIsr;
113 uint32_t nIsr_usb;
114 uint32_t nIsr_setup[USB_ENDPTCTRL_COUNT];
115 uint32_t nIsr_OUT[USB_ENDPTCTRL_COUNT];
116 uint32_t nIsr_IN[USB_ENDPTCTRL_COUNT];
117 uint32_t nIsr_RST;
118 uint32_t nIsr_PortChange;
119 uint32_t nIsr_Err;
120 uint32_t nIsr_Susp;
121
122 void getSetupPkt(uint8_t epnum);
123
124 int readOutTransfer(uint8_t epnum, uint8_t *dataBuf, uint16_t maxLen);
125
126 void QueueTD(uint8_t epidx, dTD* dtd);
127 void QueueTD_Empty(uint8_t epidx, dTD* dtd);
128 void PrimeEP(uint8_t epidx);
129 void FlushEP(uint8_t epidx);
130 void TDCleanup(uint8_t epidx, bool canceled);
131 void AbortTransfer(uint8_t epnum, eDir_t dir);
132 void busReset();
133
134 virtual void StallEP(uint8_t epnum, eDir_t dir);
135 void isr_usb();
136 void isr();
137 void isr_phy(USBPHY_Type &uphy);
138 static void usb1_isr();
139 static void usb2_isr();
140 static void usbphy1_isr();
141 static void usbphy2_isr();
142 friend void ::DumpUSBPHY();
143 friend void ::UserMain(void *pd);
144
145 virtual int initInTransfer(uint8_t epnum, uint8_t* data, uint16_t length, bool irqOnComplete, bool dontblock = false);
146 virtual int initInTransfer(uint8_t epnum, PoolPtr pp, bool irqOnComplete, bool dontblock = false);
147 virtual int initOutTransfer(uint8_t epnum, bool irqOnComplete, bool dontblock = false);
148
149 virtual void StallEP(uint8_t devAddr, uint8_t epnum, eDir_t dir);
150 virtual void FlushEP(uint8_t devAddr, uint8_t epnum);
151public:
152 UDC_MIMXRT(USB_Type *hwusb, dQH *qHeads, dTD *tdPool, int poolLen);
153 virtual void Init(Device *dev);
154
155 virtual int TransmitBuffer(uint8_t devAddr, uint8_t ep, PoolPtr pp);
156 virtual int TransmitData(uint8_t devAddr, uint8_t ep, uint8_t *pData, uint16_t length);
157
158 virtual int sendControlPkt(uint8_t epnum, uint8_t *buf, uint16_t bufLen);
159 virtual int sendControlPkt(uint8_t epnum, PoolPtr pp);
160 virtual int SendZLP(uint8_t devAddr, uint8_t epnum);
161
162 virtual int InAvail(uint8_t epnum);
163 virtual int OutAvail(uint8_t epnum);
164
165 virtual int RegisterEP(uint8_t devAddr, uint8_t epnum, eDir_t dir, eEndPt_t type,
166 uint16_t maxPktSize, endPtCB_t fnCB);
167 virtual int SetDevAddr(uint8_t devAddr, Device *dev);
168 virtual int ReleaseEP(uint8_t devAddr, uint8_t epnum, eDir_t dir);
169};
170
171// USB Host Controller
172class UHC_MIMXRT : public UHC {
173 volatile USB_Type &usb;
174
175public:
176 UHC_MIMXRT(USB_Type *usb);
177 virtual void Init();
178 int SendToDevice(uint8_t devAddr, uint8_t endpt, void *buf, int datLen);
179};
180
181class UOTGC_MIMXRT : public UOTGC {
182 volatile USB_Type &usb;
183
184public:
185 UOTGC_MIMXRT(USB_Type *usb);
186 virtual void Init();
187};
188
189}
190}
191#endif
192#endif /* ----- #ifndef __USB_MIMXRT_H ----- */
193
NetBurner Buffers API.
void UserMain(void *pd)
Main function.
Definition PlatformSpecific/SAME70/MODM7AE70/ADC_Simple/src/main.cpp:42
Semaphores are used to control access to shared resources or or to communicate between tasks in a mul...
Definition nbrtos.h:411
OS_FIFO element definition.
Definition nbrtos.h:909
Main buffer structure for network and serial communication.
Definition buffers.h:90