DSP篇--C6678功能调试系列之网络调试

news2024/11/15 23:49:33

目录

网络调试

1、GE工程的研究与功能扩充


网络调试

        网口测试,使用的是TI官方提供的GE网络测试例程。

         主要注意的事项是:时钟的设置、相关设备的MAC地址和IP的设置、中断的设置。确定板子的port和phy。

GbE Switch Subsystem Initialization Procedure

Step 1. Configure the CPSW_CONTROL register

Step 2. Configure the MAC1_SA and MAC2_SA (MAC3_SA and MAC4_SA if KeyStone II) source

address hi and lo registers

Step 3. Enable the desired statistics ports by programming the CPSW_STAT_PORT_EN register

Step 4. Configure the ALE

Step 5. Configure MAC modules

Step 6. Configure the MDIO and external PHY (if used)

Step 7. Configure the SGMII modules

        其中遇到最大的问题,可能是使用官方例程,直接运行,会while死循环,或者phy link up和link down等问题。这些主要是需要根据自己的板卡对应设置好时钟与MDIO、PHY的内容。

1、GE工程的研究与功能扩充

        1、GE工程的收发包,需要通过wireshark抓包软件、TCP&UDP测试工具等软件来查看。在使用中也必须开启,不然发送的数据包均无法收取从而会造成线上拥堵而出现程序运行不对。

        2、GE工程的发包,具有限制,最大一包发送1472字节。且有最小和最大限制46~9216,最短头信息长度至数据包巨帧长度。

for(j= 0; j< GE_NUM_ETHERNET_PORT; j++)
{
	if(FALSE==Port_OK(j))
		continue;
	transferParam= &test_2DSP_cfg[j];
	uiPayloadNumBytes= transferParam->payloadNumBytes;
	if((uiPayloadNumBytes<46)||(uiPayloadNumBytes>9216))//数据量的一级限制
	{
		printf("invalid packet payload size %d for port %d\n", uiPayloadNumBytes, j+1);
		continue;
	}
	if(uiPayloadNumBytes>DDR_PACKET_BUFFER_SIZE0)//数据量的二级限制,1536-64?=1472
		uiFDQ= DDR_HOST_SIZE1_FDQ;
	else
		uiFDQ= DDR_HOST_SIZE0_FDQ;//这个值应该对应下方queuepop,硬件方面预计是只初始化了size0;故此对包的数据量有限制
	for(i=0; i<transferParam->numPackets; i++)
	{
		hostDescriptor= (HostPacketDescriptor *)KeyStone_queuePop(uiFDQ);
		if(NULL==hostDescriptor)
		{
			printf("Source queue %d is NULL\n", uiFDQ);
			GE_Check_Free_Queues(); 	//for debug
			break;
		}
		/*invalid cache before read descriptor RAM*/
		InvalidCache((void *)hostDescriptor, 64);//64个描述符
		/*Directed packet to port. Setting these bits to a non-zero value 
		indicates that the packet is a directed packet. Packets with the 
		these bits set will bypass the ALE and send the packet directly 
		to the port indicated.*/
		hostDescriptor->ps_flags= j+1;
		/*initialize the source buffer*/
		ucpBuffer= (Uint8 *)hostDescriptor->buffer_ptr;
		/*fill MAC header*/
		Fill_EMAC_header(ucpBuffer, ETHERNET_IPV4_PACKET, Source_MAC_address[j],Dest_MAC_address[j]);

#if 1
	Fill_UDP_header(ucpBuffer,SourPort,DestPort,UDP_HEADER_LEN+uiPayloadNumBytes);
	Fill_IP_header(ucpBuffer,Recv_IP,Dest_IP, IP_HEADER_LEN+UDP_HEADER_LEN+uiPayloadNumBytes);
		/*添加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++;
		  }
		Uint16 check= checksum(Buffer1, 20);
		 ucpBuffer[24]=((check)>>8)&0xFF;  // 头部校验  16位
		 ucpBuffer[25]= ((check)>>0)&0xFF;
#endif
		/*fill data pattern*/
		memset(ucpBuffer+EMAC_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN, transferParam->dataPattern, uiPayloadNumBytes);

		hostDescriptor->packet_length= uiPayloadNumBytes+ EMAC_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN;

		/*write back data from cache to descriptor RAM*/
		WritebackCache((void *)hostDescriptor, 64);
		WritebackCache((void *)ucpBuffer, uiPayloadNumBytes+EMAC_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN);

		//save descriptors to temp buffer
		TxDescriptorTempBuffer[uiTotalNumPackets]= (Uint32)hostDescriptor;
		uiTotalBytes += uiPayloadNumBytes+EMAC_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN;//uiPayloadNumBytes
		uiTotalNumPackets++;
	}
}

        3、除了通过MAC层收发数据外,可以通过添加相关的IP层信息头、UDP层信息头,来发送UDP数据包。

        4、udp包发送原理,需要有ARP应答与回应;

