#include <stdlib.h> 
 | 
#include <fcntl.h> 
 | 
#include <errno.h> 
 | 
#include <string.h> 
 | 
#include <dirent.h> 
 | 
#include <sys/socket.h> 
 | 
#include <unistd.h> 
 | 
#include <poll.h> 
 | 
#include <dirent.h> 
 | 
#include <stdio.h> 
 | 
#include <assert.h> 
 | 
#include <stdbool.h> 
 | 
#include <unistd.h> 
 | 
#include <sys/stat.h> 
 | 
#include <syslog.h> 
 | 
  
 | 
#define WIFI_CHIP_TYPE_PATH    "/sys/class/rkwifi/chip" 
 | 
#define WIFI_POWER_INF        "/sys/class/rkwifi/power" 
 | 
#define WIFI_DRIVER_INF        "/sys/class/rkwifi/driver" 
 | 
#define WIFI_PRELOAD_INF    "/sys/class/rkwifi/preload" 
 | 
  
 | 
#define UNKKOWN_DRIVER_MODULE_ARG "" 
 | 
  
 | 
#define RKWIFIBT_DEBUG 
 | 
  
 | 
#ifdef RKWIFIBT_DEBUG 
 | 
#define pr_debug(fmt, ...)        syslog(LOG_DEBUG, fmt, ##__VA_ARGS__) 
 | 
#define pr_info(fmt, ...)        syslog(LOG_INFO, fmt, ##__VA_ARGS__) 
 | 
#define pr_warning(fmt, ...)    syslog(LOG_WARNING, fmt, ##__VA_ARGS__) 
 | 
#define pr_err(fmt, ...)        syslog(LOG_ERR, fmt, ##__VA_ARGS__) 
 | 
#else 
 | 
#define pr_debug 
 | 
#define pr_info 
 | 
#define pr_warning 
 | 
#define pr_err 
 | 
#endif 
 | 
  
 | 
  
 | 
int check_wifi_chip_type(void); 
 | 
int check_wifi_chip_type_string(char *type); 
 | 
int rk_wifi_power_ctrl(int on); 
 | 
int rk_wifi_load_driver(int enable); 
 | 
int check_wireless_ready(void); 
 | 
int get_kernel_version(void); 
 | 
  
 | 
static int identify_sucess = -1; 
 | 
static int rtl_usb_bt = 0; 
 | 
static char recoginze_wifi_chip[64]; 
 | 
static const char USB_DIR[] = "/sys/bus/usb/devices"; 
 | 
static const char SDIO_DIR[]= "/sys/bus/sdio/devices"; 
 | 
static const char PCIE_DIR[]= "/sys/bus/pci/devices"; 
 | 
  
 | 
static const char PREFIX_SDIO[] = "SDIO_ID="; 
 | 
static const char PREFIX_PCIE[] = "PCI_ID="; 
 | 
static const char PREFIX_USB[] = "PRODUCT="; 
 | 
  
 | 
static int invalid_wifi_device_id = -1; 
 | 
static char wifi_type[64] = {0}; 
 | 
static char *bt_firmware_patch = {0}; 
 | 
static int wifi_dirver_is_loaded = -1; 
 | 
static char bt_tty_dev[64] = { 0 }; 
 | 
  
 | 
typedef struct _wifi_devices 
 | 
{ 
 | 
  char wifi_name[64]; 
 | 
  char wifi_vid_pid[64]; 
 | 
} wifi_device; 
 | 
  
 | 
typedef struct _wifi_ko_file_name 
 | 
{ 
 | 
    char wifi_name[64]; 
 | 
    char wifi_module_path[128]; 
 | 
    char wifi_module_arg[128]; 
 | 
    char bt_firmware_path[128]; 
 | 
  
 | 
} wifi_ko_file_name; 
 | 
  
 | 
