Skip to content
Snippets Groups Projects
Commit 75273770 authored by Christos Gentsos's avatar Christos Gentsos
Browse files

I2C: Merge "standard" and "extended" PMBus command structures

parent dd1774be
Branches
No related merge requests found
......@@ -17,32 +17,6 @@ const char MFR_SER[] = "123456789";
void query_prp();
uint8_t query_r;
static const int8_t cmd_data_lengths[] = {
-1, // 0x1A
-(int8_t)sizeof(MFR_ID), // 0x99
-(int8_t)sizeof(MFR_MDL), // 0x9A
-(int8_t)sizeof(MFR_REV), // 0x9B
-(int8_t)sizeof(MFR_LOC), // 0x9C
-(int8_t)sizeof(MFR_DAT), // 0x9D
-(int8_t)sizeof(MFR_SER)}; // 0x9E
// for block write-block read process calls, which modify the length
static int8_t cmd_data_length_query = -1;
static cmd_t cmds_cmds[] = (cmd_t[]){
{0x1A, (int8_t *)&cmd_data_length_query, (uint8_t *)&query_r, (fp_t)NULL, &query_prp, (fp_t)NULL, QUERY_SUP, 1},
{0x99, (int8_t *)&cmd_data_lengths[1], (uint8_t *)&MFR_ID, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9A, (int8_t *)&cmd_data_lengths[2], (uint8_t *)&MFR_MDL, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9B, (int8_t *)&cmd_data_lengths[3], (uint8_t *)&MFR_REV, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9C, (int8_t *)&cmd_data_lengths[4], (uint8_t *)&MFR_LOC, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9D, (int8_t *)&cmd_data_lengths[5], (uint8_t *)&MFR_DAT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9E, (int8_t *)&cmd_data_lengths[6], (uint8_t *)&MFR_SER, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0}};
cmd_space_t cmds = {
sizeof(cmds_cmds)/sizeof(cmd_t),
cmds_cmds
};
void written_fw_block();
void written_fw_checksum();
void uc_reset();
......@@ -55,6 +29,18 @@ static uint8_t fw_block[8];
static uint8_t dummy_byte;
static const int8_t cmd_data_lengths[] = {
-1, // 0x1A
-(int8_t)sizeof(MFR_ID), // 0x99
-(int8_t)sizeof(MFR_MDL), // 0x9A
-(int8_t)sizeof(MFR_REV), // 0x9B
-(int8_t)sizeof(MFR_LOC), // 0x9C
-(int8_t)sizeof(MFR_DAT), // 0x9D
-(int8_t)sizeof(MFR_SER)}; // 0x9E
// for block write-block read process calls, which modify the length
static int8_t cmd_data_length_query = -1;
static const int8_t ext_cmd_data_lengths[] = {
2, // 0x05
8, // 0x06
......@@ -63,17 +49,24 @@ static const int8_t ext_cmd_data_lengths[] = {
1, // 0xC0
1}; // 0xC4
static cmd_t ext_cmds_cmds[] = (cmd_t[]){
{0x01, (int8_t *)&ext_cmd_data_lengths[0], (uint8_t *)&fw_len, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0x02, (int8_t *)&ext_cmd_data_lengths[1], (uint8_t *)fw_block, (fp_t)NULL, (fp_t)&written_fw_block, (fp_t)NULL, 0, 1},
{0x03, (int8_t *)&ext_cmd_data_lengths[2], (uint8_t *)&fw_checksum, (fp_t)NULL, (fp_t)&written_fw_checksum, (fp_t)NULL, 0, 0},
{0x04, (int8_t *)&ext_cmd_data_lengths[3], (uint8_t *)&fw_local_checksum, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0x05, (int8_t *)&ext_cmd_data_lengths[4], (uint8_t *)&dummy_byte, (fp_t)NULL, (fp_t)&boot_new_fw, (fp_t)NULL, 0, 0},
{0x06, (int8_t *)&ext_cmd_data_lengths[5], (uint8_t *)&dummy_byte, (fp_t)NULL, (fp_t)&uc_reset, (fp_t)NULL, 0, 0}};
cmd_space_t ext_cmds = {
sizeof(ext_cmds_cmds)/sizeof(cmd_t),
ext_cmds_cmds
static cmd_t cmds_cmds[] = (cmd_t[]){
{0x001A, (int8_t *)&cmd_data_length_query, (uint8_t *)&query_r, (fp_t)NULL, &query_prp, (fp_t)NULL, QUERY_SUP, 1},
{0x0099, (int8_t *)&cmd_data_lengths[1], (uint8_t *)&MFR_ID, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009A, (int8_t *)&cmd_data_lengths[2], (uint8_t *)&MFR_MDL, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009B, (int8_t *)&cmd_data_lengths[3], (uint8_t *)&MFR_REV, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009C, (int8_t *)&cmd_data_lengths[4], (uint8_t *)&MFR_LOC, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009D, (int8_t *)&cmd_data_lengths[5], (uint8_t *)&MFR_DAT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009E, (int8_t *)&cmd_data_lengths[6], (uint8_t *)&MFR_SER, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0xFF01, (int8_t *)&ext_cmd_data_lengths[0], (uint8_t *)&fw_len, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0xFF02, (int8_t *)&ext_cmd_data_lengths[1], (uint8_t *)fw_block, (fp_t)NULL, (fp_t)&written_fw_block, (fp_t)NULL, 0, 1},
{0xFF03, (int8_t *)&ext_cmd_data_lengths[2], (uint8_t *)&fw_checksum, (fp_t)NULL, (fp_t)&written_fw_checksum, (fp_t)NULL, 0, 0},
{0xFF04, (int8_t *)&ext_cmd_data_lengths[3], (uint8_t *)&fw_local_checksum, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0xFF05, (int8_t *)&ext_cmd_data_lengths[4], (uint8_t *)&dummy_byte, (fp_t)NULL, (fp_t)&boot_new_fw, (fp_t)NULL, 0, 0},
{0xFF06, (int8_t *)&ext_cmd_data_lengths[5], (uint8_t *)&dummy_byte, (fp_t)NULL, (fp_t)&uc_reset, (fp_t)NULL, 0, 0}};
cmd_space_t cmds = {
sizeof(cmds_cmds)/sizeof(cmd_t),
cmds_cmds
};
static uint8_t fw_write_buf[FLASH_ROW_SIZE] __attribute__((__aligned__(4)));
......
......@@ -9,8 +9,6 @@ __DEFAULT_NO_xMR
//! PMBus commmands structure
extern cmd_space_t cmds;
//! Our custom commmands structure
extern cmd_space_t ext_cmds;
uint8_t status_b;
......@@ -19,7 +17,7 @@ int main(void)
system_init();
if (user_flash.copy_fw == 0xBEC0ABCD) {
setup_I2C_slave(&cmds, &ext_cmds);
setup_I2C_slave(&cmds);
while (1)
;
......
......@@ -5,12 +5,8 @@
#define CMD 0x01
#define DATA 0x02
#define EXT_CMD 0x04
#define EXT_DATA 0x08
#define BLK_GET_LEN 0x10
#define EXT_BLK_GET_LEN 0x20
#define GET_CHECKSUM 0x40
#define EXT_GET_CHECKSUM 0x80
#define BLK_GET_LEN 0x04
#define GET_CHECKSUM 0x08
typedef void(*fp_t)(void);
......@@ -29,7 +25,7 @@ enum QUERY_RET_VALS {
typedef const struct {
//! CMD code
const uint8_t addr;
const uint16_t addr;
//! transaction length for this command
int8_t *const data_len;
//! pointer to data
......@@ -53,7 +49,7 @@ typedef const struct {
cmd_t *const cmds;
} cmd_space_t;
int16_t in_addr_space(cmd_space_t *addr_space, uint8_t addr);
void setup_I2C_slave(cmd_space_t *impl_cmds, cmd_space_t *impl_ext_cmds);
int16_t in_addr_space(cmd_space_t *addr_space, uint16_t addr);
void setup_I2C_slave(cmd_space_t *impl_cmds);
#endif
......@@ -16,17 +16,15 @@ static struct io_descriptor *io;
static uint16_t dev_addr __xMR;
static uint16_t rx_state __xMR = CMD;
static uint8_t tmp_std_cmd_addr;
static uint16_t std_cmd_addr __xMR = 0xFF;
static uint8_t tmp_cmd_addr;
static uint16_t cmd_addr __xMR;
static uint16_t got_ff __xMR;
static int16_t cmd_index __xMR;
static int16_t cmd_len __xMR;
static uint8_t tmp_ext_cmd_addr;
static uint16_t ext_cmd_addr __xMR;
static uint16_t blk_wrote_len_byte __xMR;
static uint16_t last_byte_read_got_nack __xMR;
static cmd_space_t *cmds;
static cmd_space_t *ext_cmds;
uint16_t use_pec __xMR = 0;
static uint16_t pec_checksum __xMR;
......@@ -41,7 +39,7 @@ uint8_t status_cml;
/*! This function checks the command array for a specific command. Returns its
* index if it finds it, and -1 if it doesn't. */
int16_t in_addr_space(cmd_space_t *addr_space, uint8_t addr)
int16_t in_addr_space(cmd_space_t *addr_space, uint16_t addr)
{
for (uint8_t i = 0; i < addr_space->n_cmds; ++i)
if (addr == addr_space->cmds[i].addr)
......@@ -74,17 +72,28 @@ static void __xMR I2C_rx_complete(const struct i2c_s_async_descriptor *const des
case CMD:
// first state after getting the address + write bit,
// set the PEC checksum
if (use_pec)
if (use_pec && got_ff == 0)
pec_checksum = crc8_byte(dev_addr << 1);
io_read(io, &tmp_std_cmd_addr, 1);
std_cmd_addr = tmp_std_cmd_addr;
io_read(io, &tmp_cmd_addr, 1);
cmd_addr = tmp_cmd_addr;
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ std_cmd_addr);
if (std_cmd_addr == 0xFF) {
rx_state = EXT_CMD;
pec_checksum = crc8_byte(pec_checksum ^ cmd_addr);
if (got_ff) {
got_ff = 0;
cmd_index = in_addr_space(cmds, 0xFF00 | cmd_addr);
} else if (cmd_addr == 0xFF) {
got_ff = 1;
send_ack(descr);
set_cmd(descr, 3);
} else if ((cmd_index = in_addr_space(cmds, std_cmd_addr)) != -1) {
break;
} else {
cmd_index = in_addr_space(cmds, cmd_addr);
}
if (cmd_index != -1) {
cmd_len = 0;
if (*cmds->cmds[cmd_index].data_len < 0)
rx_state = BLK_GET_LEN;
......@@ -100,28 +109,7 @@ static void __xMR I2C_rx_complete(const struct i2c_s_async_descriptor *const des
set_cmd(descr, 2);
}
break;
case DATA:
io_read(io, &cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ cmds->cmds[cmd_index].data_pnt[cmd_len]);
++cmd_len;
if (cmd_len < abs(*cmds->cmds[cmd_index].data_len)) {
send_ack(descr);
set_cmd(descr, 3);
} else {
if (use_pec && !cmds->cmds[cmd_index].wr_pec_disabled) {
send_ack(descr);
set_cmd(descr, 3);
rx_state = GET_CHECKSUM;
} else {
send_ack(descr);
set_cmd(descr, 2);
rx_state = CMD;
if (cmds->cmds[cmd_index].w_callback)
notmr_call_helper(cmds->cmds[cmd_index].w_callback);
}
}
break;
case BLK_GET_LEN:
io_read(io, (uint8_t *)cmds->cmds[cmd_index].data_len, 1);
if (use_pec)
......@@ -131,59 +119,30 @@ static void __xMR I2C_rx_complete(const struct i2c_s_async_descriptor *const des
set_cmd(descr, 3);
rx_state = DATA;
break;
case EXT_CMD:
io_read(io, &tmp_ext_cmd_addr, 1);
ext_cmd_addr = tmp_ext_cmd_addr;
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ ext_cmd_addr);
if ((cmd_index = in_addr_space(ext_cmds, ext_cmd_addr)) != -1) {
cmd_len = 0;
if (*ext_cmds->cmds[cmd_index].data_len < 0)
rx_state = EXT_BLK_GET_LEN;
else
rx_state = EXT_DATA;
send_ack(descr);
set_cmd(descr, 3);
if (ext_cmds->cmds[cmd_index].a_callback)
notmr_call_helper(ext_cmds->cmds[cmd_index].a_callback);
} else {
// invalid EXT_CMD, return NACK and terminate transaction
send_nack(descr);
set_cmd(descr, 2);
rx_state = CMD;
}
break;
case EXT_DATA:
io_read(io, &ext_cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
case DATA:
io_read(io, &cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ ext_cmds->cmds[cmd_index].data_pnt[cmd_len]);
pec_checksum = crc8_byte(pec_checksum ^ cmds->cmds[cmd_index].data_pnt[cmd_len]);
++cmd_len;
if (cmd_len < abs(*ext_cmds->cmds[cmd_index].data_len)) {
if (cmd_len < abs(*cmds->cmds[cmd_index].data_len)) {
send_ack(descr);
set_cmd(descr, 3);
} else {
if (use_pec && !ext_cmds->cmds[cmd_index].wr_pec_disabled) {
if (use_pec && !cmds->cmds[cmd_index].wr_pec_disabled) {
send_ack(descr);
set_cmd(descr, 3);
rx_state = EXT_GET_CHECKSUM;
rx_state = GET_CHECKSUM;
} else {
send_ack(descr);
set_cmd(descr, 2);
rx_state = CMD;
if (ext_cmds->cmds[cmd_index].w_callback)
notmr_call_helper(ext_cmds->cmds[cmd_index].w_callback);
if (cmds->cmds[cmd_index].w_callback)
notmr_call_helper(cmds->cmds[cmd_index].w_callback);
}
}
break;
case EXT_BLK_GET_LEN:
io_read(io, (uint8_t *)ext_cmds->cmds[cmd_index].data_len, 1);
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ *ext_cmds->cmds[cmd_index].data_len);
*ext_cmds->cmds[cmd_index].data_len = -(*ext_cmds->cmds[cmd_index].data_len);
send_ack(descr);
set_cmd(descr, 3);
rx_state = EXT_DATA;
break;
case GET_CHECKSUM:
io_read(io, &checksum_from_m, 1);
if (checksum_from_m == pec_checksum) {
......@@ -198,20 +157,7 @@ static void __xMR I2C_rx_complete(const struct i2c_s_async_descriptor *const des
set_cmd(descr, 2);
rx_state = CMD;
break;
case EXT_GET_CHECKSUM:
io_read(io, &checksum_from_m, 1);
if (checksum_from_m == pec_checksum) {
send_ack(descr);
if (ext_cmds->cmds[cmd_index].w_callback)
notmr_call_helper(ext_cmds->cmds[cmd_index].w_callback);
} else {
status_b |= 0x01;
status_cml = 0x20; // PEC error
send_nack(descr);
}
set_cmd(descr, 2);
rx_state = CMD;
break;
default:
break;
}
......@@ -231,58 +177,30 @@ static void __xMR I2C_tx_pending(const struct i2c_s_async_descriptor *const desc
added_tx_pec = 1;
sent_checksum = 0;
}
if (std_cmd_addr != 0xFF) {
if ((*cmds->cmds[cmd_index].data_len < 0) && (!blk_wrote_len_byte)) {
cmd_len = 0;
tx_tmp = -*cmds->cmds[cmd_index].data_len;
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ tx_tmp);
io_write(io, (uint8_t *)&tx_tmp, 1);
set_cmd(descr, 3);
blk_wrote_len_byte = 1;
} else if (cmd_len < abs(*cmds->cmds[cmd_index].data_len)) {
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ cmds->cmds[cmd_index].data_pnt[cmd_len]);
io_write(io, &cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
set_cmd(descr, 3);
++cmd_len;
} else if (use_pec && !sent_checksum) {
tmp_pec_checksum = pec_checksum;
io_write(io, (uint8_t *)&tmp_pec_checksum, 1);
set_cmd(descr, 3);
sent_checksum = 1;
} else {
set_cmd(descr, 2);
rx_state = CMD;
if (cmds->cmds[cmd_index].r_callback)
notmr_call_helper(cmds->cmds[cmd_index].r_callback);
}
} else { /* extended command space */
if ((*ext_cmds->cmds[cmd_index].data_len < 0) && (!blk_wrote_len_byte)) {
cmd_len = 0;
tx_tmp = -*ext_cmds->cmds[cmd_index].data_len;
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ tx_tmp);
io_write(io, (uint8_t *)&tx_tmp, 1);
set_cmd(descr, 3);
blk_wrote_len_byte = 1;
} else if (cmd_len < abs(*ext_cmds->cmds[cmd_index].data_len)) {
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ ext_cmds->cmds[cmd_index].data_pnt[cmd_len]);
io_write(io, &ext_cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
set_cmd(descr, 3);
++cmd_len;
} else if (use_pec && !sent_checksum) {
tmp_pec_checksum = pec_checksum;
io_write(io, (uint8_t *)&tmp_pec_checksum, 1);
set_cmd(descr, 3);
sent_checksum = 1;
} else {
set_cmd(descr, 2);
rx_state = CMD;
if (ext_cmds->cmds[cmd_index].r_callback)
notmr_call_helper(ext_cmds->cmds[cmd_index].r_callback);
}
if ((*cmds->cmds[cmd_index].data_len < 0) && (!blk_wrote_len_byte)) {
cmd_len = 0;
tx_tmp = -*cmds->cmds[cmd_index].data_len;
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ tx_tmp);
io_write(io, (uint8_t *)&tx_tmp, 1);
set_cmd(descr, 3);
blk_wrote_len_byte = 1;
} else if (cmd_len < abs(*cmds->cmds[cmd_index].data_len)) {
if (use_pec)
pec_checksum = crc8_byte(pec_checksum ^ cmds->cmds[cmd_index].data_pnt[cmd_len]);
io_write(io, &cmds->cmds[cmd_index].data_pnt[cmd_len], 1);
set_cmd(descr, 3);
++cmd_len;
} else if (use_pec && !sent_checksum) {
tmp_pec_checksum = pec_checksum;
io_write(io, (uint8_t *)&tmp_pec_checksum, 1);
set_cmd(descr, 3);
sent_checksum = 1;
} else {
set_cmd(descr, 2);
rx_state = CMD;
if (cmds->cmds[cmd_index].r_callback)
notmr_call_helper(cmds->cmds[cmd_index].r_callback);
}
}
......@@ -313,12 +231,11 @@ static void __attribute__((noinline)) __xMR set_dev_addr(uint8_t dev_addr_notmr
/*! this configures the I2C interrupt handlers with the PMBus and
extended command structures */
void setup_I2C_slave(cmd_space_t *impl_cmds, cmd_space_t *impl_ext_cmds)
void setup_I2C_slave(cmd_space_t *impl_cmds)
{
uint8_t dev_addr_notmr = 0x12 + 4*(!gpio_get_pin_level(ADDR2)) + 2*(!gpio_get_pin_level(ADDR1)) + (!gpio_get_pin_level(ADDR0));
cmds = impl_cmds;
ext_cmds = impl_ext_cmds;
hri_sercomi2cs_clear_CTRLB_SMEN_bit(SERCOM2);
i2c_s_async_get_io_descriptor(&I2C_0, &io);
i2c_s_async_register_callback(&I2C_0, I2C_S_RX_COMPLETE, I2C_rx_complete);
......
......@@ -88,6 +88,9 @@ extern uint16_t fan_installed[3] __xMR;
extern uint16_t fan_cmdrpm[3] __xMR;
extern uint16_t fan_ppr[3] __xMR;
void uc_reset();
void boot_new_fw();
static const int8_t cmd_data_lengths[] = {
1, // 0x00
-1, // 0x1A
......@@ -117,40 +120,6 @@ static const int8_t cmd_data_lengths[] = {
// only block write-block read process calls modify the length
static int8_t cmd_data_length_query = -1;
static const cmd_t cmds_cmds[] = (cmd_t[]){
{0x00, (int8_t *)&cmd_data_lengths[0], (uint8_t *)&page_tmp, (fp_t)NULL, &page_chk, (fp_t)NULL, QUERY_WR | QUERY_RD | QUERY_FMT_8B, 0},
{0x1A, (int8_t *)&cmd_data_length_query, (uint8_t *)&query_r, (fp_t)NULL, &query_prp, (fp_t)NULL, QUERY_SUP, 1},
{0x78, (int8_t *)&cmd_data_lengths[2], (uint8_t *)&status_b, (fp_t)NULL, (fp_t)NULL, &read_status_b, QUERY_RD, 0},
{0x7E, (int8_t *)&cmd_data_lengths[3], (uint8_t *)&status_cml, (fp_t)NULL, (fp_t)NULL, &read_status_cml, QUERY_RD, 0},
{0x8B, (int8_t *)&cmd_data_lengths[4], (uint8_t *)&curpage_volt, &accvolt, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x8C, (int8_t *)&cmd_data_lengths[5], (uint8_t *)&curpage_curr, &acccurr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x8D, (int8_t *)&cmd_data_lengths[6], (uint8_t *)&temps_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x8E, (int8_t *)&cmd_data_lengths[7], (uint8_t *)&temps_lin[1], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x8F, (int8_t *)&cmd_data_lengths[8], (uint8_t *)&temps_lin[2], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x90, (int8_t *)&cmd_data_lengths[9], (uint8_t *)&frpms_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x91, (int8_t *)&cmd_data_lengths[10], (uint8_t *)&frpms_lin[1], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x92, (int8_t *)&cmd_data_lengths[11], (uint8_t *)&frpms_lin[2], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x96, (int8_t *)&cmd_data_lengths[12], (uint8_t *)&curpage_powr, &accpowr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x99, (int8_t *)&cmd_data_lengths[13], (uint8_t *)&MFR_ID, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9A, (int8_t *)&cmd_data_lengths[14], (uint8_t *)&MFR_MDL, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9B, (int8_t *)&cmd_data_lengths[15], (uint8_t *)&MFR_REV, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9C, (int8_t *)&cmd_data_lengths[16], (uint8_t *)&MFR_LOC, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9D, (int8_t *)&cmd_data_lengths[17], (uint8_t *)&MFR_DAT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x9E, (int8_t *)&cmd_data_lengths[18], (uint8_t *)&MFR_SER, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x3A, (int8_t *)&cmd_data_lengths[19], (uint8_t *)&fan_config_1_2, (fp_t)NULL, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0},
{0x3B, (int8_t *)&cmd_data_lengths[20], (uint8_t *)&setfrpms_lin[0], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0x3C, (int8_t *)&cmd_data_lengths[21], (uint8_t *)&setfrpms_lin[1], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0x3D, (int8_t *)&cmd_data_lengths[22], (uint8_t *)&fan_config_3_4, (fp_t)NULL, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0},
{0x3E, (int8_t *)&cmd_data_lengths[23], (uint8_t *)&setfrpms_lin[2], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0}};
cmd_space_t cmds = {
sizeof(cmds_cmds)/sizeof(cmd_t),
cmds_cmds
};
void uc_reset();
void boot_new_fw();
static const int8_t ext_cmd_data_lengths[] = {
1, // 0x05
1, // 0x06
......@@ -160,18 +129,42 @@ static const int8_t ext_cmd_data_lengths[] = {
7, // 0xC1
1}; // 0xC4
static cmd_t ext_cmds_cmds[] = (cmd_t[]){
{0x05, (int8_t *)&ext_cmd_data_lengths[0], (uint8_t *)&dummy_byte, (fp_t)NULL, &boot_new_fw, (fp_t)NULL, 0, 0},
{0x06, (int8_t *)&ext_cmd_data_lengths[1], (uint8_t *)&dummy_byte, (fp_t)NULL, &uc_reset, (fp_t)NULL, 0, 0},
{0xA0, (int8_t *)&ext_cmd_data_lengths[2], (uint8_t *)&TMR_ERROR_CNT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0xB0, (int8_t *)&ext_cmd_data_lengths[3], (uint8_t *)&use_pec_tmp, (fp_t)NULL, &set_pec, (fp_t)NULL, 0, 1},
{0xC0, (int8_t *)&ext_cmd_data_lengths[4], (uint8_t *)&temp_curve_points_data, (fp_t)NULL, &set_tc_curve, (fp_t)NULL, 0, 0},
{0xC1, (int8_t *)&ext_cmd_data_lengths[5], (uint8_t *)&temp_matrix_row, (fp_t)NULL, &set_tc_matrix, (fp_t)NULL, 0, 0},
{0xC4, (int8_t *)&ext_cmd_data_lengths[6], (uint8_t *)&tc_on, (fp_t)NULL, &set_tc_onoff, (fp_t)NULL, 0, 0}};
cmd_space_t ext_cmds = {
sizeof(ext_cmds_cmds)/sizeof(cmd_t),
ext_cmds_cmds
static const cmd_t cmds_cmds[] = (cmd_t[]){
{0x0000, (int8_t *)&cmd_data_lengths[0], (uint8_t *)&page_tmp, (fp_t)NULL, &page_chk, (fp_t)NULL, QUERY_WR | QUERY_RD | QUERY_FMT_8B, 0},
{0x001A, (int8_t *)&cmd_data_length_query, (uint8_t *)&query_r, (fp_t)NULL, &query_prp, (fp_t)NULL, QUERY_SUP, 1},
{0x0078, (int8_t *)&cmd_data_lengths[2], (uint8_t *)&status_b, (fp_t)NULL, (fp_t)NULL, &read_status_b, QUERY_RD, 0},
{0x007E, (int8_t *)&cmd_data_lengths[3], (uint8_t *)&status_cml, (fp_t)NULL, (fp_t)NULL, &read_status_cml, QUERY_RD, 0},
{0x008B, (int8_t *)&cmd_data_lengths[4], (uint8_t *)&curpage_volt, &accvolt, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008C, (int8_t *)&cmd_data_lengths[5], (uint8_t *)&curpage_curr, &acccurr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008D, (int8_t *)&cmd_data_lengths[6], (uint8_t *)&temps_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008E, (int8_t *)&cmd_data_lengths[7], (uint8_t *)&temps_lin[1], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008F, (int8_t *)&cmd_data_lengths[8], (uint8_t *)&temps_lin[2], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x0090, (int8_t *)&cmd_data_lengths[9], (uint8_t *)&frpms_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x0091, (int8_t *)&cmd_data_lengths[10], (uint8_t *)&frpms_lin[1], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x0092, (int8_t *)&cmd_data_lengths[11], (uint8_t *)&frpms_lin[2], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x0096, (int8_t *)&cmd_data_lengths[12], (uint8_t *)&curpage_powr, &accpowr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x0099, (int8_t *)&cmd_data_lengths[13], (uint8_t *)&MFR_ID, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009A, (int8_t *)&cmd_data_lengths[14], (uint8_t *)&MFR_MDL, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009B, (int8_t *)&cmd_data_lengths[15], (uint8_t *)&MFR_REV, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009C, (int8_t *)&cmd_data_lengths[16], (uint8_t *)&MFR_LOC, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009D, (int8_t *)&cmd_data_lengths[17], (uint8_t *)&MFR_DAT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x009E, (int8_t *)&cmd_data_lengths[18], (uint8_t *)&MFR_SER, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_NAN, 0},
{0x003A, (int8_t *)&cmd_data_lengths[19], (uint8_t *)&fan_config_1_2, (fp_t)NULL, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0},
{0x003B, (int8_t *)&cmd_data_lengths[20], (uint8_t *)&setfrpms_lin[0], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0x003C, (int8_t *)&cmd_data_lengths[21], (uint8_t *)&setfrpms_lin[1], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0x003D, (int8_t *)&cmd_data_lengths[22], (uint8_t *)&fan_config_3_4, (fp_t)NULL, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0},
{0x003E, (int8_t *)&cmd_data_lengths[23], (uint8_t *)&setfrpms_lin[2], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0xFF05, (int8_t *)&ext_cmd_data_lengths[0], (uint8_t *)&dummy_byte, (fp_t)NULL, &boot_new_fw, (fp_t)NULL, 0, 0},
{0xFF06, (int8_t *)&ext_cmd_data_lengths[1], (uint8_t *)&dummy_byte, (fp_t)NULL, &uc_reset, (fp_t)NULL, 0, 0},
{0xFFA0, (int8_t *)&ext_cmd_data_lengths[2], (uint8_t *)&TMR_ERROR_CNT, (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, 0, 0},
{0xFFB0, (int8_t *)&ext_cmd_data_lengths[3], (uint8_t *)&use_pec_tmp, (fp_t)NULL, &set_pec, (fp_t)NULL, 0, 1},
{0xFFC0, (int8_t *)&ext_cmd_data_lengths[4], (uint8_t *)&temp_curve_points_data, (fp_t)NULL, &set_tc_curve, (fp_t)NULL, 0, 0},
{0xFFC1, (int8_t *)&ext_cmd_data_lengths[5], (uint8_t *)&temp_matrix_row, (fp_t)NULL, &set_tc_matrix, (fp_t)NULL, 0, 0},
{0xFFC4, (int8_t *)&ext_cmd_data_lengths[6], (uint8_t *)&tc_on, (fp_t)NULL, &set_tc_onoff, (fp_t)NULL, 0, 0}};
cmd_space_t cmds = {
sizeof(cmds_cmds)/sizeof(cmd_t),
cmds_cmds
};
static uint32_t fw_write_buf[FLASH_ROW_SIZE/4];
......
......@@ -16,8 +16,6 @@ __DEFAULT_NO_xMR
//! PMBus commmands structure
extern cmd_space_t cmds;
//! Our custom commmands structure
extern cmd_space_t ext_cmds;
#ifdef MMRTSB
#define MAX_PAGE 3
......@@ -478,7 +476,7 @@ int main(void)
adc_async_enable_channel(&ADC_0, 0);
adc_async_start_conversion(&ADC_0);
setup_I2C_slave(&cmds, &ext_cmds);
setup_I2C_slave(&cmds);
// set the timer interrupt to a lower priority otherwise i2c won't work
NVIC_SetPriority(RTC_IRQn, 1);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment