/*
- * Copyright (C) 2012-2013 Czech Technical University in Prague
+ * Copyright (C) 2012-2013, 2015 Czech Technical University in Prague
*
* Created on: 28.2.2013
*
* Authors:
* - Michal Horn
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * 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:
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
*
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 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 : cmd_spi.c
*
* Abstract:
- * Command for processing data from SPI and
- * lowlevel command for sending data on SPI
+ * Command for processing data from SPI and
+ * lowlevel command for sending data on SPI
*
*/
#include "cmdproc_utils.h"
#include "drv/drv.h"
#include <_isfuncdcl.h>
+#include "spi_resp_transl.h"
/**
- * @brief Translate SPI response according the command and peripheral type
+ * @brief Translate SPI response according the command and peripheral type
*
* @param[in] cmd_io Pointer to IO stack
* @param[in] des Pointer to command descriptor
* @param[in] param Parameters of command
* @return 0 when OK or error code
*/
-int cmd_do_spi_translate(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]) {
- char *p;
- int i;
- uint32_t ret;
- uint32_t values[MAX_PARAM_VALUES_NUM];
- uint32_t numFieldDesc;
- uint32_t numCmdDesc;
- uint32_t command;
- uint32_t response;
- spitr_reg_translate_table_t translatedData;
- char peripheralName[32];
- char spareParams;
+int cmd_do_spi_translate(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
+{
+ uint32_t command;
+ uint32_t response;
+ char peripheralName[32];
+ char spareParams;
- p = param[1];
- if (sscanf(p, "%31s ", peripheralName) != 1) {
- return -CMDERR_BADPAR;
- }
+ if (sscanf(param[1], "%31s ", peripheralName) != 1)
+ return -CMDERR_BADPAR;
- const spitr_cmd_map_t* cmdDesc = cmdDesc = get_spi_cmd_map(peripheralName, -1, &numCmdDesc);
- if(cmdDesc == NULL) return -CMDERR_BADREG;
+ const spitr_port_cmds_t *cmds = spitr_get_cmds_by_port_name(peripheralName);
+ if (cmds == NULL) return -CMDERR_BADREG;
- if(param[2] != NULL) { // More parameters expected
- p=param[2];
- if (sscanf(p, "%x %x %1s", &values[0], &values[1], &spareParams) != 2) {
+ if (param[2] != NULL) { // More parameters expected
+ if (sscanf(param[2], "%x %x %1s", &command, &response, &spareParams) != 2)
return -CMDERR_BADPAR;
- }
- command = values[0];
- response = values[1];
- const spitr_field_desc_t* fieldDescs = get_spi_field_desc(cmdDesc, numCmdDesc, command, &numFieldDesc);
- if (fieldDescs == NULL)
- return -CMDERR_BADPAR;
+ const spitr_cmd_desc_t *cmd_desc = get_spi_cmd_desc(cmds, command);
+ if (!cmd_desc)
+ return -CMDERR_BADCMD;
- ret = spitr_fill_tr_table(fieldDescs, numFieldDesc, response, &translatedData);
+ spitr_print_resp(cmd_desc, response);
- for (i = 0; i < translatedData.num_rows; i++) {
- rpp_sci_printf("%s: %x\r\n", translatedData.row[i].field_name, translatedData.row[i].value);
- }
- return cmd_opchar_replong(cmd_io, param, ret, 0, 10);
- }
- else{
- return -CMDERR_BADPAR;
- }
+ return cmd_opchar_replong(cmd_io, param, 0, 0, 10);
+ }
+ else
+ return -CMDERR_BADPAR;
}
uint8_t spi_test_buf_tx[TEST_BUF];
uint8_t spi_test_buf_rx[TEST_BUF];
-int spimst_print_rx(struct spi_drv *ifc, int status, int addr, uint8_t *buf)
+int spimst_print_rx(int status, uint8_t *buf)
{
int i;
return -1;
}
- rpp_sci_printf("spirx:%#x(", addr);
+ rpp_sci_printf("spirx:(");
for (i = 0; i < status; i++) {
rpp_sci_printf("%#x", buf[i]);
if (i < status-1)
/**
- * @brief Send SPI command on SPI and receive response
+ * @brief Send SPI command on SPI and receive response
*
* @param[in] cmd_io Pointer to IO stack
* @param[in] des Pointer to command descriptor
*/
int cmd_do_spimst(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
{
- spi_drv_t *ifc;
int i;
char *p;
- char* token;
+ char *token;
int ret;
- unsigned int addr;
unsigned int rq_len;
- int spi;
+ enum spi_device dev;
int values[MAX_PARAM_VALUES_NUM];
- p=param[1];
- if (sscanf(p, "%d", &spi) != 1) {
+ p = param[1];
+ if (sscanf(p, "%d", &i) != 1)
return -CMDERR_BADPAR;
- }
- p=param[2];
- if (sscanf(p, " %d", &addr) != 1) {
+ dev = (enum spi_device)i;
+ if (dev >= _SPIDEV_COUNT)
return -CMDERR_BADPAR;
- }
token = strtok(p, " ");
token = strtok(NULL, " ");
i = 0;
while (i < MAX_PARAM_VALUES_NUM && token != NULL) {
- if (sscanf(token, "%x", &values[i]) == EOF) {
+ if (sscanf(token, "%x", &values[i]) == EOF)
break;
- }
token = strtok(NULL, " ");
spi_test_buf_tx[i] = (uint8_t)values[i];
i++;
}
-
- ifc = spi_find_drv(NULL, spi);
- if (ifc == NULL)
- return -CMDERR_NODEV;
-
- if (!(ifc->flags & SPI_IFC_ON)) {
- //if (spi_tms570_init(ifc) < 0)
- return -CMDERR_BADCFG;
- }
-
rq_len = i;
- ret = spi_transfer(ifc, addr, rq_len, spi_test_buf_tx, spi_test_buf_rx);
- spimst_print_rx(ifc, ret, addr, spi_test_buf_rx);
+ ret = spi_transfer(dev, rq_len, spi_test_buf_tx, spi_test_buf_rx);
+ spimst_print_rx(ret, spi_test_buf_rx);
return 0;
}
-#endif /* DOCGEN */
+#endif /* DOCGEN */
/** Command descriptor for SPI response translation */
-cmd_des_t const cmd_des_spi_translate={
+cmd_des_t const cmd_des_spi_translate = {
0, CDESM_OPCHR|CDESM_RW,
"spitr*","Translate response from an SPI peripheral",
- "=== Command syntax ===\n"
+ "### Command syntax ###\n"
"\n"
- " spitr<NAME> <CMD> <RESP>\n"
+ " spitr<NAME> <CMD> <RESP>\n"
"where\n"
- "* <NAME> is a string specifying the name of the peripheral (one of DINSPI, LOUT, DAC12, DAC34, HBR, FRAY1 and FRAY2)\n"
- "* <CMD> is a hexadecimal number in range 0 - FFFFFFFF\n"
- "* <RESP> is a hexadecimal number in range 0 - FFFFFFFF\n"
"\n"
- "=== Description ===\n"
+ "- `<NAME>` is a string specifying the name of the peripheral (one of DINSPI, LOUT, DAC12, DAC34, HBR, FRAY1 and FRAY2)\n"
+ "- `<CMD>` is a hexadecimal number in range 0 - FFFFFFFF\n"
+ "- `<RESP>` is a hexadecimal number in range 0 - FFFFFFFF\n"
+ "\n"
+ "### Description ###\n"
"\n"
"This command translates a response from SPI from many different\n"
"peripherals into a human readable form. The SPI response is in the\n"
"response, the name of the peripheral and translates the response into\n"
"the attribute-value table.\n"
"\n"
- "=== Example ===\n"
- " --> portvalDINSPI 7F 00 00\n"
- " portvalDINSPI=AAC03F\n"
- " --> spitrDINSPI 7F0000 3FC0AA\n"
- " Thermal flag : 0\n"
- " INT flag : 0\n"
- " SP0 - DIN0 : 1\n"
- " SP1 - DIN1 : 1\n"
- " SP2 - DIN2 : 1\n"
- " SP3 - DIN3 : 1\n"
- " SP4 - DIN4 : 1\n"
- " SP5 - DIN5 : 1\n"
- " SP6 - DIN6 : 1\n"
- " SP7 - DIN7 : 1\n"
- " SG0 - DIN8 : 0\n"
- " SG1 - DIN9 : 1\n"
- " SG2 - DIN10 : 0\n"
- " SG3 - DIN11 : 1\n"
- " SG4 - DIN12 : 0\n"
- " SG5 - DIN13 : 1\n"
- " SG6 - DIN14 : 0\n"
- " SG7 - DIN15 : 1\n"
- " SG8 - NA : 0\n"
- " SG9 - NA : 0\n"
- " SG10 - NA : 0\n"
- " SG11 - NA : 0\n"
- " SG12 - NA : 0\n"
- " SG13 - NA : 0\n"
- " spitrDINSPI=24\n"
+ "### Example ###\n"
+ " --> portvalDINSPI 7F 00 00\n"
+ " portvalDINSPI=AAC03F\n"
+ " --> spitrDINSPI 7F0000 3FC0AA\n"
+ " Thermal flag : 0\n"
+ " INT flag : 0\n"
+ " SP0 - DIN0 : 1\n"
+ " SP1 - DIN1 : 1\n"
+ " SP2 - DIN2 : 1\n"
+ " SP3 - DIN3 : 1\n"
+ " SP4 - DIN4 : 1\n"
+ " SP5 - DIN5 : 1\n"
+ " SP6 - DIN6 : 1\n"
+ " SP7 - DIN7 : 1\n"
+ " SG0 - DIN8 : 0\n"
+ " SG1 - DIN9 : 1\n"
+ " SG2 - DIN10 : 0\n"
+ " SG3 - DIN11 : 1\n"
+ " SG4 - DIN12 : 0\n"
+ " SG5 - DIN13 : 1\n"
+ " SG6 - DIN14 : 0\n"
+ " SG7 - DIN15 : 1\n"
+ " SG8 - NA : 0\n"
+ " SG9 - NA : 0\n"
+ " SG10 - NA : 0\n"
+ " SG11 - NA : 0\n"
+ " SG12 - NA : 0\n"
+ " SG13 - NA : 0\n"
+ " spitrDINSPI=24\n"
"\n"
"Translates response 0x3FC0AA returned by command 0x7F0000 into a human\n"
"readable form.\n"
cmd_des_t const cmd_des_spimst = {
0, 0,
"spimst*", "Request SPI master communication",
- "=== Command syntax ===\n"
+ "### Command syntax ###\n"
"\n"
- " spimst<SPI> <ADDR> <DATA>\n"
+ " spimst<SPI> <ADDR> <DATA>\n"
"where\n"
- "* <SPI> is a number in range 0 - 4\n"
- "* <ADDR> is a number in range 0 - 2\n"
- "* <DATA> is a sequence of hexadecimal numbers, separated by spaces, e.g. 12 AA CD\n"
"\n"
- "=== Description ===\n"
+ "- `<SPI>` is a number in range 0 - 4\n"
+ "- `<ADDR>` is a number in range 0 - 2\n"
+ "- `<DATA>` is a sequence of hexadecimal numbers, separated by spaces, e.g. 12 AA CD\n"
+ "\n"
+ "### Description ###\n"
"\n"
"The command sends given data to the SPI peripheral and prints the\n"
"response. The response contains the address and the received data in\n"
"parentheses.\n"
"\n"
- "=== Example ===\n"
+ "### Example ###\n"
"\n"
- " --> spimst1 0 7F 00 00\n"
- " spirx:0x0(0x3f,0xc0,0xff)\n"
+ " --> spimst1 0 7F 00 00\n"
+ " spirx:0x0(0x3f,0xc0,0xff)\n"
"\n"
"Sends reset command (0x7F0000) to the DIN peripheral.\n",
CMD_HANDLER(cmd_do_spimst), (void *)&cmd_list_spi
};
/** List of commands for SPI, defined as external */
-cmd_des_t const *cmd_list_spi[]={
- &cmd_des_spi_translate,
- &cmd_des_spimst,
- NULL
+cmd_des_t const *cmd_list_spi[] = {
+ &cmd_des_spi_translate,
+ &cmd_des_spimst,
+ NULL
};