SR_PRIV void hung_chang_dso_2100_write_mbox(struct parport *port, uint8_t val) { sr_dbg("mbox <= %X", val); ieee1284_write_control(port, C1284_NSTROBE | C1284_NINIT | C1284_NSELECTIN); ieee1284_data_dir(port, 0); ieee1284_write_data(port, val); ieee1284_write_control(port, C1284_NINIT | C1284_NSELECTIN); ieee1284_write_control(port, C1284_NSTROBE | C1284_NINIT | C1284_NSELECTIN); ieee1284_data_dir(port, 1); ieee1284_write_control(port, C1284_NSTROBE | C1284_NAUTOFD | C1284_NINIT | C1284_NSELECTIN); }
static int dev_open(struct sr_dev_inst *sdi) { struct dev_context *devc = sdi->priv; int i; if (ieee1284_open(sdi->conn, 0, &i) != E1284_OK) goto fail1; if (ieee1284_claim(sdi->conn) != E1284_OK) goto fail2; if (ieee1284_data_dir(sdi->conn, 1) != E1284_OK) goto fail3; if (hung_chang_dso_2100_move_to(sdi, 1)) goto fail3; devc->samples = g_try_malloc(1000 * sizeof(*devc->samples)); if (!devc->samples) goto fail3; return SR_OK; fail3: hung_chang_dso_2100_reset_port(sdi->conn); ieee1284_release(sdi->conn); fail2: ieee1284_close(sdi->conn); fail1: return SR_ERR; }
SR_PRIV gboolean hung_chang_dso_2100_check_id(struct parport *port) { gboolean ret = FALSE; if (ieee1284_data_dir(port, 1) != E1284_OK) goto fail; ieee1284_write_control(port, C1284_NSTROBE | C1284_NAUTOFD | C1284_NSELECTIN); ieee1284_write_control(port, C1284_NAUTOFD | C1284_NSELECTIN); if (ieee1284_read_data(port) != 0x55) goto fail; ret = TRUE; fail: hung_chang_dso_2100_reset_port(port); return ret; }
SR_PRIV void hung_chang_dso_2100_reset_port(struct parport *port) { ieee1284_write_control(port, C1284_NSTROBE | C1284_NAUTOFD | C1284_NSELECTIN); ieee1284_data_dir(port, 0); }