#include "system.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "includes.h"
#include "simple_socket_server.h"
#include "alt_error_handler.h"
#include "alt_lwip_dev.h"
#include "lwip/sys.h"
#include "lwip/netif.h"
#include "lwip/sockets.h"
#include "sys/alt_dma.h"
#include <io.h>
#define IOWR_ALTERA_AVALON_RECV_INDI_DATA(base,data) IOWR(base, 0, data)//#include "altera_avalon_recv_indi_regs.h"
//config
#define LOCAL_PORT 8088
const char *LOCAL_IP_ADDR = "192.168.123.88";
int ss;
struct sockaddr_in remote_addr;
int nLen = sizeof(remote_addr);
void UdpServerTask()
{
ss = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ss < 0)
{
printf("Failed socket()\n");
OSTaskDel(OS_PRIO_SELF);
}
struct sockaddr_in ssin;
ssin.sin_family = AF_INET;
ssin.sin_port = htons(LOCAL_PORT);
ssin.sin_addr.s_addr = inet_addr(LOCAL_IP_ADDR);//INADDR_ANY;
if (bind(ss, (struct sockaddr *)&ssin, sizeof(ssin)) < 0)
{
printf("Failed bind()\n");
OSTaskDel(OS_PRIO_SELF);
}
printf("--------------- Server -----------------\n");
char rx_buf[256];
while (1)
{
int nRecv = recvfrom(ss, rx_buf, 255, 0, (struct sockaddr *)&remote_addr, &nLen);
if (nRecv > 0)
{ /*
rx_buf[nRecv] = '\0';
printf("接收到数据:%s \n", rx_buf);
sendto(ss, rx_buf, nRecv, 0, (struct sockaddr *)&remote_addr, nLen);
*/
int index;
for (index=0; index<nRecv; index++)
{
char cmd = toupper(rx_buf[index]);
if (cmd == 'S')
{
IOWR_ALTERA_AVALON_RECV_INDI_DATA(RECV_INDI_BASE, 3);
break;
}
}
}
}
return ;
}
#define MAX_INDEX 192
#define BUF_LEN 512
typedef struct ST_RXB
{
alt_u16 buf[MAX_INDEX][BUF_LEN];
alt_u8 rd_index, wr_index;
alt_u16 len[MAX_INDEX];
} RXB;
RXB rxb;
OS_EVENT *recv_sem;
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;
void* tx_buf;;
void* rx_buf;
static void dma_done(void* handle, void* data)
{
alt_u16 frame_end;
IOWR_ALTERA_AVALON_RECV_INDI_DATA(RECV_INDI_BASE, 2);
rxb.len[rxb.wr_index] = (rxb.buf[rxb.wr_index][0] & 0x7fff)<<1;
frame_end = rxb.buf[rxb.wr_index][0] & 0x8000;
rxb.wr_index = (++rxb.wr_index) % MAX_INDEX;
rx_buf = (void*)rxb.buf[rxb.wr_index];
//OSSemPost(recv_sem);
if (frame_end)
{
OSSemPost(recv_sem);
}
}
void isr_recv(void *context, alt_u32 id)
{
alt_irq_context irq_context = alt_irq_disable_all();
IOWR_ALTERA_AVALON_RECV_INDI_DATA(RECV_INDI_BASE, 0);
alt_dma_txchan_send(txchan, tx_buf, 1024, NULL, NULL);
alt_dma_rxchan_prepare(rxchan, rx_buf, 1024, dma_done, NULL);
alt_irq_enable_all(irq_context);
}
void recv_init()
{
IOWR_ALTERA_AVALON_RECV_INDI_DATA(RECV_INDI_BASE, 0);//disable receive
rxb.rd_index = 0;
rxb.wr_index = 0;
recv_sem = OSSemCreate(0);
if (recv_sem == NULL)
{
printf("The TCB is not enough!\n");
}
alt_irq_register(DMA_SRC_IRQ, NULL, isr_recv);
tx_buf = (void*)DMA_SRC_BASE;
rx_buf = (void*)rxb.buf[rxb.wr_index];
if ((txchan = alt_dma_txchan_open("/dev/dma")) == NULL)
{
printf ("Failed to open transmit channel\n");
}
if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL)
{
printf ("Failed to open receive channel\n");
}
}
//alt_u8 zero[6] = {0};
void UdpPackTask()
{
INT8U err;
while (1)
{
OSSemPend(recv_sem, 0, &err);
while (rxb.rd_index != rxb.wr_index)
{
if (rxb.len[rxb.rd_index]==0)
{
printf("Zero!!!\n");
//sendto(ss, zero, 6, 0, (struct sockaddr *)&remote_addr, nLen);
}
sendto(ss, (alt_u8 *)rxb.buf[rxb.rd_index], rxb.len[rxb.rd_index], 0, (struct sockaddr *)&remote_addr, nLen);
rxb.rd_index = (++rxb.rd_index) % MAX_INDEX;
}
//printf("\nOSEventCnt=%d, rd_index=%d, wr_index=%d\n", recv_sem->OSEventCnt, rxb.rd_index, rxb.wr_index);
}
}
udp_pack.zip_NIOS II DMA_NIOS 以太网_nios ii 以太网_nios udp_ram dma
版权申诉
125 浏览量
2022-09-22
19:09:36
上传
评论 1
收藏 2KB ZIP 举报
![avatar](https://profile-avatar.csdnimg.cn/dabc422b995e4f93b0df429caef6266e_weixin_42656416.jpg!1)
四散
- 粉丝: 54
- 资源: 1万+
最新资源
- ProPresenter 是一款专业级别的演示和制作软件,专为教会、现场活动、演唱会、体育赛事和广播等领域设计
- Privazer 是一款强大的隐私保护和系统清理工具
- iToon 是一款创新的图像编辑软件,专注于将照片转化为卡通和动漫风格的图像
- haproxy-3.1 for windows 64位 不支持ssl
- haproxy-3.1 for windows 64位 支持ssl
- Gillmeister Rename Expert 是一款功能强大且灵活的文件重命名工具
- Node.js - Mastering Node.js
- EssentialPIM Pro Business 是一款专业的个人信息管理 (PIM) 工具
- 《云计算技术》复习大纲.zip
- DbVisualizer Pro 是一款功能强大、用户友好的数据库管理工具,适用于各种数据库开发人员和数据库管理员
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)