2
0
forked from Ivasoft/DSView

Suports new hardware

This commit is contained in:
dreamsourcelabTAI
2022-12-12 15:58:05 +08:00
parent 2c07623bfa
commit 2532ad4c10
5 changed files with 185 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -48,6 +48,8 @@
#define bmWR_WORDWIDE (1 << 0)
#define VTH_ADDR 0x78
#define SEC_DATA_ADDR 0x75
#define SEC_CTRL_ADDR 0x73
#define CTR1_ADDR 0x71
#define CTR0_ADDR 0x70
#define COMB_ADDR 0x68
@@ -55,6 +57,14 @@
#define ADCC_ADDR 0x48
#define HDL_VERSION_ADDR 0x04
#define bmSECU_READY (1 << 3)
#define bmSECU_PASS (1 << 4)
#define SECU_STEPS 8
#define SECU_START 0x0513
#define SECU_CHECK 0x0219
#define SECU_EEP_ADDR 0x3C00
#define SECU_TRY_CNT 8
#define EI2C_CTR_OFF 0x2
#define EI2C_RXR_OFF 0x3
#define EI2C_SR_OFF 0x4

View File

@@ -30,6 +30,13 @@
#undef LOG_PREFIX
#define LOG_PREFIX "dsl: "
SR_PRIV int dsl_secuReset(const struct sr_dev_inst *sdi);
SR_PRIV int dsl_secuWrite(const struct sr_dev_inst *sdi, uint16_t cmd, uint16_t din);
SR_PRIV gboolean dsl_isSecuReady(const struct sr_dev_inst *sdi);
SR_PRIV gboolean dsl_isSecuPass(const struct sr_dev_inst *sdi);
SR_PRIV uint16_t dsl_secuRead(const struct sr_dev_inst *sdi);
SR_PRIV int dsl_secuCheck(const struct sr_dev_inst *sdi, uint16_t* encryption, int steps);
static const int32_t probeOptions[] = {
SR_CONF_PROBE_COUPLING,
SR_CONF_PROBE_VDIV,
@@ -1912,6 +1919,17 @@ SR_PRIV int dsl_dev_open(struct sr_dev_driver *di, struct sr_dev_inst *sdi, gboo
}
}
// check security
uint16_t encryption[SECU_STEPS];
ret = dsl_wr_reg(sdi, CTR0_ADDR, bmNONE); // dessert clear
if (dsl_rd_nvm(sdi, (unsigned char *)encryption, SECU_EEP_ADDR, SECU_STEPS*2) != SR_OK) {
sr_err("Read EEPROM content failed!");
return SR_ERR;
}
ret = dsl_secuCheck(sdi, encryption, SECU_STEPS);
if (ret != SR_OK)
sr_err("Security check failed!");
return SR_OK;
}
@@ -2520,3 +2538,104 @@ SR_PRIV int sr_option_value_to_code(int config_id, const char *value, const stru
return -1;
}
/*
* security low level operations
*/
SR_PRIV int dsl_secuReset(const struct sr_dev_inst *sdi)
{
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR, 0) != SR_OK) goto Err;
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR + 1, 0) != SR_OK) goto Err;
g_usleep(10*1000);
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR, 1) != SR_OK) goto Err;
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR + 1, 0) != SR_OK) goto Err;
return SR_OK;
Err:
sr_err("Sent dsl_wr_reg(SEC_XXX_ADDR) command failed.");
return SR_ERR;
}
SR_PRIV int dsl_secuWrite(const struct sr_dev_inst *sdi, uint16_t cmd, uint16_t din)
{
if (dsl_wr_reg(sdi, SEC_DATA_ADDR, din) != SR_OK) goto Err;
if (dsl_wr_reg(sdi, SEC_DATA_ADDR + 1, (din >> 8)) != SR_OK) goto Err;
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR, cmd) != SR_OK) goto Err;
if (dsl_wr_reg(sdi, SEC_CTRL_ADDR + 1, (cmd >> 8)) != SR_OK) goto Err;
return SR_OK;
Err:
sr_err("Sent dsl_wr_reg(SEC_XXX_ADDR) command failed.");
return SR_ERR;
}
SR_PRIV gboolean dsl_isSecuReady(const struct sr_dev_inst *sdi)
{
uint8_t temp;
if (dsl_rd_reg(sdi, SEC_CTRL_ADDR, &temp) != SR_OK) goto Err;
if (temp & bmSECU_READY)
return TRUE;
else
return FALSE;
Err:
sr_err("Sent dsl_rd_reg(SEC_XXX_ADDR) command failed.");
return FALSE;
}
SR_PRIV gboolean dsl_isSecuPass(const struct sr_dev_inst *sdi)
{
uint8_t temp;
if (dsl_rd_reg(sdi, SEC_CTRL_ADDR, &temp) != SR_OK) goto Err;
if (temp & bmSECU_PASS)
return TRUE;
else
return FALSE;
Err:
sr_err("Sent dsl_rd_reg(SEC_XXX_ADDR) command failed.");
return FALSE;
}
SR_PRIV uint16_t dsl_secuRead(const struct sr_dev_inst *sdi)
{
uint16_t sec;
if (dsl_rd_reg(sdi, SEC_DATA_ADDR + 1, (uint8_t*)&sec) != SR_OK) goto Err;
sec <<= 8;
if (dsl_rd_reg(sdi, SEC_DATA_ADDR, (uint8_t*)&sec) != SR_OK) goto Err;
return sec;
Err:
sr_err("Sent dsl_rd_reg(SEC_XXX_ADDR) command failed.");
return 0;
}
/*
* security API interface
*/
SR_PRIV int dsl_secuCheck(const struct sr_dev_inst *sdi, uint16_t* encryption, int steps)
{
int tryCnt = SECU_TRY_CNT;
dsl_secuReset(sdi);
if (dsl_isSecuPass(sdi))
return SR_ERR;
dsl_secuWrite(sdi, SECU_START, 0);
while(steps--) {
if (dsl_isSecuPass(sdi))
return SR_ERR;
while(!dsl_isSecuReady(sdi)) {
if (tryCnt-- == 0) {
sr_err("Get security ready failed.");
return SR_ERR;
}
}
if (dsl_secuRead(sdi) != 0)
return SR_ERR;
dsl_secuWrite(sdi, SECU_CHECK, encryption[steps]);
}
return SR_OK;
}

