--- /dev/null
+#ifndef _UTILS_DEF_H_
+#define _UTILS_DEF_H_
+
+/* skip space/blank characters, return 0 if no space found */
+int si_skspace(char **ps);
+
+/* skip spaces and checks for <sepchars>, */
+/* if no such char return -1, else char is returned */
+int si_fndsep(char **ps, char *sepchrs);
+
+/* reads max <n> letters and digits to <pout> */
+/* returns number of readed chars */
+int si_alnumn(char **ps, char *pout, int n);
+
+/* same as above, but only letters are read */
+int si_alphan(char **ps, char *pout, int n);
+
+/* reads long number, if no digit found return -1 */
+int si_long(char **ps, long *val, int base);
+
+/* reads numbers into array, size of element representation is selected by blen */
+int si_add_to_arr(char **ps, void **pdata, int *plen, int base, int elsize,
+ char *stop_chars);
+
+/* concatenate C main style arguments into one line */
+int concat_args2line(char **pline, int argc, char **argv);
+
+#endif /* _UTILS_DEF_H_ */
#include "vbat.h"
#include "lin.h"
#include "emac_test.h"
+#include "spi_drv.h"
+#include "spi_tms570.h"
+
+#include "ctype.h"
+#include "utils.h"
/** @brief Count of AD channels in ADC1
*/
return 0;
}
+/* SPI Master testing command */
+#define TEST_BUF 64
+uint8_t spi_test_buf_tx[TEST_BUF];
+uint8_t spi_test_buf_rx[TEST_BUF];
+
+static int test_rd_arr(char **ps, uint8_t *buf, int n)
+{
+ long val;
+ int c;
+ int i;
+
+ if (si_fndsep(ps, "({") < 0)
+ return -CMDERR_BADSEP;
+ i = 0;
+ si_skspace(ps);
+ if ((**ps != ')') && (**ps != '}'))
+ do {
+ if (i >= n)
+ return -CMDERR_BADPAR;
+ if (si_long(ps, &val, 16) < 0)
+ return -CMDERR_BADPAR;
+ buf[i] = val;
+ i++;
+ if ((c = si_fndsep(ps, ",)}")) < 0)
+ return -CMDERR_BADSEP;
+ } while (c == ',');
+
+ return i;
+}
+
+int spimst_print_rx(struct spi_drv *ifc, int status, int addr, uint8_t *buf)
+{
+ int i;
+
+//FIXME print vs. printf
+
+ print("SPI\n\r");
+ printf("SPI! %02X ", addr);
+ if (status < 0)
+ print("FAIL ");
+
+ printf(" RX(");
+ for (i = 0; i < status; i++)
+ printf("%s%02X", i ? "," : "", buf[i]);
+ printf(")");
+ printf("\n");
+
+ return 0;
+}
+
+
+int cmd_do_spimst(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
+{
+ spi_drv_t *ifc;
+ int i;
+ char *p;
+ long val;
+ int ret;
+ unsigned int addr;
+ unsigned int rq_len;
+
+ if (!¶m[1] || !(*param[1] >= '0' && *param[1] <= '9'))
+ return -CMDERR_BADSUF;
+
+ if (*param[2] != ':')
+ return -CMDERR_OPCHAR;
+
+ ifc = spi_find_drv(NULL, *param[1] - '0');
+ if (ifc == NULL)
+ return -CMDERR_NODEV;
+
+ if (!(ifc->flags & SPI_IFC_ON)) {
+ //if (spi_tms570_init(ifc) < 0)
+ return -CMDERR_BADCFG;
+ }
+
+ si_skspace(&p);
+ if (isdigit(*p)) {
+ if (si_long(&p, &val, 16) < 0)
+ return -CMDERR_BADPAR;
+ addr = val;
+ }
+ si_skspace(&p);
+ i = test_rd_arr(&p, spi_test_buf_tx, TEST_BUF);
+ if (i < 0)
+ return i;
+ 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);
+ return 0;
+}
+
+
/* ------------------------------
* User defined command variables
* ------------------------------
cmd_do_help, (void *)&cmd_list
};
+cmd_des_t const cmd_des_spimst = { 0, CDESM_OPCHR,
+ "SPIMST#", "SPI master communication request",
+ cmd_do_spimst, (void *)&cmd_list
+};
+
+
/* ------------------------
* Command lists definitons
* ------------------------
/* Code based on Halcogen generated source code */
#include "spi_tms570.h"
-#include "spi_comm.h"
+#include "spi_drv.h"
#include "sys_common.h"
static int spi_tms570_ctrl_fnc(spi_drv_t *ifc, int ctrl, void *p);
}
}
+spi_drv_t *spi_find_drv(char *name, int number)
+{
+ if (number < 0 || number >= (sizeof(spi_tms570_ifcs)/sizeof(spi_tms570_ifcs[0])))
+ return NULL;
+
+ return &spi_tms570_ifcs[number].spi_drv;
+}
#pragma INTERRUPT(spi2LowLevelInterrupt, IRQ)
void spi2LowLevelInterrupt(void)