软件版本来源:K1_STK_v1.1
硬件平台:C6670 EVM
需要改动的地方:GE_Test.c
C6670 EVM板使用port1通过和phy连接。所以需要将port 1配成 GE_PORT_CABLE_CONNECT。需要根据自己的板子的硬件设计来确定具体配置。
若遇到进入此循环过不去
需要改的地方void KeyStone_Ethernet_Ports_Init(KeyStone_GE_Config * ge_cfg);函数中的
使用port1连接
如果link不上,主要查看PC端的配置和网线是否能用。出现link不上,很少是DSP的配置问题。DSP部分已经对phy部分配置。主要查看PC端的原因。还是不能link可以修改DSP的目的Mac试一下,将DSP的目的MAC改为PC端的MAC(很少是因为这个原因),有的时候之前能link,后来不能link,可以复位DSP试一下
以上GE的初始化应该完成。
以下为协议部分(使用UDP和PC完成通信,如果不需要太复杂的功能。DSP可以自己加包头实现。若要实现复杂功能请使用NDK组件来完成)
使用UDP协议来和PC端通信,DSP端需要加UDP协议的报头
UDP协议报头由以下几部分组成
UDP层 + IP层 + MAC层
一个完整的UDP包包含
MAC层 + IP层 + UDP层 + 净荷数据 + MAC层校验和;
最后一个校验和自动加,不需要自己来完成。需要加的部分是UDP协议报头部分
具体流程:添加UDP层 IP层
/*函数功能:添加IP层
函数第一个参数:存放UDP包数据的地址
函数第二个参数:源IP
函数第三个参数:目的IP
函数第三个参数:IP层的长度(IP层+UDP层的长度。净荷数据的长度+28)
*/
void Fill_IP_header(Uint8 * buffer,unsigned int sour_add,unsigned int dest_add, short length ){
// 32
buffer[14]= 0x45; //8
buffer[15]= 0x00;
buffer[16]= ((length)>>8)&0xFF; //IP包的长度以字节为单位 16位
buffer[17]= ((length)>>0)&0xFF; // 长度
buffer[18]= 0x00; //8 // 标识符 16位
buffer[19]= 0x01;
buffer[20]= 0x00; // 3+13
buffer[21]= 0x00;
buffer[22]= 0x10; //8
buffer[23]= 0x11;
buffer[24]= 0x00; // 头部校验 16位
buffer[25]= 0x00;
buffer[26]= ((sour_add)>>24)&0xFF; //8 // 源IP 32位
buffer[27]= ((sour_add)>>16)&0xFF;
buffer[28]= ((sour_add)>>8)&0xFF;
buffer[29]= ((sour_add)>>0)&0xFF;
buffer[30]= ((dest_add)>>24)&0xFF; //8 // 目的 32位
buffer[31]= ((dest_add)>>16)&0xFF;
buffer[32]= ((dest_add)>>8)&0xFF;
buffer[33]= ((dest_add)>>0)&0xFF;
}
/*函数功能:添加UDP层
函数第一个参数:存放UDP包数据的地址
函数第二个参数:源端口号
函数第三个参数:目的端口号
函数第三个参数:IP层的长度(UDP层的长度。净荷数据的长度+8)
*/
void Fill_UDP_header(Uint8 * buffer,unsigned short sour_port, unsigned short det_port,short length){
buffer[34]= ((sour_port)>>8)&0xFF; //8
buffer[35]= ((sour_port)>>0)&0xFF;
buffer[36]= ((det_port)>>8)&0xFF;
buffer[37]= ((det_port)>>0)&0xFF;
buffer[38]= ((length)>>8)&0xFF; //8
buffer[39]= ((length)>>0)&0xFF;
buffer[40]= 0x00; // 校验和
buffer[41]= 0x00;
}
/*计算校验和的代码,用法下文中有*/
Uint16 checksum(Uint16 *dp, Uint16 length)
{
__u32 sum = 0;
__u16 len = length >> 1;
while(len-- > 0)
sum += *dp++;
if(length & 1)
sum += (*dp & 0xFF00);
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
len = sum & 0xFFFF;
return(~len);
}
加MAC层的程序。源程序中有。不再重复
调用流程:(放到GE_2DSP_Test()函数中)
/*SendDataBuf 存放净荷数据的地址*/
Fill_UDP_header(ucpBuffer,DestPort,DestPort,lenth);
Fill_IP_header(ucpBuffer,Recv_IP,DestIP, len);
/*添加IP层的校验和*/
Uint16 check;
Uint16 Buffer1[10]={0};
int a;
int b=0;
for(a=14;a<34;a=a+2){
Buffer1[b]=(ucpBuffer[a] &0xff)<<8 | (ucpBuffer[a+1] &0xff);
b++;
}
check= checksum(Buffer1, 20);
ucpBuffer[24]=((check)>>8)&0xFF; // 头部校验 16位
ucpBuffer[25]= ((check)>>0)&0xFF;
/*fill MAC header*/
Fill_EMAC_header(ucpBuffer,0x0800,locallMAC,DestMAC);
memcpy(ucpBuffer+headerlen,SendDataBuf , uiPayloadNumBytes);
hostDescriptor->packet_length= uiPayloadNumBytes+ headerlen;
具体细节自己注意改
想要速度传输速度提升要去掉延迟
使用抓包工具,查看具体情况
若想要PC端给DSP发送数据
PC端自动绑定MAC和IP,在CMD中执行arp -s 10.0.0.100 00-18-30-87-31-a1命令
使用抓包工具可以得到DSP的MAC地址。DSP也可以写一个发送函数,将自己的MAC地址发送给PC端
未解决的问题:
DSP给PC端发送UDP包。会出现丢包现象。DSP端通过读取0x02090C34寄存器可以确定包全部发出。还没有解决丢包现象。目前规避方法加入重传机制(DSP个PC端发送的UDP带有控制信息)