//arp应答
Uint8* arp_reply(Uint8 * re_packet)
{
	Uint8 *buffer; int i;
	//unsigned short SourPort=8080,DestPort=8000;//端口不必一致
	//unsigned int Recv_IP=0xC0A801FB,Dest_IP=0xC0A801DF;//DSP ip为 192.168.1.251,PC ip为192.168.1.223
	buffer = re_packet;
	buffer[0]= (Dest_MAC_address[0]>>40)&0xff;
	buffer[1]= (Dest_MAC_address[0]>>32)&0xff;
	buffer[2]= (Dest_MAC_address[0]>>24)&0xff;
	buffer[3]= (Dest_MAC_address[0]>>16)&0xff;
	buffer[4]= (Dest_MAC_address[0]>>8)&0xff;
	buffer[5]= (Dest_MAC_address[0])&0xff;

	buffer[6]= (Source_MAC_address[0]>>40)&0xff;
	buffer[7]= (Source_MAC_address[0]>>32)&0xff;
	buffer[8]= (Source_MAC_address[0]>>24)&0xff;
	buffer[9]= (Source_MAC_address[0]>>16)&0xff;
	buffer[10]= (Source_MAC_address[0]>>8)&0xff;
	buffer[11]= (Source_MAC_address[0])&0xff;


	buffer[21] = 0x02;//ARP应答操作码

	buffer[22]= (Source_MAC_address[0]>>40)&0xff;
	buffer[23]= (Source_MAC_address[0]>>32)&0xff;
	buffer[24]= (Source_MAC_address[0]>>24)&0xff;
	buffer[25]= (Source_MAC_address[0]>>16)&0xff;
	buffer[26]= (Source_MAC_address[0]>>8)&0xff;
	buffer[27]= (Source_MAC_address[0])&0xff;

    buffer[28]= ((Recv_IP)>>24)&0xFF;
    buffer[29]= ((Recv_IP)>>16)&0xFF;
    buffer[30]= ((Recv_IP)>>8)&0xFF;
    buffer[31]= ((Recv_IP)>>0)&0xFF;

	buffer[32]= (Dest_MAC_address[0]>>40)&0xff;
	buffer[33]= (Dest_MAC_address[0]>>32)&0xff;
	buffer[34]= (Dest_MAC_address[0]>>24)&0xff;
	buffer[35]= (Dest_MAC_address[0]>>16)&0xff;
	buffer[36]= (Dest_MAC_address[0]>>8)&0xff;
	buffer[37]= (Dest_MAC_address[0])&0xff;

    buffer[38]= ((Dest_IP)>>24)&0xFF;
    buffer[39]= ((Dest_IP)>>16)&0xFF;
    buffer[40]= ((Dest_IP)>>8)&0xFF;
    buffer[41]= ((Dest_IP)>>0)&0xFF;
    for(i=42;i<60;i++)//补18个0x00
    {
    	 buffer[i]= 0x00;
    }
    return buffer;
}

//arp应答发送
void arp_transfer(Uint8 * buffer)
{
	    int i, j;
		Uint32 uiFDQ;
		Uint32  uiTotalNumPackets;
		Uint8 * ucpBuffer;
		HostPacketDescriptor * hostDescriptor;
		uiTotalNumPackets= 0;
		uiFDQ=2058;
		for(i=0; i<1; i++)
		{
			hostDescriptor= (HostPacketDescriptor *)KeyStone_queuePop(uiFDQ);
			if(NULL==hostDescriptor)
			{
				printf("Source queue %d is NULL\n", uiFDQ);
				GE_Check_Free_Queues(); 	//for debug
				break;
			}
			/*invalid cache before read descriptor RAM*/
			InvalidCache((void *)hostDescriptor, 64);
			hostDescriptor->ps_flags= 1;
			/*initialize the source buffer*/
			ucpBuffer= (Uint8 *)hostDescriptor->buffer_ptr;
			/*fill data pattern*/
			for(j = 0;j< 60;j++)
			{
				ucpBuffer[j] = buffer[j];
			}
			hostDescriptor->packet_length= 60;
			/*write back data from cache to descriptor RAM*/
			WritebackCache((void *)hostDescriptor, 64);
			WritebackCache((void *)ucpBuffer,60);
			//save descriptors to temp buffer
			TxDescriptorBuffer[uiTotalNumPackets]= (Uint32)hostDescriptor;
			uiTotalNumPackets++;
		}
		for(i=0; i< uiTotalNumPackets; i++)
		{
			/*push the packet descriptor to Packet DMA TX queue*/
			KeyStone_queuePush(GE_DIRECT_TX_QUEUE,
					TxDescriptorBuffer[i]|FETCH_SIZE_64);
		}
}

        5、为此,在中断中收取数据包中,将分别存在判读数据包正确性,以及数据存取的问题。从而加有CRC校验、IP、MAC判断等手段,来确定数据包的正确。

