JTAG:
device_id[0..4] = 0x43 0x10 0xF 0x1
IDCode : 10f1043
uint32_t Lattice::idCode()
{
uint8_t device_id[4];
const uint8_t idcode = (_fpga_family == ECP3_FAMILY) ? ECP3_IDCODE : READ_DEVICE_ID_CODE;
wr_rd(idcode, NULL, 0, device_id, 4);
printf("device_id[0..4] = 0x%X 0x%X 0x%X 0x%X\n",device_id[0],device_id[1],device_id[2],device_id[3]);
return device_id[3] << 24 |
device_id[2] << 16 |
device_id[1] << 8 |
device_id[0];
}
Status:
r[0]..r[7]=0x0 0x1E 0x0 0x0 0x1 0x10 0x0 0x0
Register raw value: 0x100100001e00
uint64_t Lattice::readStatusReg()
{
uint64_t reg;
uint8_t rx[8], tx[8];
const int reg_len = get_statusreg_size() / 8;
const uint8_t regcode = (_fpga_family == ECP3_FAMILY) ? ECP3_READ_STATUS_REGISTER : READ_STATUS_REGISTER;
/* valgrind warn */
memset(tx, 0, 8);
memset(rx, 0, 8);
wr_rd(regcode, tx, reg_len, rx, reg_len);
_jtag->set_state(Jtag::RUN_TEST_IDLE);
_jtag->toggleClk(1000);
reg = (uint64_t) rx[7] << 56 | (uint64_t) rx[6] << 48 | (uint64_t) rx[5] << 40 | (uint64_t) rx[4] << 32 | rx[3] << 24 | rx[2] << 16 | rx[1] << 8 | rx[0];
printf("%s(%d) reg=0x%X\n",__FUNCTION__,__LINE__,reg);
printf("r[0]..r[7]=0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n",rx[0],rx[1],rx[2],rx[3],rx[4],rx[5],rx[6],rx[7]);
return reg;
}
I2C:
static int sysconfig_read_idcode(struct sysconfig_priv *priv)
{
const u8 lsc_idcode[] = SYSCONFIG_LSC_IDCODE;
u8 buf[4] = {0};
int ret;
printk("%s(%d)\n",__FUNCTION__,__LINE__);
ret = sysconfig_cmd_read(priv, lsc_idcode, sizeof(lsc_idcode),buf, sizeof(buf));
if (ret)
return ret;
printk("%s(%d) 0x%X 0x%X 0x%X 0x%X ret=%d\n",__FUNCTION__,__LINE__,buf[0],buf[1],buf[2],buf[3],ret);
return 0;
}
sysconfig_read_idcode(74) 0x01 0xF 0x10 0x43 ret=0
static int sysconfig_read_status(struct sysconfig_priv *priv, u64 *status)
{
const u8 lsc_read_status[] = SYSCONFIG_LSC_READ_STATUS;
u8 buf[8] = {0};
int ret;
ret = sysconfig_cmd_read(priv, lsc_read_status, sizeof(lsc_read_status),
buf, sizeof(buf));
if (ret)
return ret;
*status = ((u64)buf[0] << 56 |(u64)buf[1] << 48 | (u64)buf[2] << 40 | (u64)buf[3] << 32 | (u64)buf[4] << 24 |(u64)buf[5] << 16 | (u64)buf[6] << 8 | buf[7]);
return 0;
}
sysconfig_isc_enable(194) ret=0 status=0x40114800E0044B5
правильно ли я понимаю, что единственная разница это в том что у меня старший байт это buf[0] на I2C, а на JTAG buf[0] - младший байт?
Почему так сильно разнится значение статуса в обоих режимах???Может в этом проблема, что в режиме i2c что-то не так?