| 558 | } |
| 559 | |
| 560 | SR_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); |
nothing calls this directly
no test coverage detected