* 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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
{ .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) },
};
/* 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;
}