中斷註冊函數整理

中斷註冊函數整理

ArchIpcInt_interruptRegister (obj->remoteProcId,

                         obj->params.localIntId,

                         _NotifyDriverShm_ISR,

                         (Ptr) obj);

Int32  ArchIpcInt_interruptRegister  (UInt16                 procId,

                               UInt32                 intId,

                               ArchIpcInt_CallbackFxn fxn,

                               Ptr                    fxnArgs)

{

ArchIpcInt_object.fxnTable->interruptRegister (procId, intId, fxn, fxnArgs);

..........................

}

Int32  Dm8168IpcInt_interruptRegister  (UInt16                     procId,

                                   UInt32                     intId,

                                   ArchIpcInt_CallbackFxn       fxn,

                                   Ptr                         fxnArgs)

{

OsalIsr_Params isrParams;

isrParams.sharedInt        = FALSE;

isrParams.checkAndClearFxn = &_Dm8168IpcInt_checkAndClearFunc;

isrParams.fxnArgs          = NULL;

isrParams.intId            = intId;

Dm8168IpcInt_state.isrHandle = OsalIsr_create (&_Dm8168IpcInt_isr, NULL, &isrParams);

OsalIsr_install (Dm8168IpcInt_state.isrHandle);

\

Dm8168IpcInt_state.isrObjects [procId].fxn       = fxn;

Dm8168IpcInt_state.isrObjects [procId].fxnArgs   = fxnArgs;

Dm8168IpcInt_state.isrObjects [procId].recvIntId = intId;

Dm8168IpcInt_interruptEnable (procId, intId);

............................................

}

OsalIsr_Handle  OsalIsr_create (OsalIsr_CallbackFxn fxn,

                           Ptr                 fxnArgs,

                           OsalIsr_Params *    params)

{

OsalIsr_Object *        isrObj =  NULL;

OsalThread_Params       threadParams;

isrObj = Memory_alloc (NULL, sizeof (OsalIsr_Object), 0, NULL);

threadParams.priority     = OsalThread_Priority_High;

threadParams.priorityType = OsalThread_PriorityType_Generic;

threadParams.once         = FALSE;

isrObj->bottomHalf = OsalThread_create ((OsalThread_CallbackFxn)fxn,

                                                    fxnArgs,

                                                    &threadParams);

isrObj->irq = params->intId;

isrObj->isSharedInt = params->sharedInt;

isrObj->checkFunc = params->checkAndClearFxn;

isrObj->checkFuncArg = params->fxnArgs;

isrObj->isrState = OsalIsr_State_Uninstalled;

.............................................

return (OsalIsr_Handle) isrObj;

}

OsalThread_Handle  OsalThread_create (OsalThread_CallbackFxn fxn,

                                  Ptr                    fxnArgs,

                                  OsalThread_Params *    params)

{

OsalThread_Object * obj    = NULL;

obj = (OsalThread_Object*) Memory_alloc (NULL,

                                    sizeof (OsalThread_Object),

                                    0,

                                    NULL);

obj->cbckFxn  = fxn;

obj->cbckData = fxnArgs;

init_completion (&obj->sem);

obj->task = kthread_create (Thread_callback,

                       (Ptr) obj,

                       "kernelThread_%d",

                        (tid - 1));

wake_up_process (obj->task);

........................................................

return (OsalThread_Handle) obj;

}

int Thread_callback (Void * arg)

{

OsalThread_Object * obj = (OsalThread_Object *) arg;

if (obj != NULL) 

{

    for (;!kthread_should_stop ();) 

    {

            wait_for_completion (&obj->sem);

while (atomic_read (&obj->count)) 

{

obj->cbckFxn (obj->cbckData) ;

atomic_dec (&obj->count) ;

. .............................................

}

}

............................

}

}

static Bool  _Dm8168IpcInt_isr (Ptr ref)

{

for (i = 0 ; i < Dm8168IpcInt_state.maxProcessors ; i++)

{

Dm8168IpcInt_state.isrObjects [i].fxn (Dm8168IpcInt_state.isrObjects [i].fxnArgs);

..................

}

...................

}

int OsalIsr_install (OsalIsr_Handle isrHandle)

{

OsalIsr_Object *    isrObj   = (OsalIsr_Object *) isrHandle;

request_irq (isrObj->irq,

          (Void*) &OsalIsr_callback,

          0,

          "SYSLINK",

          (Void *) isrObj);

..........................

}

irqreturn_t OsalIsr_callback (int irq, Ptr arg, struct pt_regs * regs)

{

OsalIsr_Object * isrObj     = (OsalIsr_Object *) arg;

isAsserted = (*isrObj->checkFunc) (isrObj->checkFuncArg);

OsalThread_activate (isrObj->bottomHalf);

}

Void  OsalThread_activate (OsalThread_Handle threadHandle)

{

OsalThread_Object * obj = (OsalThread_Object*) threadHandle;

atomic_inc (&obj->count);

complete (&obj->sem);

..............................

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章