static wifi_device supported_wifi_devices[] = { 
 | 
    {"RTL8188EU",    "0bda:8179"}, 
 | 
    {"RTL8188EU",    "0bda:0179"}, 
 | 
    {"RTL8723BU",    "0bda:b720"}, 
 | 
    {"RTL8723BS",    "024c:b723"}, 
 | 
    {"RTL8822BS",    "024c:b822"}, 
 | 
    {"RTL8723CS",    "024c:b703"}, 
 | 
    {"RTL8723DS",    "024c:d723"}, 
 | 
    {"RTL8188FU",    "0bda:f179"}, 
 | 
    {"RTL8822BU",    "0bda:b82c"}, 
 | 
    {"RTL8189ES",    "024c:8179"}, 
 | 
    {"RTL8189FS",    "024c:f179"}, 
 | 
    {"RTL8192DU",    "0bda:8194"}, 
 | 
    {"RTL8812AU",    "0bda:8812"}, 
 | 
    {"AP6354",        "02d0:4354"}, 
 | 
    {"AP6330",        "02d0:4330"}, 
 | 
    {"AP6356S",        "02d0:4356"}, 
 | 
    {"AP6398S",        "02d0:4359"}, 
 | 
    {"AP6335",        "02d0:4335"}, 
 | 
    {"AP6255",      "02d0:a9bf"}, 
 | 
    {"AP6212A",     "02d0:a9a6"}, 
 | 
    {"AP6275S",     "02d0:aae8"}, 
 | 
    {"AP6275P",     "14e4:449d"}, 
 | 
    {"RTL8822BE",    "10ec:b822"}, 
 | 
    {"RTL8822CE",    "10ec:c822"}, 
 | 
}; 
 | 
  
 | 
// TODO: use new ANDROID_SOCKET mechanism, once support for multiple 
 | 
// sockets is in 
 | 
#define RTL8188EU_DRIVER_MODULE_PATH "/system/lib/modules/8188eu.ko" 
 | 
#define RTL8723BU_DRIVER_MODULE_PATH "/system/lib/modules/8723bu.ko" 
 | 
#define RTL8723BS_DRIVER_MODULE_PATH "/system/lib/modules/8723bs.ko" 
 | 
#define RTL8723BS_VQ0_DRIVER_MODULE_PATH "/system/lib/modules/8723bs-vq0.ko" 
 | 
#define RTL8723CS_DRIVER_MODULE_PATH "/system/lib/modules/8723cs.ko" 
 | 
#define RTL8723DS_DRIVER_MODULE_PATH "/system/lib/modules/8723ds.ko" 
 | 
#define RTL8188FU_DRIVER_MODULE_PATH "/system/lib/modules/8188fu.ko" 
 | 
#define RTL8822BU_DRIVER_MODULE_PATH "/system/lib/modules/8822bu.ko" 
 | 
#define RTL8822BS_DRIVER_MODULE_PATH "/system/lib/modules/8822bs.ko" 
 | 
#define RTL8189ES_DRIVER_MODULE_PATH "/system/lib/modules/8189es.ko" 
 | 
#define RTL8189FS_DRIVER_MODULE_PATH "/system/lib/modules/8189fs.ko" 
 | 
#define RTL8192DU_DRIVER_MODULE_PATH "/system/lib/modules/8192du.ko" 
 | 
#define RTL8812AU_DRIVER_MODULE_PATH "/system/lib/modules/8812au.ko" 
 | 
#define RTL8822BE_DRIVER_MODULE_PATH "/system/lib/modules/8822be.ko" 
 | 
#define RTL8822CE_DRIVER_MODULE_PATH "/system/lib/modules/8822ce.ko" 
 | 
#define BCM_DRIVER_MODULE_PATH       "/system/lib/modules/bcmdhd.ko" 
 | 
#define BCM_PCIE_DRIVER_MODULE_PATH   "/system/lib/modules/bcmdhd.ko" 
 | 
#define DRIVER_MODULE_PATH_UNKNOW    "" 
 | 
  
 | 
#define RTL8822BS_DRIVER_MODULE_NAME "8822bs" 
 | 
#define RTL8723CS_DRIVER_MODULE_NAME "8723cs" 
 | 
#define RTL8723DS_DRIVER_MODULE_NAME "8723ds" 
 | 
#define RTL8188EU_DRIVER_MODULE_NAME "8188eu" 
 | 
#define RTL8723BU_DRIVER_MODULE_NAME "8723bu" 
 | 
#define RTL8723BS_DRIVER_MODULE_NAME "8723bs" 
 | 
#define RTL8723BS_VQ0_DRIVER_MODULE_NAME "8723bs_vq0" 
 | 
#define RTL8188FU_DRIVER_MODULE_NAME "8188fu" 
 | 
#define RTL8189ES_DRIVER_MODULE_NAME "8189es" 
 | 
#define RTL8189FS_DRIVER_MODULE_NAME "8189fs" 
 | 
#define RTL8192DU_DRIVER_MODULE_NAME "8192du" 
 | 
