MCPcopy Create free account
hub / github.com/DreamSourceLab/DSView / dsl_rd_ext

Function dsl_rd_ext

libsigrok4DSL/hardware/DSL/dsl.c:560–622  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

558}
559
560SR_PRIV int dsl_rd_ext(const struct sr_dev_inst *sdi, unsigned char *ctx, uint16_t addr, uint8_t len)
561{
562 struct sr_usb_dev_inst *usb;
563 struct libusb_device_handle *hdl;
564 struct ctl_rd_cmd rd_cmd;
565 struct DSL_context *devc = sdi->priv;
566 uint8_t rdata;
567 int ret;
568
569 if (devc->profile->dev_caps.feature_caps & CAPS_FEATURE_POGOPIN) {
570 usb = sdi->conn;
571 hdl = usb->devhdl;
572
573 rd_cmd.header.dest = DSL_CTL_I2C_EXT;
574 rd_cmd.header.size = len;
575 rd_cmd.header.offset = addr;
576 rd_cmd.data = ctx;
577 if ((ret = command_ctl_rd(hdl, rd_cmd)) != SR_OK) {
578 sr_err("Sent DSL_CTL_I2C_EXT read command failed.");
579 return SR_ERR;
580 }
581 } else {
582 // write addr + wr
583 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_TXR_OFF, EI2C_AWR);
584 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STA | bmEI2C_WR);
585 // check done
586 ret = dsl_rd_reg(sdi, EI2C_ADDR+EI2C_SR_OFF, &rdata);
587 if (rdata & bmEI2C_RXNACK) {
588 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STO | bmEI2C_WR);
589 return SR_ERR;
590 }
591
592 // write offset + wr
593 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_TXR_OFF, addr);
594 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_WR);
595 // check done
596 ret = dsl_rd_reg(sdi, EI2C_ADDR+EI2C_SR_OFF, &rdata);
597 if (rdata & bmEI2C_RXNACK) {
598 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STO | bmEI2C_WR);
599 return SR_ERR;
600 }
601
602 // write read addr + wr
603 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_TXR_OFF, EI2C_ARD);
604 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STA | bmEI2C_WR);
605 // check done
606 ret = dsl_rd_reg(sdi, EI2C_ADDR+EI2C_SR_OFF, &rdata);
607 if (rdata & bmEI2C_RXNACK) {
608 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STO | bmEI2C_WR);
609 return SR_ERR;
610 }
611
612 while(--len) {
613 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_RD);
614 ret = dsl_rd_reg(sdi, EI2C_ADDR+EI2C_RXR_OFF, ctx);
615 ctx++;
616 }
617 ret = dsl_wr_reg(sdi, EI2C_ADDR+EI2C_CR_OFF, bmEI2C_STO | bmEI2C_RD | bmEI2C_NACK);

Callers

nothing calls this directly

Calls 3

command_ctl_rdFunction · 0.85
dsl_wr_regFunction · 0.85
dsl_rd_regFunction · 0.85

Tested by

no test coverage detected