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

📄 cmd9118.c

📁 基于pxa270的linux下smsc9118的网卡驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -