sysclk-lwla: Read test word twice during initialization
During initialization of the LWLA1034, read the 64-bit test word twice and verify the result of the second read only. This better matches what the original vendor software does.
This commit is contained in:
parent
3a322bbc3b
commit
e1172cf847
|
@ -191,6 +191,33 @@ SR_PRIV int lwla_read_reg(const struct sr_usb_dev_inst *usb,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SR_PRIV int lwla_read_long_reg(const struct sr_usb_dev_inst *usb,
|
||||||
|
uint32_t addr, uint64_t *value)
|
||||||
|
{
|
||||||
|
uint32_t low, high, dummy;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = lwla_write_reg(usb, REG_LONG_ADDR, addr);
|
||||||
|
if (ret != SR_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = lwla_read_reg(usb, REG_LONG_STROBE, &dummy);
|
||||||
|
if (ret != SR_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = lwla_read_reg(usb, REG_LONG_HIGH, &high);
|
||||||
|
if (ret != SR_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = lwla_read_reg(usb, REG_LONG_LOW, &low);
|
||||||
|
if (ret != SR_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
*value = ((uint64_t)high << 32) | low;
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
SR_PRIV int lwla_write_reg(const struct sr_usb_dev_inst *usb,
|
SR_PRIV int lwla_write_reg(const struct sr_usb_dev_inst *usb,
|
||||||
uint16_t reg, uint32_t value)
|
uint16_t reg, uint32_t value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -114,6 +114,9 @@ SR_PRIV int lwla_receive_reply(const struct sr_usb_dev_inst *usb,
|
||||||
SR_PRIV int lwla_read_reg(const struct sr_usb_dev_inst *usb,
|
SR_PRIV int lwla_read_reg(const struct sr_usb_dev_inst *usb,
|
||||||
uint16_t reg, uint32_t *value);
|
uint16_t reg, uint32_t *value);
|
||||||
|
|
||||||
|
SR_PRIV int lwla_read_long_reg(const struct sr_usb_dev_inst *usb,
|
||||||
|
uint32_t addr, uint64_t *value);
|
||||||
|
|
||||||
SR_PRIV int lwla_write_reg(const struct sr_usb_dev_inst *usb,
|
SR_PRIV int lwla_write_reg(const struct sr_usb_dev_inst *usb,
|
||||||
uint16_t reg, uint32_t value);
|
uint16_t reg, uint32_t value);
|
||||||
|
|
||||||
|
|
|
@ -700,9 +700,9 @@ static void LIBUSB_CALL receive_transfer_in(struct libusb_transfer *transfer)
|
||||||
*/
|
*/
|
||||||
SR_PRIV int lwla_init_device(const struct sr_dev_inst *sdi)
|
SR_PRIV int lwla_init_device(const struct sr_dev_inst *sdi)
|
||||||
{
|
{
|
||||||
|
uint64_t value;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t value;
|
|
||||||
|
|
||||||
devc = sdi->priv;
|
devc = sdi->priv;
|
||||||
|
|
||||||
|
@ -710,36 +710,23 @@ SR_PRIV int lwla_init_device(const struct sr_dev_inst *sdi)
|
||||||
devc->cur_clock_config = CONF_CLOCK_NONE;
|
devc->cur_clock_config = CONF_CLOCK_NONE;
|
||||||
|
|
||||||
ret = lwla_set_clock_config(sdi);
|
ret = lwla_set_clock_config(sdi);
|
||||||
|
|
||||||
if (ret != SR_OK)
|
if (ret != SR_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = lwla_write_reg(sdi->conn, REG_LONG_ADDR, 100);
|
ret = lwla_read_long_reg(sdi->conn, 100, &value);
|
||||||
if (ret != SR_OK)
|
if (ret != SR_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = lwla_read_reg(sdi->conn, REG_LONG_STROBE, &value);
|
/* Ignore the value returned by the first read */
|
||||||
|
ret = lwla_read_long_reg(sdi->conn, 100, &value);
|
||||||
if (ret != SR_OK)
|
if (ret != SR_OK)
|
||||||
return ret;
|
return ret;
|
||||||
sr_dbg("Received test word 0x%08X back.", value);
|
|
||||||
if (value != 0x12345678)
|
if (value != UINT64_C(0x1234567887654321)) {
|
||||||
|
sr_err("Received invalid test word 0x%16" PRIX64 ".", value);
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
|
}
|
||||||
ret = lwla_read_reg(sdi->conn, REG_LONG_HIGH, &value);
|
return SR_OK;
|
||||||
if (ret != SR_OK)
|
|
||||||
return ret;
|
|
||||||
sr_dbg("Received test word 0x%08X back.", value);
|
|
||||||
if (value != 0x12345678)
|
|
||||||
return SR_ERR;
|
|
||||||
|
|
||||||
ret = lwla_read_reg(sdi->conn, REG_LONG_LOW, &value);
|
|
||||||
if (ret != SR_OK)
|
|
||||||
return ret;
|
|
||||||
sr_dbg("Received test word 0x%08X back.", value);
|
|
||||||
if (value != 0x87654321)
|
|
||||||
return SR_ERR;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select the LWLA clock configuration. If the clock source changed from
|
/* Select the LWLA clock configuration. If the clock source changed from
|
||||||
|
|
Loading…
Reference in New Issue