20 #define PRMS_ID_DELAY_MS 2
22 #define PRMS_REG_THR_DAC 0x00
23 #define PRMS_REG_HV_DAC 0x01
24 #define PRMS_REG_CMDSTS 0x02
25 #define PRMS_REG_ID 0x08
27 #define PRMS_CMD_PROM_READ BIT(0)
28 #define PRMS_CMD_HV_ON_OFF BIT(2)
29 #define PRMS_CMD_CHAIN_TEST BIT(3)
30 #define PRMS_CMD_ANA_BUF BIT(6)
32 static bool prmsRMWCmd(
I2C_Device * dev, uint8_t addr, uint8_t val, uint8_t mask)
35 if (!
i2cReadReg(dev, addr, PRMS_REG_CMDSTS, ®Val,
sizeof(regVal)))
return errRebase(
"Promis");
36 regVal = ((regVal & ~mask) | (val & mask));
38 return i2cWriteReg(dev, addr, PRMS_REG_CMDSTS, ®Val,
sizeof(regVal));
44 uint8_t autoLoadId[3];
49 if (!prmsRMWCmd(dev, addr, PRMS_CMD_PROM_READ, PRMS_CMD_PROM_READ))
return errRebase(
"Promis");
50 if (!prmsRMWCmd(dev, addr, 0, PRMS_CMD_PROM_READ))
return errRebase(
"Promis");
62 if (
id[0] != autoLoadId[2] ||
id[1] != autoLoadId[1] ||
id[2] != autoLoadId[0])
72 return i2cWriteReg(dev, addr, PRMS_REG_THR_DAC, dacVals,
sizeof(dacVals));
79 if (!
i2cReadReg(dev, addr, PRMS_REG_THR_DAC, dacVals,
sizeof(dacVals)))
return errRebase(
"Promis");
87 return prmsRMWCmd(dev, addr, PRMS_CMD_PROM_READ |(enable ? PRMS_CMD_HV_ON_OFF : 0),
88 PRMS_CMD_PROM_READ | PRMS_CMD_HV_ON_OFF);
95 if (!
i2cWriteReg(dev, addr, PRMS_REG_THR_DAC, &dacVal,
sizeof(dacVal)))
return errRebase(
"Promis");
98 if (!prmsRMWCmd(dev, addr, PRMS_CMD_PROM_READ | PRMS_CMD_CHAIN_TEST,
99 PRMS_CMD_PROM_READ | PRMS_CMD_HV_ON_OFF | PRMS_CMD_CHAIN_TEST))
return errRebase(
"Promis");
102 return prmsRMWCmd(dev, addr, PRMS_CMD_PROM_READ,
103 PRMS_CMD_PROM_READ | PRMS_CMD_HV_ON_OFF | PRMS_CMD_CHAIN_TEST);
109 if (!
i2cReadReg(dev, addr, PRMS_REG_CMDSTS, &cmdsts,
sizeof(cmdsts)))
return errRebase(
"Promis");
110 status->
anaBuf = ( cmdsts & PRMS_CMD_ANA_BUF ) != 0;
111 status->
highVoltOn = ( cmdsts & PRMS_CMD_HV_ON_OFF ) != 0;
bool prmsChainTest(I2C_Device *dev, uint8_t addr)
Executes a chain test.
Structure defines OpenCores I2C Device.
#define E_PRMS_ID_FAULT
PROMiS ID is not consistent.
bool prmsID(I2C_Device *dev, uint8_t addr, uint8_t *id)
Returns the burned ID of the PROMiS device.
void timeDelay(uint32_t msec)
Simple busy-wait delay.
bool i2cReadReg(I2C_Device *dev, i2cAddr addr, uint8_t regNo, uint8_t *rd, int rdLen)
Reads from the I2C device register.
bool i2cWriteReg(I2C_Device *dev, i2cAddr addr, uint8_t regNo, uint8_t *wr, int wrLen)
Writes to the I2C device register.
bool prmsGetConfig(I2C_Device *dev, uint8_t addr, PrmsConfig *cfg)
Gets the configuration from the PROMiS device.
uint8_t threshold
threshold DAC value
bool anaBuf
Analog buffer.
static bool errRebase(const char *name)
Rebases the cause of the error message.
bool prmsSetConfig(I2C_Device *dev, uint8_t addr, PrmsConfig *cfg)
Sets the configuration on the PROMiS device.
uint8_t highVolt
high voltage DAC value
bool highVoltOn
High voltage on.
This driver interfaces with the PROMiS PMT ASIC.
bool prmsHighVolt(I2C_Device *dev, uint8_t addr, bool enable)
Enables/Disables the high voltage.
bool errSet(uint32_t code, const char *error, const char *name)
Sets an error.
#define ERROR(CODE,...)
Expands an error code to an error code with a description (if ERROR_W_DESCR is declared).
#define PRMS_THRS_MV2DAC(MV)
Converts a threshold value in milliVolts to the DAC value.
bool prmsStatus(I2C_Device *dev, uint8_t addr, PrmsStatus *status)
Returns the status of the PROMiS device.