Choco OS  V.0.16.9.0
Join to the chocolate world
oc_driverman.c
Go to the documentation of this file.
1 
27 #include <oc_driverman.h>
28 #include <oc_boot.h>
29 #include <oc_stdlib.h>
30 #include <string.h>
31 #include <oc_drivers_list.h>
32 #include <oc_bits.h>
33 #include <oc_debug.h>
34 #include <oc_drivers_cfg.c>
35 
41 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________
42 
43 static bool ModuleEnabledFlag = false;
44 static oC_List(oC_Driver_t) Drivers = NULL;
45 static oC_List(oC_AutoConfiguration_t*) Configurations = NULL;
46 static const oC_Allocator_t Allocator = {
47  .Name = "driver manager"
48 };
49 
50 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________
51 
52 
58 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
59 
60 //==========================================================================================================================================
61 //==========================================================================================================================================
62 oC_ErrorCode_t oC_DriverMan_TurnOn( void )
63 {
64  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
65 
66  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == false , oC_ErrorCode_ModuleIsTurnedOn))
67  {
68  Drivers = oC_List_New(&Allocator , AllocationFlags_NoWait);
69  Configurations = oC_List_New(&Allocator , AllocationFlags_NoWait);
70 
71  if(Drivers)
72  {
73  ModuleEnabledFlag = true;
74  errorCode = oC_ErrorCode_None;
75 #define ADD_DRIVER_TO_LIST(NAME) oC_AssignErrorCode(&errorCode , oC_DriverMan_AddDriver(&NAME));
76 #define DONT_ADD_DRIVER_TO_LIST(NAME)
77  CFG_LIST_DRIVERS(ADD_DRIVER_TO_LIST,DONT_ADD_DRIVER_TO_LIST)
78 #undef ADD_DRIVER_TO_LIST
79 #undef DONT_ADD_DRIVER_TO_LIST
80 
81 #define ADD_CONFIGURATION( DRIVER_NAME , CONFIG_NAME ) oC_AssignErrorCode(&errorCode , oC_DriverMan_AddAutoConfiguration(#CONFIG_NAME,&DRIVER_NAME,&CONFIG_NAME));
82 #define DONT_ADD_CONFIGURATION(...)
83  CFG_AUTO_CONFIGURATION_LIST(ADD_CONFIGURATION,DONT_ADD_CONFIGURATION)
84 #undef ADD_CONFIGURATION
85 #undef DONT_ADD_CONFIGURATION
86  }
87  else
88  {
89  errorCode = oC_ErrorCode_AllocationError;
90  }
91  }
92 
93  return errorCode;
94 }
95 
96 //==========================================================================================================================================
97 //==========================================================================================================================================
98 oC_ErrorCode_t oC_DriverMan_TurnOff( void )
99 {
100  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
101 
102  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
103  {
104  ModuleEnabledFlag = false;
105 
106  if(oC_List_Delete(Drivers,AllocationFlags_CanWaitForever))
107  {
108  errorCode = oC_ErrorCode_None;
109  }
110  else
111  {
112  errorCode = oC_ErrorCode_ReleaseError;
113  }
114  }
115 
116  return errorCode;
117 }
118 
119 //==========================================================================================================================================
120 //==========================================================================================================================================
121 oC_List(oC_Driver_t) oC_DriverMan_GetList( void )
122 {
123  return Drivers;
124 }
125 
126 //==========================================================================================================================================
127 //==========================================================================================================================================
128 oC_ErrorCode_t oC_DriverMan_AddDriver( oC_Driver_t Driver )
129 {
130  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
131 
132  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
133  {
134  bool added = oC_List_PushBack(Drivers,Driver,&Allocator);
135 
136  if(added)
137  {
138  errorCode = oC_ErrorCode_None;
139  }
140  else
141  {
142  errorCode = oC_ErrorCode_CannotAddObjectToList;
143  }
144  }
145 
146  return errorCode;
147 }
148 
149 //==========================================================================================================================================
150 //==========================================================================================================================================
151 oC_ErrorCode_t oC_DriverMan_RemoveDriver( oC_Driver_t Driver )
152 {
153  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
154 
155  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
156  {
157  bool removed = oC_List_RemoveAll(Drivers,Driver);
158 
159  if(removed)
160  {
161  errorCode = oC_ErrorCode_None;
162  }
163  else
164  {
165  errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
166  }
167  }
168 
169  return errorCode;
170 }
171 
172 //==========================================================================================================================================
173 //==========================================================================================================================================
174 oC_Driver_t oC_DriverMan_GetDriver( const char * FileName )
175 {
176  oC_Driver_t foundDriver = NULL;
177 
179  {
180  oC_List_Foreach(Drivers,driver)
181  {
182  if(strcmp(driver->FileName,FileName) == 0)
183  {
184  foundDriver = driver;
185  }
186  }
187  }
188 
189  return foundDriver;
190 }
191 
192 //==========================================================================================================================================
193 //==========================================================================================================================================
194 void oC_DriverMan_TurnOnAllDrivers( void )
195 {
197  {
198  oC_Boot_Level_t currentLevel = oC_Boot_GetCurrentBootLevel();
199 
200  oC_List_Foreach(Drivers,driver)
201  {
202  if((oC_Driver_IsTurnedOn(driver) == false) && oC_Bits_AreBitsSetU32(currentLevel,driver->RequiredBootLevel))
203  {
204  oC_ErrorCode_t errorCode = oC_Driver_TurnOn(driver);
205 
206  if(oC_ErrorOccur(errorCode))
207  {
208  oC_SaveError(driver->FileName,errorCode);
209  }
210  }
211  }
212  }
213 }
214 //==========================================================================================================================================
215 //==========================================================================================================================================
216 void oC_DriverMan_TurnOffAllDrivers( void )
217 {
219  {
220  oC_List_Foreach(Drivers,driver)
221  {
222  oC_ErrorCode_t errorCode = oC_Driver_TurnOff(driver);
223 
224  if(oC_ErrorOccur(errorCode))
225  {
226  oC_SaveError(driver->FileName,errorCode);
227  }
228  }
229  }
230 }
231 
232 //==========================================================================================================================================
233 //==========================================================================================================================================
234 oC_ErrorCode_t oC_DriverMan_AddAutoConfiguration( const char * Name , oC_Driver_t Driver , const void * Config )
235 {
236  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
237 
238  if(
239  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet )
240  && ErrorCondition( Configurations != NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
241  && ErrorCondition( isaddresscorrect(Name) , oC_ErrorCode_WrongAddress )
242  && ErrorCondition( isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress )
243  && ErrorCondition( isaddresscorrect(Config) , oC_ErrorCode_WrongAddress )
244  )
245  {
246  oC_AutoConfiguration_t * autoConfiguration = kmalloc(sizeof(oC_AutoConfiguration_t),&Allocator,AllocationFlags_NoWait | AllocationFlags_ZeroFill);
247 
248  if(ErrorCondition(autoConfiguration != NULL , oC_ErrorCode_AllocationError))
249  {
250  autoConfiguration->Config = kmalloc(Driver->ConfigurationSize,&Allocator,AllocationFlags_NoWait | AllocationFlags_ZeroFill);
251  autoConfiguration->Driver = Driver;
252 
253  if(ErrorCondition(autoConfiguration->Config != NULL , oC_ErrorCode_AllocationError))
254  {
255  strncpy(autoConfiguration->Name,Name,sizeof(autoConfiguration->Name));
256  memcpy(autoConfiguration->Config,Config,Driver->ConfigurationSize);
257 
258  bool added = oC_List_PushBack(Configurations,autoConfiguration,&Allocator);
259 
260  if(added)
261  {
262  errorCode = oC_ErrorCode_None;
263  }
264  else
265  {
266  errorCode = oC_ErrorCode_CannotAddObjectToList;
267  }
268  }
269  }
270 
271  if(oC_ErrorOccur(errorCode))
272  {
273  if(autoConfiguration != NULL)
274  {
275  if(autoConfiguration->Config != NULL)
276  {
277  oC_SaveIfFalse("DRVMAN: Add autoConf kfree config error - " , kfree(autoConfiguration->Config , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
278  }
279  oC_SaveIfFalse("DRVMAN: Add autoConf kfree error - " , kfree(autoConfiguration , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
280  }
281  }
282  }
283 
284  return errorCode;
285 }
286 
287 //==========================================================================================================================================
288 //==========================================================================================================================================
289 oC_ErrorCode_t oC_DriverMan_RemoveAutoConfiguration( const char * Name )
290 {
291  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
292 
293  if(
294  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet )
295  && ErrorCondition( Configurations != NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
296  && ErrorCondition( isaddresscorrect(Name) , oC_ErrorCode_WrongAddress )
297  )
298  {
299  bool removedAll = false;
300 
301  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
302 
303  oC_List_Foreach(Configurations,autoConfig)
304  {
305  if(isaddresscorrect(autoConfig) == false)
306  {
307  kdebuglog(oC_LogType_Error,"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
308  }
309  else if(strcmp(autoConfig->Name,Name) == 0)
310  {
311  oC_SaveIfFalse("DRVMAN: Remove autoConf kfree config error - " , kfree(autoConfig->Config , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
312  oC_SaveIfFalse("DRVMAN: Remove autoConf kfree error - " , kfree(autoConfig , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
313 
314  removedAll = oC_List_RemoveAll(Configurations,autoConfig);
315  if(removedAll)
316  {
317  errorCode = oC_ErrorCode_None;
318  }
319  else
320  {
321  errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
322  }
323  }
324  }
325  }
326 
327  return errorCode;
328 }
329 //==========================================================================================================================================
330 //==========================================================================================================================================
331 oC_ErrorCode_t oC_DriverMan_ReadAutoConfiguration( const char * Name , oC_AutoConfiguration_t * outAutoConfiguration )
332 {
333  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
334 
335  if(
336  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet )
337  && ErrorCondition( Configurations != NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
338  && ErrorCondition( isaddresscorrect(Name) , oC_ErrorCode_WrongAddress )
339  && ErrorCondition( isram(outAutoConfiguration), oC_ErrorCode_OutputAddressNotInRAM )
340  )
341  {
342  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
343 
344  oC_List_Foreach(Configurations,autoConfig)
345  {
346  if(isaddresscorrect(autoConfig) == false)
347  {
348  kdebuglog(oC_LogType_Error,"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
349  }
350  else if(strcmp(autoConfig->Name,Name) == 0)
351  {
352  memcpy(outAutoConfiguration,&autoConfig,sizeof(autoConfig));
353  errorCode = oC_ErrorCode_None;
354  }
355  }
356  }
357 
358  return errorCode;
359 }
360 
361 //==========================================================================================================================================
362 //==========================================================================================================================================
363 void oC_DriverMan_ConfigureAllDrivers( void )
364 {
365  if(ModuleEnabledFlag && Configurations != NULL)
366  {
367  oC_List_Foreach(Configurations,autoConfig)
368  {
369  if(isaddresscorrect(autoConfig) == false)
370  {
371  kdebuglog(oC_LogType_Error,"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
372  }
373  else if(oC_Driver_IsTurnedOn(autoConfig->Driver) && autoConfig->Configured == false)
374  {
375  oC_ErrorCode_t errorCode = oC_Driver_Configure(autoConfig->Driver,autoConfig->Config,&autoConfig->Context);
376 
377  oC_SaveIfErrorOccur(autoConfig->Name,errorCode);
378 
379  if(!oC_ErrorOccur(errorCode))
380  {
381  autoConfig->Configured = true;
382  }
383  }
384  }
385  }
386 }
387 
388 //==========================================================================================================================================
389 //==========================================================================================================================================
390 oC_ErrorCode_t oC_DriverMan_ReadAutoConfigurationList ( oC_List(oC_AutoConfiguration_t*) * outList )
391 {
392  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
393 
394  if(
395  ErrorCondition( ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet )
396  && ErrorCondition( Configurations != NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
397  && ErrorCondition( isram(outList) , oC_ErrorCode_OutputAddressNotInRAM )
398  )
399  {
400  *outList = Configurations;
401  errorCode = oC_ErrorCode_None;
402  }
403 
404  return errorCode;
405 }
406 
407 
408 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
409 
410 
oC_Boot_Level_t oC_Boot_GetCurrentBootLevel(void)
returns current boot level
Definition: oc_boot.c:131
static bool oC_Bits_AreBitsSetU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are set
Definition: oc_bits.h:884
FILE__DESCRIPTION
static bool ModuleEnabledFlag
Definition: oc_memman.c:211
const char * Name
Definition: oc_stdlib.h:161
identifier for allocations
Definition: oc_stdlib.h:159
The file with interface for bootloader.
The file with drivers manager interface.
The file with functions for the bits operation.
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define NULL
pointer to a zero
Definition: oc_null.h:37