NetBurner 3.5.7
PDF Version
src/usbd_cdc_ncm.h
1
17#ifndef __USBD_CDC_NCM_H
18#define __USBD_CDC_NCM_H
19
20#ifdef SOMRT1061
21#include <usb.h>
22#include <nettypes.h>
23#include <buffers.h>
24#include <nbrtos.h>
25#include "ncm_protocol.h"
26
27// Forward declaration
28class InterfaceBlock;
30
31/*******************************************************************************
32 * USB Endpoint Configuration
33 ******************************************************************************/
34#define NCM_BULK_EP_NUM (1) // Bulk IN/OUT endpoint number
35#define NCM_INT_EP_NUM (2) // Interrupt IN endpoint number
36#define NCM_BULK_MAX_PACKET_HS (512) // High-speed bulk packet size
37#define NCM_BULK_MAX_PACKET_FS (64) // Full-speed bulk packet size
38#define NCM_INT_MAX_PACKET (16) // Interrupt packet size
39
40/*******************************************************************************
41 * CDC Class Requests
42 ******************************************************************************/
43#define CDC_SEND_ENCAPSULATED_CMD (0x00)
44#define CDC_GET_ENCAPSULATED_RESP (0x01)
45
46/*******************************************************************************
47 * USB String Descriptor Indices
48 ******************************************************************************/
49#define NCM_STRING_IDX_MANUFACTURER (1)
50#define NCM_STRING_IDX_PRODUCT (2)
51#define NCM_STRING_IDX_SERIAL (3)
52#define NCM_STRING_IDX_MAC (4)
53
63class dCDC_NCM : public nbrtos::USB::Device {
64protected:
65 // NCM state
66 ncm_state_t ncmState;
67 uint8_t currentAltSetting;
68
69 // Device identity
70 MACADR macAddress;
71 uint32_t linkSpeed; // in bps (100 Mbps = 100000000)
72
73 // NTB configuration
74 uint32_t ntbInMaxSize; // Max NTB size device will accept
75 uint32_t ntbOutMaxSize; // Max NTB size device will send
76
77 // Statistics
78 uint32_t txFramesOk;
79 uint32_t rxFramesOk;
80 uint32_t txFramesError;
81 uint32_t rxFramesError;
82 uint32_t rxNoBuffer;
83
84 // USB buffers (aligned for DMA)
85 uint8_t ntbRxBuf[NCM_MAX_NTB_SIZE] __attribute__((aligned(64)));
86 uint8_t ntbTxBuf[NCM_MAX_NTB_SIZE] __attribute__((aligned(64)));
87
88 // TX state
89 ncm_tx_state_t txState;
90 uint16_t txSequence;
91 PoolPtr txPendingFrame;
92
93 // RX state
94 ncm_rx_state_t rxState;
95 uint32_t rxBufLen;
96
97 // Device state
98 uint32_t devState;
99 int baseEP;
100
101 // Synchronization
102 OS_CRIT ncm_crit;
103
104 // Network interface pointer and number
105 NcmInterfaceBlock *pInterface;
106 int ifNumber;
107
108 // Friend for network interface callbacks
109 friend class NcmInterfaceBlock;
110 friend void UserMain(void *pd);
111
112protected:
116 int QueueRx();
117
121 int ParseNtb16(uint8_t *ntb, uint32_t length);
122
126 int BuildNtb16(uint8_t *destBuf, uint8_t *frameData, uint32_t frameLen);
127
131 int SendNetworkConnectionNotification(bool connected);
132
137
138public:
142 dCDC_NCM(nbrtos::USB::Ctlr *parent, const usb_dev_t *desc,
143 const usb_cfg_t *cfg, const nbrtos::USB::StrDescTbl *strTbl);
144
148 void SetMACAddress(const MACADR &mac);
149
153 void SetLinkSpeed(uint32_t speedMbps);
154
158 ncm_state_t GetNcmState() const { return ncmState; }
159
163 bool IsDataReady() const { return ncmState == NCM_STATE_CONNECTED; }
164
165 // USB Device overrides
166 virtual void Event_BusReset() override;
167 virtual void Event_Suspend() override;
168 virtual void Event_Resume() override;
169 virtual int Event_ControlMsg(nbrtos::USB::bufPtr_t ctlMsg, uint8_t bufLen) override;
170 virtual int SetConfiguration(uint16_t wValue) override;
171 virtual int SetAltSetting(uint16_t wIndex, uint16_t wValue) override;
172 virtual int ProcessBuffer(uint8_t epnum, PoolPtr pp, uint16_t bufLen) override;
173 virtual int ProcessSetupPkt(uint8_t epnum, usb_setup_pkt_t msg) override;
174 virtual uint16_t GetMaxPktSize(uint8_t epnum, eDir_t dir) override;
175 virtual uint16_t GetStatus(eReqTarget_t target, uint16_t wIndex, int *err) override;
176 virtual uint8_t GetActiveConfig(int *err) override;
177 virtual uint8_t GetAltSetting(uint8_t intfNum, int *err) override;
178
179 nbrtos::USB::eBusState_t GetUSBState();
180 void SetUSBState(nbrtos::USB::eBusState_t newState);
181
182 // NCM protocol handlers
183 int HandleGetNtbParameters(uint8_t epnum, uint16_t wLength);
184 int HandleSetNtbInputSize(uint8_t *data, uint16_t length);
185 int HandleGetNtbInputSize(uint8_t epnum, uint16_t wLength);
186 int HandleSetEthernetPacketFilter(uint16_t wValue);
187
188 // Data transfer
189 int TransmitEthernetFrame(PoolPtr pp);
190 void DeliverToNetworkStack(uint8_t *data, uint16_t len);
191
192 // State machine processing
193 void ProcessTxStateMachine();
194 void ProcessRxStateMachine();
195
196 // Network interface registration
197 void SetNetworkInterface(NcmInterfaceBlock *pIntf, int interfaceNum) {
198 pInterface = pIntf;
199 ifNumber = interfaceNum;
200 }
201 NcmInterfaceBlock *GetNetworkInterface() { return pInterface; }
202 int GetInterfaceNumber() { return ifNumber; }
203};
204
214int InitializeUSBNCM(dCDC_NCM *pNcm);
215
216// Global NCM device instances (USB1 and USB2)
217extern dCDC_NCM usb_ncm1;
218extern dCDC_NCM usb_ncm2;
219
220#endif /* SOMRT1061 */
221#endif /* __USBD_CDC_NCM_H */
Network interface configuration block class for interface control and configuration.
Definition netinterface.h:244
Used to store and manipulate MAC addresses.
Definition nettypes.h:69
Network interface block for NCM USB device.
Definition src/ncm_interface.h:30
USB CDC NCM Device Class for Ethernet-over-USB.
Definition src/usbd_cdc_ncm.h:63
int BuildNtb16(uint8_t *destBuf, uint8_t *frameData, uint32_t frameLen)
Build NTB16 for transmission.
Definition src/usbd_cdc_ncm.cpp:1061
void SetMACAddress(const MACADR &mac)
Set the MAC address for this NCM interface.
Definition src/usbd_cdc_ncm.cpp:404
int SendNetworkConnectionNotification(bool connected)
Send NETWORK_CONNECTION notification.
Definition src/usbd_cdc_ncm.cpp:838
dCDC_NCM(nbrtos::USB::Ctlr *parent, const usb_dev_t *desc, const usb_cfg_t *cfg, const nbrtos::USB::StrDescTbl *strTbl)
Constructor.
bool IsDataReady() const
Check if NCM is ready for data transfer.
Definition src/usbd_cdc_ncm.h:163
ncm_state_t GetNcmState() const
Get the current NCM state.
Definition src/usbd_cdc_ncm.h:158
int ParseNtb16(uint8_t *ntb, uint32_t length)
Parse received NTB and extract datagrams.
Definition src/usbd_cdc_ncm.cpp:976
int SendSpeedChangeNotification()
Send CONNECTION_SPEED_CHANGE notification.
Definition src/usbd_cdc_ncm.cpp:862
int QueueRx()
Queue a receive operation on the bulk OUT endpoint.
Definition src/usbd_cdc_ncm.cpp:952
void SetLinkSpeed(uint32_t speedMbps)
Set the link speed in Mbps.
Definition src/usbd_cdc_ncm.cpp:409
friend void UserMain(void *pd)
Main application entry point.
Definition aes/src/main.cpp:75
int32_t GetInterfaceNumber(InterfaceBlock *pifb)
Returns the Interface Number of the specified network interface InterfaceBlock.
Mutual-exclusion critical section for protecting shared resources between tasks.
Definition nbrtos.h:1391
Main buffer structure for network and serial communication.
Definition buffers.h:90