Skip to content
Snippets Groups Projects
Commit 744b1f69 authored by Adam Wujek's avatar Adam Wujek
Browse files

main_fw/i2c: fix handling of STATUS_BYTE and STATUS_CML


STATUS_BYTE is read only, STATUS_CML is R/W, can be cleared on write
with selected bits

Signed-off-by: default avatarAdam Wujek <dev_public@wujek.eu>
parent 4c139a70
No related merge requests found
...@@ -112,6 +112,10 @@ returned by READ_VOUT_. ...@@ -112,6 +112,10 @@ returned by READ_VOUT_.
+--------------+---------------------+------------------------+-------------+----------------------+ +--------------+---------------------+------------------------+-------------+----------------------+
| 3E | FAN_COMMAND_3_ | Word write / read | 2 | set fan 3 speed | | 3E | FAN_COMMAND_3_ | Word write / read | 2 | set fan 3 speed |
+--------------+---------------------+------------------------+-------------+----------------------+ +--------------+---------------------+------------------------+-------------+----------------------+
| 78 | STATUS_BYTE_ | Byte read | 1 | status byte |
+--------------+---------------------+------------------------+-------------+----------------------+
| 7E | STATUS_CML_ | Byte read | 1 | status CML |
+--------------+---------------------+------------------------+-------------+----------------------+
| 8B | READ_VOUT_ | Word read | 2 | read voltage | | 8B | READ_VOUT_ | Word read | 2 | read voltage |
+--------------+---------------------+------------------------+-------------+----------------------+ +--------------+---------------------+------------------------+-------------+----------------------+
| 8C | READ_IOUT_ | Word read | 2 | read current | | 8C | READ_IOUT_ | Word read | 2 | read current |
...@@ -287,6 +291,63 @@ The FAN_COMMAND_n commands set the desired speed of the attached ...@@ -287,6 +291,63 @@ The FAN_COMMAND_n commands set the desired speed of the attached
fans. The value set is either in RPMs (when the fan is configured to fans. The value set is either in RPMs (when the fan is configured to
be controlled like that) or duty cycle, in the range 0--1000. be controlled like that) or duty cycle, in the range 0--1000.
.. _STATUS_BYTE
STATUS_BYTE
~~~~~~~~~~~
| Command code: **78**
| Transaction type: **Byte read**
| Data length: **1**
The STATUS_BYTE command returns one byte of information with a summary of the
most critical faults.
.. table:: STATUS_BYTE Data byte format
+--------+------------------------------------------------------+
| Bit(s) | Meaning |
+--------+------------------------------------------------------+
| 7:2 | Unused |
+--------+------------------------------------------------------+
| 1 | A communications, memory or logic fault has occurred |
+--------+------------------------------------------------------+
| 0 | Unused |
+--------+------------------------------------------------------+
The value of STATUS_BYTE is calculated based on other status registers (for now only STATUS_CML).
To clear value of STATUS_BYTE, please clear information in other status registers.
.. _STATUS_CML
STATUS_CML
~~~~~~~~~~
| Command code: **7E**
| Transaction type: **Byte write / read**
| Data length: **1**
The STATUS_CML command returns one data byte with contents as follows:
.. table:: STATUS_CML Data byte format
+--------+---------------------------+
| Bit(s) | Meaning |
+--------+---------------------------+
| 7:6 | Unused |
+--------+---------------------------+
| 5 | Packet Error Check Failed |
+--------+---------------------------+
| 4:2 | Unused |
+--------+---------------------------+
| 1 | A communication fault |
+--------+---------------------------+
| 0 | Unused |
+--------+---------------------------+
Write 1's in the desired bits positions to clear corresponding errors in the register.
.. _READ_VOUT: .. _READ_VOUT:
READ_VOUT READ_VOUT
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <float_utils.h> #include <float_utils.h>
#include <usb_debug.h> #include <usb_debug.h>
#define STATUS_BYTE_CML_SHIFT 1
const char MFR_ID[] = "CERN (BE/CO)"; const char MFR_ID[] = "CERN (BE/CO)";
const char MFR_MDL[] = "DI/OT MoniMod"; const char MFR_MDL[] = "DI/OT MoniMod";
#if defined MMRTSB #if defined MMRTSB
...@@ -40,10 +42,12 @@ extern uint16_t use_pec __xMR; ...@@ -40,10 +42,12 @@ extern uint16_t use_pec __xMR;
uint8_t use_pec_tmp; uint8_t use_pec_tmp;
void set_pec(); void set_pec();
void read_status_b(); void read_status_b(void);
void read_status_cml(); void get_status_cml(void);
void write_status_cml(void);
extern uint8_t status_b; extern uint8_t status_b;
extern uint8_t status_cml; extern uint8_t status_cml;
static uint8_t status_cml_tmp;
void accvolt(); void accvolt();
void acccurr(); void acccurr();
...@@ -190,8 +194,8 @@ static const cmd_t cmds_cmds[] = (cmd_t[]){ ...@@ -190,8 +194,8 @@ static const cmd_t cmds_cmds[] = (cmd_t[]){
{0x003C, (int8_t *)&cmd_data_lengths[cmd_0x3C], (uint8_t *)&setfrpms_lin[1], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0}, {0x003C, (int8_t *)&cmd_data_lengths[cmd_0x3C], (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[cmd_0x3D], (uint8_t *)&fan_config_3_4, &get_fan_configs, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0}, {0x003D, (int8_t *)&cmd_data_lengths[cmd_0x3D], (uint8_t *)&fan_config_3_4, &get_fan_configs, &fan_config, (fp_t)NULL, QUERY_WR | QUERY_FMT_NAN, 0},
{0x003E, (int8_t *)&cmd_data_lengths[cmd_0x3E], (uint8_t *)&setfrpms_lin[2], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0}, {0x003E, (int8_t *)&cmd_data_lengths[cmd_0x3E], (uint8_t *)&setfrpms_lin[2], (fp_t)NULL, &set_frpms, (fp_t)NULL, QUERY_WR | QUERY_FMT_LIN, 0},
{0x0078, (int8_t *)&cmd_data_lengths[cmd_0x78], (uint8_t *)&status_b, (fp_t)NULL, (fp_t)NULL, &read_status_b, QUERY_RD, 0}, {0x0078, (int8_t *)&cmd_data_lengths[cmd_0x78], (uint8_t *)&status_b, &read_status_b, (fp_t)NULL, (fp_t)NULL, QUERY_RD, 0},
{0x007E, (int8_t *)&cmd_data_lengths[cmd_0x7E], (uint8_t *)&status_cml, (fp_t)NULL, (fp_t)NULL, &read_status_cml, QUERY_RD, 0}, {0x007E, (int8_t *)&cmd_data_lengths[cmd_0x7E], (uint8_t *)&status_cml_tmp, &get_status_cml, &write_status_cml, (fp_t)NULL, QUERY_WR | QUERY_RD, 0},
{0x008B, (int8_t *)&cmd_data_lengths[cmd_0x8B], (uint8_t *)&curpage_volt, &accvolt, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0}, {0x008B, (int8_t *)&cmd_data_lengths[cmd_0x8B], (uint8_t *)&curpage_volt, &accvolt, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008C, (int8_t *)&cmd_data_lengths[cmd_0x8C], (uint8_t *)&curpage_curr, &acccurr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0}, {0x008C, (int8_t *)&cmd_data_lengths[cmd_0x8C], (uint8_t *)&curpage_curr, &acccurr, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
{0x008D, (int8_t *)&cmd_data_lengths[cmd_0x8D], (uint8_t *)&temps_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0}, {0x008D, (int8_t *)&cmd_data_lengths[cmd_0x8D], (uint8_t *)&temps_lin[0], (fp_t)NULL, (fp_t)NULL, (fp_t)NULL, QUERY_RD | QUERY_FMT_LIN, 0},
...@@ -298,14 +302,21 @@ void __xMR set_pec() ...@@ -298,14 +302,21 @@ void __xMR set_pec()
use_pec = use_pec_tmp; use_pec = use_pec_tmp;
} }
void read_status_b() void read_status_b(void)
{
status_b = status_cml ? 1 << STATUS_BYTE_CML_SHIFT : 0;
}
void get_status_cml(void)
{ {
status_b &= 0xFE; status_cml_tmp = status_cml;
} }
void read_status_cml() void write_status_cml(void)
{ {
status_cml = 0; /* clear only bits set to 1 */
status_cml &= ~status_cml_tmp;
} }
#if defined(MMFANT) || defined(MMPROT) #if defined(MMFANT) || defined(MMPROT)
......
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