OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / driver / serial / at91 / at91usartdrv_write.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  at91usartdrv_write.c
5  * @brief %jp{ATMEL AT91シリーズUSART用デバイスドライバ}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include "at91usartdrv_local.h"
13
14
15 /** %jp{送信} */
16 FILE_SIZE At91UsartDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
17 {
18         C_AT91USARTDRV          *self;
19         C_CHRFILE                       *pChrFile;
20         const unsigned char     *pubBuf;
21         FILE_SIZE                       i;
22         int                                     c;
23         
24         /* upper cast */
25         self     = (C_AT91USARTDRV *)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 ( !(AT91USART_REG_READ(self, AT91USART_US_CSR) & 0x0002) )
37                 {
38                         if ( pChrFile->cWriteMode == FILE_WMODE_BLOCKING )
39                         {
40                                 /* ブロッキングなら送信割り込みを待つ */
41                                 AT91USART_REG_WRITE(self, AT91USART_US_IER, 0x00000002);        /* 送信割り込み許可 */          
42                                 SysEvt_Wait(self->hEvtSend);
43                                 SysEvt_Clear(self->hEvtSend);
44                         }
45                         else
46                         {
47                                 /* ノンブロッキングなら終了 */
48                                 goto loop_end;
49                         }
50                 }
51                 AT91USART_REG_WRITE(self, AT91USART_US_THR, c);
52         }
53 loop_end:
54
55         /* クリティカルセクションを出る */
56         SysMtx_Unlock(self->hMtxSend);
57
58         return i;
59 }
60
61
62 /* end of file */