View File

@@ -73,6 +73,8 @@
#define CAPS_FEATURE_LA_CH32 (1 << 11)
// auto tunning vgain
#define CAPS_FEATURE_AUTO_VGAIN (1 << 12)
// max 2.5v fpga threshold
#define CAPS_FEATURE_MAX25_VTH (1 << 13)
/* end */
@@ -689,6 +691,60 @@ static const struct DSL_profile supported_DSLogic[] = {
SR_GHZ(1)}
},
{0x2A0E, 0x0030, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic PLus", NULL,
"DSLogicPlus.fw",
"DSLogicPlus-pgl12.bin",
"DSLogicPlus-pgl12.bin",
{CAPS_MODE_LOGIC,
CAPS_FEATURE_VTH | CAPS_FEATURE_BUF | CAPS_FEATURE_MAX25_VTH,
(1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) |
(1 << DSL_BUFFER100x16) | (1 << DSL_BUFFER200x8) | (1 << DSL_BUFFER400x4),
16,
SR_MB(256),
0,
DSL_BUFFER100x16,
0,
samplerates400,
0,
DSL_STREAM20x16,
SR_MHZ(1),
SR_Mn(1),
0,
0,
0,
0,
0,
SR_MHZ(200),
SR_MHZ(400)}
},
{0x2A0E, 0x0031, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic U2Basic", NULL,
"DSLogicU2Basic.fw",
"DSLogicU2Basic-pgl12.bin",
"DSLogicU2Basic-pgl12.bin",
{CAPS_MODE_LOGIC,
CAPS_FEATURE_VTH | CAPS_FEATURE_BUF | CAPS_FEATURE_MAX25_VTH,
(1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) |
(1 << DSL_BUFFER100x16),
16,
SR_MB(64),
0,
DSL_BUFFER100x16,
0,
samplerates100,
0,
DSL_STREAM20x16,
SR_MHZ(1),
SR_Mn(1),
0,
0,
0,
0,
0,
SR_MHZ(200),
SR_MHZ(400)}
},
{ 0, 0, LIBUSB_SPEED_UNKNOWN, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
};