Bool CRC(Uint8 *buffer)
{
	 Uint16 check;
	 Uint16 Buffer1[10]={0};
	 Uint8 c1,c2;
	 int a;
	 int b=0;
	 for(a=14;a<34;a=a+2)
	 {
	     Buffer1[b]=(buffer[a] &0xff)<<8 | (buffer[a+1] &0xff);
	     b++;
	  }
	 check= checksum(Buffer1, 20);

	 c1=((check)>>8)&0xFF;  // 头部校验  16位
	 c2 = ((check)>>0)&0xFF;
	 if(c1 == buffer[24] && c2 == buffer[25])
	 {
		 return TRUE;
	 }
	 else
	 {
		 return FALSE;
	 }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django计算机相关专业考研资料管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

bash调试方法总结

在看nginx源码实现时发现有些代码是根据不同的本地环境动态生成的&#xff0c;看了一下大致生成流程&#xff0c;基本上都是通过shell脚本调用shell脚本实现的。看到了shell脚本&#xff0c;就想到如何调试shell脚本&#xff0c;shell脚本在实际工作中运用的挺多的&#xff0c;…

几何向量:向量到平面投影和LookAt

在研究所保密开发完后回来隔离两波&#xff0c;已经接近四五个月没碰外网电脑了&#xff0c;可以说是活成了原始人。 因为某些开发细节原因&#xff0c;需要实现向量投影和LookAt功能&#xff0c;记录一下。 首先实现向量到平面投影&#xff0c;如下&#xff1a; …

第二证券|鲍威尔发声:释放重磅信号,美股大涨!中概股狂涨

大家早上好&#xff01;昨夜今晨又有许多大事产生&#xff1a;美联储主席鲍威尔证明&#xff0c;12月开端或许放缓加息&#xff1b;微软涨逾1100亿美元&#xff0c;美股进入技能型牛市&#xff1b;小鹏轿车昨日暴升近50%&#xff0c;中概股11月涨逾40%&#xff1b;法、德不满美…

java计算机毕业设计ssm企业日常事务管理系统sl5xl(附源码、数据库)

java计算机毕业设计ssm企业日常事务管理系统sl5xl&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

全栈性能测试教程之性能测试相关知识(二) Jmeter的应用

性能测试相关知识&#xff08;二&#xff09; Jmeter的应 1、性能测试的方法 1.1验收负载测试&#xff1a; 在QA的环境模拟生产运行的业务压力和使用场景组合&#xff0c;测试系统的性能是否满足生产环境的性能诉求。 1.2负载测试 在被测系统上持续不断的增加压力&#xff…

易点易动RFID固定资产管理系统助力企业年终固定资产大盘点

固定资产作为资产构成的重要组成部分&#xff0c;也是企业完成生产经营的物质保障&#xff0c;对企业的发展起着重要的作用。越来越多的企业者开始重视企业内部的固定资产管理&#xff0c;从而会定期对固定资产进行盘点&#xff0c;以保证固定资产账实一致、账账相符。每逢年底…

粒子群算法和鲸鱼算法的比较(Matlab代码实现)

目录 1 粒子群优化算法 2 鲸鱼优化算法 3 粒子群算法和鲸鱼算法比较 4 Matlab代码实现 1 粒子群优化算法 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究…

GitHub限时开源36小时的阿里Java架构师学习手册,上线即标星35k+

前言 今年受大环境影响面试于往年相比难得多&#xff0c;对程序员要求越来越高&#xff01;环境我们无法改变能改变的就是自己&#xff0c;努力提升技术&#xff01; 我在GitHub无意见看见115k的Java教程&#xff0c;感觉还不错&#xff0c;给大家看看&#xff01;文档总共分为…

Cloud Mail JavaScript管理邮件

Cloud Mail JavaScript管理邮件 使用流行的云服务发送、接收和管理邮件。 云邮件使用流行的云服务简化了邮件的发送、接收和管理&#xff0c;包括Amazon SES、Microsoft 365(Outlook Mail)和Gmail。还支持包括OAuth、TLS 1.3和TLS 1.2在内的现代身份验证和安全选项。 云邮件功…

前后端验证码交互完整流程

本文章基于vueelement-uispringbootredis讲解&#xff0c;其他的都是工具&#xff0c;可以直接拿来用&#xff0c;不懂redis没关系&#xff08;因为本文只用了简单的存取&#xff09;&#xff0c;但前面三个要懂 如果你只想看前端或者后端的代码逻辑&#xff0c;本文章同样适用…

提升代码可读性,减少if-else的几个小技巧

前言&#x1f481;‍♂️ 相信大家或多或少都接触过拥有庞大 if else 的项目代码吧&#xff0c;多重嵌套的 if else 在维护的时候真的让人很恼火&#x1f621;&#xff0c;有时候一个 bug 排查下来&#xff0c;严重感觉身体被掏空&#x1f63f;。 本文并未有消灭或歧视 if el…

2022年测试行业的新变化

清晨的第一缕阳光&#xff0c;打开手机&#xff0c;熟悉的数字映入眼帘&#xff0c;洗漱完毕&#xff0c;戴好口罩&#xff0c;新的一天开始了 看似平静的表面&#xff0c;却到处暗潮汹涌 偶然间在朋友圈看到一则招聘广告&#xff0c;Base上海&#xff0c;两年以上经验&#…

python接口自动化测试框架

本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动&#xff0c;采用Excel管理测试用例等集成测试数据功能&#xff0c;以及使用HTMLTestRunner来生成测试报告&#xff0c;目前有开源的poman、Jmeter等接口测试工…

文件的上传和下载

一、node实现文件上传 1、FormData对象&#xff1a;以对象的方式来表示页面中的表单&#xff0c;又称为表单对象。以key-value的方式来保存数据&#xff0c;XMLHttpRequest对 象可以轻松的表单对象发送的服务器端 ​ &#xff08;1&#xff09;是一个构造函数&#xff1a;ne…

力扣hot100——第4天:19删除链表的倒数第N个节点、20有效的括号、21合并两个有序链表

文章目录1.19删除链表的倒数第N个节点【代码随想录已刷】2.20有效的括号【代码随想录已刷】3.21合并两个有序链表3.1.题目3.2.题解1.19删除链表的倒数第N个节点【代码随想录已刷】 参考&#xff1a;力扣题目链接&#xff1b;自己的博客解答 2.20有效的括号【代码随想录已刷】…

whistle监听方法

视频教程 程序员抓包神器&#xff0c;快速定位线上bug_哔哩哔哩_bilibili whistle官网 关于whistle GitBook 安装whistle后&#xff0c; 复制启动网址 系统代理也设置完毕后&#xff0c;在浏览器打开http://192.168.4.238:8899,即可进行抓包 拦截js&#xff0c;并执行自定…

10年的老测试告诉你八大测试用例设计方法

一&#xff1a;等价类划分法 1:有效等价类: 2:无效等价类: 案例:比如一个登陆输入框,规定只能输入中文,同时长度为6-10。 通过等价类设计测试用例: 测试用例中重要的三步: 输入 操作 预计结果 如果与预期结果不符合就是bug。 有效等价类: 输入:输入长度为6的中文,输入的为…

微信小程序接口请求多文件+参数上传、单文件+参数上传(formData形式) 微信小程序实现formData格式传参(亲测有效)

01.引入所需formData js文件 1.文件链接 链接: https://pan.baidu.com/s/1BDxx0-1KMAnkceXb45L5rg 提取码: 6ibp 2.引入使用 const FormData require(../../../../utils/formData.js)formData.js与mimeMap.js请确保在同一层级 02.formData参数 1.参数设置 let data {a…

Vue3 Composition API(案例)

前言&#xff1a;如果你是从vue2转到vue3的一份子&#xff0c;那么你重点学一下核心内容Composition API 。vue3的更新使代码写起来更加清晰&#xff0c;而且更接近于原生开发&#xff0c;对TS支持友好,现在我们来学习一下API。 如果你也想学一下TS那么请看这里 带你学习语法T…