2 * Copyright (C) 2012-2013 Czech Technical University in Prague
4 * Created on: 28.2.2013
9 * This document contains proprietary information belonging to Czech
10 * Technical University in Prague. Passing on and copying of this
11 * document, and communication of its contents is not permitted
12 * without prior written authorization.
17 * Command for processing data from SPI and
18 * lowlevel command for sending data on SPI
28 #include "cmdproc_utils.h"
30 #include <_isfuncdcl.h>
33 * @brief Translate SPI response according the command and peripheral type
35 * @param[in] cmd_io Pointer to IO stack
36 * @param[in] des Pointer to command descriptor
37 * @param[in] param Parameters of command
38 * @return 0 when OK or error code
40 int cmd_do_spi_translate(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
45 uint32_t values[MAX_PARAM_VALUES_NUM];
46 uint32_t numFieldDesc;
50 spitr_reg_translate_table_t translatedData;
51 char peripheralName[32];
55 if (sscanf(p, "%31s ", peripheralName) != 1)
56 return -CMDERR_BADPAR;
58 const spitr_cmd_map_t *cmdDesc = cmdDesc = get_spi_cmd_map(peripheralName, -1, &numCmdDesc);
59 if (cmdDesc == NULL) return -CMDERR_BADREG;
62 if (param[2] != NULL) { // More parameters expected
64 if (sscanf(p, "%x %x %1s", &values[0], &values[1], &spareParams) != 2)
65 return -CMDERR_BADPAR;
69 const spitr_field_desc_t *fieldDescs = get_spi_field_desc(cmdDesc, numCmdDesc, command, &numFieldDesc);
70 if (fieldDescs == NULL)
71 return -CMDERR_BADPAR;
73 ret = spitr_fill_tr_table(fieldDescs, numFieldDesc, response, &translatedData);
75 for (i = 0; i < translatedData.num_rows; i++) {
76 rpp_sci_printf("%s: %x\r\n", translatedData.row[i].field_name, translatedData.row[i].value);
78 return cmd_opchar_replong(cmd_io, param, ret, 0, 10);
81 return -CMDERR_BADPAR;
85 /* SPI Master testing command */
87 uint8_t spi_test_buf_tx[TEST_BUF];
88 uint8_t spi_test_buf_rx[TEST_BUF];
90 int spimst_print_rx(struct spi_drv *ifc, int status, int addr, uint8_t *buf)
95 rpp_sci_printf("spirx failed: %d\n", status);
99 rpp_sci_printf("spirx:%#x(", addr);
100 for (i = 0; i < status; i++) {
101 rpp_sci_printf("%#x", buf[i]);
105 rpp_sci_printf(")\n");
112 * @brief Send SPI command on SPI and receive response
114 * @param[in] cmd_io Pointer to IO stack
115 * @param[in] des Pointer to command descriptor
116 * @param[in] param Parameters of command
117 * @return 0 when OK or error code
119 int cmd_do_spimst(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
129 int values[MAX_PARAM_VALUES_NUM];
132 if (sscanf(p, "%d", &spi) != 1)
133 return -CMDERR_BADPAR;
135 if (sscanf(p, " %d", &addr) != 1)
136 return -CMDERR_BADPAR;
137 token = strtok(p, " ");
138 token = strtok(NULL, " ");
140 while (i < MAX_PARAM_VALUES_NUM && token != NULL) {
141 if (sscanf(token, "%x", &values[i]) == EOF)
143 token = strtok(NULL, " ");
144 spi_test_buf_tx[i] = (uint8_t)values[i];
149 ifc = spi_find_drv(NULL, spi);
151 return -CMDERR_NODEV;
153 if (!(ifc->flags & SPI_IFC_ON))
154 //if (spi_tms570_init(ifc) < 0)
155 return -CMDERR_BADCFG;
159 ret = spi_transfer(ifc, addr, rq_len, spi_test_buf_tx, spi_test_buf_rx);
160 spimst_print_rx(ifc, ret, addr, spi_test_buf_rx);
165 /** Command descriptor for SPI response translation */
166 cmd_des_t const cmd_des_spi_translate = {
167 0, CDESM_OPCHR|CDESM_RW,
168 "spitr*","Translate response from an SPI peripheral",
169 "### Command syntax ###\n"
171 " spitr<NAME> <CMD> <RESP>\n"
174 "- `<NAME>` is a string specifying the name of the peripheral (one of DINSPI, LOUT, DAC12, DAC34, HBR, FRAY1 and FRAY2)\n"
175 "- `<CMD>` is a hexadecimal number in range 0 - FFFFFFFF\n"
176 "- `<RESP>` is a hexadecimal number in range 0 - FFFFFFFF\n"
178 "### Description ###\n"
180 "This command translates a response from SPI from many different\n"
181 "peripherals into a human readable form. The SPI response is in the\n"
182 "form of a hexadecimal number, which encodes the information. This\n"
183 "commands takes this response, the command which produced this\n"
184 "response, the name of the peripheral and translates the response into\n"
185 "the attribute-value table.\n"
188 " --> portvalDINSPI 7F 00 00\n"
189 " portvalDINSPI=AAC03F\n"
190 " --> spitrDINSPI 7F0000 3FC0AA\n"
191 " Thermal flag : 0\n"
217 "Translates response 0x3FC0AA returned by command 0x7F0000 into a human\n"
219 "Please notice LSB->MSB conversion of the portval result. The necessity\n"
220 "of the conversion depends on the controller of the examined port.\n",
221 CMD_HANDLER(cmd_do_spi_translate), (void *)&cmd_list_spi
224 /** Command descriptor for SPI trasfer */
225 cmd_des_t const cmd_des_spimst = {
227 "spimst*", "Request SPI master communication",
228 "### Command syntax ###\n"
230 " spimst<SPI> <ADDR> <DATA>\n"
233 "- `<SPI>` is a number in range 0 - 4\n"
234 "- `<ADDR>` is a number in range 0 - 2\n"
235 "- `<DATA>` is a sequence of hexadecimal numbers, separated by spaces, e.g. 12 AA CD\n"
237 "### Description ###\n"
239 "The command sends given data to the SPI peripheral and prints the\n"
240 "response. The response contains the address and the received data in\n"
245 " --> spimst1 0 7F 00 00\n"
246 " spirx:0x0(0x3f,0xc0,0xff)\n"
248 "Sends reset command (0x7F0000) to the DIN peripheral.\n",
249 CMD_HANDLER(cmd_do_spimst), (void *)&cmd_list_spi
252 /** List of commands for SPI, defined as external */
253 cmd_des_t const *cmd_list_spi[] = {
254 &cmd_des_spi_translate,