EL4121 Embedded System / mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 * Copyright (c) 2016 Realtek Semiconductor Corp.
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 5 * you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 6 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 7 *
be_bryan 0:b74591d5ab33 8 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 9 *
be_bryan 0:b74591d5ab33 10 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 11 * distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 13 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 14 * limitations under the License.
be_bryan 0:b74591d5ab33 15 */
be_bryan 0:b74591d5ab33 16
be_bryan 0:b74591d5ab33 17 #if DEVICE_EMAC
be_bryan 0:b74591d5ab33 18
be_bryan 0:b74591d5ab33 19 #include <stdio.h>
be_bryan 0:b74591d5ab33 20 #include "mbed_assert.h"
be_bryan 0:b74591d5ab33 21 #include "mbed_events.h"
be_bryan 0:b74591d5ab33 22
be_bryan 0:b74591d5ab33 23 #include "emac_api.h"
be_bryan 0:b74591d5ab33 24 #include "rtos.h"
be_bryan 0:b74591d5ab33 25
be_bryan 0:b74591d5ab33 26 #include "lwip/pbuf.h"
be_bryan 0:b74591d5ab33 27 #include "netif/etharp.h"
be_bryan 0:b74591d5ab33 28
be_bryan 0:b74591d5ab33 29 #include "lwip_intf.h"
be_bryan 0:b74591d5ab33 30 #include "wifi_constants.h"
be_bryan 0:b74591d5ab33 31 #include "wifi_conf.h"
be_bryan 0:b74591d5ab33 32
be_bryan 0:b74591d5ab33 33 #define RTW_EMAC_MTU_SIZE (1500U)
be_bryan 0:b74591d5ab33 34
be_bryan 0:b74591d5ab33 35 static emac_interface_t *_emac;
be_bryan 0:b74591d5ab33 36 static emac_link_input_fn link_input_cb;
be_bryan 0:b74591d5ab33 37 static emac_link_state_change_fn link_state_cb;
be_bryan 0:b74591d5ab33 38 static void *link_input_data;
be_bryan 0:b74591d5ab33 39 static void *link_state_data;
be_bryan 0:b74591d5ab33 40
be_bryan 0:b74591d5ab33 41 static uint32_t wlan_get_mtu_size(emac_interface_t *emac)
be_bryan 0:b74591d5ab33 42 {
be_bryan 0:b74591d5ab33 43 return RTW_EMAC_MTU_SIZE;
be_bryan 0:b74591d5ab33 44 }
be_bryan 0:b74591d5ab33 45
be_bryan 0:b74591d5ab33 46 static void wlan_get_ifname(emac_interface_t *emac, char *name, uint8_t size)
be_bryan 0:b74591d5ab33 47 {
be_bryan 0:b74591d5ab33 48 MBED_ASSERT(name != NULL);
be_bryan 0:b74591d5ab33 49 strncpy(name, "r0", size);
be_bryan 0:b74591d5ab33 50 }
be_bryan 0:b74591d5ab33 51
be_bryan 0:b74591d5ab33 52 static uint8_t wlan_get_hwaddr_size(emac_interface_t *emac)
be_bryan 0:b74591d5ab33 53 {
be_bryan 0:b74591d5ab33 54 return ETHARP_HWADDR_LEN;
be_bryan 0:b74591d5ab33 55 }
be_bryan 0:b74591d5ab33 56
be_bryan 0:b74591d5ab33 57 static void wlan_get_hwaddr(emac_interface_t *emac, uint8_t *addr)
be_bryan 0:b74591d5ab33 58 {
be_bryan 0:b74591d5ab33 59 char mac[20];
be_bryan 0:b74591d5ab33 60 if(RTW_SUCCESS == wifi_get_mac_address(mac))
be_bryan 0:b74591d5ab33 61 {
be_bryan 0:b74591d5ab33 62 if (sscanf(mac, "%x:%x:%x:%x:%x:%x", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]) != 6)
be_bryan 0:b74591d5ab33 63 printf("Get HW address failed\r\n");
be_bryan 0:b74591d5ab33 64 }else{
be_bryan 0:b74591d5ab33 65 printf("Get HW address failed\r\n");
be_bryan 0:b74591d5ab33 66 }
be_bryan 0:b74591d5ab33 67 }
be_bryan 0:b74591d5ab33 68
be_bryan 0:b74591d5ab33 69 static void wlan_set_hwaddr(emac_interface_t *emac, uint8_t *addr)
be_bryan 0:b74591d5ab33 70 {
be_bryan 0:b74591d5ab33 71
be_bryan 0:b74591d5ab33 72 }
be_bryan 0:b74591d5ab33 73
be_bryan 0:b74591d5ab33 74
be_bryan 0:b74591d5ab33 75 static bool wlan_link_out(emac_interface_t *emac, emac_stack_mem_t *buf)
be_bryan 0:b74591d5ab33 76 {
be_bryan 0:b74591d5ab33 77 struct eth_drv_sg * sg_list=0;
be_bryan 0:b74591d5ab33 78 int sg_len = 0;
be_bryan 0:b74591d5ab33 79 int tot_len;
be_bryan 0:b74591d5ab33 80 struct pbuf *p;
be_bryan 0:b74591d5ab33 81 bool ret = true;
be_bryan 0:b74591d5ab33 82
be_bryan 0:b74591d5ab33 83 if (!rltk_wlan_running(0)) {
be_bryan 0:b74591d5ab33 84 return false;
be_bryan 0:b74591d5ab33 85 }
be_bryan 0:b74591d5ab33 86
be_bryan 0:b74591d5ab33 87 sg_list = (struct eth_drv_sg *)malloc(sizeof(struct eth_drv_sg)*MAX_ETH_DRV_SG);
be_bryan 0:b74591d5ab33 88 if(sg_list == 0){//malloc fail
be_bryan 0:b74591d5ab33 89 return false;
be_bryan 0:b74591d5ab33 90 }
be_bryan 0:b74591d5ab33 91 emac_stack_mem_ref(emac, buf);
be_bryan 0:b74591d5ab33 92
be_bryan 0:b74591d5ab33 93 p = (struct pbuf *)buf;
be_bryan 0:b74591d5ab33 94 tot_len = p->tot_len;
be_bryan 0:b74591d5ab33 95 for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = p->next) {
be_bryan 0:b74591d5ab33 96 sg_list[sg_len].buf = (uint32_t) p->payload;
be_bryan 0:b74591d5ab33 97 sg_list[sg_len].len = p->len;
be_bryan 0:b74591d5ab33 98 sg_len++;
be_bryan 0:b74591d5ab33 99 }
be_bryan 0:b74591d5ab33 100
be_bryan 0:b74591d5ab33 101 if (sg_len) {
be_bryan 0:b74591d5ab33 102 if (rltk_wlan_send(0, sg_list, sg_len, tot_len) != 0) {
be_bryan 0:b74591d5ab33 103 ret = false;
be_bryan 0:b74591d5ab33 104 }
be_bryan 0:b74591d5ab33 105 }
be_bryan 0:b74591d5ab33 106
be_bryan 0:b74591d5ab33 107 emac_stack_mem_free(emac, buf);
be_bryan 0:b74591d5ab33 108 free(sg_list);
be_bryan 0:b74591d5ab33 109 return ret;
be_bryan 0:b74591d5ab33 110 }
be_bryan 0:b74591d5ab33 111
be_bryan 0:b74591d5ab33 112 static bool wlan_power_up(emac_interface_t *emac)
be_bryan 0:b74591d5ab33 113 {
be_bryan 0:b74591d5ab33 114 wifi_on(RTW_MODE_STA);
be_bryan 0:b74591d5ab33 115 wait_ms(1000);
be_bryan 0:b74591d5ab33 116 return true;
be_bryan 0:b74591d5ab33 117 }
be_bryan 0:b74591d5ab33 118
be_bryan 0:b74591d5ab33 119 static void wlan_power_down(emac_interface_t *emac)
be_bryan 0:b74591d5ab33 120 {
be_bryan 0:b74591d5ab33 121 wifi_off();
be_bryan 0:b74591d5ab33 122 }
be_bryan 0:b74591d5ab33 123
be_bryan 0:b74591d5ab33 124 static void wlan_set_link_input_cb(emac_interface_t *emac, emac_link_input_fn cb, void *data)
be_bryan 0:b74591d5ab33 125 {
be_bryan 0:b74591d5ab33 126 link_input_cb = cb;
be_bryan 0:b74591d5ab33 127 link_input_data = data;
be_bryan 0:b74591d5ab33 128 }
be_bryan 0:b74591d5ab33 129
be_bryan 0:b74591d5ab33 130 static void wlan_set_link_state_cb(emac_interface_t *emac, emac_link_state_change_fn cb, void *data)
be_bryan 0:b74591d5ab33 131 {
be_bryan 0:b74591d5ab33 132 link_state_cb = cb;
be_bryan 0:b74591d5ab33 133 link_state_data = data;
be_bryan 0:b74591d5ab33 134 }
be_bryan 0:b74591d5ab33 135
be_bryan 0:b74591d5ab33 136 void wlan_emac_recv(struct netif *netif, int len)
be_bryan 0:b74591d5ab33 137 {
be_bryan 0:b74591d5ab33 138 struct eth_drv_sg sg_list[MAX_ETH_DRV_SG];
be_bryan 0:b74591d5ab33 139 emac_stack_mem_t *buf;
be_bryan 0:b74591d5ab33 140 struct pbuf *p;
be_bryan 0:b74591d5ab33 141 int sg_len = 0;
be_bryan 0:b74591d5ab33 142
be_bryan 0:b74591d5ab33 143 if (!rltk_wlan_running(0)) {
be_bryan 0:b74591d5ab33 144 return;
be_bryan 0:b74591d5ab33 145 }
be_bryan 0:b74591d5ab33 146
be_bryan 0:b74591d5ab33 147 if (len > MAX_ETH_MSG || len < 0) {
be_bryan 0:b74591d5ab33 148 len = MAX_ETH_MSG;
be_bryan 0:b74591d5ab33 149 }
be_bryan 0:b74591d5ab33 150
be_bryan 0:b74591d5ab33 151 buf = emac_stack_mem_alloc(NULL, len, 0);
be_bryan 0:b74591d5ab33 152 if (buf == NULL) {
be_bryan 0:b74591d5ab33 153 return;
be_bryan 0:b74591d5ab33 154 }
be_bryan 0:b74591d5ab33 155
be_bryan 0:b74591d5ab33 156 p = (struct pbuf *)buf;
be_bryan 0:b74591d5ab33 157 for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = p->next) {
be_bryan 0:b74591d5ab33 158 sg_list[sg_len].buf = (uint32_t) p->payload;
be_bryan 0:b74591d5ab33 159 sg_list[sg_len].len = p->len;
be_bryan 0:b74591d5ab33 160 sg_len++;
be_bryan 0:b74591d5ab33 161 }
be_bryan 0:b74591d5ab33 162 rltk_wlan_recv(0, sg_list, sg_len);
be_bryan 0:b74591d5ab33 163
be_bryan 0:b74591d5ab33 164 if (link_input_cb) {
be_bryan 0:b74591d5ab33 165 link_input_cb(link_input_data, buf);
be_bryan 0:b74591d5ab33 166 }
be_bryan 0:b74591d5ab33 167 return;
be_bryan 0:b74591d5ab33 168 }
be_bryan 0:b74591d5ab33 169
be_bryan 0:b74591d5ab33 170 const emac_interface_ops_t wlan_emac_interface = {
be_bryan 0:b74591d5ab33 171 .get_mtu_size = wlan_get_mtu_size,
be_bryan 0:b74591d5ab33 172 .get_ifname = wlan_get_ifname,
be_bryan 0:b74591d5ab33 173 .get_hwaddr_size = wlan_get_hwaddr_size,
be_bryan 0:b74591d5ab33 174 .get_hwaddr = wlan_get_hwaddr,
be_bryan 0:b74591d5ab33 175 .set_hwaddr = wlan_set_hwaddr,
be_bryan 0:b74591d5ab33 176 .link_out = wlan_link_out,
be_bryan 0:b74591d5ab33 177 .power_up = wlan_power_up,
be_bryan 0:b74591d5ab33 178 .power_down = wlan_power_down,
be_bryan 0:b74591d5ab33 179 .set_link_input_cb = wlan_set_link_input_cb,
be_bryan 0:b74591d5ab33 180 .set_link_state_cb = wlan_set_link_state_cb
be_bryan 0:b74591d5ab33 181 };
be_bryan 0:b74591d5ab33 182
be_bryan 0:b74591d5ab33 183 void mbed_default_mac_address(char *mac) {
be_bryan 0:b74591d5ab33 184 unsigned char RTK_mac_addr[3] = {0x00, 0xE0, 0x4C}; // default Realtek mac address
be_bryan 0:b74591d5ab33 185
be_bryan 0:b74591d5ab33 186 mac[0] = RTK_mac_addr[0];
be_bryan 0:b74591d5ab33 187 mac[1] = RTK_mac_addr[1];
be_bryan 0:b74591d5ab33 188 mac[2] = RTK_mac_addr[2];
be_bryan 0:b74591d5ab33 189 mac[3] = 0x87;
be_bryan 0:b74591d5ab33 190 mac[4] = 0x00;
be_bryan 0:b74591d5ab33 191 mac[5] = 0x01;
be_bryan 0:b74591d5ab33 192
be_bryan 0:b74591d5ab33 193 return;
be_bryan 0:b74591d5ab33 194 }
be_bryan 0:b74591d5ab33 195
be_bryan 0:b74591d5ab33 196 void mbed_mac_address(char *mac)
be_bryan 0:b74591d5ab33 197 {
be_bryan 0:b74591d5ab33 198 char hwaddr[20];
be_bryan 0:b74591d5ab33 199 if(RTW_SUCCESS == wifi_get_mac_address(hwaddr))
be_bryan 0:b74591d5ab33 200 {
be_bryan 0:b74591d5ab33 201 if (sscanf(hwaddr, "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6)
be_bryan 0:b74591d5ab33 202 printf("Get HW address failed\r\n");
be_bryan 0:b74591d5ab33 203 }else{
be_bryan 0:b74591d5ab33 204 printf("Get HW address failed\r\n");
be_bryan 0:b74591d5ab33 205 mbed_default_mac_address(mac);
be_bryan 0:b74591d5ab33 206 }
be_bryan 0:b74591d5ab33 207 }
be_bryan 0:b74591d5ab33 208
be_bryan 0:b74591d5ab33 209 void wlan_emac_link_change(bool up)
be_bryan 0:b74591d5ab33 210 {
be_bryan 0:b74591d5ab33 211 if (link_state_cb) {
be_bryan 0:b74591d5ab33 212 link_state_cb(link_state_data, up);
be_bryan 0:b74591d5ab33 213 }
be_bryan 0:b74591d5ab33 214 }
be_bryan 0:b74591d5ab33 215
be_bryan 0:b74591d5ab33 216 emac_interface_t *wlan_emac_init_interface()
be_bryan 0:b74591d5ab33 217 {
be_bryan 0:b74591d5ab33 218
be_bryan 0:b74591d5ab33 219 if (_emac == NULL) {
be_bryan 0:b74591d5ab33 220 _emac = (emac_interface_t*) malloc(sizeof(emac_interface_t));
be_bryan 0:b74591d5ab33 221 MBED_ASSERT(_emac);
be_bryan 0:b74591d5ab33 222 _emac->hw = NULL;
be_bryan 0:b74591d5ab33 223 memcpy((void*)&_emac->ops, &wlan_emac_interface, sizeof(wlan_emac_interface));
be_bryan 0:b74591d5ab33 224 }
be_bryan 0:b74591d5ab33 225 return _emac;
be_bryan 0:b74591d5ab33 226 }
be_bryan 0:b74591d5ab33 227 #endif