#include #include #include #include #include #include #include #include #define USB_POWER_UP _IO('m', 1) #define USB_POWER_DOWN _IO('m', 2) #define SDIO_POWER_UP _IO('m', 3) #define SDIO_POWER_DOWN _IO('m', 4) #define SDIO_POWER_DOWN _IO('m', 4) #define SDIO_GET_DEV_TYPE _IO('m', 5) char dev_type[128] = {0}; bool set_wifi_power(int on) { int fd; bool ret = true; fd = open("/dev/wifi_power", O_RDWR); if (fd < 0) { fprintf(stderr, "Device open failed !!!\n"); return false; } switch (on) { case 0: { if (ioctl(fd, SDIO_POWER_DOWN) < 0) { if (ioctl(fd, USB_POWER_DOWN) < 0) { fprintf(stderr, "Set Wi-Fi power down error!!!\n"); ret = false; } } } break; case 1: { if (ioctl(fd, SDIO_POWER_UP) < 0) { if (ioctl(fd, USB_POWER_UP) < 0) { fprintf(stderr, "Set Wi-Fi power up error!!!\n"); ret = false; } } } break; case 2: { if (ioctl(fd, SDIO_GET_DEV_TYPE, dev_type) < 0) { fprintf(stderr, "Failed to get dev type!!!\n"); ret = false; } else fprintf(stdout, "inf=%s\n", dev_type); } break; default: fprintf(stderr, "Invalid command %d\n", on); ret = false; } close(fd); return ret; } /* * return 1 is pci, other is sdio or usb */ int check_is_pci_module() { char file_name[100]; char pci_buf[20]; FILE *fp; int i; for (i = 0; i < 5; i++) { memset(file_name,'\0',sizeof(file_name)); sprintf(file_name, "/sys/bus/pci/devices/0000:0%d:00.0/device", i); fp = fopen(file_name, "r"); if (!fp) continue; memset(pci_buf,0,sizeof(pci_buf)); if (fread(pci_buf, 1,20,fp) < 1) { fclose(fp); continue; } fclose(fp); return 1; } if (i == 5) return 0; } int main(int argc, char *argv[]) { long value = 0; if (argc < 2) { fprintf(stderr, "wrong number of arguments\n"); return -1; } value = strtol(argv[1], NULL, 10); if (check_is_pci_module()) { fprintf(stderr, "PCIE modules need`t set wifi power\n"); return 0; } if (!set_wifi_power(value)) { return -1; } if (value == 1 && argc > 2) { const char *interface_name = argv[2]; int wait_time = 100; char fpath[64]; snprintf(fpath, sizeof(fpath), "/sys/class/net/%s", interface_name); do { if (access(fpath, 0) == 0) break; usleep(50000); } while (wait_time--); if (wait_time < 0) { fprintf(stderr, "wait for interface [%s] timeout\n", interface_name); return -1; } } return 0; }