fdsf

Dependents:   sisk_proj_stat MQTT Hello_FXOS8700Q WireFSHandControl ... more

Committer:
grzemich
Date:
Wed Dec 07 23:47:50 2016 +0000
Revision:
0:d7bd7384a37c
dgd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
grzemich 0:d7bd7384a37c 1 #include "lwip/opt.h"
grzemich 0:d7bd7384a37c 2 #include "lwip/tcpip.h"
grzemich 0:d7bd7384a37c 3 #include "netif/etharp.h"
grzemich 0:d7bd7384a37c 4 #include "mbed_interface.h"
grzemich 0:d7bd7384a37c 5 #include "ethernet_api.h"
grzemich 0:d7bd7384a37c 6 #include "ethernetext_api.h"
grzemich 0:d7bd7384a37c 7
grzemich 0:d7bd7384a37c 8 #define RECV_TASK_PRI (osPriorityNormal)
grzemich 0:d7bd7384a37c 9 #define PHY_TASK_PRI (osPriorityNormal)
grzemich 0:d7bd7384a37c 10 #define PHY_TASK_WAIT (200)
grzemich 0:d7bd7384a37c 11
grzemich 0:d7bd7384a37c 12 /* memory */
grzemich 0:d7bd7384a37c 13 static sys_sem_t recv_ready_sem; /* receive ready semaphore */
grzemich 0:d7bd7384a37c 14
grzemich 0:d7bd7384a37c 15 /* function */
grzemich 0:d7bd7384a37c 16 static void rza1_recv_task(void *arg);
grzemich 0:d7bd7384a37c 17 static void rza1_phy_task(void *arg);
grzemich 0:d7bd7384a37c 18 static err_t rza1_etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
grzemich 0:d7bd7384a37c 19 static err_t rza1_low_level_output(struct netif *netif, struct pbuf *p);
grzemich 0:d7bd7384a37c 20 static void rza1_recv_callback(void);
grzemich 0:d7bd7384a37c 21
grzemich 0:d7bd7384a37c 22 static void rza1_recv_task(void *arg) {
grzemich 0:d7bd7384a37c 23 struct netif *netif = (struct netif*)arg;
grzemich 0:d7bd7384a37c 24 struct eth_hdr *ethhdr;
grzemich 0:d7bd7384a37c 25 u16_t recv_size;
grzemich 0:d7bd7384a37c 26 struct pbuf *p;
grzemich 0:d7bd7384a37c 27 int cnt;
grzemich 0:d7bd7384a37c 28
grzemich 0:d7bd7384a37c 29 while (1) {
grzemich 0:d7bd7384a37c 30 sys_arch_sem_wait(&recv_ready_sem, 0);
grzemich 0:d7bd7384a37c 31 for (cnt = 0; cnt < 16; cnt++) {
grzemich 0:d7bd7384a37c 32 recv_size = ethernet_receive();
grzemich 0:d7bd7384a37c 33 if (recv_size != 0) {
grzemich 0:d7bd7384a37c 34 p = pbuf_alloc(PBUF_RAW, recv_size, PBUF_RAM);
grzemich 0:d7bd7384a37c 35 if (p != NULL) {
grzemich 0:d7bd7384a37c 36 (void)ethernet_read((char *)p->payload, p->len);
grzemich 0:d7bd7384a37c 37 ethhdr = p->payload;
grzemich 0:d7bd7384a37c 38 switch (htons(ethhdr->type)) {
grzemich 0:d7bd7384a37c 39 case ETHTYPE_IP:
grzemich 0:d7bd7384a37c 40 case ETHTYPE_ARP:
grzemich 0:d7bd7384a37c 41 #if PPPOE_SUPPORT
grzemich 0:d7bd7384a37c 42 case ETHTYPE_PPPOEDISC:
grzemich 0:d7bd7384a37c 43 case ETHTYPE_PPPOE:
grzemich 0:d7bd7384a37c 44 #endif /* PPPOE_SUPPORT */
grzemich 0:d7bd7384a37c 45 /* full packet send to tcpip_thread to process */
grzemich 0:d7bd7384a37c 46 if (netif->input(p, netif) != ERR_OK) {
grzemich 0:d7bd7384a37c 47 /* Free buffer */
grzemich 0:d7bd7384a37c 48 pbuf_free(p);
grzemich 0:d7bd7384a37c 49 }
grzemich 0:d7bd7384a37c 50 break;
grzemich 0:d7bd7384a37c 51 default:
grzemich 0:d7bd7384a37c 52 /* Return buffer */
grzemich 0:d7bd7384a37c 53 pbuf_free(p);
grzemich 0:d7bd7384a37c 54 break;
grzemich 0:d7bd7384a37c 55 }
grzemich 0:d7bd7384a37c 56 }
grzemich 0:d7bd7384a37c 57 } else {
grzemich 0:d7bd7384a37c 58 break;
grzemich 0:d7bd7384a37c 59 }
grzemich 0:d7bd7384a37c 60 }
grzemich 0:d7bd7384a37c 61 }
grzemich 0:d7bd7384a37c 62 }
grzemich 0:d7bd7384a37c 63
grzemich 0:d7bd7384a37c 64 static void rza1_phy_task(void *arg) {
grzemich 0:d7bd7384a37c 65 struct netif *netif = (struct netif*)arg;
grzemich 0:d7bd7384a37c 66 s32_t connect_sts = 0; /* 0: disconnect, 1:connect */
grzemich 0:d7bd7384a37c 67 s32_t link_sts;
grzemich 0:d7bd7384a37c 68 s32_t link_mode_new = NEGO_FAIL;
grzemich 0:d7bd7384a37c 69 s32_t link_mode_old = NEGO_FAIL;
grzemich 0:d7bd7384a37c 70
grzemich 0:d7bd7384a37c 71 while (1) {
grzemich 0:d7bd7384a37c 72 link_sts = ethernet_link();
grzemich 0:d7bd7384a37c 73 if (link_sts == 1) {
grzemich 0:d7bd7384a37c 74 link_mode_new = ethernetext_chk_link_mode();
grzemich 0:d7bd7384a37c 75 if (link_mode_new != link_mode_old) {
grzemich 0:d7bd7384a37c 76 if (connect_sts == 1) {
grzemich 0:d7bd7384a37c 77 tcpip_callback_with_block((tcpip_callback_fn)netif_set_link_down, (void*) netif, 1);
grzemich 0:d7bd7384a37c 78 }
grzemich 0:d7bd7384a37c 79 if (link_mode_new != NEGO_FAIL) {
grzemich 0:d7bd7384a37c 80 ethernetext_set_link_mode(link_mode_new);
grzemich 0:d7bd7384a37c 81 tcpip_callback_with_block((tcpip_callback_fn)netif_set_link_up, (void*) netif, 1);
grzemich 0:d7bd7384a37c 82 connect_sts = 1;
grzemich 0:d7bd7384a37c 83 }
grzemich 0:d7bd7384a37c 84 }
grzemich 0:d7bd7384a37c 85 } else {
grzemich 0:d7bd7384a37c 86 if (connect_sts != 0) {
grzemich 0:d7bd7384a37c 87 tcpip_callback_with_block((tcpip_callback_fn)netif_set_link_down, (void*) netif, 1);
grzemich 0:d7bd7384a37c 88 link_mode_new = NEGO_FAIL;
grzemich 0:d7bd7384a37c 89 connect_sts = 0;
grzemich 0:d7bd7384a37c 90 }
grzemich 0:d7bd7384a37c 91 }
grzemich 0:d7bd7384a37c 92 link_mode_old = link_mode_new;
grzemich 0:d7bd7384a37c 93 osDelay(PHY_TASK_WAIT);
grzemich 0:d7bd7384a37c 94 }
grzemich 0:d7bd7384a37c 95 }
grzemich 0:d7bd7384a37c 96
grzemich 0:d7bd7384a37c 97 static err_t rza1_etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr) {
grzemich 0:d7bd7384a37c 98 /* Only send packet is link is up */
grzemich 0:d7bd7384a37c 99 if (netif->flags & NETIF_FLAG_LINK_UP) {
grzemich 0:d7bd7384a37c 100 return etharp_output(netif, q, ipaddr);
grzemich 0:d7bd7384a37c 101 }
grzemich 0:d7bd7384a37c 102
grzemich 0:d7bd7384a37c 103 return ERR_CONN;
grzemich 0:d7bd7384a37c 104 }
grzemich 0:d7bd7384a37c 105
grzemich 0:d7bd7384a37c 106 static err_t rza1_low_level_output(struct netif *netif, struct pbuf *p) {
grzemich 0:d7bd7384a37c 107 struct pbuf *q;
grzemich 0:d7bd7384a37c 108 s32_t cnt;
grzemich 0:d7bd7384a37c 109 err_t err = ERR_MEM;
grzemich 0:d7bd7384a37c 110 s32_t write_size = 0;
grzemich 0:d7bd7384a37c 111
grzemich 0:d7bd7384a37c 112 if ((p->payload != NULL) && (p->len != 0)) {
grzemich 0:d7bd7384a37c 113 /* If the first data can't be written, transmit descriptor is full. */
grzemich 0:d7bd7384a37c 114 for (cnt = 0; cnt < 100; cnt++) {
grzemich 0:d7bd7384a37c 115 write_size = ethernet_write((char *)p->payload, p->len);
grzemich 0:d7bd7384a37c 116 if (write_size != 0) {
grzemich 0:d7bd7384a37c 117 break;
grzemich 0:d7bd7384a37c 118 }
grzemich 0:d7bd7384a37c 119 osDelay(1);
grzemich 0:d7bd7384a37c 120 }
grzemich 0:d7bd7384a37c 121 if (write_size != 0) {
grzemich 0:d7bd7384a37c 122 for (q = p->next; q != NULL; q = q->next) {
grzemich 0:d7bd7384a37c 123 (void)ethernet_write((char *)q->payload, q->len);
grzemich 0:d7bd7384a37c 124 }
grzemich 0:d7bd7384a37c 125 if (ethernet_send() == 1) {
grzemich 0:d7bd7384a37c 126 err = ERR_OK;
grzemich 0:d7bd7384a37c 127 }
grzemich 0:d7bd7384a37c 128 }
grzemich 0:d7bd7384a37c 129 }
grzemich 0:d7bd7384a37c 130
grzemich 0:d7bd7384a37c 131 return err;
grzemich 0:d7bd7384a37c 132 }
grzemich 0:d7bd7384a37c 133
grzemich 0:d7bd7384a37c 134 static void rza1_recv_callback(void) {
grzemich 0:d7bd7384a37c 135 sys_sem_signal(&recv_ready_sem);
grzemich 0:d7bd7384a37c 136 }
grzemich 0:d7bd7384a37c 137
grzemich 0:d7bd7384a37c 138 err_t eth_arch_enetif_init(struct netif *netif)
grzemich 0:d7bd7384a37c 139 {
grzemich 0:d7bd7384a37c 140 ethernet_cfg_t ethcfg;
grzemich 0:d7bd7384a37c 141
grzemich 0:d7bd7384a37c 142 /* set MAC hardware address */
grzemich 0:d7bd7384a37c 143 #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE)
grzemich 0:d7bd7384a37c 144 netif->hwaddr[0] = MBED_MAC_ADDR_0;
grzemich 0:d7bd7384a37c 145 netif->hwaddr[1] = MBED_MAC_ADDR_1;
grzemich 0:d7bd7384a37c 146 netif->hwaddr[2] = MBED_MAC_ADDR_2;
grzemich 0:d7bd7384a37c 147 netif->hwaddr[3] = MBED_MAC_ADDR_3;
grzemich 0:d7bd7384a37c 148 netif->hwaddr[4] = MBED_MAC_ADDR_4;
grzemich 0:d7bd7384a37c 149 netif->hwaddr[5] = MBED_MAC_ADDR_5;
grzemich 0:d7bd7384a37c 150 #else
grzemich 0:d7bd7384a37c 151 mbed_mac_address((char *)netif->hwaddr);
grzemich 0:d7bd7384a37c 152 #endif
grzemich 0:d7bd7384a37c 153 netif->hwaddr_len = ETHARP_HWADDR_LEN;
grzemich 0:d7bd7384a37c 154
grzemich 0:d7bd7384a37c 155 /* maximum transfer unit */
grzemich 0:d7bd7384a37c 156 netif->mtu = 1500;
grzemich 0:d7bd7384a37c 157
grzemich 0:d7bd7384a37c 158 /* device capabilities */
grzemich 0:d7bd7384a37c 159 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP;
grzemich 0:d7bd7384a37c 160
grzemich 0:d7bd7384a37c 161 #if LWIP_NETIF_HOSTNAME
grzemich 0:d7bd7384a37c 162 /* Initialize interface hostname */
grzemich 0:d7bd7384a37c 163 netif->hostname = "lwiprza1";
grzemich 0:d7bd7384a37c 164 #endif /* LWIP_NETIF_HOSTNAME */
grzemich 0:d7bd7384a37c 165
grzemich 0:d7bd7384a37c 166 netif->name[0] = 'e';
grzemich 0:d7bd7384a37c 167 netif->name[1] = 'n';
grzemich 0:d7bd7384a37c 168
grzemich 0:d7bd7384a37c 169 netif->output = rza1_etharp_output;
grzemich 0:d7bd7384a37c 170 netif->linkoutput = rza1_low_level_output;
grzemich 0:d7bd7384a37c 171
grzemich 0:d7bd7384a37c 172 /* Initialize the hardware */
grzemich 0:d7bd7384a37c 173 ethcfg.int_priority = 6;
grzemich 0:d7bd7384a37c 174 ethcfg.recv_cb = &rza1_recv_callback;
grzemich 0:d7bd7384a37c 175 ethcfg.ether_mac = (char *)netif->hwaddr;
grzemich 0:d7bd7384a37c 176 ethernetext_init(&ethcfg);
grzemich 0:d7bd7384a37c 177
grzemich 0:d7bd7384a37c 178 /* semaphore */
grzemich 0:d7bd7384a37c 179 sys_sem_new(&recv_ready_sem, 0);
grzemich 0:d7bd7384a37c 180
grzemich 0:d7bd7384a37c 181 /* task */
grzemich 0:d7bd7384a37c 182 sys_thread_new("rza1_recv_task", rza1_recv_task, netif, DEFAULT_THREAD_STACKSIZE, RECV_TASK_PRI);
grzemich 0:d7bd7384a37c 183 sys_thread_new("rza1_phy_task", rza1_phy_task, netif, DEFAULT_THREAD_STACKSIZE, PHY_TASK_PRI);
grzemich 0:d7bd7384a37c 184
grzemich 0:d7bd7384a37c 185 return ERR_OK;
grzemich 0:d7bd7384a37c 186 }
grzemich 0:d7bd7384a37c 187
grzemich 0:d7bd7384a37c 188 void eth_arch_enable_interrupts(void) {
grzemich 0:d7bd7384a37c 189 ethernetext_start_stop(1);
grzemich 0:d7bd7384a37c 190 }
grzemich 0:d7bd7384a37c 191
grzemich 0:d7bd7384a37c 192 void eth_arch_disable_interrupts(void) {
grzemich 0:d7bd7384a37c 193 ethernetext_start_stop(0);
grzemich 0:d7bd7384a37c 194 }