#define RTL8812AU_DRIVER_MODULE_NAME "8812au" 
 | 
#define RTL8822CE_DRIVER_MODULE_NAME "8822ce" 
 | 
#define BCM_DRIVER_MODULE_NAME       "bcmdhd" 
 | 
  
 | 
#define AP6330_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/rk903.hcd" 
 | 
#define AP6212_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm43438a0.hcd" 
 | 
#define AP6212A_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm43438a1.hcd" 
 | 
#define AP6335_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm4339a0.hcd" 
 | 
#define AP6255_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4345C0.hcd" 
 | 
#define AP6354_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/bcm4354a1.hcd" 
 | 
#define AP6356_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4356A2.hcd" 
 | 
#define AP6398s_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4359C0.hcd" 
 | 
#define AP6236_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4343B0.hcd" 
 | 
#define AP6275_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/BCM4362A2.hcd" 
 | 
#define AP_BT_FIRMWARE_MODULE_PATH "/system/etc/firmware/" 
 | 
  
 | 
wifi_ko_file_name module_list[] = 
 | 
{ 
 | 
    {"RTL8723BU", RTL8723BU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8188EU", RTL8188EU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8192DU", RTL8192DU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8822BU", RTL8822BU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8822BS", RTL8822BS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8188FU", RTL8188FU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8189ES", RTL8189ES_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8723BS", RTL8723BS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8723CS", RTL8723CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8723DS", RTL8723DS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, "RTL8723DS"}, 
 | 
    {"RTL8812AU", RTL8812AU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8189FS", RTL8189FS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8822BE", RTL8822BE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"RTL8822CE", RTL8822CE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"AP6335",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6335_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6330",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6330_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6354",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6354_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6356S",         BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6356_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6255",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6255_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6212",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6212_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6212A",         BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6356",          BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6356_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6398S",         BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6398s_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6275S",         BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6275_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"AP6275P",         BCM_PCIE_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, AP6275_BT_FIRMWARE_MODULE_PATH}, 
 | 
    {"APXXX",           BCM_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG, ""}, 
 | 
    {"UNKNOW",       DRIVER_MODULE_PATH_UNKNOW, UNKKOWN_DRIVER_MODULE_ARG, ""} 
 | 
  
 | 
}; 
 | 
  
 | 
static const char RECOGNIZE_WIFI_CHIP[] = "/data/wifi_chip"; 
 | 
  
 | 
int save_wifi_chip_type(char *type) 
 | 
{ 
 | 
    int ret, found; 
 | 
    int fd; 
 | 
    char buf[64]; 
 | 
  
 | 
    ret = access(RECOGNIZE_WIFI_CHIP, R_OK|W_OK); 
 | 
  
 | 
    if ((ret == 0) || (errno == EACCES)) { 
 | 
        if ((ret != 0) && (chmod(RECOGNIZE_WIFI_CHIP, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) { 
 | 
            pr_info("Cannot set RW to \"%s\": %s \n", RECOGNIZE_WIFI_CHIP, strerror(errno)); 
 | 
            return -1; 
 | 
        } 
 | 
        pr_info("%s is exit \n", RECOGNIZE_WIFI_CHIP); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    fd = open(RECOGNIZE_WIFI_CHIP, O_CREAT|O_RDWR, 0664); 
 | 
    if (fd < 0) { 
 | 
        pr_info("Cannot create \"%s\": %s", RECOGNIZE_WIFI_CHIP, strerror(errno)); 
 | 
        return -1; 
 | 
    } 
 | 
  
 | 
    pr_info("%s is not exit,save wifi chip \n", RECOGNIZE_WIFI_CHIP); 
 | 
    strcpy(buf, type); 
 | 
    pr_info("recognized wifi chip = %s, save to %s \n", buf, RECOGNIZE_WIFI_CHIP); 
 | 
  
 | 
    if (write(fd, buf, strlen(buf) + 1) != (strlen(buf) + 1)) { 
 | 
        pr_info("Error writing \"%s\": %s \n", RECOGNIZE_WIFI_CHIP, strerror(errno)); 
 | 
        close(fd); 
 | 
        return -1; 
 | 
    } 
 | 
  
 | 
    close(fd); 
 | 
  
 | 
    if (chmod(RECOGNIZE_WIFI_CHIP, 0664) < 0) { 
 | 
        pr_info("Error changing permissions of %s to 0664: %s \n",RECOGNIZE_WIFI_CHIP, strerror(errno)); 
 | 
        unlink(RECOGNIZE_WIFI_CHIP); 
 | 
        return -1; 
 | 
    } 
 | 
  
 | 
    return 1; 
 | 
} 
 | 
  
 | 
int get_wifi_device_id(const char *bus_dir, const char *prefix) 
 | 
{ 
 | 
    int idnum; 
 | 
    int i = 0; 
 | 
    int ret = invalid_wifi_device_id; 
 | 
    DIR *dir; 
 | 
    struct dirent *next; 
 | 
    FILE *fp = NULL; 
 | 
    idnum = sizeof(supported_wifi_devices) / sizeof(supported_wifi_devices[0]); 
 | 
    dir = opendir(bus_dir); 
 | 
    if (!dir) { 
 | 
        pr_info("open dir failed: %s \n", strerror(errno)); 
 | 
        return invalid_wifi_device_id; 
 | 
    } 
 | 
  
 | 
    while ((next = readdir(dir)) != NULL) { 
 | 
        char line[256]; 
 | 
        char uevent_file[256] = {0}; 
 | 
        sprintf(uevent_file, "%s/%s/uevent", bus_dir, next->d_name); 
 | 
        pr_info("uevent path:%s \n", uevent_file); 
 | 
        fp = fopen(uevent_file, "r"); 
 | 
        if (NULL == fp) { 
 | 
            continue; 
 | 
        } 
 | 
  
 | 
        while (fgets(line, sizeof(line), fp)) { 
 | 
            char *pos = NULL; 
 | 
            int product_vid = 0; 
 | 
            int product_did = 0; 
 | 
            int producd_bcddev = 0; 
 | 
            char temp[10] = {0}; 
 | 
            pos = strstr(line, prefix); 
 | 
            pr_info("line: %s, prefix: %s.\n", line, prefix); 
 | 
            if (pos != NULL) { 
 | 
                if (strncmp(bus_dir, USB_DIR, sizeof(USB_DIR)) == 0) 
 | 
                    sscanf(pos + 8, "%x/%x/%x", &product_vid, &product_did, &producd_bcddev); 
 | 
                else if (strncmp(bus_dir, SDIO_DIR, sizeof(SDIO_DIR)) == 0) 
 | 
                    sscanf(pos + 8, "%x:%x", &product_vid, &product_did); 
 | 
                else if (strncmp(bus_dir, PCIE_DIR, sizeof(PCIE_DIR)) == 0) 
 | 
                    sscanf(pos + 7, "%x:%x", &product_vid, &product_did); 
 | 
                else 
 | 
                    return invalid_wifi_device_id; 
 | 
  
 | 
                sprintf(temp, "%04x:%04x", product_vid, product_did); 
 | 
                pr_info("pid:vid : %s \n", temp); 
 | 
                for (i = 0; i < idnum; i++) { 
 | 
                    if (0 == strncmp(temp, supported_wifi_devices[i].wifi_vid_pid, 9)) { 
 | 
                        pr_info("found device pid:vid : %s \n", temp); 
 | 
                        strcpy(recoginze_wifi_chip, supported_wifi_devices[i].wifi_name); 
 | 
                        identify_sucess = 1 ; 
 | 
                        ret = 0; 
 | 
                        fclose(fp); 
 | 
                        goto ready; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        fclose(fp); 
 | 
    } 
 | 
  
 | 
    ret = invalid_wifi_device_id; 
 | 
ready: 
 | 
    closedir(dir); 
 | 
    pr_info("wifi detectd return ret:%d \n", ret); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
int check_wifi_chip_type_string(char *type) 
 | 
{ 
 | 
    if (identify_sucess == -1) { 
 | 
        if (get_wifi_device_id(SDIO_DIR, PREFIX_SDIO) == 0) 
 | 
            pr_info("SDIO WIFI identify sucess \n"); 
 | 
        else if (get_wifi_device_id(USB_DIR, PREFIX_USB) == 0) 
 | 
            pr_info("USB WIFI identify sucess \n"); 
 | 
        else if (get_wifi_device_id(PCIE_DIR, PREFIX_PCIE) == 0) 
 | 
            pr_info("PCIE WIFI identify sucess \n"); 
 | 
        else { 
 | 
            pr_info("maybe there is no usb wifi or sdio or pcie wifi, set default wifi module Brocom APXXX \n"); 
 | 
            strcpy(recoginze_wifi_chip, "APXXX"); 
 | 
            identify_sucess = 1 ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    strcpy(type, recoginze_wifi_chip); 
 | 
    pr_info("%s: %s \n", __func__, type); 
 | 
    return 0; 
 | 
} 
 | 
  
 | 
/* 0 - not ready; 1 - ready. */ 
 | 
int check_wireless_ready(void) 
 | 
{ 
 | 
    char line[1024], *ptr = NULL; 
 | 
    FILE *fp = NULL; 
 | 
  
 | 
    fp = fopen("/proc/net/dev", "r"); 
 | 
    if (fp == NULL) { 
 | 
        pr_info("Couldn't open /proc/net/dev \n"); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    while(fgets(line, 1024, fp)) { 
 | 
        if ((strstr(line, "wlan0:") != NULL) || (strstr(line, "p2p0:") != NULL)) { 
 | 
            pr_info("Wifi driver is ready for now... \n"); 
 | 
            fclose(fp); 
 | 
            return 1; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    fclose(fp); 
 | 
  
 | 
    pr_info("Wifi driver is not ready.\n"); 
 | 
    return 0; 
 | 
} 
 | 
  
 | 
static const char BT_TEST_FILE[] = "/userdata/bt_pcba_test"; 
 | 
static int create_bt_test_file_for_brcm(void) 
 | 
{ 
 | 
    FILE* fp; 
 | 
    char cmdline[512] = {0}; 
 | 
  
 | 
    fp = fopen(BT_TEST_FILE, "wt+"); 
 | 
  
 | 
    if (fp != 0) { 
 | 
        fputs("echo 0 > /sys/class/rfkill/rfkill0/state\n", fp); 
 | 
        fputs("echo 0 > /proc/bluetooth/sleep/btwrite\n", fp); 
 | 
        fputs("sleep 1\n", fp); 
 | 
        fputs("echo 1 > /sys/class/rfkill/rfkill0/state\n", fp); 
 | 
        fputs("echo 1 > /proc/bluetooth/sleep/btwrite\n", fp); 
 | 
        fputs("sleep 1\n", fp); 
 | 
        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); 
 | 
        fputs(cmdline, fp); 
 | 
        fputs("sleep 1\n", fp); 
 | 
        fclose(fp); 
 | 
        system("chmod 777 /userdata/bt_pcba_test"); 
 | 
        system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test"); 
 | 
        return 0; 
 | 
    } 
 | 
    return -1; 
 | 
} 
 | 
  
 | 
static int create_bt_test_file_for_rtl(void) 
 | 
{ 
 | 
    FILE* fp; 
 | 
    char cmdline[512] = {0}; 
 | 
  
 | 
    fp = fopen(BT_TEST_FILE, "wt+"); 
 | 
  
 | 
    if (strstr(recoginze_wifi_chip , "E")) { 
 | 
        system("chmod 777 /userdata/bt_pcba_test"); 
 | 
        system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test"); 
 | 
        fclose(fp); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    if (fp != 0) { 
 | 
        fputs("echo 0 > /sys/class/rfkill/rfkill0/state\n", fp); 
 | 
        fputs("echo 0 > /proc/bluetooth/sleep/btwrite\n", fp); 
 | 
        fputs("sleep 0.5\n", fp); 
 | 
        fputs("echo 1 > /sys/class/rfkill/rfkill0/state\n", fp); 
 | 
        fputs("echo 1 > /proc/bluetooth/sleep/btwrite\n", fp); 
 | 
        fputs("sleep 0.5\n", fp); 
 | 
  
 | 
        fputs("insmod /usr/lib/modules/hci_uart.ko\n", fp); 
 | 
        fputs("sleep 1\n", fp); 
 | 
  
 | 
        sprintf(cmdline, "rtk_hciattach -n -s 115200 %s rtk_h5 &\n", bt_tty_dev); 
 | 
        fputs(cmdline, fp); 
 | 
        fputs("sleep 0.5\n", fp); 
 | 
  
 | 
        fclose(fp); 
 | 
        system("chmod 777 /userdata/bt_pcba_test"); 
 | 
        system("mount --bind /userdata/bt_pcba_test /usr/bin/bt_pcba_test"); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    return -1; 
 | 
} 
 | 
  
 | 
int wifibt_load_driver(void) 
 | 
{ 
 | 
    char* wifi_ko_path = NULL ; 
 | 
    char* wifi_ko_arg =NULL; 
 | 
    int i = 0; 
 | 
    int count = 100; /* wait at most 20 seconds for completion */ 
 | 
    char temp[256] = {0}; 
 | 
  
 | 
    if (wifi_dirver_is_loaded == 1) { 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    if (check_wireless_ready()) { 
 | 
        wifi_dirver_is_loaded = 1; 
 | 
    } 
 | 
  
 | 
    pr_info("%s \n", __func__); 
 | 
  
 | 
    if (wifi_type[0] == 0) { 
 | 
        check_wifi_chip_type_string(wifi_type); 
 | 
        save_wifi_chip_type(wifi_type); 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < (int)(sizeof(module_list) / sizeof(module_list[0])); i++) { 
 | 
        if (!strcmp(wifi_type , module_list[i].wifi_name)) { 
 | 
            wifi_ko_path = module_list[i].wifi_module_path; 
 | 
            wifi_ko_arg = module_list[i].wifi_module_arg; 
 | 
            bt_firmware_patch = module_list[i].bt_firmware_path; 
 | 
            pr_info("%s matched ko file path  %s \n", __func__, wifi_ko_path); 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if (wifi_ko_path == NULL) { 
 | 
        pr_info("%s falied to find wifi driver for type=%s \n", __func__, wifi_type); 
 | 
        return -1; 
 | 
    } 
 | 
  
 | 
    sprintf(temp, "insmod %s %s", wifi_ko_path, wifi_ko_arg); 
 | 
    pr_info("%s %s\n", __func__, temp); 
 | 
    if (system(temp)) { 
 | 
        pr_info("%s insmod %s failed \n", __func__, wifi_ko_path); 
 | 
        return -1; 
 | 
    } 
 | 
  
 | 
    while (count-- > 0) { 
 | 
        if (check_wireless_ready()) 
 | 
            break; 
 | 
        usleep(200000); 
 | 
    } 
 | 
  
 | 
    //bt init 
 | 
    if (strstr(recoginze_wifi_chip , "AP")) { 
 | 
        create_bt_test_file_for_brcm(); 
 | 
        memset(temp, 0, 256); 
 | 
        system("echo 0 > /sys/class/rfkill/rfkill0/state"); 
 | 
        system("echo 0 > /proc/bluetooth/sleep/btwrite"); 
 | 
        usleep(5000); 
 | 
        system("echo 1 > /sys/class/rfkill/rfkill0/state"); 
 | 
        system("echo 1 > /proc/bluetooth/sleep/btwrite"); 
 | 
        usleep(5000); 
 | 
  
 | 
        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); 
 | 
        pr_info("%s %s\n", __func__, temp); 
 | 
        if (system(temp)) { 
 | 
            pr_info("bt_init: %s failed \n", temp); 
 | 
            return -1; 
 | 
        } 
 | 
    } else if (strstr(recoginze_wifi_chip , "RTL")) { 
 | 
        create_bt_test_file_for_rtl(); 
 | 
  
 | 
        if (strstr(recoginze_wifi_chip , "E")) { 
 | 
            system("insmod /system/lib/modules/rtk_btusb.ko"); 
 | 
        } else { 
 | 
            system("echo 0 > /sys/class/rfkill/rfkill0/state"); 
 | 
            system("echo 0 > /proc/bluetooth/sleep/btwrite"); 
 | 
            usleep(5000); 
 | 
            system("echo 1 > /sys/class/rfkill/rfkill0/state"); 
 | 
            system("echo 1 > /proc/bluetooth/sleep/btwrite"); 
 | 
            usleep(5000); 
 | 
  
 | 
            system("insmod /usr/lib/modules/hci_uart.ko"); 
 | 
            usleep(5000); 
 | 
  
 | 
            memset(temp, 0, 256); 
 | 
            sprintf(temp, "rtk_hciattach -n -s 115200 %s rtk_h5 &", bt_tty_dev); 
 | 
            system(temp); 
 | 
            usleep(5000); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    return 0; 
 | 
} 
 | 
  
 | 
int main(int argc, char *argv[]) 
 | 
{ 
 | 
    pr_info("Rockchip Linux WifiBt init (ver 1.0)\n"); 
 | 
  
 | 
    strncpy(bt_tty_dev, argv[1], 10); 
 | 
    pr_info("BT TTY: %s \n", bt_tty_dev); 
 | 
  
 | 
    wifibt_load_driver(); 
 | 
  
 | 
    return 0; 
 | 
} 
 |