📄 cmd9118.c
字号:
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_READ_DWORD;
commandData->IoctlData.Data[0]=address;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
printf("Memory Address == 0x%08lX, Read Value == 0x%08lX\n",
commandData->IoctlData.Data[0],
commandData->IoctlData.Data[1]);
} else {
printf("Failed to Read Memory\n");
}
}
void WriteByte(PCOMMAND_DATA commandData,unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_WRITE_BYTE;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data&0xFFUL;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Memory\n");
}
}
void WriteWord(PCOMMAND_DATA commandData,unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_WRITE_WORD;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data&0xFFFFUL;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Memory\n");
}
}
void WriteDWord(PCOMMAND_DATA commandData,unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_WRITE_DWORD;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Memory\n");
}
}
void LanGetReg(PCOMMAND_DATA commandData,unsigned long address)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_LAN_GET_REG;
commandData->IoctlData.Data[0]=address;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
printf("Mem Map Offset == 0x%08lX, Read Value == 0x%08lX\n",
commandData->IoctlData.Data[0],
commandData->IoctlData.Data[1]);
} else {
printf("Failed to Read Register\n");
}
}
void LanSetReg(PCOMMAND_DATA commandData, unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_LAN_SET_REG;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Register\n");
}
}
void MacGetReg(PCOMMAND_DATA commandData, unsigned long address)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_MAC_GET_REG;
commandData->IoctlData.Data[0]=address;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
printf("Mac Index == 0x%08lX, Read Value == 0x%08lX\n",
commandData->IoctlData.Data[0],
commandData->IoctlData.Data[1]);
} else {
printf("Failed to read Mac Register\n");
}
}
void MacSetReg(
PCOMMAND_DATA commandData,
unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_MAC_SET_REG;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Mac Register\n");
}
}
void PhyGetReg(PCOMMAND_DATA commandData, unsigned long address)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_PHY_GET_REG;
commandData->IoctlData.Data[0]=address;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
printf("Phy Index == 0x%08lX, Read Value == 0x%08lX\n",
commandData->IoctlData.Data[0],
commandData->IoctlData.Data[1]);
} else {
printf("Failed to Read Phy Register\n");
}
}
void PhySetReg(
PCOMMAND_DATA commandData,
unsigned long address, unsigned long data)
{
if(commandData==NULL) return;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_PHY_SET_REG;
commandData->IoctlData.Data[0]=address;
commandData->IoctlData.Data[1]=data;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature!=SMSC9118_DRIVER_SIGNATURE) {
printf("Failed to Write Phy Register\n");
}
}
bool Initialize(PCOMMAND_DATA commandData,const char *ethName) {
if(commandData==NULL) return false;
if(ethName==NULL) return false;
commandData->hSockFD=socket(AF_INET,SOCK_DGRAM,0);
if((commandData->hSockFD) < 0) {
perror("\r\nFailed to create socket !! ->");
return false;
}
commandData->IfReq.ifr_data= (void *)&(commandData->IoctlData);
memset(&(commandData->IoctlData),0,sizeof(SMSC9118_IOCTL_DATA));
if(ethName[0]!=0) {
strncpy(commandData->IfReq.ifr_name,ethName,IFNAMSIZ);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_GET_SIGNATURE;
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
return true;
}
printf("Failed to find 9118 driver on %s\n",commandData->IfReq.ifr_name);
} else {
int ifNumber;
for(ifNumber=0;ifNumber<8;ifNumber++) {
sprintf(commandData->IfReq.ifr_name,"eth%d",ifNumber);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_GET_SIGNATURE;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
ioctl(commandData->hSockFD,SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
//printf("found 9118 on %s\n",commandData->IfReq.ifr_name);
return true;
}
}
printf("Failed to find 9118 driver on eth0 .. eth7\n");
}
printf("Either the driver has not been installed or there is\n");
printf("a possible version mismatch between smsc9118.o and cmd9118\n");
return false;
}
bool ReceiveULong(SOCKET sock,unsigned long * pDWord)
{
bool result=false;
unsigned long data=0;
unsigned char ch=0;
if(recv(sock,&ch,1,0)>0) {
data=(unsigned long)ch;
if(recv(sock,&ch,1,0)>0) {
data|=(((unsigned long)ch)<<8);
if(recv(sock,&ch,1,0)>0) {
data|=(((unsigned long)ch)<<16);
if(recv(sock,&ch,1,0)>0) {
data|=(((unsigned long)ch)<<24);
(*pDWord)=data;
result=true;
}
}
}
}
return result;
}
bool SendULong(SOCKET sock,unsigned long data)
{
bool result=false;
unsigned char ch=(unsigned char)(data&0x000000FFUL);
if(send(sock,&ch,1,0)==1) {
ch=(unsigned char)((data>>8)&0x000000FFUL);
if(send(sock,&ch,1,0)==1) {
ch=(unsigned char)((data>>16)&0x000000FFUL);
if(send(sock,&ch,1,0)==1) {
ch=(unsigned char)((data>>24)&0x000000FFUL);
if(send(sock,&ch,1,0)==1) {
result=true;
}
}
}
}
return result;
}
void process_requests(PCOMMAND_DATA commandData)
{
unsigned long requestCode=0;
while(ReceiveULong(server_sock,&requestCode)) {
switch(requestCode) {
case COMMAND_GET_FLOW_PARAMS:
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_GET_FLOW_PARAMS;
ioctl(commandData->hSockFD,
SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
SendULong(server_sock,1);//1==success
SendULong(server_sock,commandData->IoctlData.Data[0]);//RxFlowMeasuredMaxThroughput
SendULong(server_sock,commandData->IoctlData.Data[1]);//RxFlowMeasuredMaxPacketCount
SendULong(server_sock,commandData->IoctlData.Data[2]);//RxFlowParameters.MaxThroughput
SendULong(server_sock,commandData->IoctlData.Data[3]);//RxFlowParameters.MaxPacketCount
SendULong(server_sock,commandData->IoctlData.Data[4]);//RxFlowParameters.PacketCost
SendULong(server_sock,commandData->IoctlData.Data[5]);//RxFlowParameters.BurstPeriod
SendULong(server_sock,commandData->IoctlData.Data[6]);//RxFlowMaxWorkLoad
SendULong(server_sock,commandData->IoctlData.Data[7]);//INT_CFG.INT_DEAS
} else {
SendULong(server_sock,0);//0==failed
}
break;
case COMMAND_SET_FLOW_PARAMS:
{
unsigned long data=0;
commandData->IfReq.ifr_data=(void *)&(commandData->IoctlData);
commandData->IoctlData.dwSignature=SMSC9118_APP_SIGNATURE;
commandData->IoctlData.dwCommand=COMMAND_SET_FLOW_PARAMS;
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[0]=data;//RxFlowMeasuredMaxThroughput
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[1]=data;//RxFlowMeasuredMaxPacketCount
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[2]=data;//RxFlowParameters.MaxThroughput
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[3]=data;//RxFlowParameters.MaxPacketCount
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[4]=data;//RxFlowParameters.PacketCost
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[5]=data;//RxFlowParameters.BurstPeriod
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[6]=data;//RxFlowMaxWorkLoad
if(!ReceiveULong(server_sock,&data)) break;
commandData->IoctlData.Data[7]=data;//INT_CFG.INT_DEAS
ioctl(commandData->hSockFD,
SMSC9118_IOCTL,&(commandData->IfReq));
if(commandData->IoctlData.dwSignature==SMSC9118_DRIVER_SIGNATURE) {
SendULong(server_sock,1);//1==success
} else {
SendULong(server_sock,0);//0==failed
}
}
break;
default:
printf("WARNING, unknown requestCode=0x%08lX\n",requestCode);
break;
}
}
}
void RunServer(PCOMMAND_DATA commandData,unsigned short portNumber)
{
struct sockaddr *server;
struct sockaddr_in server4;
int sockaddr_len;
struct sockaddr peeraddr;
SOCKET server_control;
int on=1;
if(portNumber==0) {
portNumber=DEFAULT_PORT_NUMBER;
}
server4.sin_port=htons(portNumber);
server4.sin_addr.s_addr=INADDR_ANY;
server4.sin_family=AF_INET;
sockaddr_len=sizeof(struct sockaddr_in);
server=(struct sockaddr *)&server4;
printf("Starting server at port %d\n",portNumber);
server_control = socket(server->sa_family,SOCK_STREAM,0);
if(server_control==INVALID_SOCKET)
{
printf("Error creating the socket\n");
exit(1);
}
if(setsockopt(server_control,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -