OSDN Git Service

update jelly sample (MIPS)
[hos/hos-v4a.git] / aplfw / driver / serial / renesas / scidrv_read.c
index b83e4a3..f75d3aa 100755 (executable)
@@ -2,9 +2,9 @@
  *  Hyper Operating System  Application Framework
  *
  * @file  scidrv.c
- * @brief %jp{SCI用デバイスドライバ}
+ * @brief %jp{Renesas H8/SH用 SCIデバイスドライバ}
  *
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
 /** %jp{受信} */
 FILE_SIZE SciDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
 {
-       C_SCIDRV        *self;
-       C_CHRFILE               *pChrFile;
+       C_SCIDRV                *self;
+       C_SYNCFILE              *pFile;
        unsigned char   *pubBuf;
+       FILE_ERR                ErrCode;
        FILE_SIZE               i;
        int                             c;
        
        /* upper cast */
-       self     = (C_SCIDRV *)pDrvObj;
-       pChrFile = (C_CHRFILE *)pFileObj;
+       self  = (C_SCIDRV *)pDrvObj;
+       pFile = (C_SYNCFILE *)pFileObj;
 
        pubBuf = (unsigned char *)pBuf;
 
-       /* クリティカルセクションに入る */
-       SysMtx_Lock(self->hMtxRecv);
+       /* 読込み処理開始 */
+       if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_READ)) != FILE_ERR_OK )
+       {
+               return (FILE_SIZE)ErrCode;
+       }
 
+       /* 読込みシグナルを一旦クリア */
+       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
+       
        for ( i = 0; i < Size; i++ )
        {
+               /* 読み出し */
                while ( (c = StreamBuf_RecvChar(&self->StmBufRecv)) < 0 )
                {
-                       if ( pChrFile->cReadMode == FILE_RMODE_BLOCKING )
-                       {
-                               /* ブロッキングなら受信イベントを待つ */
-                               SysEvt_Wait(self->hEvtRecv);
-                               SysEvt_Clear(self->hEvtRecv);
-                       }
-                       else
+                       /* ブロッキングモードでなければ抜ける */
+                       if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_READ) != FILE_SYNCMODE_BLOCKING )
                        {
-                               /* ノンブロッキングなら終了 */
-                               goto loop_end;
+                               SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, i);
+                               return i;
                        }
+                       
+                       /* 受信を待つ */
+                       SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_READ);
+                       
+                       /* 読込みシグナルをクリアしてリトライ */
+                       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
                }
+               
+               /* 読み出せた文字を格納 */    
                *pubBuf++ = (unsigned char)c;
        }
-loop_end:
        
-       /* クリティカルセクションを出る */
-       SysMtx_Unlock(self->hMtxRecv);
+       /* 読み出し処理完了 */
+       SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, (VPARAM)i);
 
        return i;
 }