/* * start.C */ #include #include #include #include #include #include EXPORT ID PorID; LOCAL ID TskID_Norm, TskID_Abort; /* 暫定 */ EXPORT VOID main_task(W par); EXPORT VOID interrupt_handler(); EXPORT W irq; /* ドライバ登録・削除 */ LOCAL ERR regist(Bool start) { ERR err; DevDef d; LOCAL CONST DevDef devdef = {{0}, 1, {L"xxyyzz"}, 0}; d = devdef; d.attr.chardev = 1; d.attr.nowait = 1; /* ドライバ削除 */ if(!start) { defIntHdr(-irq, interrupt_handler, 0); b_DefDevice(&d, NULL); return ER_OK; } /* 割り込みハンドラ登録 */ err = defIntHdr(irq, interrupt_handler, 0); if(err < 0) goto fin0; /* デバイス登録 */ d.portid = PorID; err = b_DefDevice(&d, NULL); if(err < 0) goto fin1; err = ER_OK; goto fin0; fin1: defIntHdr(-irq, interrupt_handler, 0); fin0: return err; } /* タスク起動・終了 */ LOCAL ERR task_start(Bool start) { WERR err = E_OK; VP exinf = (VP)CH4toW('_', 'x', 'y', 'z'); T_CTSK ctsk; T_CPOR cpor; if(!start) goto fin5; /* デバイス要求受け付け用ランデブポート作成 */ cpor.exinf = exinf; cpor.poratr = TA_NULL; cpor.maxcmsz = sizeof(DevReq); cpor.maxrmsz = sizeof(DevRsp); err = vcre_por(&cpor); if(err < 0) goto fin0; PorID = err; /* 特殊要求受け付けタスクの作成 */ ctsk.exinf = exinf; ctsk.task = main_task; ctsk.itskpri = 80; ctsk.stksz = 2048; ctsk.tskatr = TA_HLNG | TA_RNG0; err = vcre_tsk(&ctsk); if(err < 0) goto fin1; TskID_Abort = err; /* 通常要求受け付けタスクの作成 */ err = vcre_tsk(&ctsk); if(err < 0) goto fin2; TskID_Norm = err; /* 特殊要求受け付けタスクの起動 */ err = sta_tsk(TskID_Abort, D_ABORT_PTN); if(err < 0) goto fin3; /* 通常要求受け付けタスクの起動 */ err = sta_tsk(TskID_Norm, D_NORM_PTN); if(err < 0) goto fin4; err = E_OK; goto fin0; fin5: ter_tsk(TskID_Norm); fin4: ter_tsk(TskID_Abort); fin3: del_tsk(TskID_Norm); fin2: del_tsk(TskID_Abort); fin1: del_por(PorID); fin0: return err; } /* ドライバ起動 */ LOCAL ERR driver_start(TC *arg) { ERR err; /* カード検出・初期化 */ err = probe(); if(err < 0) goto fin0; /* タスク起動 */ err = task_start(True); if(err < 0) goto fin0; /* ドライバ登録 */ err = regist(True); if(err < 0) goto fin1; err = ER_OK; goto fin0; fin1: task_start(False); fin0: return err; } /* ドライバ終了 */ LOCAL ERR driver_end(TC *arg) { return ER_NOSPT; /* とりあえず、ドライバは終了しない */ } /* ドライバエントリ */ EXPORT ERR main(Bool start, TC *arg) { return start ? driver_start(arg) : driver_end(arg); }