📄 drv_nim.c
字号:
* Outputs
* None
*
* Return Codes
* DRV_NIM_OK,
* DRV_NIM_ALREADY_INITIALIZED,
* DRV_NIM_NOT_INITIALIZED,
* DRV_NIM_INVALID_PARAMETER,
* DRV_NIM_FAIL,
* DRV_NIM_CALLBACK_TABLE_NOT_ENOUGH
*
* Description
* Install Callback Function.
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_InstallCallback(
I32 Device,
DRV_NIM_CALLBACK_TYPE CallbackType,
void ( *Callback )(I32 Device ))
{
UI32 i;
if( !DRV_NIM_Initialized ) { /* Not Initialized ? */
return( DRV_NIM_NOT_INITIALIZED ); /* Not Initialized */
}
#if DRV_NIM_CHECK_PARAMETER
if(!((0<=Device)&&(Device<DRV_NIM_NUMBER_OF_DEVICES))){ /* Invalid Device Number ? */
return( DRV_NIM_INVALID_PARAMETER ); /* Invalid Parameter */
}
if(!((0<=Type)&&(Type<DRV_NIM_CALLBACK_TYPE_NUM))){ /* Invalid Vallback Type ? */
return( DRV_NIM_INVALID_PARAMETER ); /* Invalid Parameter */
}
if(Callback==NULL){ /* Pointer is NULL ? */
return( DRV_NIM_INVALID_PARAMETER ); /* Invalid Parameter */
}
#endif
if( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) { /* Take Semaphore for Callback Table NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
if( DRV_NIM_CallbackTable[i].Function == NULL ) { /* Callback Function Not Installed ? */
DRV_NIM_CallbackTable[i].Device = Device; /* Store Callback Table */
DRV_NIM_CallbackTable[i].Type = CallbackType;
DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
DRV_NIM_CallbackTable[i].Function = Callback;
if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
/* Free Semaphore for Callback Table */
return( DRV_NIM_FAIL ); /* Fail */
}
DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_EXIST; /* callback table exist */
return( DRV_NIM_OK ); /* Ok */
}
}
if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
/* Free Semaphore for Callback Table */
return( DRV_NIM_FAIL ); /* Fail */
}
return( DRV_NIM_CALLBACK_TABLE_NOT_ENOUGH ); /* Callback Table Not Enough */
}
/*****************************************************************
*
* Function Name
* DRV_NIM_UninstallCallback
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_UninstallCallback(
* int Device,
* void ( *Callback )( int Device ) );
*
* Inputs
* Device : NIM Device Number
* Callback : Pointer to Callback Function
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_OK
* DRV_NIM_NOT_INITIALIZED
* DRV_NIM_INVALID_PARAMETER
* DRV_NIM_FAIL
*
* Description
* Uninstall Callback Function
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_UninstallCallback(I32 Device,void (*Callback)(I32 Device))
{
int i, j; /* Loop Counter */
if( !DRV_NIM_Initialized ) { /* Not Initialized ? */
return( DRV_NIM_NOT_INITIALIZED ); /* Not Initialized */
}
#if DRV_NIM_CHECK_PARAMETER
if(!((0<=Device)&&(Device<DRV_NIM_NUMBER_OF_DEVICES))){ /* Invalid Device Number ? */
return( DRV_NIM_INVALID_PARAMETER ); /* Invalid Parameter */
}
if(Callback==NULL){ /* Pointer is NULL ? */
return( DRV_NIM_INVALID_PARAMETER ); /* Invalid Parameter */
}
#endif
if( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) { /* Take Semaphore for Callback Table NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
if( ( DRV_NIM_CallbackTable[i].Device == Device ) && ( DRV_NIM_CallbackTable[i].Function == Callback ) ) {
/* Callback Function Match ? */
if( !DRV_NIM_CallbackActive ) { /* Callback Function Inactive ? */
for( j = i + 1 ; j < DRV_NIM_MAX_CALLBACKS ; j++ ) {
/* Loop from Next Entry to End of Table */
DRV_NIM_CallbackTable[j-1] = DRV_NIM_CallbackTable[j];
/* Slide Callback Table Element */
}
/* Clear Last Callback Table */
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Device = -1;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Type = DRV_NIM_CALLBACK_TYPE_INIT;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].DeleteFlag = FALSE;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Function = NULL;
}
else { /* Callback Function Active ? */
DRV_NIM_CallbackTable[i].DeleteFlag = TRUE; /* Set Delete Flag */
}
break; /* Exit Loop */
}
}
/* Callback is not registered? */
if(DRV_NIM_CallbackTable[0].Function == NULL){
DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_NOTHING; /* callback table nothing */
}
if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
/* Free Semaphore for Callback Table */
return( DRV_NIM_FAIL ); /* Fail */
}
return( DRV_NIM_OK ); /* Ok */
}
/*****************************************************************
*
* Function Name
* DRV_NIM_CallbackTask
*
* Prototype
* static void DRV_NIM_CallbackTask(
* UI32 argc,
* void *argv );
*
* Inputs
* argc : Argument Count
* argv : Argument Value
*
* Outputs
* None
*
* Return Codes
* None
*
* Description
* Callback Function Dispatch Task
* This Function Can Use Only in NIM Driver.
*
*****************************************************************/
static void DRV_NIM_CallbackTask( UI32 argc, void *argv )
{
/* UI32 Message, ActualSize; */ /* Message, Actual Size Buffer */
UI32 Message; /* Message Size Buffer */
DRV_NIM_CALLBACK_TYPE Type; /* Callback Type */
int Device; /* Device Number */
void ( *Function )(I32 Device); /* Callback Function */
int i, j; /* Loop Counter */
for( ; ; ) { /* Eternal Loop */
while( MMAC_RTOS_ReceiveMessageQueue( DRV_NIM_CallbackQueue
, MMAC_RTOS_MSG_QUEUE_BLOCKING, &Message ) != MMAC_RTOS_OK ) {
/* Receive from Callback Dispatch Queue */
} /* Loop while NG */
if( DRV_NIM_Initialized ) { /* Driver Initialized ? */
while( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) { /* Take Semaphore for Callback Table NG ? */
}
DRV_NIM_CallbackActive = TRUE; /* Set Callback Active Flag */
Type = (DRV_NIM_CALLBACK_TYPE)Message; /* Get Callback Type */
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
if( DRV_NIM_CallbackTable[i].Function != NULL ) {
/* Callback Function Installed ? */
if( !DRV_NIM_CallbackTable[i].DeleteFlag ) {
/* Callback Function Not Deleted ? */
if( DRV_NIM_CallbackTable[i].Type == Type ) {
/* Callback Function Type Is Match ? */
/* Get Device Number & Callback Function Pointer */
Device = DRV_NIM_CallbackTable[i].Device;
Function = DRV_NIM_CallbackTable[i].Function;
MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore );
/* Free Semaphore for Callback Table */
Function( Device ); /* Execute Callback Function */
while( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) { /* Take Semaphore for Callback Table NG ? */
}
}
}
}
}
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
if( DRV_NIM_CallbackTable[i].DeleteFlag ) { /* Callback Function Deleted ? */
for( j = i + 1 ; j < DRV_NIM_MAX_CALLBACKS ; j++ ) {
/* Loop from Next Entry to End of Table */
DRV_NIM_CallbackTable[j-1] = DRV_NIM_CallbackTable[j];
/* Slide Callback Table Element */
}
/* Clear Last Callback Table */
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Device = -1;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Type = DRV_NIM_CALLBACK_TYPE_INIT;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Function = NULL;
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].DeleteFlag = FALSE;
}
}
DRV_NIM_CallbackActive = FALSE; /* Clear Callback Active Flag */
MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore );
/* Free Semaphore for Callback Table */
}
}
}
/*****************************************************************
*
* Function Name
* DRV_NIM_LockScanTask
*
* Prototype
* static void DRV_NIM_LockScanTask(
* UI32 argc,
* void *argv );
*
* Inputs
* argc : Argument Count
* argv : Argument Value
*
* Outputs
* None
*
* Return Codes
* None
*
* Description
* NIM Lock Scan Task
* This Function Can Use Only in NIM Driver.
*
*****************************************************************/
static void DRV_NIM_LockScanTask( UI32 argc, void *argv )
{
UI32 Message; /* Message Buffer */
UI32 ReceiveEventFlag; /* Event flag receive buffer */
BOOL ChangeSw;
for( ; ; ) { /* Eternal Loop */
while( MMAC_RTOS_EventRetrieve(
DRV_NIM_EventGroup, /* Event Group control block */
MMAC_RTOS_SUSPEND, /* SUSPEND */
NIM_LOCKSCAN_EVENT, /* Event Flag */
&ReceiveEventFlag, /* Receive Event Flag */
MMAC_RTOS_EVENT_OP_AND /* only bit event */
) != MMAC_RTOS_OK ) {
/* Receive from Callback Dispatch Queue */
} /* Loop while NG */
if( DRV_NIM_Initialized ){ /* Driver Initialized ? */
MMAC_RTOS_AcquireSemaphore( DRV_NIM_Semaphore, MMAC_RTOS_SUSPEND ); /* Take Semaphore for Callback Table NG ? */
ChangeSw=DRV_NIM_QPSK_StatusCheck();
MMAC_RTOS_ReleaseSemaphore( DRV_NIM_Semaphore );
if((FALSE==ChangeSw)&&(DRV_NIM_CallbackExistence==NIM_CALLBACK_TABLE_EXIST)){
Message = (UI32)DRV_NIM_CHANGE_NIM_STATUS; /* Dispatch Lock Status Scan Callback */
MMAC_RTOS_SendMessageQueue( DRV_NIM_CallbackQueue, MMAC_RTOS_MSG_QUEUE_BLOCKING, &Message, MMAC_FALSE );
}
}
}
}
/*****************************************************************
*
* Function Name
* DRV_NIM_LockScanTimeoutRoutine
*
* Prototype
* static void DRV_NIM_LockScanTimeoutRoutine(UI32 argc)
*
* Inputs
* argc : Argument Count
* argv : Argument Value
*
* Outputs
* None
*
* Return Codes
* None
*
* Description
* Lock Scan Timeout Routine <<< HISR >>>
*
*****************************************************************/
static void DRV_NIM_LockScanTimeoutRoutine(UI32 argc)
{
MMAC_RTOS_SetEvent(
DRV_NIM_EventGroup, /* Event Group control block */
NIM_LOCKSCAN_EVENT, /* Event Flag */
MMAC_RTOS_EVENT_OP_OR); /* OR */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -