1*4882a593Smuzhiyun #include <unistd.h>
2*4882a593Smuzhiyun #include <stdio.h>
3*4882a593Smuzhiyun #include <string.h>
4*4882a593Smuzhiyun #include <errno.h>
5*4882a593Smuzhiyun #include <pthread.h>
6*4882a593Smuzhiyun #include <sys/prctl.h>
7*4882a593Smuzhiyun #include <sys/time.h>
8*4882a593Smuzhiyun #include <stdbool.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "Rk_wifi.h"
11*4882a593Smuzhiyun #include "Rk_softap.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun struct wifi_info {
14*4882a593Smuzhiyun int ssid_len;
15*4882a593Smuzhiyun char ssid[512];
16*4882a593Smuzhiyun int psk_len;
17*4882a593Smuzhiyun char psk[512];
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun
printf_system_time()20*4882a593Smuzhiyun static void printf_system_time()
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun struct timeval tv;
23*4882a593Smuzhiyun gettimeofday(&tv, NULL);
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun printf("--- time: %lld ms ---\n", tv.tv_sec * 1000 + tv.tv_usec/1000 + tv.tv_usec%1000);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
ping_test()28*4882a593Smuzhiyun static void ping_test()
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun char line[2048];
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun while(1) {
33*4882a593Smuzhiyun sleep(1);
34*4882a593Smuzhiyun #if 0
35*4882a593Smuzhiyun if (RK_wifi_ping("www.baidu.com")) {
36*4882a593Smuzhiyun printf("ping ok\n");
37*4882a593Smuzhiyun printf_system_time();
38*4882a593Smuzhiyun rk_wifi_getConnectionInfo(NULL);
39*4882a593Smuzhiyun break;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun //#else
42*4882a593Smuzhiyun memset(line, 0, sizeof(line));
43*4882a593Smuzhiyun RK_shell_exec("ping www.baidu.com -c 1", line, sizeof(line));
44*4882a593Smuzhiyun //RK_shell_exec("ping 8.8.8.8 -c 1", line, sizeof(line));
45*4882a593Smuzhiyun //usleep(100000);
46*4882a593Smuzhiyun printf("line: %s\n", line);
47*4882a593Smuzhiyun if (strstr(line, "PING www.baidu.com") && strstr(line, "bytes from")) {
48*4882a593Smuzhiyun //if (strstr(line, "PING 8.8.8.8") && strstr(line, "bytes from")) {
49*4882a593Smuzhiyun printf("ping ok\n");
50*4882a593Smuzhiyun printf_system_time();
51*4882a593Smuzhiyun rk_wifi_getConnectionInfo(NULL);
52*4882a593Smuzhiyun break;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun #endif
55*4882a593Smuzhiyun usleep(100000);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
printf_connect_info(RK_WIFI_INFO_Connection_s * info)59*4882a593Smuzhiyun static void printf_connect_info(RK_WIFI_INFO_Connection_s *info)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun if(!info)
62*4882a593Smuzhiyun return;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun printf(" id: %d\n", info->id);
65*4882a593Smuzhiyun printf(" bssid: %s\n", info->bssid);
66*4882a593Smuzhiyun printf(" ssid: %s\n", info->ssid);
67*4882a593Smuzhiyun printf(" freq: %d\n", info->freq);
68*4882a593Smuzhiyun printf(" mode: %s\n", info->mode);
69*4882a593Smuzhiyun printf(" wpa_state: %s\n", info->wpa_state);
70*4882a593Smuzhiyun printf(" ip_address: %s\n", info->ip_address);
71*4882a593Smuzhiyun printf(" mac_address: %s\n", info->mac_address);
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun /*****************************************************************
75*4882a593Smuzhiyun * wifi config *
76*4882a593Smuzhiyun *****************************************************************/
77*4882a593Smuzhiyun static volatile bool rkwifi_gonff = false;
78*4882a593Smuzhiyun static RK_WIFI_RUNNING_State_e wifi_state = 0;
rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state,RK_WIFI_INFO_Connection_s * info)79*4882a593Smuzhiyun static int rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state, RK_WIFI_INFO_Connection_s *info)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun printf("%s state: %d\n", __func__, state);
82*4882a593Smuzhiyun printf_connect_info(info);
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun wifi_state = state;
85*4882a593Smuzhiyun if (state == RK_WIFI_State_CONNECTED) {
86*4882a593Smuzhiyun printf("RK_WIFI_State_CONNECTED\n");
87*4882a593Smuzhiyun //ping_test();
88*4882a593Smuzhiyun //RK_wifi_get_connected_ap_rssi();
89*4882a593Smuzhiyun } else if (state == RK_WIFI_State_CONNECTFAILED) {
90*4882a593Smuzhiyun printf("RK_WIFI_State_CONNECTFAILED\n");
91*4882a593Smuzhiyun } else if (state == RK_WIFI_State_CONNECTFAILED_WRONG_KEY) {
92*4882a593Smuzhiyun printf("RK_WIFI_State_CONNECTFAILED_WRONG_KEY\n");
93*4882a593Smuzhiyun } else if (state == RK_WIFI_State_OPEN) {
94*4882a593Smuzhiyun rkwifi_gonff = true;
95*4882a593Smuzhiyun printf("RK_WIFI_State_OPEN\n");
96*4882a593Smuzhiyun } else if (state == RK_WIFI_State_OFF) {
97*4882a593Smuzhiyun rkwifi_gonff = false;
98*4882a593Smuzhiyun printf("RK_WIFI_State_OFF\n");
99*4882a593Smuzhiyun } else if (state == RK_WIFI_State_DISCONNECTED) {
100*4882a593Smuzhiyun printf("RK_WIFI_State_DISCONNECTED\n");
101*4882a593Smuzhiyun } else if (state == RK_WIFI_State_SCAN_RESULTS) {
102*4882a593Smuzhiyun char *scan_r;
103*4882a593Smuzhiyun printf("RK_WIFI_State_SCAN_RESULTS\n");
104*4882a593Smuzhiyun scan_r = RK_wifi_scan_r();
105*4882a593Smuzhiyun //printf("%s\n", scan_r);
106*4882a593Smuzhiyun free(scan_r);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun return 0;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
rk_wifi_config_thread(void * arg)112*4882a593Smuzhiyun static void *rk_wifi_config_thread(void *arg)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun struct wifi_info *info;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun printf("rk_config_wifi_thread\n");
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun prctl(PR_SET_NAME,"rk_config_wifi_thread");
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun wifi_state = 0;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun info = (struct wifi_info *) arg;
123*4882a593Smuzhiyun RK_wifi_register_callback(rk_wifi_state_callback);
124*4882a593Smuzhiyun RK_wifi_connect(info->ssid, info->psk);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun printf("Exit wifi config thread\n");
127*4882a593Smuzhiyun return NULL;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun /*****************************************************************
131*4882a593Smuzhiyun * airkiss wifi config test *
132*4882a593Smuzhiyun *****************************************************************/
rk_wifi_airkiss_start(void * data)133*4882a593Smuzhiyun void rk_wifi_airkiss_start(void *data)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun int err = 0;
136*4882a593Smuzhiyun struct wifi_info info;
137*4882a593Smuzhiyun pthread_t tid = 0;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun memset(&info, 0, sizeof(struct wifi_info));
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun printf("===== %s =====\n", __func__);
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun //if(RK_wifi_airkiss_start(info.ssid, info.psk) < 0)
144*4882a593Smuzhiyun // return;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun wifi_state = 0;
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun err = pthread_create(&tid, NULL, rk_wifi_config_thread, &info);
149*4882a593Smuzhiyun if (err) {
150*4882a593Smuzhiyun printf("Error - pthread_create() return code: %d\n", err);
151*4882a593Smuzhiyun return;
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun while (!wifi_state)
155*4882a593Smuzhiyun sleep(1);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
rk_wifi_airkiss_stop(void * data)158*4882a593Smuzhiyun void rk_wifi_airkiss_stop(void *data)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun //RK_wifi_airkiss_stop();
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /*****************************************************************
164*4882a593Smuzhiyun * softap wifi config test *
165*4882a593Smuzhiyun *****************************************************************/
rk_wifi_softap_state_callback(RK_SOFTAP_STATE state,const char * data)166*4882a593Smuzhiyun static int rk_wifi_softap_state_callback(RK_SOFTAP_STATE state, const char* data)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun switch (state) {
169*4882a593Smuzhiyun case RK_SOFTAP_STATE_CONNECTTING:
170*4882a593Smuzhiyun printf("RK_SOFTAP_STATE_CONNECTTING\n");
171*4882a593Smuzhiyun break;
172*4882a593Smuzhiyun case RK_SOFTAP_STATE_DISCONNECT:
173*4882a593Smuzhiyun printf("RK_SOFTAP_STATE_DISCONNECT\n");
174*4882a593Smuzhiyun break;
175*4882a593Smuzhiyun case RK_SOFTAP_STATE_FAIL:
176*4882a593Smuzhiyun printf("RK_SOFTAP_STATE_FAIL\n");
177*4882a593Smuzhiyun break;
178*4882a593Smuzhiyun case RK_SOFTAP_STATE_SUCCESS:
179*4882a593Smuzhiyun printf("RK_SOFTAP_STATE_SUCCESS\n");
180*4882a593Smuzhiyun break;
181*4882a593Smuzhiyun default:
182*4882a593Smuzhiyun break;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun return 0;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
rk_wifi_softap_start(void * data)188*4882a593Smuzhiyun void rk_wifi_softap_start(void *data)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun printf("%s enter\n", __func__);
191*4882a593Smuzhiyun RK_softap_register_callback(rk_wifi_softap_state_callback);
192*4882a593Smuzhiyun if (0 != RK_softap_start("Rockchip-SoftAp", RK_SOFTAP_TCP_SERVER)) {
193*4882a593Smuzhiyun return;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun
rk_wifi_softap_stop(void * data)197*4882a593Smuzhiyun void rk_wifi_softap_stop(void *data)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun RK_softap_stop();
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
_rk_wifi_open(void * data)202*4882a593Smuzhiyun void _rk_wifi_open(void *data)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun RK_wifi_register_callback(rk_wifi_state_callback);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (RK_wifi_enable(1) < 0)
207*4882a593Smuzhiyun printf("RK_wifi_enable 1 fail!\n");
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
rk_wifi_close(void * data)210*4882a593Smuzhiyun void rk_wifi_close(void *data)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun if (RK_wifi_enable(0) < 0)
213*4882a593Smuzhiyun printf("RK_wifi_enable 0 fail!\n");
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun static int wifi_cnt = 0;
wifi_test_onff_thread(void * arg)217*4882a593Smuzhiyun void *wifi_test_onff_thread(void *arg)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun while (1) {
220*4882a593Smuzhiyun //open
221*4882a593Smuzhiyun RK_wifi_register_callback(rk_wifi_state_callback);
222*4882a593Smuzhiyun if (RK_wifi_enable(1) < 0)
223*4882a593Smuzhiyun printf("RK_wifi_enable 1 fail!\n");
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun while (rkwifi_gonff == false) {
226*4882a593Smuzhiyun sleep(1);
227*4882a593Smuzhiyun printf("%s: RKWIFI TURNING ON ...\n", __func__);
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun //scan
231*4882a593Smuzhiyun RK_wifi_scan();
232*4882a593Smuzhiyun sleep(1);
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun //close
235*4882a593Smuzhiyun printf("%s: RKWIFI DEINIT\n", __func__);
236*4882a593Smuzhiyun if (RK_wifi_enable(0) < 0)
237*4882a593Smuzhiyun printf("RK_wifi_enable 0 fail!\n");
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun while (rkwifi_gonff == true) {
240*4882a593Smuzhiyun sleep(1);
241*4882a593Smuzhiyun printf("%s: RKWIFI TURNING OFF ...\n", __func__);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun printf("%s: RKWIFI TURN ONOFF CNT: [%d] \n", __func__, wifi_cnt++);
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun static pthread_t rkwifi_init_thread = 0;
rk_wifi_openoff_test(char * data)248*4882a593Smuzhiyun void rk_wifi_openoff_test(char *data)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun printf("%s: ", __func__);
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun if (rkwifi_init_thread) {
253*4882a593Smuzhiyun printf("rkwifi_init_thread already exist\n");
254*4882a593Smuzhiyun return;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun if (pthread_create(&rkwifi_init_thread, NULL, wifi_test_onff_thread, NULL)) {
258*4882a593Smuzhiyun printf("Createrkwifi_init_thread failed\n");
259*4882a593Smuzhiyun return;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
rk_wifi_open(char * data)263*4882a593Smuzhiyun void rk_wifi_open(char *data)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun printf("%s: ", __func__);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun RK_wifi_register_callback(rk_wifi_state_callback);
268*4882a593Smuzhiyun if (RK_wifi_enable(1) < 0)
269*4882a593Smuzhiyun printf("RK_wifi_enable 1 fail!\n");
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun //9 input fish1:rk12345678
rk_wifi_connect(void * data)273*4882a593Smuzhiyun void rk_wifi_connect(void *data)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun char *ssid = NULL, *psk = NULL;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun if(data == NULL) {
278*4882a593Smuzhiyun printf("%s: invalid input\n", __func__);
279*4882a593Smuzhiyun return;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun ssid = strtok(data, ":");
283*4882a593Smuzhiyun if(ssid)
284*4882a593Smuzhiyun psk = strtok(NULL, ":");
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun if (RK_wifi_connect(ssid, psk) < 0)
287*4882a593Smuzhiyun printf("RK_wifi_connect1 fail!\n");
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
rk_wifi_connect1(void * data)290*4882a593Smuzhiyun void rk_wifi_connect1(void *data)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun char *ssid = NULL, *psk = NULL;
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun if (RK_wifi_connect1("1a~!@#%^*()=+]['\\\\\\\":\\/?.>,<", "12345678", WPA, 1) < 0)
295*4882a593Smuzhiyun printf("RK_wifi_connect1 fail!\n");
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun return;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if(data == NULL) {
300*4882a593Smuzhiyun printf("%s: invalid input\n", __func__);
301*4882a593Smuzhiyun return;
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun ssid = strtok(data, ":");
305*4882a593Smuzhiyun if(ssid)
306*4882a593Smuzhiyun psk = strtok(NULL, ":");
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun if (RK_wifi_connect(ssid, psk) < 0)
309*4882a593Smuzhiyun printf("RK_wifi_connect1 fail!\n");
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
rk_wifi_ping(void * data)312*4882a593Smuzhiyun void rk_wifi_ping(void *data)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun if (!RK_wifi_ping("www.baidu.com"))
315*4882a593Smuzhiyun printf("RK_wifi_ping fail!\n");
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
rk_wifi_scan(void * data)318*4882a593Smuzhiyun void rk_wifi_scan(void *data)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun if (RK_wifi_scan() < 0)
321*4882a593Smuzhiyun printf("RK_wifi_scan fail!\n");
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun
rk_wifi_getSavedInfo(void * data)324*4882a593Smuzhiyun void rk_wifi_getSavedInfo(void *data)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun RK_WIFI_SAVED_INFO_s *wsi;
327*4882a593Smuzhiyun int ap_cnt = 0;
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun RK_wifi_getSavedInfo(&wsi, &ap_cnt);
330*4882a593Smuzhiyun if (ap_cnt <= 0) {
331*4882a593Smuzhiyun printf("not found saved ap!\n");
332*4882a593Smuzhiyun return;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun for (int i = 0; i < ap_cnt; i++) {
336*4882a593Smuzhiyun printf("id: %d, name: %s, bssid: %s, state: %s\n",
337*4882a593Smuzhiyun wsi[i].id,
338*4882a593Smuzhiyun wsi[i].ssid,
339*4882a593Smuzhiyun wsi[i].bssid,
340*4882a593Smuzhiyun wsi[i].state);
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun if (wsi != NULL)
344*4882a593Smuzhiyun free(wsi);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
rk_wifi_getConnectionInfo(void * data)347*4882a593Smuzhiyun void rk_wifi_getConnectionInfo(void *data)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun RK_WIFI_INFO_Connection_s info;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun if(!RK_wifi_running_getConnectionInfo(&info))
352*4882a593Smuzhiyun printf_connect_info(&info);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
rk_wifi_connect_with_ssid(void * data)355*4882a593Smuzhiyun void rk_wifi_connect_with_ssid(void *data)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun if(data == NULL) {
358*4882a593Smuzhiyun printf("%s: ssid is null\n", __func__);
359*4882a593Smuzhiyun return;
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun if (RK_wifi_connect_with_ssid(data) < 0)
363*4882a593Smuzhiyun printf("RK_wifi_connect_with_ssid fail!\n");
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
rk_wifi_cancel(void * data)366*4882a593Smuzhiyun void rk_wifi_cancel(void *data)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun if (RK_wifi_cancel() < 0)
369*4882a593Smuzhiyun printf("RK_wifi_cancel fail!\n");
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun
rk_wifi_forget_with_ssid(void * data)372*4882a593Smuzhiyun void rk_wifi_forget_with_ssid(void *data)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun if(data == NULL) {
375*4882a593Smuzhiyun printf("%s: ssid is null\n", __func__);
376*4882a593Smuzhiyun return;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun if (RK_wifi_forget_with_ssid(data) < 0) {
380*4882a593Smuzhiyun printf("rk_wifi_forget_with_ssid fail!\n");
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
rk_wifi_disconnect(void * data)384*4882a593Smuzhiyun void rk_wifi_disconnect(void *data)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun RK_wifi_disconnect_network();
387*4882a593Smuzhiyun }
388