📄 drv_nim.c
字号:
/****************************************************************
*
* FILENAME
* DRV_NIM.c
*
* PURPOSE
* EMMA2L Reference Model NIM Driver
*
* AUTHOR
* Kenji.Matsuura
*
* DATE/UPDATE
* 09/04/2002
* 29/08/2002
*
* HISTORY
*
*
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include "COM.h"
#include "DRV_Internal.h"
#include "mmac/rtos.h"
#include "DRV_NIM.h"
#include "DRV_NIM_QPSK_Internal.h"
#include "DRV_NIM_TUNER_Internal.h"
#include "DRV_GPIO.h"
/****************************************************************
* Define Values
****************************************************************/
#define NIM_TIMER_TICK (500) /* tick 200ms (200) */
#define NIM_LOCKSCAN_EVENT 0x00000002 /* lockscan event flag */
/****************************************************************
* Define Variable Types
****************************************************************/
typedef struct { /* Callback Table */
int Device; /* NIM Device Number */
DRV_NIM_CALLBACK_TYPE Type; /* Type of Callback Function */
void (*Function )(I32 Device); /* Callback Function */
BOOL DeleteFlag; /* Delete Flag */
}DRV_NIM_CALLBACK_TABLE_ELEM;
/*****************************************************************
Global Variables
*****************************************************************/
BOOL DRV_NIM_Initialized = FALSE; /* NIM Driver Initialized Flag */
UI8 DRV_NIM_CallbackExistence; /* Callback Table Registration presence */
UI8 DRV_NIM_FreqSweepControl; /* Frequency Sweep Stop Enable */
UI8 DRV_NIM_FreqSweepStatus; /* Frequency Sweep Status Run */
UI8 DRV_NIM_FreqAmendmentControl; /* Frequency Amendment Control */
UI8 DRV_NIM_FreqAmendmentStatus; /* Frequency Amendment Status Run */
MMAC_RTOS_SEMAPHORE DRV_NIM_CallbackTableSemaphore; /* Semaphore for Callback Table */
MMAC_RTOS_SEMAPHORE DRV_NIM_Semaphore; /* Semaphore for NIM Program */
MMAC_RTOS_TIMER_ID DRV_NIM_NimScanTimer; /* Assume timer control block */
MMAC_RTOS_MSG_QUEUE DRV_NIM_CallbackQueue; /* Callback Function Dispatch Queue Pointer */
MMAC_RTOS_EVENT DRV_NIM_EventGroup; /* LockScan Function Dispatch Queue Pointer */
/****************************************************************
* Static Valiables
****************************************************************/
static DRV_NIM_CALLBACK_TABLE_ELEM
DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS]; /* Callback Function Table */
static BOOL DRV_NIM_CallbackActive; /* Callback Function Active Flag */
static UI32 DRV_NIM_CallbackTaskStack
[DRV_NIM_CALLBACK_TASK_STACK_SIZE/sizeof(UI32)]; /* Callback Function Task Stack Area */
static UI32 DRV_NIM_LockScanTaskStack
[DRV_NIM_LOCKSCAN_TASK_STACK_SIZE/sizeof(UI32)]; /* LockScan Function Task Stack Area */
static BOOL DRV_NIM_CallbackTaskCreated = FALSE; /* Callback Function Task Created Flag */
static BOOL DRV_NIM_LockScanTaskCreated = FALSE; /* LockScan Function Task Created Flag */
/****************************************************************
* FORWARD DECLARATIONS
****************************************************************/
static void DRV_NIM_CallbackTask( UI32 argc, void *argv );
static void DRV_NIM_LockScanTask( UI32 argc, void *argv );
static void DRV_NIM_LockScanTimeoutRoutine(UI32 argc);
/*****************************************************************
*
* Function Name
* DRV_NIM_Initialize
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_Initialize( void );
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_OK
* DRV_NIM_ALREADY_INITIALIZED
* DRV_NIM_FAIL
*
* Description
* Initialize Function
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_Initialize( void )
{
UI8 PinNumber;
DRV_GPIO_CONFIG PinConfig;
UI32 i;
MMAC_RTOS_TIMER_CNTRL iopb;
MMAC_RTOS_TASK_ID tid;
if( DRV_NIM_Initialized ) { /* Already Initialized ?*/
return( DRV_NIM_ALREADY_INITIALIZED ); /* Already Initialized */
}
/*******************/
/* NIM(TUNER)RESET */
/*******************/
PinNumber = 52;
PinConfig.Direction =DRV_GPIO_DIRECTION_OUTPUT;
PinConfig.InterruptMode =DRV_GPIO_INT_DISABLED;
PinConfig.Callback =NULL;
if((DRV_GPIO_Configure(PinNumber,&PinConfig))!=DRV_GPIO_OK){
return( DRV_NIM_FAIL );
}
if((DRV_GPIO_SetBit(DRV_GPIO_PIN_SET,52))!=DRV_GPIO_OK){
return( DRV_NIM_FAIL );
}
for(i=0;i<0xFFFFFF;i++){}; /* Delay */
if((DRV_GPIO_SetBit(DRV_GPIO_PIN_CLR,52))!=DRV_GPIO_OK){
return( DRV_NIM_FAIL );
}
for(i=0;i<0xFFFFFF;i++){}; /* Delay */
if((DRV_GPIO_SetBit(DRV_GPIO_PIN_SET,52))!=DRV_GPIO_OK){
return( DRV_NIM_FAIL );
}
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
DRV_NIM_CallbackTable[i].Device = -1; /* Initialize Callback Table */
DRV_NIM_CallbackTable[i].Type = DRV_NIM_CALLBACK_TYPE_INIT;
DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
DRV_NIM_CallbackTable[i].Function = NULL;
}
/************************************************/
/* NIM Callback Task Create */
/************************************************/
DRV_NIM_CallbackActive = FALSE; /* Clear Callback Active Flag */
if( !DRV_NIM_CallbackTaskCreated ) { /* Callback Function Dispatch Task Not Created ? */
if( MMAC_RTOS_CreateSemaphore( /* Create Semaphore for Callback Table */
"NIM_CBD", 1, &DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
/* NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
if( MMAC_RTOS_CreateMessageQueue( "NIM_CBQ", /* Create Queue for Callback Function Dispatch */
DRV_NIM_CALLBACK_QUEUE_SIZE, 1,
&DRV_NIM_CallbackQueue ) != MMAC_RTOS_OK ) {
/* NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
if( MMAC_RTOS_TaskCreate( /* Create Callback Function Dispatch Task */
(MMAC_RTOS_TASK_ENTRY)(UI32)DRV_NIM_CallbackTask, (MMAC_RTOS_TASK_ARG)0,
DRV_NIM_CallbackTaskStack, DRV_NIM_CALLBACK_TASK_STACK_SIZE,
DRV_NIM_CALLBACK_TASK_PRIORITY, &tid, MMAC_FALSE ) != MMAC_RTOS_OK ) {
return( DRV_NIM_FAIL ); /* Fail */
}
if(MMAC_RTOS_TaskStart(tid) != MMAC_RTOS_OK)
return( DRV_NIM_FAIL ); /* Fail */
DRV_NIM_CallbackTaskCreated = TRUE; /* Set Callback Function Dispatch Task Created Flag */
}
else { /* Callback Function Dispatch Task Created ? */
if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
/* Free Semaphore for Callback Table */
return( DRV_NIM_FAIL ); /* Fail */
}
}
/************************************************/
/* NIM Lock Scan Task Create */
/************************************************/
if( !DRV_NIM_LockScanTaskCreated ) { /* NIM Lock Scan Event Task Not Created ? */
if( MMAC_RTOS_CreateSemaphore( /* Create Semaphore for Callback Table */
"NIM_SEM", 1, &DRV_NIM_Semaphore ) != MMAC_RTOS_OK ) {
/* NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
if( MMAC_RTOS_EventCreate(
&DRV_NIM_EventGroup /* Event group control block pointer */
) != MMAC_RTOS_OK ){
return( DRV_NIM_FAIL ); /* Fail */
}
if( MMAC_RTOS_TaskCreate( /* Create Callback Function Dispatch Task */
(MMAC_RTOS_TASK_ENTRY)(UI32)DRV_NIM_LockScanTask, (MMAC_RTOS_TASK_ARG)0,
DRV_NIM_LockScanTaskStack, DRV_NIM_LOCKSCAN_TASK_STACK_SIZE,
DRV_NIM_LOCKSCAN_TASK_PRIORITY, &tid, MMAC_FALSE ) != MMAC_RTOS_OK ) {
return( DRV_NIM_FAIL ); /* Fail */
}
if(MMAC_RTOS_TaskStart(tid) != MMAC_RTOS_OK)
return( DRV_NIM_FAIL ); /* Fail */
DRV_NIM_LockScanTaskCreated = TRUE; /* Set NIM Lock Scan Task Created Flag */
}else{
if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_Semaphore ) != MMAC_RTOS_OK ) {
/* Free Semaphore for Callback Table */
return( DRV_NIM_FAIL ); /* Fail */
}
}
/* Initialize value */
DRV_NIM_FreqSweepControl = QPSK_ENABLE; /* Frequency Sweep Stop Enable */
DRV_NIM_FreqSweepStatus = QPSK_SW_ON; /* Frequency Sweep Status Run */
DRV_NIM_FreqAmendmentControl= TUNER_ENABLE; /* Frequency Amendment Control */
DRV_NIM_FreqAmendmentStatus = TUNER_SW_ON; /* Frequency Amendment Status Run */
DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_NOTHING; /* callback table nothing */
/************************************************/
/* NIM(TUNER) INITIALIZE */
/************************************************/
if(DRV_NIM_OK != DRV_NIM_Reset()){
return( DRV_NIM_FAIL );
}
/************************************************/
/* NIM Lock Scan Timer Create */
/************************************************/
if( MMAC_RTOS_TimerCreate( /* Create Scan Key Status Timer */
"NIM_STM", DRV_NIM_LockScanTimeoutRoutine, 0,
NIM_TIMER_TICK/COM_TimerTickPeriod, MMAC_RTOS_TIMER_CONTINUOUS,
&DRV_NIM_NimScanTimer ) != MMAC_RTOS_OK ) {
/* NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
iopb.operation = MMAC_RTOS_TIMER_SET;
iopb.state = MMAC_RTOS_TIMER_ENABLE;
if( MMAC_RTOS_TimerCntrl( DRV_NIM_NimScanTimer
, &iopb ) != MMAC_RTOS_OK ) { /* Disable Scan Key Status Timer NG ? */
return( DRV_NIM_FAIL ); /* Fail */
}
DRV_NIM_Initialized = TRUE; /* Set Initialized Flag */
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DRV_NIM_Finalize
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_Finalize( void );
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_OK
* DRV_NIM_NOT_INITIALIZED
* DRV_NIM_FAIL
*
* Description
* Finalize Function
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_Finalize( void )
{
UI32 i;
if( !DRV_NIM_Initialized ) { /* Not Initialized ? */
return( DRV_NIM_NOT_INITIALIZED ); /* Not Initialized */
}
for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) { /* Loop Number of Callback Functions */
DRV_NIM_CallbackTable[i].Device = -1; /* Initialize Callback Table */
DRV_NIM_CallbackTable[i].Type = DRV_NIM_CALLBACK_TYPE_INIT;
DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
DRV_NIM_CallbackTable[i].Function = NULL;
}
DRV_NIM_Initialized = FALSE; /* Clear Initialized Flag */
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DRV_NIM_InstallCallback
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_InstallCallback(
* I32 Device,
* DRV_NIM_CALLBACK_TYPE CallbackType,
* void ( *Callback )(I32 Device ))
*
* Inputs
* Device : NIM Device Number
* CallbackType : Callback Type
* Callback : Pointer to callback function
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -