29 #include <oc_stdlib.h> 31 #include <oc_drivers_list.h> 34 #include <oc_drivers_cfg.c> 41 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________ 44 static oC_List(oC_Driver_t) Drivers =
NULL;
47 .
Name =
"driver manager" 50 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________ 58 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ 62 oC_ErrorCode_t oC_DriverMan_TurnOn(
void )
64 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
66 if(oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag ==
false , oC_ErrorCode_ModuleIsTurnedOn))
68 Drivers = oC_List_New(&
Allocator , AllocationFlags_NoWait);
69 Configurations = oC_List_New(&
Allocator , AllocationFlags_NoWait);
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 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 89 errorCode = oC_ErrorCode_AllocationError;
98 oC_ErrorCode_t oC_DriverMan_TurnOff(
void )
100 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
102 if(oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
106 if(oC_List_Delete(Drivers,AllocationFlags_CanWaitForever))
108 errorCode = oC_ErrorCode_None;
112 errorCode = oC_ErrorCode_ReleaseError;
121 oC_List(oC_Driver_t) oC_DriverMan_GetList(
void )
128 oC_ErrorCode_t oC_DriverMan_AddDriver( oC_Driver_t Driver )
130 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
132 if(oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
134 bool added = oC_List_PushBack(Drivers,Driver,&
Allocator);
138 errorCode = oC_ErrorCode_None;
142 errorCode = oC_ErrorCode_CannotAddObjectToList;
151 oC_ErrorCode_t oC_DriverMan_RemoveDriver( oC_Driver_t Driver )
153 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
155 if(oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
157 bool removed = oC_List_RemoveAll(Drivers,Driver);
161 errorCode = oC_ErrorCode_None;
165 errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
174 oC_Driver_t oC_DriverMan_GetDriver(
const char * FileName )
176 oC_Driver_t foundDriver =
NULL;
180 oC_List_Foreach(Drivers,driver)
182 if(strcmp(driver->FileName,FileName) == 0)
184 foundDriver = driver;
194 void oC_DriverMan_TurnOnAllDrivers(
void )
200 oC_List_Foreach(Drivers,driver)
202 if((oC_Driver_IsTurnedOn(driver) ==
false) &&
oC_Bits_AreBitsSetU32(currentLevel,driver->RequiredBootLevel))
204 oC_ErrorCode_t errorCode = oC_Driver_TurnOn(driver);
206 if(oC_ErrorOccur(errorCode))
208 oC_SaveError(driver->FileName,errorCode);
216 void oC_DriverMan_TurnOffAllDrivers(
void )
220 oC_List_Foreach(Drivers,driver)
222 oC_ErrorCode_t errorCode = oC_Driver_TurnOff(driver);
224 if(oC_ErrorOccur(errorCode))
226 oC_SaveError(driver->FileName,errorCode);
234 oC_ErrorCode_t oC_DriverMan_AddAutoConfiguration(
const char * Name , oC_Driver_t Driver ,
const void * Config )
236 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
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 )
248 if(ErrorCondition(autoConfiguration !=
NULL , oC_ErrorCode_AllocationError))
250 autoConfiguration->Config = kmalloc(Driver->ConfigurationSize,&
Allocator,AllocationFlags_NoWait | AllocationFlags_ZeroFill);
251 autoConfiguration->Driver = Driver;
253 if(ErrorCondition(autoConfiguration->Config !=
NULL , oC_ErrorCode_AllocationError))
255 strncpy(autoConfiguration->Name,Name,
sizeof(autoConfiguration->Name));
256 memcpy(autoConfiguration->Config,Config,Driver->ConfigurationSize);
258 bool added = oC_List_PushBack(Configurations,autoConfiguration,&
Allocator);
262 errorCode = oC_ErrorCode_None;
266 errorCode = oC_ErrorCode_CannotAddObjectToList;
271 if(oC_ErrorOccur(errorCode))
273 if(autoConfiguration !=
NULL)
275 if(autoConfiguration->Config !=
NULL)
277 oC_SaveIfFalse(
"DRVMAN: Add autoConf kfree config error - " , kfree(autoConfiguration->Config , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
279 oC_SaveIfFalse(
"DRVMAN: Add autoConf kfree error - " , kfree(autoConfiguration , AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
289 oC_ErrorCode_t oC_DriverMan_RemoveAutoConfiguration(
const char * Name )
291 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
295 && ErrorCondition( Configurations !=
NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
296 && ErrorCondition( isaddresscorrect(Name) , oC_ErrorCode_WrongAddress )
299 bool removedAll =
false;
301 errorCode = oC_ErrorCode_ObjectNotFoundOnList;
303 oC_List_Foreach(Configurations,autoConfig)
305 if(isaddresscorrect(autoConfig) ==
false)
307 kdebuglog(oC_LogType_Error,
"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
309 else if(strcmp(autoConfig->Name,Name) == 0)
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);
314 removedAll = oC_List_RemoveAll(Configurations,autoConfig);
317 errorCode = oC_ErrorCode_None;
321 errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
331 oC_ErrorCode_t oC_DriverMan_ReadAutoConfiguration(
const char * Name ,
oC_AutoConfiguration_t * outAutoConfiguration )
333 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
337 && ErrorCondition( Configurations !=
NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
338 && ErrorCondition( isaddresscorrect(Name) , oC_ErrorCode_WrongAddress )
339 && ErrorCondition( isram(outAutoConfiguration), oC_ErrorCode_OutputAddressNotInRAM )
342 errorCode = oC_ErrorCode_ObjectNotFoundOnList;
344 oC_List_Foreach(Configurations,autoConfig)
346 if(isaddresscorrect(autoConfig) ==
false)
348 kdebuglog(oC_LogType_Error,
"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
350 else if(strcmp(autoConfig->Name,Name) == 0)
352 memcpy(outAutoConfiguration,&autoConfig,
sizeof(autoConfig));
353 errorCode = oC_ErrorCode_None;
363 void oC_DriverMan_ConfigureAllDrivers(
void )
367 oC_List_Foreach(Configurations,autoConfig)
369 if(isaddresscorrect(autoConfig) ==
false)
371 kdebuglog(oC_LogType_Error,
"DRVMAN: autoConfig address is not correct! (%p)\n" , autoConfig);
373 else if(oC_Driver_IsTurnedOn(autoConfig->Driver) && autoConfig->Configured ==
false)
375 oC_ErrorCode_t errorCode = oC_Driver_Configure(autoConfig->Driver,autoConfig->Config,&autoConfig->Context);
377 oC_SaveIfErrorOccur(autoConfig->Name,errorCode);
379 if(!oC_ErrorOccur(errorCode))
381 autoConfig->Configured =
true;
392 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
396 && ErrorCondition( Configurations !=
NULL , oC_ErrorCode_AutoConfigurationsNotAvailable )
397 && ErrorCondition( isram(outList) , oC_ErrorCode_OutputAddressNotInRAM )
400 *outList = Configurations;
401 errorCode = oC_ErrorCode_None;
408 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ oC_Boot_Level_t oC_Boot_GetCurrentBootLevel(void)
returns current boot level
static bool oC_Bits_AreBitsSetU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are set
static bool ModuleEnabledFlag
identifier for allocations
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
#define NULL
pointer to a zero