static int flash_question(struct vmm_chardev *cdev) { char ans = 0; vmm_cprintf(cdev, "Continue [Y/n]?\n"); ans = vmm_cgetc(cdev, FALSE); vmm_printf("\n"); return (ans == '\n') || (ans == 'y') || (ans == 'Y'); }
static int cmd_i2c_detect(struct vmm_chardev *cdev, int argc, char **argv) { char ans = 0; int err = VMM_OK; int mode = MODE_AUTO; int first = 0x03; int last = 0x77; unsigned int funcs = 0; struct i2c_adapter *adap = NULL; err = cmd_i2c_common(cdev, argc, argv, &adap, &funcs); if (VMM_OK != err) { return err; } if (argc >= 4) { if (!strcmp(argv[3], "read")) { mode = MODE_READ; } else if (!strcmp(argv[3], "quick")) { mode = MODE_QUICK; } else { vmm_cprintf(cdev, "Unknown mode %s\n", mode); } } if (!(funcs & (I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_READ_BYTE))) { vmm_cprintf(cdev, "Error: Bus doesn't support detection " "commands\n"); err = VMM_EFAIL; goto out; } if (mode == MODE_AUTO) { if (!(funcs & I2C_FUNC_SMBUS_QUICK)) vmm_cprintf(cdev, "Warning: Can't use SMBus Quick " "Write command, will skip some " "addresses\n"); if (!(funcs & I2C_FUNC_SMBUS_READ_BYTE)) vmm_cprintf(cdev, "Warning: Can't use SMBus Receive " "Byte command, will skip some " "addresses\n"); } vmm_cprintf(cdev, "WARNING! This program can confuse your I2C " "bus, cause data loss and worse!\n"); vmm_cprintf(cdev, "Probing %s", adap->name); if (MODE_QUICK == mode) { vmm_cprintf(cdev, " using quick write commands\n"); } else if (MODE_READ == mode) { vmm_cprintf(cdev, " using receive byte commands\n"); } else { vmm_cprintf(cdev, " (auto)\n"); } vmm_cprintf(cdev, " address range 0x%02x-0x%02x.\n", first, last); vmm_cprintf(cdev, "Continue? [Y/n] "); ans = vmm_cgetc(cdev, 0); if ('\n' != ans && 'y' != ans && 'Y' != ans) { vmm_cprintf(cdev, "Aborting on user request.\n"); goto out; } err = i2c_scan_bus(cdev, adap, mode, funcs, first, last); out: i2c_put_adapter(adap); return err; }