/**************************************************************************** * apps/system/spi/spitool.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ #ifndef __APPS_SYSTEM_SPI_SPITOOLS_H #define __APPS_SYSTEM_SPI_SPITOOLS_H /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Configuration ************************************************************/ /* CONFIG_NSH_BUILTIN_APPS - Build the tools as an NSH built-in command * CONFIG_SPITOOL_MINBUS - Smallest bus index supported by the hardware * (default 0). * CONFIG_SPITOOL_MAXBUS - Largest bus index supported by the hardware * (default 3) * CONFIG_SPITOOL_DEFFREQ - Default frequency (default: 40000000) * CONFIG_SPITOOL_DEFMODE - Default mode, where; * 0 = CPOL=0, CPHA=0 * 1 = CPOL=0, CPHA=1 * 2 = CPOL=1, CPHA=0 * 3 = CPOL=1, CPHA=1 * CONFIG_SPITOOL_DEFWIDTH - Default bit width (default 8) * CONFIG_SPITOOL_DEFWORDS - Default number of words to exchange * (default 1) */ #ifndef CONFIG_SPITOOL_MINBUS # define CONFIG_SPITOOL_MINBUS 0 #endif #ifndef CONFIG_SPITOOL_MAXBUS # define CONFIG_SPITOOL_MAXBUS 3 #endif #ifndef CONFIG_SPITOOL_DEFFREQ # define CONFIG_SPITOOL_DEFFREQ 4000000 #endif #ifndef CONFIG_SPITOOL_DEFMODE #define CONFIG_SPITOOL_DEFMODE 0 /* CPOL=0, CPHA=0 */ #endif #ifndef CONFIG_SPITOOL_DEFWIDTH #define CONFIG_SPITOOL_DEFWIDTH 8 #endif #ifndef CONFIG_SPITOOL_DEFWORDS #define CONFIG_SPITOOL_DEFWORDS 1 #endif /* This is the maximum number of arguments that will be accepted for a * command. This is only used for sizing a hardcoded array and is set * to be sufficiently large to support all possible SPI tool arguments and * then some. */ #define MAX_ARGUMENTS 12 /* Maximum size of one command line */ #define MAX_LINELEN 80 #define MAX_XDATA (MAX_LINELEN/2) /* Are we using the NuttX console for I/O? Or some other character device? */ #ifdef CONFIG_SPITOOL_INDEV # define INFD(p) ((p)->ss_infd) # define INSTREAM(p) ((p)->ss_instream) #else # define INFD(p) 0 # define INSTREAM(p) stdin #endif #ifdef CONFIG_SPITOOL_OUTDEV # define OUTFD(p) ((p)->ss_outfd) # define OUTSTREAM(p) ((p)->ss_outstream) #else # define OUTFD(p) 1 # define OUTSTREAM(p) stdout #endif /* Output is via printf but can be changed using this macro */ # define spi_output printf /**************************************************************************** * Public Types ****************************************************************************/ struct spitool_s { /* Sticky options */ uint8_t bus; /* [-b bus] is the SPI bus number */ uint8_t width; /* [-w width] is the data width (8 or 16) */ uint32_t freq; /* [-f freq] SPI frequency */ uint32_t count; /* [-x count] No of words to exchange */ uint32_t csn; /* [-n CSn] Chip select number for devtype */ uint32_t devtype; /* [-t devtype] DevType (see spi_devtype_e) */ bool command; /* [-c 0|1] Send as command or data? */ useconds_t udelay; /* [-u udelay] Delay in uS after transfer */ uint8_t mode; /* [-m mode] Mode to use for transfer */ /* Output streams */ #ifdef CONFIG_SPITOOL_OUTDEV int ss_outfd; /* Output file descriptor */ FILE *ss_outstream; /* Output stream */ #endif }; typedef int (*cmd_t)(FAR struct spitool_s *spitool, int argc, FAR char **argv); struct cmdmap_s { FAR const char *cmd; /* Name of the command */ cmd_t handler; /* Function that handles the command */ FAR const char *desc; /* Short description */ FAR const char *usage; /* Usage instructions for 'help' command */ }; /**************************************************************************** * Public Data ****************************************************************************/ extern const char g_spiargrequired[]; extern const char g_spiarginvalid[]; extern const char g_spiargrange[]; extern const char g_spiincompleteparam[]; extern const char g_spicmdnotfound[]; extern const char g_spitoomanyargs[]; extern const char g_spicmdfailed[]; extern const char g_spixfrerror[]; /**************************************************************************** * Public Function Prototypes ****************************************************************************/ /* Message handler */ ssize_t spitool_exchange(FAR struct spitool_s *spitool, FAR const void *outbuffer, size_t noutbytes, FAR void *inbuffer, size_t ninbytes); int spitool_printf(FAR struct spitool_s *spitool, FAR const char *fmt, ...) printf_like(2, 3); void spitool_flush(FAR struct spitool_s *spitool); /* Command handlers */ int spicmd_bus(FAR struct spitool_s *spitool, int argc, FAR char **argv); int spicmd_exch(FAR struct spitool_s *spitool, int argc, FAR char **argv); /* Common logic */ int spitool_common_args(FAR struct spitool_s *spitool, FAR char **arg); /* Driver access utilities */ FAR char *spidev_path(int bus); bool spidev_exists(int bus); int spidev_open(int bus); int spidev_transfer(int fd, FAR struct spi_sequence_s *seq); #endif /* __APPS_SYSTEM_SPI_SPITOOLS_H */