/* Get gpio pin value */ static int sunxi_gpio_get(struct gpio_chip *chip, unsigned gpio) { int ret; unsigned long flags; struct sunxi_gpio_chip *sgpio = to_sunxi_gpio(chip); /* Some pins can be used as interrupt source. This */ /* works only for EINT pin mode. But you can't read */ /* pin value in this mode. So we should check mode */ /* here and then switch_input/read/switch_eint */ if (sgpio->data[gpio].info.mul_sel == sgpio->data[gpio].eint_mux) { spin_lock_irqsave(&sgpio->irq_lock, flags); SUNXI_SET_GPIO_MODE(sgpio->gaddr, sgpio->data[gpio].info.port, sgpio->data[gpio].info.port_num, SUNXI_GPIO_INPUT); ret = gpio_read_one_pin_value(sgpio->data[gpio].gpio_handler, sgpio->data[gpio].pin_name); SUNXI_SET_GPIO_MODE(sgpio->gaddr, sgpio->data[gpio].info.port, sgpio->data[gpio].info.port_num, sgpio->data[gpio].eint_mux); spin_unlock_irqrestore(&sgpio->irq_lock, flags); } else { /* "normal" pin read */ ret = gpio_read_one_pin_value(sgpio->data[gpio].gpio_handler, sgpio->data[gpio].pin_name); } return ret; }
static void sunximmc_cd_timer(unsigned long data) { struct sunxi_mmc_host *smc_host = (struct sunxi_mmc_host *)data; u32 gpio_val; u32 present; gpio_val = gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_det"); gpio_val += gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_det"); gpio_val += gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_det"); gpio_val += gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_det"); gpio_val += gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_det"); if (gpio_val==5) present = 0; else if (gpio_val==0) present = 1; else goto modtimer; // SMC_DBG("cd %d, host present %d, cur present %d\n", gpio_val, smc_host->present, present); if (smc_host->present ^ present) { SMC_MSG("mmc %d detect change, present %d\n", smc_host->pdev->id, present); smc_host->present = present; if (smc_host->present) mmc_detect_change(smc_host->mmc, msecs_to_jiffies(300)); else mmc_detect_change(smc_host->mmc, msecs_to_jiffies(10)); } else { // SMC_DBG("card detect no change\n"); } modtimer: mod_timer(&smc_host->cd_timer, jiffies + 30); return; }
static int ap6210_gpio_read(char* name) { int i = 0; int gpio = 0; int val = 0; char * gpio_name[2] = {"ap6210_wl_regon", "ap6210_bt_regon"}; for (i = 0; i < 2; i++) { if (strcmp(name, gpio_name[i]) == 0) { switch (i) { case 0: /*ap6210_wl_regon*/ gpio = ap6210_wl_regon; break; case 1: /*ap6210_bt_regon*/ gpio = ap6210_bt_regon; break; default: AP6210_ERR("no matched gpio.\n" ); } break; } } val = gpio_read_one_pin_value(gpio, name); return val; }
/* ************************************************************************************************************ * * function * * name : 一键恢复的按键检测 * * parmeters : * * return : * * note : [email protected] * * ************************************************************************************************************ */ int check_boot_recovery_key(void) { user_gpio_set_t gpio_recovery; __u32 gpio_hd; int gpio_value = 0; int ret; ret = script_parser_fetch("system", "recovery_key", (int *)&gpio_recovery, sizeof(user_gpio_set_t)/4); if (!ret) { gpio_recovery.mul_sel = 0; //强制设置成输入 gpio_hd = gpio_request(&gpio_recovery, 1); if (gpio_hd) { int k; gpio_value = 0; for(k=0;k<4;k++) { gpio_value += gpio_read_one_pin_value(gpio_hd, 0); __msdelay(5); } if (!gpio_value) { printf("set to recovery\n"); return 0; } } } return 1; }
int check_physical_key_early(void) { user_gpio_set_t gpio_recovery; __u32 gpio_hd; int ret; int gpio_value = 0; int used = 0; int mode = 0; if(uboot_spare_head.boot_data.work_mode != WORK_MODE_BOOT) { return 0; } ret = script_parser_fetch("recovery_para", "used", (int *)&used, sizeof(int) / 4); if (ret || !used) { printf("[recovery] no use\n"); return 0; } ret = script_parser_fetch("recovery_para", "recovery_key", (int *)&gpio_recovery, sizeof(user_gpio_set_t) / 4); if (!ret) { gpio_recovery.mul_sel = 0; //强制设置成输入 gpio_hd = gpio_request(&gpio_recovery, 1); if (gpio_hd) { int time; gpio_value = 0; for(time = 0; time < 4; time++) { gpio_value += gpio_read_one_pin_value(gpio_hd, 0); __msdelay(5); } if (!gpio_value) { printf("[box recovery] find the key\n"); script_parser_fetch("recovery_para", "mode", (int *)&mode, sizeof(int) / 4); if (mode == ONEKEY_USB_RECOVERY_MODE) { gd->key_pressd_value = USB_RECOVERY_KEY_VALUE; } else if (mode == ONEKEY_SPRITE_RECOVERY_MODE) { gd->key_pressd_value = SPRITE_RECOVERY_KEY_VALUE; uboot_spare_head.boot_data.work_mode = WORK_MODE_SPRITE_RECOVERY; } else { printf("[recovery] no option for one key recovery's mode (%d)\n", mode); } } } } return 0; }
int check_boot_recovery_key(void) { user_gpio_set_t gpio_recovery; __u32 gpio_hd; int ret; int gpio_value = 0; int used = 0; int mode = 0; if(uboot_spare_head.boot_data.work_mode != WORK_MODE_BOOT) { return 0; } ret = script_parser_fetch("recovery_para", "used", (int *)&used, sizeof(int) / 4); if (ret || !used) { printf("[recovery] no use\n"); return 0; } ret = script_parser_fetch("recovery_para", "recovery_key", (int *)&gpio_recovery, sizeof(user_gpio_set_t) / 4); if (!ret) { gpio_recovery.mul_sel = 0; //强制设置成输入 gpio_hd = gpio_request(&gpio_recovery, 1); if (gpio_hd) { int time; gpio_value = 0; for(time = 0; time < 4; time++) { gpio_value += gpio_read_one_pin_value(gpio_hd, 0); __msdelay(5); } if (!gpio_value) { script_parser_fetch("recovery_para", "mode", (int *)&mode, sizeof(int) / 4); if (mode == ONEKEY_USB_RECOVERY) { printf("set to one key usb recovery\n"); write_usb_recovery_to_misc(); } else if (mode == ONEKEY_SPRITE_RECOVERY) { printf("set to one key sprite recovery\n"); setenv("bootcmd", "sprite_recovery"); } else { printf("[recovery] no option for one key recovery's mode\n"); } } } } return 0; }
static int hwmw269_get_gpio_value(char* name) { struct mmc_pm_ops *ops = &mmc_card_pm_ops; if (strcmp(name, "hw_mw269x_wl_hostwake") || strcmp(name, "hw_mw269x_bt_hostwake")) { hw_msg("No gpio %s for %s\n", name, SDIO_MODULE_NAME); return -1; } return gpio_read_one_pin_value(ops->pio_hdle, name); }
static int nano_get_io_value(char* name) { struct mmc_pm_ops *ops = &mmc_card_pm_ops; char* hostwake = "swl_n20_host_wakeup"; if (strcmp(name, hostwake)) { nano_msg("No gpio %s for swl-n20\n", name); return -1; } return gpio_read_one_pin_value(ops->pio_hdle, name); }
static int usi_bm01a_get_gpio_value(char* name) { struct mmc_pm_ops *ops = &mmc_card_pm_ops; char* bt_hostwake = "usi_bm01a_bt_hostwake"; if (strcmp(name, bt_hostwake)) { usi_msg("No gpio %s for USI-BM01A\n", name); return -1; } return gpio_read_one_pin_value(ops->pio_hdle, name); }
static int bcm40181_get_io_value(char* name) { int ret = -1; struct mmc_pm_ops *ops = &mmc_card_pm_ops; if (strcmp(name, "bcm40181_wakeup")) { bcm40181_msg("No gpio %s for BCM40181\n", name); return -1; } ret = gpio_read_one_pin_value(ops->pio_hdle, name); bcm40181_msg("Succeed to get gpio %s value: %d !\n", name, ret); return ret; }
static s32 sunximmc_get_ro(struct mmc_host *mmc) { struct sunxi_mmc_host *smc_host = mmc_priv(mmc); char mmc_para[16] = {0}; int card_wp = 0; int ret; u32 gpio_val; sprintf(mmc_para, "mmc%d_para", smc_host->pdev->id); ret = script_parser_fetch(mmc_para, "sdc_use_wp", &card_wp, sizeof(int)); if (ret) { SMC_ERR("sdc fetch card write protect mode failed\n"); } if (card_wp) { gpio_val = gpio_read_one_pin_value(smc_host->pio_hdle, "sdc_wp"); SMC_DBG("sdc fetch card write protect pin status val = %d \n", gpio_val); if (!gpio_val) { smc_host->read_only = 0; return 0; } else { SMC_MSG("Card is write-protected\n"); smc_host->read_only = 1; return 1; } } else { smc_host->read_only = 0; return 0; } }