00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "includes.h"
00026
00027 #define EthernetIdleState 0
00028
00029
00030 ETHERNET_CONTROL EthernetCtrl;
00031
00032 void F_EthernetInit(void);
00033 void F_EthernetSvc(void);
00034 INT8U F_EthernetInUseCheck(void);
00035 INT8U F_EthernetAllocate(INT16U UserId);
00036 INT8U F_EthernetRelease(INT16U UserId);
00037 INT8U F_EthernetMacAddressSet(INT16U UserId,INT8U *pMacAddress);
00038 INT8U F_EthernetIpAddressSet(INT16U UserId,INT8U *pIpAddress);
00039 INT8U F_EthernetSend(ETHBUFFER *pBuffer,INT8U *pDestination,INT16U Protocol);
00040 INT8U F_EthernetReceive(ETHBUFFER *pBuffer);
00041 INT8U F_EthernetPacketHandler(void);
00042 INT8U F_EthernetBiosUpdate(INT8U *pBios,INT32U size);
00043 INT8U F_EthernetSystemTableUpdate(INT8U *pSystemTable,INT32U Size);
00044 INT8U F_EthernetPartitionTableUpdate(INT8U *pSystemTable,INT32U Size);
00045 INT8U F_EthernetPartitionUpdate(INT8U *pSystemTable,INT32U Size);
00046 INT8U F_EthernetFirmwareUpdate(INT8U *pSystemTable,INT32U Size);
00047 INT16U F_EthernetUnsignedShortN2H(unsigned short s);
00048 INT16U F_EthernetUnsignedShortH2N(unsigned short s);
00049 INT32U F_EthernetUnsignedLongN2H(unsigned long l);
00050 INT32U F_EthernetUnsignedLongH2N(unsigned long l);
00051
00052 void F_EthernetInit(void){
00053 EthernetCtrl.MacAddress[0]=0x00;
00054 EthernetCtrl.MacAddress[1]=0x00;
00055 EthernetCtrl.MacAddress[2]=0x00;
00056 EthernetCtrl.MacAddress[3]=0x00;
00057 EthernetCtrl.MacAddress[4]=0x00;
00058 EthernetCtrl.MacAddress[5]=0x00;
00059 EthernetCtrl.IpAddress[0]=0x00;
00060 EthernetCtrl.IpAddress[1]=0x00;
00061 EthernetCtrl.IpAddress[2]=0x00;
00062 EthernetCtrl.IpAddress[3]=0x00;
00063
00064 EthernetCtrl.InUse=FALSE;
00065 EthernetCtrl.Status=0;
00066 EthernetCtrl.State=EthernetIdleState;
00067 }
00068 void F_EthernetSvc(void){}
00069 INT8U F_EthernetInUseCheck(void){
00070 if(EthernetCtrl.InUse==TRUE) return TRUE;
00071 else return FALSE;
00072 }
00073 INT8U F_EthernetAllocate(INT16U UserId){
00074 if(EthernetCtrl.InUse==FALSE){
00075 EthernetCtrl.InUse=TRUE;
00076 EthernetCtrl.UserId=UserId;
00077 return TRUE;
00078 }
00079 else return FALSE;
00080 }
00081 INT8U F_EthernetRelease(INT16U UserId){
00082 if(EthernetCtrl.InUse==TRUE){
00083 EthernetCtrl.InUse=FALSE;
00084 return TRUE;
00085 }
00086 else return FALSE;
00087 }
00088 INT8U F_EthernetMacAddressSet(INT16U UserId,INT8U *pMacAddress){
00089 if((EthernetCtrl.InUse==TRUE)&&(EthernetCtrl.UserId==UserId)){
00090 EthernetCtrl.MacAddress[0]=pMacAddress[0];
00091 EthernetCtrl.MacAddress[1]=pMacAddress[1];
00092 EthernetCtrl.MacAddress[2]=pMacAddress[2];
00093 EthernetCtrl.MacAddress[3]=pMacAddress[3];
00094 EthernetCtrl.MacAddress[4]=pMacAddress[4];
00095 EthernetCtrl.MacAddress[5]=pMacAddress[5];
00096 return TRUE;
00097 }
00098 else return FALSE;
00099 }
00100 INT8U F_EthernetIpAddressSet(INT16U UserId,INT8U *pIpAddress){
00101 if((EthernetCtrl.InUse==TRUE)&&(EthernetCtrl.UserId==UserId)){
00102 EthernetCtrl.IpAddress[0]=pIpAddress[0];
00103 EthernetCtrl.IpAddress[1]=pIpAddress[1];
00104 EthernetCtrl.IpAddress[2]=pIpAddress[2];
00105 EthernetCtrl.IpAddress[3]=pIpAddress[3];
00106 return TRUE;
00107 }
00108 else return FALSE;
00109 }
00110 INT8U F_EthernetSend(ETHBUFFER *pBuffer,INT8U *pDestination,INT16U Protocol){
00111 ETHERNET_HEAD *pEthernetHead;
00112
00113 pEthernetHead=(ETHERNET_HEAD *)F_EthernetBufferPush(pBuffer,ETHERNET_HEAD_LENGTH);
00114 memcpy((INT8U *)pEthernetHead->Destination,pDestination,ETHERNET_MAC_LENGTH);
00115 memcpy((INT8U *)pEthernetHead->Source,(INT8U *)EthernetCtrl.MacAddress,ETHERNET_MAC_LENGTH);
00116 pEthernetHead->Protocol=F_EthernetUnsignedShortH2N(Protocol);
00117 #if(DEBUG_ETHERNET==1)
00118 printf("\n tx packet [%4x] ",pBuffer->Length);
00119
00120 #endif
00121 return F_Cs8900PacketTransmit(pBuffer->Data,pBuffer->Length);
00122 }
00123 INT8U F_EthernetReceive(ETHBUFFER *pBuffer){
00124 INT32U Size;
00125
00126 if(F_Cs8900PacketReceiveCheck()==TRUE){
00127 Size=F_Cs8900PacketReceive(pBuffer->pData,1532);
00128 pBuffer->Length=Size;
00129 #if(DEBUG_ETHERNET==1)
00130 printf("\n rx packet [%4x] ",Size);
00131
00132 #endif
00133 return TRUE;
00134 }
00135 else return FALSE;
00136 }
00137 INT8U F_EthernetPacketHandler(void){
00138 ETHBUFFER *pBuffer;
00139 ETHERNET_HEAD *pEthernetHead;
00140
00141 pBuffer=F_EthernetBufferAllocate();
00142 if(F_EthernetReceive(pBuffer)==TRUE){
00143
00144 pEthernetHead=(ETHERNET_HEAD *)pBuffer->pData;
00145 #if(DEBUG_ETHERNET==1)
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 #endif
00161 if(Cs8900Ctrl.RxEvent&RX_EVENT_IND_ADDR){
00162 if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)>0x05dc){
00163 #if(DEBUG_ETHERNET==1)
00164 printf("\n ethernet II ");
00165 #endif
00166 F_EthernetBufferPull(pBuffer,ETHERNET_HEAD_LENGTH);
00167 if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_ARP){
00168 #if(DEBUG_ETHERNET==1)
00169 printf(" ARP");
00170 #endif
00171 F_EthernetArpPacketReceive(pBuffer);
00172 }
00173 else if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_IP){
00174 #if(DEBUG_ETHERNET==1)
00175 printf(" IP ");
00176 #endif
00177 F_EthernetIpPacketReceive(pBuffer);
00178 }
00179 }
00180 else{
00181 #if(DEBUG_ETHERNET==1)
00182 printf("\n IEEE 802.3 no support now");
00183 #endif
00184 }
00185 }
00186 else if(Cs8900Ctrl.RxEvent&RX_EVENT_BROADCAST){
00187 #if(DEBUG_ETHERNET==1)
00188 printf("\n BROADCAST");
00189 #endif
00190 F_EthernetBufferPull(pBuffer,ETHERNET_HEAD_LENGTH);
00191 if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_ARP){
00192 #if(DEBUG_ETHERNET==1)
00193 printf(" ARP");
00194 #endif
00195 F_EthernetArpPacketReceive2(pBuffer);
00196 }
00197 else if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_IP){
00198 #if(DEBUG_ETHERNET==1)
00199 printf(" IP ");
00200 #endif
00201
00202
00203 }
00204 }
00205 }
00206
00207 return TRUE;
00208 }
00209 INT8U F_EthernetBiosUpdate(INT8U *pBios,INT32U size){
00210 return TRUE;
00211 }
00212 INT8U F_EthernetSystemTableUpdate(INT8U *pSystemTable,INT32U Size){
00213 return TRUE;
00214 }
00215 INT8U F_EthernetPartitionTableUpdate(INT8U *pSystemTable,INT32U Size){
00216 return TRUE;
00217 }
00218 INT8U F_EthernetPartitionUpdate(INT8U *pSystemTable,INT32U Size){
00219 return TRUE;
00220 }
00221 INT8U F_EthernetFirmwareUpdate(INT8U *pSystemTable,INT32U Size){
00222 return TRUE;
00223 }
00224 INT16U F_EthernetUnsignedShortN2H(unsigned short s){
00225 return ((s>>8)|(s<<8));
00226 }
00227 INT16U F_EthernetUnsignedShortH2N(unsigned short s){
00228 return ((s>>8)|(s<<8));
00229 }
00230 INT32U F_EthernetUnsignedLongN2H(unsigned long l){
00231 return (((l>>24)&0x000000ff)|
00232 ((l>> 8)&0x0000ff00)|
00233 ((l<< 8)&0x00ff0000)|
00234 ((l<<24)&0xff000000));
00235 }
00236 INT32U F_EthernetUnsignedLongH2N(unsigned long l){
00237 return (((l>>24)&0x000000ff)|
00238 ((l>> 8)&0x0000ff00)|
00239 ((l<< 8)&0x00ff0000)|
00240 ((l<<24)&0xff000000));
00241 }
00242
00243