drv_wifi.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. /*
  2. * Copyright (c) 2019 Winner Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-09-15 flyingcys 1st version
  9. */
  10. #include <rtthread.h>
  11. #ifdef RT_USING_WIFI
  12. #include <wlan_dev.h>
  13. #include "wm_type_def.h"
  14. #include "wm_wifi.h"
  15. #include "drv_wifi.h"
  16. #define DBG_ENABLE
  17. #define DBG_LEVEL DBG_INFO
  18. #define DBG_SECTION_NAME "WIFI"
  19. #define DBG_COLOR
  20. #include <rtdbg.h>
  21. #include "wm_ram_config.h"
  22. #include "wm_efuse.h"
  23. #include "wm_params.h"
  24. #include "wm_debug.h"
  25. #include "tls_ieee80211.h"
  26. //#define ETH_RX_DUMP
  27. //#define ETH_TX_DUMP
  28. //#define MINI_DUMP
  29. #define MAX_ADDR_LEN (6)
  30. struct drv_wifi
  31. {
  32. struct rt_wlan_device *wlan;
  33. rt_uint8_t dev_addr[MAX_ADDR_LEN];
  34. };
  35. static const struct rt_wlan_dev_ops ops;
  36. static struct drv_wifi wifi_sta;
  37. static struct drv_wifi wifi_ap;
  38. extern int hed_rf_current_channel;
  39. extern u8 *wpa_supplicant_get_mac(void);
  40. extern u8 *hostapd_get_mac(void);
  41. extern uint8_t* tls_wifi_buffer_acquire(int total_len);
  42. extern void *tls_wl_init(u8 *tx_gain, u8* mac_addr, u8 *hwver);
  43. extern int wpa_supplicant_init(u8 *mac_addr);
  44. extern void wpa_supplicant_set_mac(u8 *mac);
  45. extern void tls_wifi_buffer_release(rt_bool_t is_apsta, rt_uint8_t* buffer);
  46. #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP)
  47. static void packet_dump(const char *msg, const void *ptr, rt_uint32_t len)
  48. {
  49. rt_uint32_t j;
  50. rt_uint8_t *p = (rt_uint8_t *)ptr;
  51. rt_kprintf("%s %d byte\n", msg, len);
  52. #ifdef MINI_DUMP
  53. return;
  54. #endif
  55. for (j = 0; j < len; j++)
  56. {
  57. if ((j % 8) == 0)
  58. {
  59. rt_kprintf(" ");
  60. }
  61. if ((j % 16) == 0)
  62. {
  63. rt_kprintf("\r\n");
  64. }
  65. rt_kprintf("%02x ", *p ++);
  66. }
  67. rt_kprintf("\n\n");
  68. }
  69. #endif /* dump */
  70. err_t tls_netif_set_addr(void *ipaddr, void *netmask, void *gw)
  71. {
  72. LOG_D("%s %d\r\n", __FUNCTION__, __LINE__);
  73. return 0;
  74. }
  75. static int wm_ethernetif_input(const rt_uint8_t *bssid, rt_uint8_t *buf, rt_uint32_t buf_len)
  76. {
  77. rt_err_t err = -RT_ERROR;
  78. if (0 == compare_ether_addr(bssid, wifi_ap.dev_addr))
  79. err = rt_wlan_dev_report_data(wifi_ap.wlan, (void *)buf, buf_len);
  80. else
  81. err = rt_wlan_dev_report_data(wifi_sta.wlan, (void *)buf, buf_len);
  82. return err ? -1 : 0;
  83. }
  84. static void wm_wlan_client_event(u8 *mac, enum tls_wifi_client_event_type event)
  85. {
  86. struct rt_wlan_buff buff;
  87. struct rt_wlan_info sta;
  88. rt_memcpy(sta.bssid, mac, MAX_ADDR_LEN);
  89. buff.data = &sta;
  90. buff.len = sizeof(sta);
  91. if (WM_WIFI_CLIENT_EVENT_ONLINE == event)
  92. {
  93. rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_ASSOCIATED, &buff);
  94. }
  95. else
  96. {
  97. rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_DISASSOCIATED, &buff);
  98. }
  99. }
  100. static void wm_wlan_status_changed(rt_uint8_t status)
  101. {
  102. LOG_D("status:%d", status);
  103. switch (status)
  104. {
  105. case WIFI_JOIN_SUCCESS:
  106. LOG_D("NETIF_WIFI_JOIN_SUCCESS");
  107. rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_CONNECT, RT_NULL);
  108. break;
  109. case WIFI_JOIN_FAILED:
  110. LOG_D("NETIF_WIFI_JOIN_FAILED");
  111. rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_CONNECT_FAIL, RT_NULL);
  112. break;
  113. case WIFI_DISCONNECTED:
  114. LOG_D("NETIF_WIFI_DISCONNECTED");
  115. rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_DISCONNECT, RT_NULL);
  116. break;
  117. case WIFI_SOFTAP_SUCCESS:
  118. LOG_D("WIFI_SOFTAP_SUCCESS");
  119. rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_START, RT_NULL);
  120. break;
  121. case WIFI_SOFTAP_CLOSED:
  122. LOG_D("WIFI_SOFTAP_CLOSED");
  123. rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_STOP, RT_NULL);
  124. break;
  125. default:
  126. break;
  127. }
  128. }
  129. static rt_err_t wm_wlan_init(void)
  130. {
  131. extern rt_uint8_t tx_gain_group[];
  132. rt_uint8_t mac_addr[6] = {0x00, 0x25, 0x08, 0x09, 0x01, 0x0F};
  133. /*PARAM GAIN,MAC default*/
  134. tls_ft_param_init();
  135. tls_param_load_factory_default();
  136. tls_param_init(); /*add param to init sysparam_lock sem*/
  137. tls_get_tx_gain(&tx_gain_group[0]);
  138. TLS_DBGPRT_INFO("tx gain ");
  139. TLS_DBGPRT_DUMP((char *)(&tx_gain_group[0]), 12);
  140. if (tls_wifi_mem_cfg(WIFI_MEM_START_ADDR, 7, 7)) /*wifi tx&rx mem customized interface*/
  141. {
  142. LOG_E("wl mem initial failured\n");
  143. }
  144. tls_get_mac_addr(&mac_addr[0]);
  145. TLS_DBGPRT_INFO("mac addr ");
  146. TLS_DBGPRT_DUMP((char *)(&mac_addr[0]), 6);
  147. if (tls_wl_init(NULL, &mac_addr[0], NULL) == NULL)
  148. {
  149. LOG_I("wl driver initial failured\n");
  150. }
  151. if (wpa_supplicant_init(mac_addr))
  152. {
  153. LOG_I("supplicant initial failured\n");
  154. }
  155. rt_memcpy(wifi_sta.dev_addr, wpa_supplicant_get_mac(), MAX_ADDR_LEN);
  156. LOG_D("sta_mac:%02x-%02x-%02x-%02x-%02x-%02x\r\n", wifi_sta.dev_addr[0], wifi_sta.dev_addr[1], wifi_sta.dev_addr[2], wifi_sta.dev_addr[3], wifi_sta.dev_addr[4], wifi_sta.dev_addr[5]);
  157. rt_memcpy(wifi_ap.dev_addr, hostapd_get_mac(), MAX_ADDR_LEN);
  158. LOG_D("ap_mac:%02x-%02x-%02x-%02x-%02x-%02x\r\n", wifi_ap.dev_addr[0], wifi_ap.dev_addr[1], wifi_ap.dev_addr[2], wifi_ap.dev_addr[3], wifi_ap.dev_addr[4], wifi_ap.dev_addr[5]);
  159. return RT_EOK;
  160. }
  161. static void wm_wlan_promisc_dataframe_callback(u8 *data, u32 data_len)
  162. {
  163. rt_wlan_dev_promisc_handler(wifi_sta.wlan, data, data_len);
  164. }
  165. static rt_err_t drv_wlan_init(struct rt_wlan_device *wlan)
  166. {
  167. static int inited = 0;
  168. if (inited)
  169. return RT_EOK;
  170. wm_wlan_init();
  171. tls_ethernet_data_rx_callback(wm_ethernetif_input);
  172. tls_wifi_status_change_cb_register(wm_wlan_status_changed);
  173. tls_wifi_softap_client_event_register(wm_wlan_client_event);
  174. inited = 1;
  175. return RT_EOK;
  176. }
  177. static rt_err_t drv_wlan_mode(struct rt_wlan_device *wlan, rt_wlan_mode_t mode)
  178. {
  179. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  180. u8 wmode = IEEE80211_MODE_INFRA;
  181. if (mode == RT_WLAN_AP)
  182. wmode = IEEE80211_MODE_AP;
  183. tls_param_set(TLS_PARAM_ID_WPROTOCOL, (void *)&wmode, TRUE);
  184. return RT_EOK;
  185. }
  186. static void wm_wlan_scan_callback(void)
  187. {
  188. int buflen = 2000;
  189. char *buf = RT_NULL;
  190. int err;
  191. struct rt_wlan_info wlan_info;
  192. struct rt_wlan_buff buff;
  193. buf = rt_malloc(buflen);
  194. if (RT_NULL == buf)
  195. {
  196. LOG_E("rt_malloc failed...\r\n");
  197. return;
  198. }
  199. err = tls_wifi_get_scan_rslt((u8 *)buf, buflen);
  200. if (err != WM_SUCCESS)
  201. {
  202. rt_free(buf);
  203. return;
  204. }
  205. struct tls_scan_bss_t *scan_res = (struct tls_scan_bss_t *)buf;
  206. struct tls_bss_info_t *bss_info = (struct tls_bss_info_t *)scan_res->bss;
  207. if (scan_res->count <= 0)
  208. {
  209. rt_free(buf);
  210. return;
  211. }
  212. int i;
  213. for (i = 0; i < scan_res->count; i ++)
  214. {
  215. rt_memset(&wlan_info, 0, sizeof(wlan_info));
  216. rt_memcpy(&wlan_info.bssid[0], bss_info->bssid, 6);
  217. rt_memcpy(wlan_info.ssid.val, bss_info->ssid, bss_info->ssid_len);
  218. wlan_info.ssid.len = bss_info->ssid_len;
  219. if (bss_info->ssid_len)
  220. wlan_info.hidden = 0;
  221. else
  222. wlan_info.hidden = 1;
  223. wlan_info.channel = (rt_int16_t)bss_info->channel;
  224. wlan_info.rssi = -(char)(0x100 - bss_info->rssi);
  225. wlan_info.datarate = bss_info->max_data_rate * 1000000;
  226. wlan_info.band = RT_802_11_BAND_2_4GHZ;
  227. wlan_info.security = SECURITY_OPEN;
  228. if (WM_WIFI_AUTH_MODE_WEP_AUTO & bss_info->privacy)
  229. wlan_info.security |= WEP_ENABLED;
  230. if (WM_WIFI_AUTH_MODE_WPA_PSK_TKIP & bss_info->privacy)
  231. wlan_info.security |= WPA_SECURITY | TKIP_ENABLED;
  232. if (WM_WIFI_AUTH_MODE_WPA_PSK_CCMP & bss_info->privacy)
  233. wlan_info.security |= WPA_SECURITY | AES_ENABLED;
  234. if (WM_WIFI_AUTH_MODE_WPA2_PSK_CCMP & bss_info->privacy)
  235. wlan_info.security |= WPA2_SECURITY | AES_ENABLED;
  236. if (WM_WIFI_AUTH_MODE_WPA2_PSK_TKIP & bss_info->privacy)
  237. wlan_info.security |= WPA2_SECURITY | TKIP_ENABLED;
  238. if (bss_info->wps_support)
  239. wlan_info.security |= WPS_ENABLED;
  240. if (WM_WIFI_AUTH_MODE_UNKNOWN == bss_info->privacy)
  241. wlan_info.security = SECURITY_UNKNOWN;
  242. /* rtt incompleted... */
  243. if (wlan_info.security & SECURITY_WPA2_MIXED_PSK)
  244. wlan_info.security = SECURITY_WPA2_MIXED_PSK;
  245. else if (wlan_info.security & SECURITY_WPA2_TKIP_PSK)
  246. wlan_info.security = SECURITY_WPA2_TKIP_PSK;
  247. else if (wlan_info.security & SECURITY_WPA2_AES_PSK)
  248. wlan_info.security = SECURITY_WPA2_AES_PSK;
  249. else if (wlan_info.security & SECURITY_WPA_AES_PSK)
  250. wlan_info.security = SECURITY_WPA_AES_PSK;
  251. else if (wlan_info.security & SECURITY_WPA_TKIP_PSK)
  252. wlan_info.security = SECURITY_WPA_TKIP_PSK;
  253. else if (wlan_info.security & SECURITY_WEP_PSK)
  254. wlan_info.security = SECURITY_WEP_PSK;
  255. else if ((SECURITY_UNKNOWN == wlan_info.security) && bss_info->wps_support)
  256. wlan_info.security = SECURITY_WPS_SECURE;
  257. LOG_D("%s-%x", wlan_info.ssid.val, wlan_info.security);
  258. bss_info ++;
  259. buff.data = &wlan_info;
  260. buff.len = sizeof(wlan_info);
  261. rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_SCAN_REPORT, &buff);
  262. }
  263. rt_free(buf);
  264. rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_SCAN_DONE, RT_NULL);
  265. }
  266. static rt_err_t drv_wlan_scan(struct rt_wlan_device *wlan, struct rt_scan_info *scan_info)
  267. {
  268. int ret;
  269. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  270. /* register scan complt callback*/
  271. tls_wifi_scan_result_cb_register(wm_wlan_scan_callback);
  272. /* trigger the scan */
  273. ret = tls_wifi_scan();
  274. if ((ret == WM_WIFI_SCANNING_BUSY) || (ret == WM_FAILED))
  275. return -RT_ERROR;
  276. return RT_EOK;
  277. }
  278. static rt_err_t drv_wlan_join(struct rt_wlan_device *wlan, struct rt_sta_info *sta_info)
  279. {
  280. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  281. tls_wifi_disconnect();
  282. tls_wifi_connect((u8 *)sta_info->ssid.val, sta_info->ssid.len, (u8 *)sta_info->key.val, sta_info->key.len);
  283. return RT_EOK;
  284. }
  285. static rt_err_t drv_wlan_softap(struct rt_wlan_device *wlan, struct rt_ap_info *ap_info)
  286. {
  287. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  288. struct tls_softap_info_t apinfo;
  289. struct tls_ip_info_t ipinfo;
  290. rt_memset(&apinfo, 0, sizeof(apinfo));
  291. rt_memcpy(apinfo.ssid, ap_info->ssid.val, ap_info->ssid.len);
  292. apinfo.channel = ap_info->channel;
  293. switch (ap_info->security) /* only support wpa2-psk and open */
  294. {
  295. case SECURITY_WEP_PSK:
  296. apinfo.encrypt = IEEE80211_ENCRYT_WEP40;
  297. break;
  298. case SECURITY_WPA_TKIP_PSK:
  299. apinfo.encrypt = IEEE80211_ENCRYT_TKIP_WPA;
  300. break;
  301. case SECURITY_WPA_AES_PSK:
  302. apinfo.encrypt = IEEE80211_ENCRYT_CCMP_WPA;
  303. break;
  304. case SECURITY_WPA2_TKIP_PSK:
  305. apinfo.encrypt = IEEE80211_ENCRYT_TKIP_WPA2;
  306. break;
  307. case SECURITY_WPA2_AES_PSK:
  308. case SECURITY_WPA2_MIXED_PSK:
  309. apinfo.encrypt = IEEE80211_ENCRYT_CCMP_WPA2;
  310. break;
  311. default:
  312. apinfo.encrypt = IEEE80211_ENCRYT_NONE;
  313. break;
  314. }
  315. apinfo.keyinfo.format = 1; /* ascii */
  316. apinfo.keyinfo.index = 1; /* index */
  317. apinfo.keyinfo.key_len = ap_info->key.len;
  318. rt_memcpy(apinfo.keyinfo.key, ap_info->key.val, ap_info->key.len);
  319. LOG_D("ch=%d, hd=%d, key=%s, sec=%x, ssid=%s", ap_info->channel, ap_info->hidden, ap_info->key.val, ap_info->security, ap_info->ssid.val);
  320. rt_memset(&ipinfo, 0, sizeof(ipinfo));
  321. ipinfo.ip_addr[0] = 192;
  322. ipinfo.ip_addr[1] = 168;
  323. ipinfo.ip_addr[2] = 48;
  324. ipinfo.ip_addr[3] = 1;
  325. ipinfo.netmask[0] = 255;
  326. ipinfo.netmask[1] = 255;
  327. ipinfo.netmask[2] = 255;
  328. ipinfo.netmask[3] = 0;
  329. u8 ssid_set = ap_info->hidden ? 0 : 1;
  330. tls_param_set(TLS_PARAM_ID_BRDSSID, (void *)&ssid_set, FALSE);
  331. rt_memcpy(ipinfo.dnsname, "local.w60x", sizeof("local.w60x"));
  332. int ret = tls_wifi_softap_create(&apinfo, &ipinfo);
  333. return (ret == WM_SUCCESS) ? RT_EOK : RT_ERROR;
  334. }
  335. static rt_err_t drv_wlan_disconnect(struct rt_wlan_device *wlan)
  336. {
  337. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  338. tls_wifi_disconnect();
  339. return RT_EOK;
  340. }
  341. static rt_err_t drv_wlan_ap_stop(struct rt_wlan_device *wlan)
  342. {
  343. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  344. tls_wifi_softap_destroy();
  345. return RT_EOK;
  346. }
  347. static rt_err_t drv_wlan_ap_deauth(struct rt_wlan_device *wlan, rt_uint8_t mac[])
  348. {
  349. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  350. struct tls_wifi_hdr_mac_t machdr;
  351. struct tls_wifi_tx_rate_t tx;
  352. rt_memset(&machdr, 0, sizeof(machdr));
  353. rt_memcpy(machdr.da_addr, mac, MAX_ADDR_LEN);
  354. rt_memcpy(machdr.sa_addr, hostapd_get_mac(), MAX_ADDR_LEN);
  355. rt_memcpy(machdr.bssid, hostapd_get_mac(), MAX_ADDR_LEN);
  356. rt_memset(&tx, 0, sizeof(tx));
  357. tx.tx_rate = WM_WIFI_TX_RATEIDX_1M;
  358. tx.tx_gain = tls_wifi_get_tx_gain_max(WM_WIFI_TX_RATEIDX_1M);
  359. unsigned short reason = WLAN_REASON_UNSPECIFIED;/* htons */
  360. int ret = tls_wifi_send_mgmt(WM_WIFI_MGMT_TYPE_DEAUTH, &machdr, (u8 *)&reason, sizeof(reason), &tx);
  361. return (0 == ret) ? RT_EOK : RT_ERROR;
  362. }
  363. static rt_err_t drv_wlan_scan_stop(struct rt_wlan_device *wlan)
  364. {
  365. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  366. return RT_EOK;
  367. }
  368. static int drv_wlan_get_rssi(struct rt_wlan_device *wlan)
  369. {
  370. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  371. struct tls_curr_bss_t bss;
  372. rt_memset(&bss, 0, sizeof(bss));
  373. tls_wifi_get_current_bss(&bss);
  374. return -bss.rssi - 1;
  375. }
  376. static rt_err_t drv_wlan_set_powersave(struct rt_wlan_device *wlan, int level)
  377. {
  378. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  379. tls_wifi_set_psflag(level ? TRUE : FALSE, FALSE);
  380. return RT_EOK;
  381. }
  382. static int drv_wlan_get_powersave(struct rt_wlan_device *wlan)
  383. {
  384. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  385. return tls_wifi_get_psflag();
  386. }
  387. static rt_err_t drv_wlan_cfg_promisc(struct rt_wlan_device *wlan, rt_bool_t start)
  388. {
  389. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  390. if (RT_TRUE == start)
  391. {
  392. tls_wifi_set_listen_mode(1);
  393. tls_wifi_data_recv_cb_register(wm_wlan_promisc_dataframe_callback);
  394. }
  395. else
  396. {
  397. tls_wifi_set_listen_mode(0);
  398. tls_wifi_data_recv_cb_register(RT_NULL);
  399. }
  400. return RT_EOK;
  401. }
  402. static rt_err_t drv_wlan_cfg_filter(struct rt_wlan_device *wlan, struct rt_wlan_filter *filter)
  403. {
  404. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  405. return RT_EINVAL;/* not support */
  406. }
  407. static rt_err_t drv_wlan_set_channel(struct rt_wlan_device *wlan, int channel)
  408. {
  409. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  410. tls_wifi_change_chanel(channel - 1);
  411. return RT_EOK;
  412. }
  413. static int drv_wlan_get_channel(struct rt_wlan_device *wlan)
  414. {
  415. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  416. return hed_rf_current_channel;
  417. }
  418. static rt_err_t drv_wlan_set_country(struct rt_wlan_device *wlan, rt_country_code_t country_code)
  419. {
  420. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  421. u8 region = (u8)country_code;
  422. tls_param_set(TLS_PARAM_ID_COUNTRY_REGION, (void *)&region, TRUE);
  423. return RT_EOK;
  424. }
  425. static rt_country_code_t drv_wlan_get_country(struct rt_wlan_device *wlan)
  426. {
  427. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  428. u8 region = RT_COUNTRY_CHINA;
  429. tls_param_get(TLS_PARAM_ID_COUNTRY_REGION, (void *)&region, FALSE);
  430. return (rt_country_code_t)region; //RT_EOK;
  431. }
  432. static rt_err_t drv_wlan_set_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
  433. {
  434. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  435. if (wlan->user_data == &wifi_sta) /* ap don't support */
  436. {
  437. wpa_supplicant_set_mac(mac);
  438. tls_set_mac_addr(mac);
  439. }
  440. return RT_EOK;
  441. }
  442. static rt_err_t drv_wlan_get_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
  443. {
  444. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  445. if (wlan->user_data == &wifi_sta)
  446. rt_memcpy(mac, wpa_supplicant_get_mac(), MAX_ADDR_LEN);
  447. else
  448. rt_memcpy(mac, hostapd_get_mac(), MAX_ADDR_LEN);
  449. return RT_EOK;
  450. }
  451. static int drv_wlan_recv(struct rt_wlan_device *wlan, void *buff, int len)
  452. {
  453. return RT_EOK;
  454. }
  455. static int drv_wlan_send(struct rt_wlan_device *wlan, void *buff, int len)
  456. {
  457. rt_uint8_t *dst = tls_wifi_buffer_acquire(len);
  458. if (dst == NULL)
  459. return -RT_ENOMEM;
  460. #if ETH_PAD_SIZE
  461. pbuf_header(p, -ETH_PAD_SIZE); /* Drop the padding word */
  462. #endif
  463. #if defined(ETH_TX_DUMP)
  464. packet_dump("Tx", buff, len);
  465. #endif
  466. rt_memcpy(dst, buff, len);
  467. #if TLS_CONFIG_AP
  468. if (netif != tls_get_netif())
  469. tls_wifi_buffer_release(true, dst);
  470. else
  471. #endif
  472. tls_wifi_buffer_release(false, dst);
  473. #if ETH_PAD_SIZE
  474. pbuf_header(p, ETH_PAD_SIZE); /* Reclaim the padding word */
  475. #endif
  476. return RT_EOK;
  477. }
  478. static const struct rt_wlan_dev_ops ops =
  479. {
  480. .wlan_init = drv_wlan_init,
  481. .wlan_mode = drv_wlan_mode,
  482. .wlan_scan = drv_wlan_scan,
  483. .wlan_join = drv_wlan_join,
  484. .wlan_softap = drv_wlan_softap,
  485. .wlan_disconnect = drv_wlan_disconnect,
  486. .wlan_ap_stop = drv_wlan_ap_stop,
  487. .wlan_ap_deauth = drv_wlan_ap_deauth,
  488. .wlan_scan_stop = drv_wlan_scan_stop,
  489. .wlan_get_rssi = drv_wlan_get_rssi,
  490. .wlan_set_powersave = drv_wlan_set_powersave,
  491. .wlan_get_powersave = drv_wlan_get_powersave,
  492. .wlan_cfg_promisc = drv_wlan_cfg_promisc,
  493. .wlan_cfg_filter = drv_wlan_cfg_filter,
  494. .wlan_set_channel = drv_wlan_set_channel,
  495. .wlan_get_channel = drv_wlan_get_channel,
  496. .wlan_set_country = drv_wlan_set_country,
  497. .wlan_get_country = drv_wlan_get_country,
  498. .wlan_set_mac = drv_wlan_set_mac,
  499. .wlan_get_mac = drv_wlan_get_mac,
  500. .wlan_recv = drv_wlan_recv,
  501. .wlan_send = drv_wlan_send,
  502. };
  503. int wm_hw_wifi_init(void)
  504. {
  505. static struct rt_wlan_device wlan;
  506. static struct rt_wlan_device wlan2;
  507. LOG_D("F:%s L:%d", __FUNCTION__, __LINE__);
  508. rt_memset(&wifi_sta, 0, sizeof(wifi_sta));
  509. rt_err_t ret = rt_wlan_dev_register(&wlan, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta);
  510. wifi_sta.wlan = &wlan;
  511. rt_memset(&wifi_ap, 0, sizeof(wifi_ap));
  512. ret |= rt_wlan_dev_register(&wlan2, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap);
  513. wifi_ap.wlan = &wlan2;
  514. return ret; //RT_EOK;
  515. }
  516. INIT_DEVICE_EXPORT(wm_hw_wifi_init);
  517. #endif