OSDN Git Service

add microblaze sample
[hos/hos-v4a.git] / aplfw / driver / serial / xilinxuartdrv / xilinxuartdrv_write.c
diff --git a/aplfw/driver/serial/xilinxuartdrv/xilinxuartdrv_write.c b/aplfw/driver/serial/xilinxuartdrv/xilinxuartdrv_write.c
new file mode 100644 (file)
index 0000000..386f385
--- /dev/null
@@ -0,0 +1,73 @@
+/** 
+ * Hyper Operating System  Application Framework
+ *
+ * @file  xilinxuartdrv_write.c
+ * @brief %jp{XILINX UART driver 書込み}%en{XILINX UART driver  write}
+ *
+ * Copyright (C) 2008 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "xilinxuartdrv_local.h"
+
+
+/** %jp{送信} */
+FILE_SIZE XilinxUartDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+       C_XILINXUARTDRV         *self;
+       C_SYNCFILE                      *pFile;
+       const unsigned char     *pubData;
+       FILE_ERR                        ErrCode;
+       FILE_SIZE                       i;
+       int                                     c;
+       
+       /* upper cast */
+       self  = (C_XILINXUARTDRV *)pDrvObj;
+       pFile = (C_SYNCFILE *)pFileObj;
+       
+       pubData = (const unsigned char *)pData;
+       
+       /* 書込み処理開始 */
+       if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_WRITE)) != FILE_ERR_OK )
+       {
+               return (FILE_SIZE)ErrCode;
+       }
+
+       /* 書込みシグナルを一旦クリア */
+       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+       
+       for ( i = 0; i < Size; i++ )
+       {
+               /* 送信文字取り出し */
+               c = *pubData++;
+               
+               /* 送信可能かチェック */
+               while ( !(XILINXUARTDRV_REG_READ(self, XILINXUARTDRV_REG_STAT) & 0x08) )
+               {
+                       /* ブロッキングモードでなければ抜ける */
+                       if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_WRITE) != FILE_SYNCMODE_BLOCKING )
+                       {
+                               SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, i);
+                               return i;
+                       }
+                       
+                       /* 書込みシグナルを待つ */
+                       SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_WRITE);
+                       
+                       /* 書込みシグナルをクリアしてリトライ */
+                       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+               }
+               
+               /* 送信処理 */
+               XILINXUARTDRV_REG_WRITE(self, XILINXUARTDRV_REG_TX, c);
+       }
+       
+       /* 書込み処理完了 */
+       SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, (VPARAM)i);
+       
+       return i;
+}
+
+
+/* end of file */