⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd9118.c

📁 SMSC NET controller 9218 driver software
💻 C
📖 第 1 页 / 共 5 页
字号:
	}


}


void ReadWord(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_READ_WORD;


	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%04lX\n",


			commandData->IoctlData.Data[0],


			commandData->IoctlData.Data[1]&0xFFFFUL);


	} else {


		printf("Failed to Read Memory\n");


	}





}


void ReadDWord(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_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);


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -