OSDN Git Service

update jelly sample (MIPS)
[hos/hos-v4a.git] / aplfw / driver / serial / renesas / scidrv_read.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  scidrv.c
5  * @brief %jp{Renesas H8/SH用 SCIデバイスドライバ}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include "scidrv_local.h"
13
14
15 /** %jp{受信} */
16 FILE_SIZE SciDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
17 {
18         C_SCIDRV                *self;
19         C_SYNCFILE              *pFile;
20         unsigned char   *pubBuf;
21         FILE_ERR                ErrCode;
22         FILE_SIZE               i;
23         int                             c;
24         
25         /* upper cast */
26         self  = (C_SCIDRV *)pDrvObj;
27         pFile = (C_SYNCFILE *)pFileObj;
28
29         pubBuf = (unsigned char *)pBuf;
30
31         /* 読込み処理開始 */
32         if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_READ)) != FILE_ERR_OK )
33         {
34                 return (FILE_SIZE)ErrCode;
35         }
36
37         /* 読込みシグナルを一旦クリア */
38         SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
39         
40         for ( i = 0; i < Size; i++ )
41         {
42                 /* 読み出し */
43                 while ( (c = StreamBuf_RecvChar(&self->StmBufRecv)) < 0 )
44                 {
45                         /* ブロッキングモードでなければ抜ける */
46                         if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_READ) != FILE_SYNCMODE_BLOCKING )
47                         {
48                                 SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, i);
49                                 return i;
50                         }
51                         
52                         /* 受信を待つ */
53                         SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_READ);
54                         
55                         /* 読込みシグナルをクリアしてリトライ */
56                         SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
57                 }
58                 
59                 /* 読み出せた文字を格納 */    
60                 *pubBuf++ = (unsigned char)c;
61         }
62         
63         /* 読み出し処理完了 */
64         SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, (VPARAM)i);
65
66         return i;
67 }
68
69
70 /* end of file */