OSDN Git Service

031f7249f34321897ccdd2c2ffa365221e411bf7
[hos/hos-v4a.git] / aplfw / driver / serial / renesas / scidrv_write.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  scidrv.c
5  * @brief %jp{SCI用デバイスドライバ}
6  *
7  * Copyright (C) 2006 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_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
17 {
18         C_SCIDRV                *self;
19         C_CHRFILE                       *pChrFile;
20         const unsigned char     *pubBuf;
21         FILE_SIZE                       i;
22         int                                     c;
23         
24         /* upper cast */
25         self     = (C_SCIDRV *)pDrvObj;
26         pChrFile = (C_CHRFILE *)pFileObj;
27
28         pubBuf = (const unsigned char *)pData;
29
30         /* クリティカルセクションに入る */
31         SysMtx_Lock(self->hMtxSend);
32
33         for ( i = 0; i < Size; i++ )
34         {
35                 c = *pubBuf++;
36                 while ( SciHal_SendChar(&self->SciHal, c) < 0 )
37                 {
38                         if ( pChrFile->cWriteMode == FILE_WMODE_BLOCKING )
39                         {
40                                 /* ブロッキングなら送信割り込みを待つ */
41                                 SciHal_EnableInterrupt(&self->SciHal, SCIHAL_INT_TIE | SCIHAL_INT_RIE);
42                                 SysEvt_Wait(self->hEvtSend);
43                                 SysEvt_Clear(self->hEvtSend);
44                         }
45                         else
46                         {
47                                 /* ノンブロッキングなら終了 */
48                                 goto loop_end;
49                         }
50                 }
51         }
52 loop_end:
53
54         /* クリティカルセクションを出る */
55         SysMtx_Unlock(self->hMtxSend);
56
57         return i;
58 }
59
60
61
62 /* end of file */