OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / driver / ether / lan9000 / lan9000hal_send.c
1 /**
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  lan9000hal.h
5  * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include "system/sysapi/sysapi.h"
13 #include "lan9000hal_local.h"
14
15
16 /** %jp{パケット送信} */
17 int Lan9000Hal_Send(C_LAN9000HAL *self, const void *pData, int iSize)
18 {
19         unsigned short uhData;
20         unsigned char  *pubData;
21         int            i;
22         
23         pubData = (unsigned char *)pData;
24         
25         
26         /* バッファ割り当て未完了ならリターン */
27         if ( !(LAN9000HAL_REG_READ(self, LAN9000HAL_B2_INTERRUPT) & LAN9000HAL_ISTATUS_ALLOCINT) )
28         {
29                 return 0;
30         }
31                 
32         /* Write allocated packet number, setup the write pointer */
33         uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_PNR) & 0x3f;
34         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_PNR, uhData << 8);
35         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_POINTER, 0x4000);
36         
37         /* Write the packet buffer Status word/Byte count (Status + Byte count + pktsize + Control) */
38         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, 0x0000);
39         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, ((iSize+6) & ~1));
40
41         /* Write the packet buffer Address/Size/Data */
42         for ( i= 0; i < iSize / 2; i++ )
43         {
44                 uhData  = *pubData++;
45                 uhData |= (*pubData++) << 8;
46                 LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, uhData);
47         }
48         if ( iSize % 2 == 1 )
49         {
50                 uhData  = *pubData;
51                 uhData |= 0x3000;
52         }
53         else
54         {
55                 uhData = 0x1000;
56         }
57         
58         /* Write Control word (Even data, No CRC) */
59         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, uhData);
60         
61         /* Queue the packet */
62         LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
63         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x00c0);
64
65         /* 送信バッファ割り当て要求 */
66         LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
67         LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x0020);
68         
69         return iSize;
70 }
71
72
73 /* end of file */
74