| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | #include "at32f403a_407.h"#include "usb_eth.h"#include <stdbool.h>#include "dhserver.h"#include "dnserver.h"#include <stdlib.h>#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include "usbd_rndis_core.h"//#include "usbd_usr.h"//#include "usbd_desc.h"//#include "usb_conf.h"#include "netif/etharp.h"#include "lwip/init.h"#include "lwip/netif.h"#include "lwip/pbuf.h"#include "lwip/icmp.h"#include "lwip/udp.h"#include "lwip/opt.h"#include "lwip/arch.h"#include "lwip/api.h"#include "lwip/inet.h"#include "lwip/dns.h"#include "tcpip.h"//#include "time.h"//#include "usb_core.h"#include "usbd_core.h"#include "usb.h"#include "common.h"//#include "board.h"#include "FreeRTOS.h"#include "task.h"#include "semphr.h"static uint8_t hwaddr[6]  = {0x20,0x89,0x84,0x6A,0x96,00};static uint8_t ipaddr[4]  = {192, 168, 7, 1};static uint8_t netmask[4] = {255, 255, 255, 0};static uint8_t gateway[4] = {0, 0, 0, 0};#define USE_LINK_LED	0#define NUM_DHCP_ENTRY 3static dhcp_entry_t entries[NUM_DHCP_ENTRY] ={	// mac    ip address        subnet mask        lease time	{ {0}, {192, 168, 7, 2}, {255, 255, 255, 0}, 24 * 60 * 60 },	{ {0}, {192, 168, 7, 3}, {255, 255, 255, 0}, 24 * 60 * 60 },	{ {0}, {192, 168, 7, 4}, {255, 255, 255, 0}, 24 * 60 * 60 }};static dhcp_config_t dhcp_config ={	{192, 168, 7, 1}, 67, // server address, port	{192, 168, 7, 1},     // dns server	"prs",                // dns suffix	NUM_DHCP_ENTRY,       // num entry	entries               // entries};struct netif netif_data;static uint8_t received[ETH_MTU + 14];static int recvSize = 0;SemaphoreHandle_t xSemUsbEth;void on_packet(const char *data, int size){	BaseType_t xHigherPriorityTaskWoken = pdFALSE;;	memcpy(received, data, size);	recvSize = size;	xSemaphoreGiveFromISR( xSemUsbEth, &xHigherPriorityTaskWoken );	if( xHigherPriorityTaskWoken != pdFALSE )	{		//vPortYield();        taskYIELD();	}}void usb_polling(){	xSemaphoreTake( xSemUsbEth, portMAX_DELAY);	if (recvSize == 0) 		return;	struct pbuf *frame;	frame = pbuf_alloc(PBUF_RAW, recvSize, PBUF_POOL);	if (frame == NULL) 		return;	memcpy(frame->payload, received, recvSize);	frame->len = recvSize;	recvSize = 0;	tcpip_input(frame, &netif_data);	pbuf_free(frame);}static int outputs = 0;err_t output_fn(struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr){	return etharp_output(netif, p, ipaddr);}err_t linkoutput_fn(struct netif *netif, struct pbuf *p){	int i;	struct pbuf *q;	static char data[ETH_MTU + 14 + 4];	int size = 0;		for (i = 0; i < 200; i++)	{		if (rndis_can_send()) break;		vTaskDelay(1);	}  	for(q = p; q != NULL; q = q->next)	{		if (size + q->len > ETH_MTU + 14)			return ERR_ARG;		memcpy(data + size, (char *)q->payload, q->len);		size += q->len;	}	if (!rndis_can_send())		return ERR_USE;	rndis_send(data, size);	outputs++;	return ERR_OK;}err_t netif_init_cb(struct netif *netif){	LWIP_ASSERT("netif != NULL", (netif != NULL));	netif->mtu = ETH_MTU;	netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP;	netif->state = NULL;	netif->name[0] = 'E';	netif->name[1] = 'X';//	netif->dhcp = NULL;	netif->linkoutput = linkoutput_fn;	//netif->output = output_fn;    netif->output = (netif_output_fn)output_fn;    //err_t output_fn(struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr)    //typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr);	return ERR_OK;}#define PADDR(ptr) ((ip_addr_t *)ptr)void init_lwip(){	struct netif  *netif = &netif_data;	netif->hwaddr_len = 6;	memcpy(netif->hwaddr, hwaddr, 6);	netif = netif_add(netif, PADDR(ipaddr), PADDR(netmask), PADDR(gateway), NULL, netif_init_cb, tcpip_input);	netif_set_link_up(netif);	netif_set_up(netif);}void usb_hw_init(void){	usb_init();	rndis_rxproc = on_packet;	xSemUsbEth = xSemaphoreCreateBinary();}bool dns_query_proc(const char *name, ip_addr_t *addr){	if (strcmp(name, "energomera.prs") == 0 || strcmp(name, "www.energomera.prs") == 0)	{		addr->addr = *(uint32_t *)ipaddr;		return true;	}	return false;}void usb_eth_task(void *arg){    while (1)    {        usb_polling();     // usb device polling    }}void usb_eth_init(void){	usb_hw_init();	//while (rndis_state != rndis_initialized) ; 	init_lwip();	while (!netif_is_up(&netif_data)) ;	while (dhserv_init(&dhcp_config) != ERR_OK) ;	while (dnserv_init(PADDR(ipaddr), 53, dns_query_proc) != ERR_OK) ;	//xTaskCreate(usb_eth_task, ( char * ) "usb_eth_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);    xTaskCreate(usb_eth_task, ( char * ) "usb_eth_task", 3*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);}#ifdef USE_USB_OTG_FSvoid OTG_FS_WKUP_IRQHandler(void){  if(USB_OTG_dev.cfg.low_power)  {    *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;    USB_OTG_UngateClock(&USB_OTG_dev);  }  EXTI_ClearITPendingBit(EXTI_Line18);}#endif
 |