]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blobdiff - rpp-test-sw/commands/spi_resp_transl.c
Change license to MIT
[pes-rpp/rpp-test-sw.git] / rpp-test-sw / commands / spi_resp_transl.c
index a4a5799319bcda77897d2072a1436f1a0eb8483e..8013712cd3d7e2476ee444389577a358c85fc3b0 100644 (file)
@@ -3,10 +3,26 @@
  * Authors:
  *     - Michal Horn <hornmich@fel.cvut.cz>
  *
- * This document contains proprietary information belonging to Czech
- * Technical University in Prague. Passing on and copying of this
- * document, and communication of its contents is not permitted
- * without prior written authorization.
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
  *
  * File : spi_resp_transl.c
  *
  *      bit or group of bits in the response.
  */
 
-#include "drv/digital_io.h"
+#include "rpp/sci.h"
+#include "drv/gio.h"
 #include "drv/spi.h"
 #include "spi_resp_transl.h"
+#include "drv/port.h"
 
 // Field descriptors
-static const spitr_field_desc_t din_glob_field_descs[DIN_NUM_GLOB_FD] = {
+static const spitr_field_desc_t din_glob_field_descs[] = {
        { .field_name = "Thermal flag\t",           .mask = (1 << 23) },
        { .field_name = "INT flag\t",               .mask = (1 << 22) },
        { .field_name = "SP0  - DIN0\t",            .mask = (1 << 14) },
@@ -58,7 +76,7 @@ static const spitr_field_desc_t din_glob_field_descs[DIN_NUM_GLOB_FD] = {
        { .field_name = "SG13 - NA\t",              .mask = (1 << 13) }
 };
 
-static const spitr_field_desc_t lout_glob_field_descs[LOUT_NUM_GLOB_FD] = {
+static const spitr_field_desc_t lout_glob_field_descs[] = {
        { .field_name = "U401 VS PS M",     .mask = (1 << 24) },
        { .field_name = "U401 IN8 state",   .mask = (1 << 27) },
        { .field_name = "U401 IN7 state",   .mask = (1 << 28) },
@@ -89,11 +107,11 @@ static const spitr_field_desc_t lout_glob_field_descs[LOUT_NUM_GLOB_FD] = {
        { .field_name = "U404 Thermal warning", .mask = (1 << 7) }
 };
 
-static const spitr_field_desc_t dac_glob_field_descs[DAC_NUM_GLOB_FD] = {
+static const spitr_field_desc_t dac_glob_field_descs[] = {
        { .field_name = "Provides no informations", .mask = 0 }
 };
 
-static const spitr_field_desc_t fray_glob_field_descs[FRAY_NUM_GLOB_FD] = {
+static const spitr_field_desc_t fray_glob_field_descs[] = {
        { .field_name = "Parity bit",           .mask = (1 << 0) },
        { .field_name = "SPI error",            .mask = (1 << 5) },
        { .field_name = "UVVIO",                .mask = (1 << 6) },
@@ -108,7 +126,7 @@ static const spitr_field_desc_t fray_glob_field_descs[FRAY_NUM_GLOB_FD] = {
        { .field_name = "Bus wake",             .mask = (1 << 15) }
 };
 
-static const spitr_field_desc_t hbr_statreg0_field_descs[HBR_NUM_STATREG_FD] = {
+static const spitr_field_desc_t hbr_statreg0_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -125,7 +143,7 @@ static const spitr_field_desc_t hbr_statreg0_field_descs[HBR_NUM_STATREG_FD] = {
        { .field_name = "CP_LOW",               .mask = (1 << 0) }
 };
 
-static const spitr_field_desc_t hbr_applreg1_field_descs[HBR_NUM_APPLREG1_FD] = {
+static const spitr_field_desc_t hbr_applreg1_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -143,7 +161,7 @@ static const spitr_field_desc_t hbr_applreg1_field_descs[HBR_NUM_APPLREG1_FD] =
        { .field_name = "DIAG",                 .mask = (3 << 0) }
 };
 
-static const spitr_field_desc_t hbr_applreg2_field_descs[HBR_NUM_APPLREG2_FD] = {
+static const spitr_field_desc_t hbr_applreg2_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -159,7 +177,7 @@ static const spitr_field_desc_t hbr_applreg2_field_descs[HBR_NUM_APPLREG2_FD] =
        { .field_name = "GCSA",                 .mask = (3 << 0) }
 };
 
-static const spitr_field_desc_t hbr_applreg3_field_descs[HBR_NUM_APPLREG3_FD] = {
+static const spitr_field_desc_t hbr_applreg3_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -178,7 +196,7 @@ static const spitr_field_desc_t hbr_applreg3_field_descs[HBR_NUM_APPLREG3_FD] =
        { .field_name = "EXT_TH_0",             .mask = (1 << 0) }
 };
 
-static const spitr_field_desc_t hbr_diaddr0_field_descs[HBR_NUM_DIADDR0_FD] = {
+static const spitr_field_desc_t hbr_diaddr0_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -191,7 +209,7 @@ static const spitr_field_desc_t hbr_diaddr0_field_descs[HBR_NUM_DIADDR0_FD] = {
        { .field_name = "NR_PI",                .mask = (0x3F << 0) }
 };
 
-static const spitr_field_desc_t hbr_diaddr1_field_descs[HBR_NUM_DIADDR1_FD] = {
+static const spitr_field_desc_t hbr_diaddr1_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -203,7 +221,7 @@ static const spitr_field_desc_t hbr_diaddr1_field_descs[HBR_NUM_DIADDR1_FD] = {
        { .field_name = "PRD_ID",               .mask = (0xFF << 0) }
 };
 
-static const spitr_field_desc_t hbr_diaddr2_field_descs[HBR_NUM_DIADDR2_FD] = {
+static const spitr_field_desc_t hbr_diaddr2_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -215,7 +233,7 @@ static const spitr_field_desc_t hbr_diaddr2_field_descs[HBR_NUM_DIADDR2_FD] = {
        { .field_name = "PRD_ID",               .mask = (0xFF << 0) }
 };
 
-static const spitr_field_desc_t hbr_diaddr3_field_descs[HBR_NUM_DIADDR3_FD] = {
+static const spitr_field_desc_t hbr_diaddr3_field_descs[] = {
        { .field_name = "GL_ER",                .mask = (1 << 15) },
        { .field_name = "Frame Error",          .mask = (1 << 14) },
        { .field_name = "STK_RESET_Q",          .mask = (1 << 13) },
@@ -235,124 +253,88 @@ static const spitr_field_desc_t hbr_diaddr3_field_descs[HBR_NUM_DIADDR3_FD] = {
 };
 
 /* Map register descriptors to spi commands */
-static const spitr_cmd_map_t din_cmd_map[DIN_NUM_CMD_D] = {
-       { .cmd_msk = 0,     .command = 0,   .field_desc = din_glob_field_descs, .num_fields = DIN_NUM_GLOB_FD}
+static const spitr_cmd_desc_t din_cmds[] = {
+       { .cmd_msk = 0,     .command = 0,   .field_desc = din_glob_field_descs, .num_fields = ARRAY_SIZE(din_glob_field_descs) }
 };
 
-static const spitr_cmd_map_t lout_cmd_map[LOUT_NUM_CMD_D] = {
-       { .cmd_msk = 0,     .command = 0,   .field_desc = lout_glob_field_descs, .num_fields = LOUT_NUM_GLOB_FD }
+static const spitr_cmd_desc_t lout_cmds[] = {
+       { .cmd_msk = 0,     .command = 0,   .field_desc = lout_glob_field_descs, .num_fields = ARRAY_SIZE(lout_glob_field_descs) }
 };
 
-static const spitr_cmd_map_t dac_cmd_map[DAC_NUM_CMD_D] = {
-       { .cmd_msk = 0,     .command = 0,   .field_desc = dac_glob_field_descs, .num_fields = DAC_NUM_GLOB_FD }
+static const spitr_cmd_desc_t dac_cmds[] = {
+       { .cmd_msk = 0,     .command = 0,   .field_desc = dac_glob_field_descs, .num_fields = ARRAY_SIZE(dac_glob_field_descs) }
 };
 
-static const spitr_cmd_map_t fray_cmd_map[FRAY_NUM_CMD_D] = {
-       { .cmd_msk = 0,     .command = 0,   .field_desc = fray_glob_field_descs, .num_fields = FRAY_NUM_GLOB_FD }
+static const spitr_cmd_desc_t fray_cmds[] = {
+       { .cmd_msk = 0,     .command = 0,   .field_desc = fray_glob_field_descs, .num_fields = ARRAY_SIZE(fray_glob_field_descs) }
 };
 
-static const spitr_cmd_map_t hbr_cmd_map[HBR_NUM_CMD_D] = {
-       { .cmd_msk = 0x0000FF00, .command = 0xC000, .field_desc = hbr_diaddr0_field_descs, .num_fields = HBR_NUM_DIADDR0_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0xC100, .field_desc = hbr_diaddr1_field_descs, .num_fields = HBR_NUM_DIADDR1_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0xC200, .field_desc = hbr_diaddr2_field_descs, .num_fields = HBR_NUM_DIADDR2_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0xC300, .field_desc = hbr_diaddr3_field_descs, .num_fields = HBR_NUM_DIADDR3_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x8000, .field_desc = hbr_statreg0_field_descs, .num_fields = HBR_NUM_STATREG_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x4000, .field_desc = hbr_statreg0_field_descs, .num_fields = HBR_NUM_STATREG_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x4100, .field_desc = hbr_applreg1_field_descs, .num_fields = HBR_NUM_APPLREG1_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x4200, .field_desc = hbr_applreg2_field_descs, .num_fields = HBR_NUM_APPLREG2_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x4300, .field_desc = hbr_applreg3_field_descs, .num_fields = HBR_NUM_APPLREG3_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x0100, .field_desc = hbr_applreg1_field_descs, .num_fields = HBR_NUM_APPLREG1_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x0200, .field_desc = hbr_applreg2_field_descs, .num_fields = HBR_NUM_APPLREG2_FD },
-       { .cmd_msk = 0x0000FF00, .command = 0x0300, .field_desc = hbr_applreg3_field_descs, .num_fields = HBR_NUM_APPLREG3_FD },
+static const spitr_cmd_desc_t hbr_cmds[] = {
+       { .cmd_msk = 0x0000FF00, .command = 0xC000, .field_desc = hbr_diaddr0_field_descs, .num_fields = ARRAY_SIZE(hbr_diaddr0_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0xC100, .field_desc = hbr_diaddr1_field_descs, .num_fields = ARRAY_SIZE(hbr_diaddr1_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0xC200, .field_desc = hbr_diaddr2_field_descs, .num_fields = ARRAY_SIZE(hbr_diaddr2_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0xC300, .field_desc = hbr_diaddr3_field_descs, .num_fields = ARRAY_SIZE(hbr_diaddr3_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x8000, .field_desc = hbr_statreg0_field_descs, .num_fields = ARRAY_SIZE(hbr_statreg0_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x4000, .field_desc = hbr_statreg0_field_descs, .num_fields = ARRAY_SIZE(hbr_statreg0_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x4100, .field_desc = hbr_applreg1_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg1_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x4200, .field_desc = hbr_applreg2_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg2_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x4300, .field_desc = hbr_applreg3_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg3_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x0100, .field_desc = hbr_applreg1_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg1_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x0200, .field_desc = hbr_applreg2_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg2_field_descs) },
+       { .cmd_msk = 0x0000FF00, .command = 0x0300, .field_desc = hbr_applreg3_field_descs, .num_fields = ARRAY_SIZE(hbr_applreg3_field_descs) },
 };
 
 /* Map command maps to SPI peripheral name */
-static const spitr_name_map_t spitr_map[NUM_SPI_DEVICES] = {
-       { .spi_name = DIO_PORT_NAME_DINSPI,     .cmd_map = din_cmd_map,     .num_cmd = DIN_NUM_CMD_D},
-       { .spi_name = DIO_PORT_NAME_LOUT,       .cmd_map = lout_cmd_map,    .num_cmd = LOUT_NUM_CMD_D },
-       { .spi_name = DIO_PORT_NAME_DAC1_2,     .cmd_map = dac_cmd_map,     .num_cmd = DAC_NUM_CMD_D },
-       { .spi_name = DIO_PORT_NAME_DAC3_4,     .cmd_map = dac_cmd_map,     .num_cmd = DAC_NUM_CMD_D },
-       { .spi_name = DIO_PORT_NAME_HBR,        .cmd_map = hbr_cmd_map,     .num_cmd = HBR_NUM_CMD_D },
-       { .spi_name = DIO_PORT_NAME_FRAY1,      .cmd_map = fray_cmd_map,    .num_cmd = FRAY_NUM_CMD_D },
-       { .spi_name = DIO_PORT_NAME_FRAY2,      .cmd_map = fray_cmd_map,    .num_cmd = FRAY_NUM_CMD_D }
+const spitr_port_cmds_t spitr_port_cmds[] = {
+       [PORT_ID_DINSPI] = { .cmd_desc = din_cmds,     .num_cmd = ARRAY_SIZE(din_cmds) },
+       [PORT_ID_LOUT]   = { .cmd_desc = lout_cmds,    .num_cmd = ARRAY_SIZE(lout_cmds) },
+       [PORT_ID_DAC1_2] = { .cmd_desc = dac_cmds,     .num_cmd = ARRAY_SIZE(dac_cmds) },
+       [PORT_ID_DAC3_4] = { .cmd_desc = dac_cmds,     .num_cmd = ARRAY_SIZE(dac_cmds) },
+       [PORT_ID_HBR]    = { .cmd_desc = hbr_cmds,     .num_cmd = ARRAY_SIZE(hbr_cmds) },
+       [PORT_ID_FRAY1]  = { .cmd_desc = fray_cmds,    .num_cmd = ARRAY_SIZE(fray_cmds) },
+       [PORT_ID_FRAY2]  = { .cmd_desc = fray_cmds,    .num_cmd = ARRAY_SIZE(fray_cmds) }
 };
 
-
-
 /**
- *  Get the map spi command to spi response.
- *  @param[in] spi_port_name    String of the port name
- *  @param[in] len  Length of the port name string, if terminated by '/0', then len = -1
- *  @param[out] num_cmdDesc returns number of command->fieldDesc fields assigned to the map
- *  @return command to field_desc map or NULL if not found
+ *  Get fields descriptor according to the field descriptor map and command.
+ *  @param[in] cmds  pointer to structure, that maps commands to their field descriptors
+ *  @param[in] num_cmd  Number of fields in the cmds
+ *  @param[in] cmd      Command used as a key value in the cmds. We are searching for the field descriptors assigned to this command
+ *  @param[out] num_fdDesc  Number of fields in field descriptors structure, that was found
+ *  @return pointer to the structure that maps field names to field masks or NULL, when not found
  */
-const spitr_cmd_map_t *get_spi_cmd_map(const char *spi_port_name, int len, uint32_t *num_cmdDesc)
+const spitr_cmd_desc_t *get_spi_cmd_desc(const spitr_port_cmds_t *cmds, uint32_t cmd)
 {
-       uint32_t i;
-       const char *spi_port_name_ptr;
-       char port_name_term[32];
-
-       if (len != -1) {    // port name not terminated by '\0'
-               strncpy(port_name_term, spi_port_name, len);
-               port_name_term[len] = '\0';
-               spi_port_name_ptr = port_name_term;
-       }
-       else spi_port_name_ptr = spi_port_name;
+       if (cmds == NULL)
+               return NULL;
 
-       for (i = 0; i < NUM_SPI_DEVICES; i++) {
-               if (strcmp(spi_port_name_ptr, spitr_map[i].spi_name) == 0) {
-                       *num_cmdDesc = spitr_map[i].num_cmd;
-                       return spitr_map[i].cmd_map;
-               }
+       uint32_t i;
+       for (i = 0; i < cmds->num_cmd; i++) {
+               const spitr_cmd_desc_t *cd = &cmds->cmd_desc[i];
+               if ((cmd & cd->cmd_msk) == cd->command)
+                       return cd;
        }
-       *num_cmdDesc = 0;
        return NULL;
 }
 
-/**
- *  Get fields descriptor according to the field descriptor map and command.
- *  @param[in] cmd_map  pointer to structure, that maps commands to their field descriptors
- *  @param[in] num_cmd  Number of fields in the cmd_map
- *  @param[in] cmd      Command used as a key value in the cmd_map. We are searching for the field descriptors assigned to this command
- *  @param[out] num_fdDesc  Number of fields in field descriptors structure, that was found
- *  @return pointer to the structure that maps field names to field masks or NULL, when not found
- */
-const spitr_field_desc_t *get_spi_field_desc(const spitr_cmd_map_t *cmd_map, uint32_t num_cmd, uint32_t cmd, uint32_t *num_fdDesc)
+const spitr_port_cmds_t *spitr_get_cmds_by_port_name(const char *name)
 {
-       if (cmd_map == NULL) {
-               *num_fdDesc = 0;
-               return NULL;
-       }
+       int i;
 
-       uint32_t i;
-       for (i = 0; i < num_cmd; i++) {
-               uint32_t mskcmd = cmd & cmd_map[i].cmd_msk;
-               uint32_t tmpCmd = cmd_map[i].command;
-               if (mskcmd == tmpCmd) {
-                       *num_fdDesc = cmd_map[i].num_fields;
-                       return cmd_map[i].field_desc;
-               }
+       for (i = 0; i < _PORT_COUNT; i++) {
+               if (strcmp(name, port_desc[i].name) == 0)
+                       return &spitr_port_cmds[i];
        }
-       *num_fdDesc = cmd_map[i].num_fields;
        return NULL;
 }
 
-/**
- *  Translate spi response into human readable form
- *  @param[in] fd           Pointer to structure that maps Field names to field value masks
- *  @param[in] num_fields   Number of fields in fd
- *  @param[in] value        spi response to be traslated
- *  @param[out] table       The result is stored in this table, where each row consists of the value name and the value
- *  @return number of rows in the translated table
- */
-int spitr_fill_tr_table(const spitr_field_desc_t *fd, uint32_t num_fields, uint32_t value, spitr_reg_translate_table_t *table)
+
+void spitr_print_resp(const spitr_cmd_desc_t *cmd_desc, uint32_t resp)
 {
-       uint32_t i;
+       int i;
 
-       for (i = 0; i < num_fields; i++) {
-               table->row[i].field_name = fd[i].field_name;
-               table->row[i].value = __mfld2val(fd[i].mask, value);
+       for (i = 0; i < cmd_desc->num_fields; i++) {
+               const spitr_field_desc_t *fd = &cmd_desc->field_desc[i];
+               rpp_sci_printf("%s: 0x%x\r\n", fd->field_name, __mfld2val(fd->mask, resp));
        }
-       table->num_rows = num_fields;
-       return i;
 }