NetBurner 3.0
nbWicedDriver.h
Go to the documentation of this file.
1 /*NB_REVISION*/
2 
3 /*NB_COPYRIGHT*/
4 
9 #ifndef __NBWICEDDRIVER_H
10 #define __NBWICEDDRIVER_H
11 
12 #include <buffers.h>
13 #include <nettypes.h>
14 #include <netinterface.h>
15 #include <constants.h>
16 #include <utils.h>
17 #include <nbwifi/nbWifiDriver.h>
18 #include <nbwifi/nbWifiConstants.h>
20 
21 #define WIFI_API_TASK_PRIO WIFI_RX_TASK_BASE_PRIO + MAX_WIFI_INTERFACES
22 #define MAX_OPTION_TABLES 256 // options have an 8-bit table id
23 #define WIFI_MAX_QUEUED_BUFFERS 8
24 #define WIFI_RX_MIN_BUFFER_THRESHHOLD 20
25 #define WIFI_INIT_BAUDRATE 230400
26 #define WIFI_RX_DELAY 5
27 #define WIFI_PEND_TIMEOUT 10
28 #define WIFI_UPDATE_MAX_PAYLOAD (ETH_MAX_SIZE - sizeof(NBWifi::APIMessage::Header::APIRequest) - sizeof(NBWifi::APIMessage::Request::FirmwareChunk))
29 
30 #define WIFI_SERIAL_SYNC_SEQ "a\x1B\x0B"
31 #define TOKEN_FIRST 'a'
32 #define TOKEN_MID '\x1B'
33 #define TOKEN_LAST '\x0B'
34 #define TOKEN_FIRST_COUNT 3
35 #define TOKEN_MID_COUNT 2
36 #define TOKEN_LAST_COUNT 1
37 
38 #define MAX_PENDING_COMMANDS 5
39 
40 #ifndef _STRUCT_PACKED
41 #define _STRUCT_PACKED __attribute__ ((__packed__))
42 #endif
43 
44 
45 typedef void ( *ReceiveScanResultFunc )( const nbWifiScanResult & ap );
46 
47 extern void SetWifiSPISpeed(int);
48 
49 namespace NBWifi {
50 
51 // namespace Broadcom{
52 
53  class WICED : public Master
54  {
55 
56  private:
57  typedef enum {
58  State_NotRegistered = 0,
59  State_TaskNotRunning = 1,
60  State_NoDevice = 2, // Beginning driver initialization
61  State_NoInfo = 3, //
62  State_InvalidDevice = 4, // Unsupported device or firmware, halting
63  State_NoOptions = 5, //
64  State_NotConfigured = 6, // Driver initialized
65  State_NotConnected = 7, //
66  State_Connected = 8, // Connection established
67  } DriverState;
68 
69  /* ---- Private Structure definitions ---- */
70  struct busWait {
71  OS_MBOX mbox;
72  uint8_t error;
73  uint32_t code;
74  };
75 
76  struct responseWaiter {
77  bool valid;
78  uint8_t requestType;
79  uint8_t commandID;
80  OS_MBOX *pMbox;
81  };
82 
83  struct commandsWaitingResponseStruct {
84  int lastKnownFree;
85  responseWaiter waitList[MAX_PENDING_COMMANDS];
86  };
87  /* ---- End Private Structure definitions ---- */
88 
89  /* ---- Data members ---- */
90  volatile uint8_t currentCommandID;
91 
92  volatile bool waitingForStatus;
93  OS_MBOX statusMailbox;
94  OS_SEM startupSem;
95  commandsWaitingResponseStruct commandsWaitingResponse;
96  PoolPtr options[MAX_OPTION_TABLES];
97 
98  APIMessage::Response::DeviceInfo devInfo;
99  char hardwareTypeOverflow[MAX_HARDWARE_TYPE_LENGTH + 1]; // <- this must follow the device info struct
100  // it is extra space for a nullbyte for full length strings
101  DriverState currentState;
102  uint32_t slaveFirmwareOffset; // used when updating slave firmware
103  bool slaveUpdateReady;
104  /* ---- End Data members ---- */
105 
106  /* ---- Constructors ---- */
107  WICED();
108  WICED( const WICED & rhs );
109  /* ---- End Constructors ---- */
110 
111  /* ---- Private methods ---- */
112 
113  bool ProcessInternal(
114  PoolPtr messageBuffer,
115  NBWifi::APIMessage::Internal::InternalTypes internalType
116  );
117 
118  void SendReconnectRequest();
119 
120  bool ProcessRequest( PoolPtr messageBuffer, uint8_t requestType );
121  bool ProcessResponse( PoolPtr messageBuffer, uint8_t responseType );
122  void ProcessResponseID( PoolPtr messageBuffer );
123  bool ProcessScanResult( PoolPtr messageBuffer );
124  bool ProcessStatus( PoolPtr messageBuffer );
125  bool ProcessDeviceInfo( PoolPtr messageBuffer );
126  bool ProcessOptionTableResponse( PoolPtr messageBuffer );
127 
128  bool ProcessCreditReport( PoolPtr messageBuffer );
129 
130  bool DevFWSupported();
131 
132  int AddWaitingCommand( uint8_t requestType, uint8_t commandID, OS_MBOX *pmbox );
133  int ReadyInterface();
134 
135  void RetrieveOptionTable( int tableNum );
136  void RetrieveAllOptionTables( );
137 
138  PoolPtr GetNetworkStatus();
139  PoolPtr GetDeviceInformation();
140  /* ---- End Private methods ---- */
141 
142  protected:
143 
144  static OS_FIFO WifiAPIRxFifo;
145 
146  int myInterfaceNumber;
147  int myWifiNum;
148  OS_SEM taskPauseSem;
149  OS_FIFO BusMsgFifo;
150  OS_FIFO BufferTxFifo;
151  uint32_t lastCreditCheckTick;
152  bool creditReportQueued;
153  bool creditReporting;
154  bool slaveHalted;
155  uint32_t lastReportTick;
156 
157  ReceiveScanResultFunc pfScanResultsCallback;
158  bool scanActive;
159  uint8_t availableCredits;
160  uint16_t pendingTxBuffers;
161  uint8_t rxTaskID;
162  OS_CRIT creditCheckCrit;
163 
164  static uint32_t DriverStk[MAX_WIFI_INTERFACES][WIFI_TASK_STACK_SIZE];
165  static uint32_t APITaskStk[WIFI_TASK_STACK_SIZE];
166 
167  WICED(CommBus busType, int resetPinConnector, int resetPinMum, const char * name);
168  ~WICED();
169 
170  void SendBusMessage( PoolPtr txMessage, bool waitForCredits = true );
171  virtual void SendBusMessage_Core( PoolPtr txMessage ) = 0;
172  virtual void RXTask( ) = 0;
173  int RegisterDriver();
174  uint8_t GetNextCommandID();
175  void PushRXCreditReport( PoolPtr &pp );
176  void PushPayloadCreditReport( PoolPtr &pp );
177 
178  public:
179 
180  static void RXTaskLauncher( void *wifiDriverObj );
181  static void APITask( void *throwaway );
182 
183 
184  // static functions for use with interface blocks
185  static void TransmitBuffer_0( PoolPtr txBuffer );
186  static void TransmitBuffer_1( PoolPtr txBuffer );
187  static void kill_0();
188  static void kill_1();
189  static BOOL linkActive_0();
190  static BOOL linkActive_1();
191  static void enab_multicast_0( MACADR macAddress, BOOL addAddress );
192  static void enab_multicast_1( MACADR macAddress, BOOL addAddress );
193 
194  void TransmitBuffer( PoolPtr txBuffer );
195  virtual void TransmitBuffer_Core( PoolPtr txBuffer, uint8_t credits ) = 0;
196  void enab_multicast( MACADR macAddress, BOOL addAddress );
197 
198  // APITask control methods
199  int APIStart();
200  static int APIStartTask();
201  static void APIPause();
202  static void APIResume();
203  static void APIKill();
204 
205  // RXTask control methods
206  int Start();
207  void Pause();
208  void Resume();
209  void Kill();
210 
211  bool isRegistered() const;
212  int GetWifiInterfaceNumber() const;
213  int GetSystemInterfaceNumber() const;
214 
215  // WLAN manipulation and statistics functions
216  int ConnectWithOptions(
217  const char * ssid = nullptr, const char * passwd = "",
218  uint8_t retryCount = CONNECT_RETRIES, uint8_t optionCount = 0,
219  uint16_t *optionList = nullptr, uint8_t ssidLen = 0
220  );
221 
222  int ConnectToAP(
223  const char * ssid = nullptr, const char * passwd = "",
224  uint8_t retryCount = CONNECT_RETRIES
225  );
226 
227 
228  int StartAP(
229  const char * ssid = nullptr,
230  const char * passwd = "",
231  uint8_t channel = DEFAULT_TABLE_LABEL_CHANNEL,
232  uint8_t security = DEFAULT_TABLE_LABEL_SEC,
233  uint8_t cipher = DEFAULT_TABLE_LABEL_CIPH,
234  uint8_t ssidLen = 0
235  ) override;
236 
237  int StartConfigAP(uint8_t channel = DEFAULT_TABLE_LABEL_CHANNEL) override;
238 
239  void Disconnect() override;
240 
241  // Results of Scan are valid until the next call to 'Scan' or 'FreeScanList'
242  nbWifiScanResult * Scan( const char * ssid = nullptr, uint8_t optionCount = 0, uint16_t *optionList = nullptr) override;
243  void FreeScanList();
244 
245  int StartAsyncScan(
246  ReceiveScanResultFunc pfCallbackFunc, const char * ssid = nullptr,
247  uint8_t optionCount = 0, uint16_t *optionList = nullptr
248  );
249 
250  void StopAsyncScan();
251 
252  //Status functions:
253  int GetCurSSID(char * buf, int maxlen) override;
254  MACADR GetCurBSSID() override;
255  void GetCurrentAP(driverStatusStruct *ap) override;
256  void GetDeviceInformation(nbWifiDeviceInfo *ap) override;
257  bool Connected() override; // performs a bus communication to query the module, slow
258  int GetSignalStrength() override;
259  uint8_t GetCurChannel() override;
260  uint8_t GetSecurity() override;
261  uint8_t GetCipher() override;
262  uint8_t GetAvailableCredits() { return availableCredits; };
263 
264  // Utility Functions
265  int StoreSSIDPWToConfig( char *ssid, char *password, int ssidLen = 0) override;
266  int GetSSIDFromConfig( char *returnBuf, int maxLen ) override;
267  int GetKeyFromConfig( char *returnBuf, int maxLen ) override;
268 
269  virtual void SendCreditRequest() = 0;
270  virtual void SendCreditReport( uint8_t credits = 0xFF) = 0;
271  void SetMAC( const MACADR *newMAC, bool waitForResponse = true);
272  bool GetLinkStatus(); // does not perform a bus communication, fast
273  void Print();
274  bool UpdateSlaveFirmware( uint32_t imageLength, const uint8_t *imageBuffer );
275  bool ReadySlaveUpdate();
276  bool SendFirmwareChunk( uint32_t length, const uint8_t *data );
277  bool FinishedSendingFirmware( uint32_t length, const uint8_t *data );
278  virtual bool SetBusSpeed( uint32_t busSpeed ) = 0;
279 
280  friend void ::SetWifiSPISpeed( int busSpeed );
281  friend class Master;
282 
283  /* TODO: These functions were added temporarily to resolve pure virtual function declerations */
284  int ConnectToAP(
285  const char * ssid = nullptr, const char * passwd = "",
286  uint8_t retryCount = CONNECT_RETRIES,
287  uint8_t security = DEFAULT_WIFI_SEC_ALL
288  ) override;
289  int ConnectToAP( nbWifiConnect connect ) override;
290 
291  static NBWifi::Master* GetNewWicedSPIDriver();
292  static NBWifi::Master* GetNewWicedSerialDriver();
293  };
294 
295 // } /* ----- end of namespace Broadcom ----- */
296 } /* ----- end of namespace NBWifi ----- */
297 
298 extern NBWifi::Master *theWifiIntf;
299 
300 #endif /* ----- #ifndef __NBWICEDDRIVER_H ----- */
A FIFO is used to pass structures from one task to another. Note: Structures to be passed must have a...
Definition: nbrtos.h:683
void SetWifiSPISpeed(int busSpeed)
Set SPI bus speed.
Semaphores are used to control access to shared resource critical section, or to communicate between ...
Definition: nbrtos.h:289
NetBurner Wifi API.
NetBurner System Constants.
NBWifi namespace that encompaces the WiFi driver.
Definition: nbWifiBsp.h:15
An OS_CRIT object is used to establish critical sections of code that can only be run by one task at ...
Definition: nbrtos.h:840
NetBurner Buffers API.
Mailboxes are used to communicate between tasks.
Definition: nbrtos.h:362