Choco OS  V.0.16.9.0
Join to the chocolate world
oc_driver.c
Go to the documentation of this file.
1 
27 #include <oc_driver.h>
28 #include <oc_stdlib.h>
29 #include <oc_ioctl.h>
30 
36 #define _________________________________________IF_FUNCTIONS_SECTION_______________________________________________________________________
37 
38 //==========================================================================================================================================
39 //==========================================================================================================================================
40 bool oC_Driver_IsDriverRequiredBy( oC_Driver_t Driver , oC_Driver_t RequiredDriver )
41 {
42  bool required = false;
43 
44  if(isaddresscorrect(Driver) && isaddresscorrect(RequiredDriver))
45  {
46  for(uint16_t driverIndex = 0; driverIndex < Driver->RequiredCount ; driverIndex++)
47  {
48  if(Driver->RequiredList[driverIndex] == RequiredDriver)
49  {
50  required = true;
51  break;
52  }
53  }
54  }
55 
56  return required;
57 }
58 
59 //==========================================================================================================================================
60 //==========================================================================================================================================
61 oC_Driver_Type_t oC_Driver_GetDriverType( oC_Driver_t Driver )
62 {
63  oC_Driver_Type_t type = oC_Driver_Type_Incorrect;
64 
65  if(isaddresscorrect(Driver))
66  {
67  type = Driver->Type;
68  }
69 
70  return type;
71 }
72 
73 //==========================================================================================================================================
74 //==========================================================================================================================================
75 bool oC_Driver_ReadRequiredList( oC_Driver_t Driver , oC_Driver_RequiredList_t * outRequiredList , uint16_t * outRequiredListCount )
76 {
77  bool read = false;
78 
79  if(isaddresscorrect(Driver) && isram(outRequiredList) && isram(outRequiredListCount))
80  {
81  *outRequiredList = Driver->RequiredList;
82  *outRequiredListCount = Driver->RequiredCount;
83  }
84 
85  return read;
86 }
87 
88 //==========================================================================================================================================
89 //==========================================================================================================================================
90 oC_ErrorCode_t oC_Driver_TurnOn( oC_Driver_t Driver )
91 {
92  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
93 
94  if(
95  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress )
96  )
97  {
98  if(Driver->IsTurnedOn == NULL)
99  {
100  errorCode = oC_ErrorCode_None;
101  }
102  else if(isaddresscorrect(Driver->IsTurnedOn) == false)
103  {
104  errorCode = oC_ErrorCode_WrongAddress;
105  }
106  else if(Driver->IsTurnedOn())
107  {
108  errorCode = oC_ErrorCode_ModuleIsTurnedOn;
109  }
110  else
111  {
112  if(Driver->TurnOn == NULL)
113  {
114  errorCode = oC_ErrorCode_None;
115  }
116  if(isaddresscorrect(Driver->TurnOn))
117  {
118  errorCode = Driver->TurnOn();
119  }
120  else
121  {
122  errorCode = oC_ErrorCode_WrongAddress;
123  }
124  }
125  }
126 
127  return errorCode;
128 }
129 
130 //==========================================================================================================================================
131 //==========================================================================================================================================
132 oC_ErrorCode_t oC_Driver_TurnOff( oC_Driver_t Driver )
133 {
134  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
135 
136  if(
137  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress )
138  )
139  {
140  if(Driver->IsTurnedOn == NULL)
141  {
142  errorCode = oC_ErrorCode_None;
143  }
144  else if(isaddresscorrect(Driver->IsTurnedOn) == false)
145  {
146  errorCode = oC_ErrorCode_WrongAddress;
147  }
148  else if(Driver->IsTurnedOn() == false)
149  {
150  errorCode = oC_ErrorCode_ModuleNotStartedYet;
151  }
152  else
153  {
154  if(Driver->TurnOff == NULL)
155  {
156  errorCode = oC_ErrorCode_None;
157  }
158  if(isaddresscorrect(Driver->TurnOff))
159  {
160  errorCode = Driver->TurnOff();
161  }
162  else
163  {
164  errorCode = oC_ErrorCode_WrongAddress;
165  }
166  }
167  }
168 
169  return errorCode;
170 }
171 
172 //==========================================================================================================================================
173 //==========================================================================================================================================
174 bool oC_Driver_IsTurnedOn( oC_Driver_t Driver )
175 {
176  bool turnedOn = false;
177 
178  if(isaddresscorrect(Driver))
179  {
180  if(Driver->IsTurnedOn == NULL)
181  {
182  turnedOn = true;
183  }
184  else if(isaddresscorrect(Driver->IsTurnedOn))
185  {
186  turnedOn = Driver->IsTurnedOn();
187  }
188  }
189 
190  return turnedOn;
191 }
192 
193 //==========================================================================================================================================
194 //==========================================================================================================================================
195 oC_ErrorCode_t oC_Driver_Configure( oC_Driver_t Driver , const void * Config , void ** outContext )
196 {
197  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
198 
199  if(
200  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
201  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->Configure) , oC_ErrorCode_NotHandledByDriver )
202  )
203  {
204  errorCode = Driver->Configure(Config,outContext);
205  }
206 
207  return errorCode;
208 }
209 
210 //==========================================================================================================================================
211 //==========================================================================================================================================
212 oC_ErrorCode_t oC_Driver_Unconfigure( oC_Driver_t Driver , const void * Config , void ** outContext )
213 {
214  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
215 
216  if(
217  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
218  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->Unconfigure), oC_ErrorCode_NotHandledByDriver )
219  )
220  {
221  errorCode = Driver->Unconfigure(Config,outContext);
222  }
223 
224  return errorCode;
225 }
226 
227 //==========================================================================================================================================
228 //==========================================================================================================================================
229 oC_ErrorCode_t oC_Driver_Read( oC_Driver_t Driver , void * Context , char * outBuffer , uint32_t * Size , oC_Time_t Timeout )
230 {
231  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
232 
233  if(
234  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
235  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->Read), oC_ErrorCode_NotHandledByDriver )
236  )
237  {
238  errorCode = Driver->Read(Context,outBuffer,Size,Timeout);
239  }
240 
241  return errorCode;
242 }
243 
244 //==========================================================================================================================================
245 //==========================================================================================================================================
246 oC_ErrorCode_t oC_Driver_Write( oC_Driver_t Driver , void * Context , const char * Buffer , uint32_t * Size , oC_Time_t Timeout )
247 {
248  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
249 
250  if(
251  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
252  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->Write), oC_ErrorCode_NotHandledByDriver )
253  )
254  {
255  errorCode = Driver->Write(Context,Buffer,Size,Timeout);
256  }
257 
258  return errorCode;
259 }
260 
261 //==========================================================================================================================================
262 //==========================================================================================================================================
263 oC_ErrorCode_t oC_Driver_HandleIoctl( oC_Driver_t Driver , void * Context , oC_Ioctl_Command_t Command , void * Data )
264 {
265  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
266 
267  if(
268  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
269  oC_AssignErrorCodeIfFalse(&errorCode , oC_Ioctl_IsCorrectCommand(Command), oC_ErrorCode_CommandNotCorrect )
270  )
271  {
272  if(Command == oC_IoCtl_SpecialCommand_GetDriverVersion)
273  {
274  if(isram(Data))
275  {
276  *((uint32_t*)Data) = Driver->Version;
277  errorCode = oC_ErrorCode_None;
278  }
279  else
280  {
281  errorCode = oC_ErrorCode_OutputAddressNotInRAM;
282  }
283  }
284  else if(ErrorCondition(isaddresscorrect(Driver->HandleIoctl), oC_ErrorCode_NotHandledByDriver ))
285  {
286  errorCode = Driver->HandleIoctl(Context,Command,Data);
287  }
288  }
289 
290  return errorCode;
291 }
292 
293 //==========================================================================================================================================
294 //==========================================================================================================================================
295 oC_ErrorCode_t oC_Driver_ReadColorMap( oC_Driver_t Driver , void * Context , oC_ColorMap_t ** outColorMap )
296 {
297  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
298 
299  if(
300  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
301  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->ReadColorMap), oC_ErrorCode_NotHandledByDriver )
302  )
303  {
304  errorCode = Driver->ReadColorMap(Context,outColorMap);
305  }
306 
307  return errorCode;
308 }
309 
310 //==========================================================================================================================================
311 //==========================================================================================================================================
312 oC_ErrorCode_t oC_Driver_SetResolution( oC_Driver_t Driver , void * Context , oC_Pixel_ResolutionUInt_t Width , oC_Pixel_ResolutionUInt_t Height )
313 {
314  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
315 
316  if(
317  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
318  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->SetResolution), oC_ErrorCode_NotHandledByDriver )
319  )
320  {
321  errorCode = Driver->SetResolution(Context,Width,Height);
322  }
323 
324  return errorCode;
325 }
326 
327 //==========================================================================================================================================
328 //==========================================================================================================================================
329 oC_ErrorCode_t oC_Driver_ReadResolution( oC_Driver_t Driver , void * Context , oC_Pixel_ResolutionUInt_t * outWidth , oC_Pixel_ResolutionUInt_t * outHeight )
330 {
331  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
332 
333  if(
334  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
335  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->ReadResolution), oC_ErrorCode_NotHandledByDriver )
336  )
337  {
338  errorCode = Driver->ReadResolution(Context,outWidth,outHeight);
339  }
340 
341  return errorCode;
342 }
343 
344 //==========================================================================================================================================
345 //==========================================================================================================================================
346 oC_ErrorCode_t oC_Driver_SendFrame( oC_Driver_t Driver , void * Context , const oC_Net_Frame_t * Frame , oC_Time_t Timeout )
347 {
348  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
349 
350  if(
351  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
352  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->SendFrame) , oC_ErrorCode_NotHandledByDriver )
353  )
354  {
355  errorCode = Driver->SendFrame(Context,Frame,Timeout);
356  }
357 
358  return errorCode;
359 }
360 
361 //=================================1=========================================================================================================
362 //==========================================================================================================================================
363 oC_ErrorCode_t oC_Driver_ReceiveFrame( oC_Driver_t Driver , void * Context , oC_Net_Frame_t * outFrame , oC_Time_t Timeout )
364 {
365  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
366 
367  if(
368  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
369  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->ReceiveFrame) , oC_ErrorCode_NotHandledByDriver )
370  )
371  {
372  errorCode = Driver->ReceiveFrame(Context,outFrame,Timeout);
373  }
374 
375  return errorCode;
376 }
377 
378 //==========================================================================================================================================
379 //==========================================================================================================================================
380 oC_ErrorCode_t oC_Driver_SetWakeOnLanEvent( oC_Driver_t Driver , void * Context , oC_Event_t WolEvent )
381 {
382  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
383 
384  if(
385  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
386  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->SetWakeOnLanEvent) , oC_ErrorCode_NotHandledByDriver )
387  )
388  {
389  errorCode = Driver->SetWakeOnLanEvent(Context,WolEvent);
390  }
391 
392  return errorCode;
393 }
394 
395 //==========================================================================================================================================
396 //==========================================================================================================================================
397 oC_ErrorCode_t oC_Driver_Flush( oC_Driver_t Driver , void * Context )
398 {
399  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
400 
401  if(
402  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
403  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->Flush) , oC_ErrorCode_NotHandledByDriver )
404  )
405  {
406  errorCode = Driver->Flush(Context);
407  }
408 
409  return errorCode;
410 }
411 
412 //==========================================================================================================================================
413 //==========================================================================================================================================
414 oC_ErrorCode_t oC_Driver_SetLoopback( oC_Driver_t Driver , void * Context , oC_Net_Layer_t Layer , bool Enabled )
415 {
416  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
417 
418  if(
419  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
420  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->SetLoopback) , oC_ErrorCode_NotHandledByDriver )
421  )
422  {
423  errorCode = Driver->SetLoopback(Context,Layer,Enabled);
424  }
425 
426  return errorCode;
427 }
428 
429 //==========================================================================================================================================
430 //==========================================================================================================================================
431 oC_ErrorCode_t oC_Driver_PerformDiagnostics( oC_Driver_t Driver , void * Context , oC_Diag_t * outDiags , uint32_t * NumberOfDiags )
432 {
433  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
434 
435  if(
436  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
437  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->PerformDiagnostics) , oC_ErrorCode_NotHandledByDriver )
438  )
439  {
440  errorCode = Driver->PerformDiagnostics(Context,outDiags,NumberOfDiags);
441  }
442 
443  return errorCode;
444 }
445 
446 //==========================================================================================================================================
447 //==========================================================================================================================================
448 oC_ErrorCode_t oC_Driver_ReadNetInfo( oC_Driver_t Driver , void * Context , oC_Net_Info_t * outInfo )
449 {
450  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
451 
452  if(
453  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress ) &&
454  oC_AssignErrorCodeIfFalse(&errorCode , isaddresscorrect(Driver->ReadNetInfo) , oC_ErrorCode_NotHandledByDriver )
455  )
456  {
457  errorCode = Driver->ReadNetInfo(Context,outInfo);
458  }
459 
460  return errorCode;
461 }
462 
463 #undef _________________________________________IF_FUNCTIONS_SECTION_______________________________________________________________________
464 
stores network interface informations
Definition: oc_net.h:508
The file with interface for driver creating.
stores informations about the frame to send
Definition: oc_net.h:314
The file with interface for IOCTL.
#define NULL
pointer to a zero
Definition: oc_null.h:37
oC_Net_Layer_t
stores layer of the OSI model
Definition: oc_net.h:333