1 #include <stdlib.h>
2 #include <fcntl.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <dirent.h>
6 #include <sys/socket.h>
7 #include <unistd.h>
8 #include <poll.h>
9 #include <dirent.h>
10 #include <stdio.h>
11 #include <assert.h>
12 #include <stdbool.h>
13 #include <unistd.h>
14 #include <sys/stat.h>
15 #include <syslog.h>
16
17 #define WIFI_CHIP_TYPE_PATH "/sys/class/rkwifi/chip"
18 #define WIFI_POWER_INF "/sys/class/rkwifi/power"
19 #define WIFI_DRIVER_INF "/sys/class/rkwifi/driver"
20 #define WIFI_PRELOAD_INF "/sys/class/rkwifi/preload"
21
22 #define UNKKOWN_DRIVER_MODULE_ARG ""
23
24 #define RKWIFIBT_DEBUG
25
26 #ifdef RKWIFIBT_DEBUG
27 #define pr_debug(fmt, ...) syslog(LOG_DEBUG, fmt, ##__VA_ARGS__)
28 #define pr_info(fmt, ...) syslog(LOG_INFO, fmt, ##__VA_ARGS__)
29 #define pr_warning(fmt, ...) syslog(LOG_WARNING, fmt, ##__VA_ARGS__)
30 #define pr_err(fmt, ...) syslog(LOG_ERR, fmt, ##__VA_ARGS__)
31 #else
32 #define pr_debug
33 #define pr_info
34 #define pr_warning
35 #define pr_err
36 #endif
37
38
39 int check_wifi_chip_type(void);
40 int check_wifi_chip_type_string(char *type);
41 int rk_wifi_power_ctrl(int on);
42 int rk_wifi_load_driver(int enable);
43 int check_wireless_ready(void);
44 int get_kernel_version(void);
45
46 static int identify_sucess = -1;
47 static int rtl_usb_bt = 0;
48 static char recoginze_wifi_chip[64];
49 static const char USB_DIR[] = "/sys/bus/usb/devices";
50 static const char SDIO_DIR[]= "/sys/bus/sdio/devices";
51 static const char PCIE_DIR[]= "/sys/bus/pci/devices";
52
53 static const char PREFIX_SDIO[] = "SDIO_ID=";
54 static const char PREFIX_PCIE[] = "PCI_ID=";
55 static const char PREFIX_USB[] = "PRODUCT=";
56
57 static int invalid_wifi_device_id = -1;
58 static char wifi_type[64] = {0};
59 static char *bt_firmware_patch = {0};
60 static int wifi_dirver_is_loaded = -1;
61 static char bt_tty_dev[64] = { 0 };
62
63 typedef struct _wifi_devices
64 {
65 char wifi_name[64];
66 char wifi_vid_pid[64];
67 } wifi_device;
68
69 typedef struct _wifi_ko_file_name
70 {
71 char wifi_name[64];
72 char wifi_module_path[128];
73 char wifi_module_arg[128];
74 char bt_firmware_path[128];
75
76 } wifi_ko_file_name;
77
78 static wifi_device supported_wifi_devices[] = {
79 {"RTL8188EU", "0bda:8179"},
80 {"RTL8188EU", "0bda:0179"},
81 {"RTL8723BU", "0bda:b720"},
82 {"RTL8723BS", "024c:b723"},
83 {"RTL8822BS", "024c:b822"},
84 {"RTL8723CS", "024c:b703"},
85 {"RTL8723DS", "024c:d723"},
86 {"RTL8188FU", "0bda:f179"},
87 {"RTL8822BU", "0bda:b82c"},
88 {"RTL8189ES", "024c:8179"},
89 {"RTL8189FS", "024c:f179"},
90 {"RTL8192DU", "0bda:8194"},
91 {"RTL8812AU", "0bda:8812"},
92 {"AP6354", "02d0:4354"},
93 {"AP6330", "02d0:4330"},
94 {"AP6356S", "02d0:4356"},
95 {"AP6398S", "02d0:4359"},
96 {"AP6335", "02d0:4335"},
97 {"AP6255", "02d0:a9bf"},
98 {"AP6256", "02d0:a9bf"},
99 {"AP6212A", "02d0:a9a6"},
100 {"AP6275S", "02d0:aae8"},
101 {"AP6275P", "14e4:449d"},
102 {"RTL8822BE", "10ec:b822"},
103 {"RTL8822CE", "10ec:c822"},
104 };
105
106 // TODO: use new ANDROID_SOCKET mechanism, once support for multiple
107 // sockets is in
108 #define RTL8188EU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8188EU.ko"
109 #define RTL8723BU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8723BU.ko"
110 #define RTL8723BS_DRIVER_MODULE_PATH "/system/lib/modules/RTL8723BS.ko"
111 #define RTL8723CS_DRIVER_MODULE_PATH "/system/lib/modules/RTL8723CS.ko"
112 #define RTL8723DS_DRIVER_MODULE_PATH "/system/lib/modules/RTL8723DS.ko"
113 #define RTL8188FU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8188FU.ko"
114 #define RTL8822BU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8822BU.ko"
115 #define RTL8822BS_DRIVER_MODULE_PATH "/system/lib/modules/RTL8822BS.ko"
116 #define RTL8189ES_DRIVER_MODULE_PATH "/system/lib/modules/RTL8189ES.ko"
117 #define RTL8189FS_DRIVER_MODULE_PATH "/system/lib/modules/RTL8189FS.ko"
118 #define RTL8192DU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8192DU.ko"
119 #define RTL8812AU_DRIVER_MODULE_PATH "/system/lib/modules/RTL8812AU.ko"
120 #define RTL8822BE_DRIVER_MODULE_PATH "/system/lib/modules/RTL8822BE.ko"
121 #define RTL8822CE_DRIVER_MODULE_PATH "/system/lib/modules/RTL8822CE.ko"
122 #define BCM_DRIVER_MODULE_PATH "/system/lib/modules/bcmdhd.ko"
123 #define BCM_PCIE_DRIVER_MODULE_PATH "/system/lib/modules/bcmdhd_pcie.ko"
124 #define DRIVER_MODULE_PATH_UNKNOW ""
125
126 #define RTL8822BS_DRIVER_MODULE_NAME "8822bs"
127 #define RTL8723CS_DRIVER_MODULE_NAME "8723cs"
128 #define RTL8723DS_DRIVER_MODULE_NAME "8723ds"
129 #define RTL8188EU_DRIVER_MODULE_NAME "8188eu"
130 #define RTL8723BU_DRIVER_MODULE_NAME "8723bu"
131 #define RTL8723BS_DRIVER_MODULE_NAME "8723bs"
132 #define RTL8723BS_VQ0_DRIVER_MODULE_NAME "8723bs_vq0"
133 #define RTL8188FU_DRIVER_MODULE_NAME "8188fu"
134 #define RTL8189ES_DRIVER_MODULE_NAME "8189es"
135 #define RTL8189FS_DRIVER_MODULE_NAME "8189fs"
136 #define RTL8192DU_DRIVER_MODULE_NAME "8192du"
137 #define RTL8812AU_DRIVER_MODULE_NAME "8812au"
138 #define RTL8822CE_DRIVER_MODULE_NAME "8822ce"
139 #define BCM_DRIVER_MODULE_NAME "bcmdhd"
140
141 #define AP6330_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/rk903.hcd"
142 #define AP6212_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm43438a0.hcd"
143 #define AP6212A_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm43438a1.hcd"
144 #define AP6335_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm4339a0.hcd"
145 #define AP6255_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4345C0.hcd"
146 #define AP6256_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4345C5.hcd"
147 #define AP6354_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm4354a1.hcd"
148 #define AP6356_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4356A2.hcd"
149 #define AP6398s_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4359C0.hcd"
150 #define AP6236_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4343B0.hcd"
151 #define AP6275_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4362A2.hcd"
152 #define AP_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/"
153
154 wifi_ko_file_name module_list[] =
155 {
156 {"RTL8723BU", RTL8723BU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
157 {"RTL8188EU", RTL8188EU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
158 {"RTL8192DU", RTL8192DU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
159 {"RTL8822BU", RTL8822BU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
160 {"RTL8822BS", RTL8822BS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
161 {"RTL8188FU", RTL8188FU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
162 {"RTL8189ES", RTL8189ES_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
163 {"RTL8723BS", RTL8723BS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
164 {"RTL8723CS", RTL8723CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
165 {"RTL8723DS", RTL8723DS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, "RTL8723DS"},
166 {"RTL8812AU", RTL8812AU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
167 {"RTL8189FS", RTL8189FS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
168 {"RTL8822BE", RTL8822BE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
169 {"RTL8822CE", RTL8822CE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
170 {"AP6335", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6335_BT_FIRMWARE_MODULE_PATH},
171 {"AP6330", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6330_BT_FIRMWARE_MODULE_PATH},
172 {"AP6354", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6354_BT_FIRMWARE_MODULE_PATH},
173 {"AP6356S", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6356_BT_FIRMWARE_MODULE_PATH},
174 {"AP6255", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6255_BT_FIRMWARE_MODULE_PATH},
175 {"AP6256", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6256_BT_FIRMWARE_MODULE_PATH},
176 {"AP6212", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6212_BT_FIRMWARE_MODULE_PATH},
177 {"AP6212A", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP_BT_FIRMWARE_MODULE_PATH},
178 {"AP6356", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6356_BT_FIRMWARE_MODULE_PATH},
179 {"AP6398S", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6398s_BT_FIRMWARE_MODULE_PATH},
180 {"AP6275S", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6275_BT_FIRMWARE_MODULE_PATH},
181 {"AP6275P", BCM_PCIE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6275_BT_FIRMWARE_MODULE_PATH},
182 {"APXXX", BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""},
183 {"UNKNOW", DRIVER_MODULE_PATH_UNKNOW, UNKKOWN_DRIVER_MODULE_ARG, ""}
184
185 };
186
187 static const char RECOGNIZE_WIFI_CHIP[] = "/data/wifi_chip";
188
save_wifi_chip_type(char * type)189 int save_wifi_chip_type(char *type)
190 {
191 int ret, found;
192 int fd;
193 char buf[64];
194
195 ret = access(RECOGNIZE_WIFI_CHIP, R_OK|W_OK);
196
197 if ((ret == 0) || (errno == EACCES)) {
198 if ((ret != 0) && (chmod(RECOGNIZE_WIFI_CHIP, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) {
199 pr_info("Cannot set RW to \"%s\": %s \n", RECOGNIZE_WIFI_CHIP, strerror(errno));
200 return -1;
201 }
202 pr_info("%s is exit \n", RECOGNIZE_WIFI_CHIP);
203 return 0;
204 }
205
206 fd = open(RECOGNIZE_WIFI_CHIP, O_CREAT|O_RDWR, 0664);
207 if (fd < 0) {
208 pr_info("Cannot create \"%s\": %s", RECOGNIZE_WIFI_CHIP, strerror(errno));
209 return -1;
210 }
211
212 pr_info("%s is not exit,save wifi chip \n", RECOGNIZE_WIFI_CHIP);
213 strcpy(buf, type);
214 pr_info("recognized wifi chip = %s, save to %s \n", buf, RECOGNIZE_WIFI_CHIP);
215
216 if (write(fd, buf, strlen(buf) + 1) != (strlen(buf) + 1)) {
217 pr_info("Error writing \"%s\": %s \n", RECOGNIZE_WIFI_CHIP, strerror(errno));
218 close(fd);
219 return -1;
220 }
221
222 close(fd);
223
224 if (chmod(RECOGNIZE_WIFI_CHIP, 0664) < 0) {
225 pr_info("Error changing permissions of %s to 0664: %s \n",RECOGNIZE_WIFI_CHIP, strerror(errno));
226 unlink(RECOGNIZE_WIFI_CHIP);
227 return -1;
228 }
229
230 return 1;
231 }
232
get_wifi_device_id(const char * bus_dir,const char * prefix)233 int get_wifi_device_id(const char *bus_dir, const char *prefix)
234 {
235 int idnum;
236 int i = 0;
237 int ret = invalid_wifi_device_id;
238 DIR *dir;
239 struct dirent *next;
240 FILE *fp = NULL;
241 idnum = sizeof(supported_wifi_devices) / sizeof(supported_wifi_devices[0]);
242 dir = opendir(bus_dir);
243 if (!dir) {
244 pr_info("open dir failed: %s \n", strerror(errno));
245 return invalid_wifi_device_id;
246 }
247
248 while ((next = readdir(dir)) != NULL) {
249 char line[256];
250 char uevent_file[256] = {0};
251 sprintf(uevent_file, "%s/%s/uevent", bus_dir, next->d_name);
252 pr_info("uevent path:%s \n", uevent_file);
253 fp = fopen(uevent_file, "r");
254 if (NULL == fp) {
255 continue;
256 }
257
258 while (fgets(line, sizeof(line), fp)) {
259 char *pos = NULL;
260 int product_vid = 0;
261 int product_did = 0;
262 int producd_bcddev = 0;
263 char temp[10] = {0};
264 pos = strstr(line, prefix);
265 pr_info("line: %s, prefix: %s.\n", line, prefix);
266 if (pos != NULL) {
267 if (strncmp(bus_dir, USB_DIR, sizeof(USB_DIR)) == 0)
268 sscanf(pos + 8, "%x/%x/%x", &product_vid, &product_did, &producd_bcddev);
269 else if (strncmp(bus_dir, SDIO_DIR, sizeof(SDIO_DIR)) == 0)
270 sscanf(pos + 8, "%x:%x", &product_vid, &product_did);
271 else if (strncmp(bus_dir, PCIE_DIR, sizeof(PCIE_DIR)) == 0)
272 sscanf(pos + 7, "%x:%x", &product_vid, &product_did);
273 else
274 return invalid_wifi_device_id;
275
276 sprintf(temp, "%04x:%04x", product_vid, product_did);
277 pr_info("pid:vid : %s \n", temp);
278 for (i = 0; i < idnum; i++) {
279 if (0 == strncmp(temp, supported_wifi_devices[i].wifi_vid_pid, 9)) {
280 pr_info("found device pid:vid : %s \n", temp);
281 strcpy(recoginze_wifi_chip, supported_wifi_devices[i].wifi_name);
282 identify_sucess = 1 ;
283 ret = 0;
284 fclose(fp);
285 goto ready;
286 }
287 }
288 }
289 }
290 fclose(fp);
291 }
292
293 ret = invalid_wifi_device_id;
294 ready:
295 closedir(dir);
296 pr_info("wifi detectd return ret:%d \n", ret);
297 return ret;
298 }
299
check_wifi_chip_type_string(char * type)300 int check_wifi_chip_type_string(char *type)
301 {
302 if (identify_sucess == -1) {
303 if (get_wifi_device_id(SDIO_DIR, PREFIX_SDIO) == 0)
304 pr_info("SDIO WIFI identify sucess \n");
305 else if (get_wifi_device_id(USB_DIR, PREFIX_USB) == 0)
306 pr_info("USB WIFI identify sucess \n");
307 else if (get_wifi_device_id(PCIE_DIR, PREFIX_PCIE) == 0)
308 pr_info("PCIE WIFI identify sucess \n");
309 else {
310 pr_info("maybe there is no usb wifi or sdio or pcie wifi, set default wifi module Brocom APXXX \n");
311 strcpy(recoginze_wifi_chip, "APXXX");
312 identify_sucess = 1 ;
313 }
314 }
315
316 strcpy(type, recoginze_wifi_chip);
317 pr_info("%s: %s \n", __func__, type);
318 return 0;
319 }
320
321 /* 0 - not ready; 1 - ready. */
check_wireless_ready(void)322 int check_wireless_ready(void)
323 {
324 char line[1024], *ptr = NULL;
325 FILE *fp = NULL;
326
327 fp = fopen("/proc/net/dev", "r");
328 if (fp == NULL) {
329 pr_info("Couldn't open /proc/net/dev \n");
330 return 0;
331 }
332
333 while(fgets(line, 1024, fp)) {
334 if ((strstr(line, "wlan0:") != NULL) || (strstr(line, "p2p0:") != NULL)) {
335 pr_info("Wifi driver is ready for now... \n");
336 fclose(fp);
337 return 1;
338 }
339 }
340
341 fclose(fp);
342
343 pr_info("Wifi driver is not ready.\n");
344 return 0;
345 }
346
347 static const char BT_TEST_FILE[] = "/userdata/bt_pcba_test";
create_bt_test_file_for_brcm(void)348 static int create_bt_test_file_for_brcm(void)
349 {
350 FILE* fp;
351 char cmdline[512] = {0};
352
353 fp = fopen(BT_TEST_FILE, "wt+");
354
355 if (fp != 0) {
356 fputs("killall brcm_patchram_plus1\n", fp);
357 fputs("echo 0 > /sys/class/rfkill/rfkill0/state\n", fp);
358 fputs("echo 0 > /proc/bluetooth/sleep/btwrite\n", fp);
359 fputs("sleep 1\n", fp);
360 fputs("echo 1 > /sys/class/rfkill/rfkill0/state\n", fp);
361 fputs("echo 1 > /proc/bluetooth/sleep/btwrite\n", fp);
362 fputs("sleep 1\n", fp);
363 sprintf(cmdline, "brcm_patchram_plus1 --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram %s %s &\n", AP_BT_FIRMWARE_MODULE_PATH, bt_tty_dev);
364 fputs(cmdline, fp);
365 fputs("sleep 1\n", fp);
366 fclose(fp);
367 system("chmod 777 /userdata/bt_pcba_test");
368 system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test");
369 system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_init.sh");
370 return 0;
371 }
372 return -1;
373 }
374
create_bt_test_file_for_rtl(void)375 static int create_bt_test_file_for_rtl(void)
376 {
377 FILE* fp;
378 char cmdline[512] = {0};
379
380 fp = fopen(BT_TEST_FILE, "wt+");
381
382 if (strstr(recoginze_wifi_chip , "E")) {
383 system("chmod 777 /userdata/bt_pcba_test");
384 system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test");
385 fclose(fp);
386 return 0;
387 }
388
389 if (fp != 0) {
390 fputs("echo 0 > /sys/class/rfkill/rfkill0/state\n", fp);
391 fputs("echo 0 > /proc/bluetooth/sleep/btwrite\n", fp);
392 fputs("sleep 0.5\n", fp);
393 fputs("echo 1 > /sys/class/rfkill/rfkill0/state\n", fp);
394 fputs("echo 1 > /proc/bluetooth/sleep/btwrite\n", fp);
395 fputs("sleep 0.5\n", fp);
396
397 fputs("insmod /usr/lib/modules/hci_uart.ko\n", fp);
398 fputs("sleep 1\n", fp);
399
400 sprintf(cmdline, "rtk_hciattach -n -s 115200 %s rtk_h5 &\n", bt_tty_dev);
401 fputs(cmdline, fp);
402 fputs("sleep 0.5\n", fp);
403
404 fclose(fp);
405 system("chmod 777 /userdata/bt_pcba_test");
406 system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test");
407 return 0;
408 }
409
410 return -1;
411 }
412
wifibt_load_driver(void)413 int wifibt_load_driver(void)
414 {
415 char* wifi_ko_path = NULL ;
416 char* wifi_ko_arg =NULL;
417 int i = 0;
418 int count = 100; /* wait at most 20 seconds for completion */
419 char temp[256] = {0};
420
421 if (wifi_dirver_is_loaded == 1) {
422 return 0;
423 }
424
425 if (check_wireless_ready()) {
426 wifi_dirver_is_loaded = 1;
427 }
428
429 pr_info("%s \n", __func__);
430
431 if (wifi_type[0] == 0) {
432 check_wifi_chip_type_string(wifi_type);
433 save_wifi_chip_type(wifi_type);
434 }
435
436 for (i = 0; i < (int)(sizeof(module_list) / sizeof(module_list[0])); i++) {
437 if (!strcmp(wifi_type , module_list[i].wifi_name)) {
438 wifi_ko_path = module_list[i].wifi_module_path;
439 wifi_ko_arg = module_list[i].wifi_module_arg;
440 bt_firmware_patch = module_list[i].bt_firmware_path;
441 pr_info("%s matched ko file path %s \n", __func__, wifi_ko_path);
442 break;
443 }
444 }
445
446 if (wifi_ko_path == NULL) {
447 pr_info("%s falied to find wifi driver for type=%s \n", __func__, wifi_type);
448 return -1;
449 }
450
451 if (strstr(recoginze_wifi_chip , "AP")) {
452 if (access("/system/lib/modules/dhd_static_buf.ko", F_OK) == 0)
453 system("insmod /system/lib/modules/dhd_static_buf.ko");
454 }
455
456 usleep(500 * 1000);
457 sprintf(temp, "insmod %s %s", wifi_ko_path, wifi_ko_arg);
458 pr_info("%s %s\n", __func__, temp);
459 if (system(temp)) {
460 pr_info("%s insmod %s failed \n", __func__, wifi_ko_path);
461 return -1;
462 }
463
464 while (count-- > 0) {
465 if (check_wireless_ready())
466 break;
467 usleep(200000);
468 }
469
470 //bt init
471 if (strstr(recoginze_wifi_chip , "AP")) {
472 create_bt_test_file_for_brcm();
473 system("killall brcm_patchram_plus1");
474 memset(temp, 0, 256);
475 system("echo 0 > /sys/class/rfkill/rfkill0/state");
476 system("echo 0 > /proc/bluetooth/sleep/btwrite");
477 usleep(5000);
478 system("echo 1 > /sys/class/rfkill/rfkill0/state");
479 system("echo 1 > /proc/bluetooth/sleep/btwrite");
480 usleep(5000);
481
482 sprintf(temp, "brcm_patchram_plus1 --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram %s %s &", AP_BT_FIRMWARE_MODULE_PATH, bt_tty_dev);
483 pr_info("%s %s\n", __func__, temp);
484 if (system(temp)) {
485 pr_info("bt_init: %s failed \n", temp);
486 return -1;
487 }
488 } else if (strstr(recoginze_wifi_chip , "RTL")) {
489 create_bt_test_file_for_rtl();
490
491 if (strstr(recoginze_wifi_chip , "E")) {
492 system("insmod /system/lib/modules/rtk_btusb.ko");
493 } else {
494 system("echo 0 > /sys/class/rfkill/rfkill0/state");
495 system("echo 0 > /proc/bluetooth/sleep/btwrite");
496 usleep(5000);
497 system("echo 1 > /sys/class/rfkill/rfkill0/state");
498 system("echo 1 > /proc/bluetooth/sleep/btwrite");
499 usleep(5000);
500
501 system("insmod /usr/lib/modules/hci_uart.ko");
502 usleep(5000);
503
504 memset(temp, 0, 256);
505 sprintf(temp, "rtk_hciattach -n -s 115200 %s rtk_h5 &", bt_tty_dev);
506 system(temp);
507 usleep(5000);
508 }
509 }
510
511 return 0;
512 }
513
main(int argc,char * argv[])514 int main(int argc, char *argv[])
515 {
516 pr_info("Rockchip Linux WifiBt init (ver 2.0)\n");
517
518 strncpy(bt_tty_dev, argv[1], 10);
519 pr_info("BT TTY: %s \n", bt_tty_dev);
520
521 wifibt_load_driver();
522
523 return 0;
524 }
525