diff --git a/boards/arm/s32k1xx/s32k148evb/README.txt b/boards/arm/s32k1xx/s32k148evb/README.txt index 4052018cd45..e4e00fbcd90 100644 --- a/boards/arm/s32k1xx/s32k148evb/README.txt +++ b/boards/arm/s32k1xx/s32k148evb/README.txt @@ -16,9 +16,17 @@ Status ====== 2019-08-20: NSH configuration created but entirely untested. + 2019-08-24: NSH configuration verified running from FLASH. - TODO: Need calibrate the delay loop. The current value of + 2019-10-19: FLASH configuration options were added. + + 2020-06-15: Added FlexCAN driver with SocketCAN support to the S32K1XX + arch. This feature been tested extensively with the S32K148EVB. + + 2020-06-16: Added Emulated EEPROM driver and initialization. + + TODO: Need to calibrate the delay loop. The current value of CONFIG_BOARD_LOOPSPERMSEC is a bogus value retained from a copy-paste (see apps/examples/calib_udelay). @@ -30,7 +38,7 @@ Serial Console OpenSDA UART TX PTC7 (LPUART1_TX) OpenSDA UART RX PTC6 (LPUART1_RX) - USB drivers for the PEMIcro CDC Serial port are available here: + USB drivers for the PEmicro CDC Serial Port are available here: http://www.pemicro.com/opensda/ LEDs and Buttons @@ -40,17 +48,21 @@ LEDs and Buttons ---- The S32K148EVB has one RGB LED: - RedLED PTE21 - GreenLED PTE22 - BlueLED PTE23 + RedLED PTE21 (FTM4 CH1) + GreenLED PTE22 (FTM4 CH2) + BlueLED PTE23 (FTM4 CH3) An output of '1' illuminates the LED. If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. The following definitions are used to access individual RGB - components. + components (see s32k148evb.h): - The RGB components could, alternatively be controlled through PWM using + GPIO_LED_R + GPIO_LED_G + GPIO_LED_B + + The RGB components could, alternatively, be controlled through PWM using the common RGB LED driver. If CONFIG_ARCH_LEDs is defined, then NuttX will control the LEDs on board @@ -69,7 +81,7 @@ LEDs and Buttons LED_SIGNAL In a signal handler (no change) LED_ASSERTION An assertion failed (no change) LED_PANIC The system has crashed FLASH OFF OFF - LED_IDLE S32K148EVB in sleep mode (no change) + LED_IDLE S32K148 in sleep mode (no change) ==========================================+========+========+========= Buttons @@ -82,34 +94,34 @@ LEDs and Buttons OpenSDA Notes ============= - - USB drivers for the PEMIcro CDC Serial port are available here: + - USB drivers for the PEmicro CDC Serial Port are available here: http://www.pemicro.com/opensda/ - The drag'n'drog interface expects files in .srec format. - - Using Segger J-Link: Easy... but remember to use the 20-pin SWD J10 - connector near the Ethernet connector and not J20 the 10-bit OpenSDA - connector closer to the OpenSDA USB connector J24. + - Using Segger J-Link: Easy... but remember to use the 20-pin SWD + connector J10 near the ethernet connector and not the 10-pin OpenSDA + connector J20 closer to the OpenSDA USB connector J24. Configurations ============== Common Information ------------------ - Each S32K148EVB configuration is maintained in a sub-directory and - can be selected as follow: + Each S32K148EVB configuration is maintained in a sub-directory and can be + selected as follows: tools/configure.sh s32k148evb: - Where is one of the sub-directories listed in the next paragraph + Where is one of the sub-directories listed in the next paragraph. NOTES (common for all configurations): - 1. This configuration uses the mconf-based configuration tool. To - change this configuration using that tool, you should: + 1. This configuration uses the mconf-based configuration tool. To change + this configuration using that tool, you should: - a. Build and install the kconfig-mconf tool. See nuttx/README.txt - see additional README.txt files in the NuttX tools repository. + a. Build and install the kconfig-mconf tool. See nuttx/README.txt. + Also see additional README.txt files in the NuttX tools repository. b. Execute 'make menuconfig' in nuttx/ in order to start the reconfiguration process. @@ -123,5 +135,5 @@ Configurations nsh: --- Configures the NuttShell (nsh) located at apps/examples/nsh. Support - for builtin applications is enabled, but in the base configuration but - the builtin applications selected is the "Hello, World!" example. + for builtin applications is enabled, but in the base configuration the + only application selected is the "Hello, World!" example. diff --git a/boards/arm/s32k1xx/s32k148evb/configs/nsh/defconfig b/boards/arm/s32k1xx/s32k148evb/configs/nsh/defconfig index 9637952298d..86dea793f17 100644 --- a/boards/arm/s32k1xx/s32k148evb/configs/nsh/defconfig +++ b/boards/arm/s32k1xx/s32k148evb/configs/nsh/defconfig @@ -17,15 +17,13 @@ CONFIG_ARCH_CHIP_S32K148=y CONFIG_ARCH_CHIP_S32K14X=y CONFIG_ARCH_CHIP_S32K1XX=y CONFIG_ARCH_STACKDUMP=y -CONFIG_BOARD_LOOPSPERMSEC=2988 +CONFIG_BOARD_LOOPSPERMSEC=6667 CONFIG_BUILTIN=y CONFIG_EXAMPLES_HELLO=y CONFIG_FS_PROCFS=y CONFIG_HAVE_CXX=y CONFIG_HAVE_CXXINITIALIZE=y -CONFIG_LPUART1_RXBUFSIZE=64 CONFIG_LPUART1_SERIAL_CONSOLE=y -CONFIG_LPUART1_TXBUFSIZE=64 CONFIG_MOTOROLA_SREC=y CONFIG_NSH_ARCHINIT=y CONFIG_NSH_BUILTIN_APPS=y @@ -34,14 +32,14 @@ CONFIG_NSH_READLINE=y CONFIG_PREALLOC_TIMERS=4 CONFIG_RAM_SIZE=258048 CONFIG_RAM_START=0x1ffe0000 +CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 CONFIG_S32K1XX_LPUART1=y CONFIG_SCHED_WAITPID=y CONFIG_SDCLONE_DISABLE=y -CONFIG_START_DAY=18 -CONFIG_START_MONTH=8 -CONFIG_START_YEAR=2019 -CONFIG_STDIO_DISABLE_BUFFERING=y +CONFIG_START_DAY=6 +CONFIG_START_MONTH=9 +CONFIG_START_YEAR=2021 CONFIG_SYMTAB_ORDEREDBYNAME=y CONFIG_SYSTEM_NSH=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/boards/arm/s32k1xx/s32k148evb/include/board.h b/boards/arm/s32k1xx/s32k148evb/include/board.h index f01f789ad0d..d7478b4d6cd 100644 --- a/boards/arm/s32k1xx/s32k148evb/include/board.h +++ b/boards/arm/s32k1xx/s32k148evb/include/board.h @@ -18,8 +18,8 @@ * ****************************************************************************/ -#ifndef __BOARDS_ARM_S32K148EVB_INCLUDE_BOARD_H -#define __BOARDS_ARM_S32K148EVB_INCLUDE_BOARD_H +#ifndef __BOARDS_ARM_S32K1XX_S32K148EVB_INCLUDE_BOARD_H +#define __BOARDS_ARM_S32K1XX_S32K148EVB_INCLUDE_BOARD_H /**************************************************************************** * Included Files @@ -27,30 +27,25 @@ #include -#ifndef __ASSEMBLY__ -# include -# include -#endif - /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Clocking *****************************************************************/ -/* The S32K148EVB is fitted with a 8MHz Crystal */ +/* The S32K148EVB is fitted with a 8 MHz crystal */ -#define BOARD_XTAL_FREQUENCY 8000000 +#define BOARD_XTAL_FREQUENCY 8000000 -/* The S32K148 will run at 112MHz */ +/* The S32K148 will run at 80 MHz */ /* LED definitions **********************************************************/ /* The S32K148EVB has one RGB LED: * - * RedLED PTE21 - * GreenLED PTE22 - * BlueLED PTE23 + * RedLED PTE21 (FTM4 CH1) + * GreenLED PTE22 (FTM4 CH2) + * BlueLED PTE23 (FTM4 CH3) * * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in * any way. The following definitions are used to access individual RGB @@ -77,20 +72,20 @@ * the S32K148EVB. The following definitions describe how NuttX controls the * LEDs: * - * SYMBOL Meaning LED state - * RED GREEN BLUE - * ------------------- ---------------------------- ----------------- + * SYMBOL Meaning LED state + * RED GREEN BLUE + * ---------------- ----------------------------- ------------------- */ -#define LED_STARTED 1 /* NuttX has been started OFF OFF OFF */ -#define LED_HEAPALLOCATE 2 /* Heap has been allocated OFF OFF ON */ -#define LED_IRQSENABLED 0 /* Interrupts enabled OFF OFF ON */ -#define LED_STACKCREATED 3 /* Idle stack created OFF ON OFF */ -#define LED_INIRQ 0 /* In an interrupt (no change) */ -#define LED_SIGNAL 0 /* In a signal handler (no change) */ -#define LED_ASSERTION 0 /* An assertion failed (no change) */ -#define LED_PANIC 4 /* The system has crashed FLASH OFF OFF */ -#undef LED_IDLE /* S32K148EVB in sleep mode (Not used) */ +#define LED_STARTED 1 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 2 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 0 /* Interrupts enabled OFF OFF ON */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON OFF */ +#define LED_INIRQ 0 /* In an interrupt (No change) */ +#define LED_SIGNAL 0 /* In a signal handler (No change) */ +#define LED_ASSERTION 0 /* An assertion failed (No change) */ +#define LED_PANIC 4 /* The system has crashed FLASH OFF OFF */ +#undef LED_IDLE /* S32K148 is in sleep mode (Not used) */ /* Button definitions *******************************************************/ @@ -107,23 +102,31 @@ #define BUTTON_SW3_BIT (1 << BUTTON_SW3) #define BUTTON_SW4_BIT (1 << BUTTON_SW4) -/* Alternate function pin selections ****************************************/ +/* UART selections **********************************************************/ /* By default, the serial console will be provided on the OpenSDA VCOM port: * - * OpenSDA UART TX PTC7 (LPUART1_TX) - * OpenSDA UART RX PTC6 (LPUART1_RX) + * OpenSDA UART RX PTC6 (LPUART1_RX) + * OpenSDA UART TX PTC7 (LPUART1_TX) */ -#define PIN_LPUART1_RX PIN_LPUART1_RX_1 /* PTC6 */ -#define PIN_LPUART1_TX PIN_LPUART1_TX_1 /* PTC7 */ +#define PIN_LPUART1_RX PIN_LPUART1_RX_1 /* PTC6 */ +#define PIN_LPUART1_TX PIN_LPUART1_TX_1 /* PTC7 */ + +/* SPI selections ***********************************************************/ + +/* UJA1132HW SBC SPI (LPSPI1) */ + +#define PIN_LPSPI1_PCS PIN_LPSPI1_PCS0_1 /* PTA26 */ +#define PIN_LPSPI1_MISO PIN_LPSPI1_SOUT_1 /* PTA27 */ +#define PIN_LPSPI1_SCK PIN_LPSPI1_SCK_1 /* PTA28 */ +#define PIN_LPSPI1_MOSI PIN_LPSPI1_SIN_4 /* PTA29 */ /* CAN selections ***********************************************************/ -#define PIN_CAN0_TX PIN_CAN0_TX_1 -#define PIN_CAN0_RX PIN_CAN0_RX_1 -#define PIN_CAN1_TX PIN_CAN1_TX_1 -#define PIN_CAN1_RX PIN_CAN1_RX_1 -#define PIN_CAN2_TX PIN_CAN2_TX_1 -#define PIN_CAN2_RX PIN_CAN2_RX_1 -#endif /* __BOARDS_ARM_S32K148EVB_INCLUDE_BOARD_H */ +/* UJA1132HW SBC CAN (CAN0) */ + +#define PIN_CAN0_RX PIN_CAN0_RX_4 /* PTE4 */ +#define PIN_CAN0_TX PIN_CAN0_TX_4 /* PTE5 */ + +#endif /* __BOARDS_ARM_S32K1XX_S32K148EVB_INCLUDE_BOARD_H */ diff --git a/boards/arm/s32k1xx/s32k148evb/src/Makefile b/boards/arm/s32k1xx/s32k148evb/src/Makefile index fbfba905a54..54f9423ac51 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/Makefile +++ b/boards/arm/s32k1xx/s32k148evb/src/Makefile @@ -23,18 +23,26 @@ include $(TOPDIR)/Make.defs CSRCS = s32k1xx_boot.c s32k1xx_bringup.c s32k1xx_clockconfig.c CSRCS += s32k1xx_periphclocks.c +ifeq ($(CONFIG_ARCH_BUTTONS),y) +CSRCS += s32k1xx_buttons.c +endif + ifeq ($(CONFIG_ARCH_LEDS),y) CSRCS += s32k1xx_autoleds.c else CSRCS += s32k1xx_userleds.c endif -ifeq ($(CONFIG_ARCH_BUTTONS),y) -CSRCS += s32k1xx_buttons.c -endif - ifeq ($(CONFIG_BOARDCTL),y) CSRCS += s32k1xx_appinit.c endif +ifeq ($(CONFIG_S32K1XX_LPI2C),y) +CSRCS += s32k1xx_i2c.c +endif + +ifeq ($(CONFIG_S32K1XX_LPSPI),y) +CSRCS += s32k1xx_spi.c +endif + include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k148evb.h b/boards/arm/s32k1xx/s32k148evb/src/s32k148evb.h index 6ec7aaf99d8..d99b89de370 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k148evb.h +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k148evb.h @@ -32,6 +32,7 @@ #include "hardware/s32k1xx_pinmux.h" #include "s32k1xx_periphclocks.h" +#include "s32k1xx_pin.h" /**************************************************************************** * Pre-processor Definitions @@ -43,16 +44,16 @@ /* LEDs. The S32K148EVB has one RGB LED: * - * RedLED PTE21 - * GreenLED PTE22 - * BlueLED PTE23 + * RedLED PTE21 (FTM4 CH1) + * GreenLED PTE22 (FTM4 CH2) + * BlueLED PTE23 (FTM4 CH3) * * An output of '1' illuminates the LED. */ -#define GPIO_LED_R (PIN_PTE21 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) -#define GPIO_LED_G (PIN_PTE22 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) -#define GPIO_LED_B (PIN_PTE23 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) +#define GPIO_LED_R (PIN_PTE21 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) +#define GPIO_LED_G (PIN_PTE22 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) +#define GPIO_LED_B (PIN_PTE23 | GPIO_LOWDRIVE | GPIO_OUTPUT_ZERO) /* Buttons. The S32K148EVB supports two buttons: * @@ -60,19 +61,13 @@ * SW4 PTC13 */ -#define GPIO_SW3 (PIN_PTC12 | PIN_INT_BOTH) -#define GPIO_SW4 (PIN_PTC13 | PIN_INT_BOTH) - -/* SPI chip selects */ +#define GPIO_SW3 (PIN_PTC12 | PIN_INT_BOTH) +#define GPIO_SW4 (PIN_PTC13 | PIN_INT_BOTH) /* Count of peripheral clock user configurations */ #define NUM_OF_PERIPHERAL_CLOCKS_0 18 -/**************************************************************************** - * Public Types - ****************************************************************************/ - /**************************************************************************** * Public Data ****************************************************************************/ @@ -104,17 +99,25 @@ extern const struct peripheral_clock_config_s g_peripheral_clockconfig0[]; int s32k1xx_bringup(void); /**************************************************************************** - * Name: s32k1xx_spidev_initialize + * Name: s32k1xx_i2cdev_initialize * * Description: - * Called to configure SPI chip select GPIO pins for the S32K148EVB - * board. + * Initialize I2C driver and register /dev/i2cN devices. * ****************************************************************************/ -#ifdef CONFIG_S32K1XX_SPI -void s32k1xx_spidev_initialize(void); -#endif +int s32k1xx_i2cdev_initialize(void); + +/**************************************************************************** + * Name: s32k1xx_spidev_initialize + * + * Description: + * Configure chip select pins, initialize the SPI driver and register + * /dev/spiN devices. + * + ****************************************************************************/ + +int s32k1xx_spidev_initialize(void); #endif /* __ASSEMBLY__ */ #endif /* __BOARDS_ARM_S32K1XX_S32K148EVB_SRC_S32K148EVB_H */ diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_appinit.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_appinit.c index 6104ecd5be0..59998634c1d 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_appinit.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_appinit.c @@ -23,9 +23,10 @@ ****************************************************************************/ #include - #include +#include + #include "s32k148evb.h" /**************************************************************************** @@ -50,14 +51,14 @@ * * Input Parameters: * arg - The boardctl() argument is passed to the board_app_initialize() - * implementation without modification. The argument has no - * meaning to NuttX; the meaning of the argument is a contract - * between the board-specific initialization logic and the - * matching application logic. The value could be such things as a - * mode enumeration value, a set of DIP switch switch settings, a - * pointer to configuration data read from a file or serial FLASH, - * or whatever you would like to do with it. Every implementation - * should accept zero/NULL as a default configuration. + * implementation without modification. The argument has no meaning + * to NuttX; the meaning of the argument is a contract between the + * board-specific initialization logic and the matching application + * logic. The value could be such things as a mode enumeration + * value, a set of DIP switch settings, a pointer to configuration + * data read from a file or serial FLASH, or whatever you would like + * to do with it. Every implementation should accept zero/NULL as a + * default configuration. * * Returned Value: * Zero (OK) is returned on success; a negated errno value is returned on diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_autoleds.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_autoleds.c index 1e33994e7f0..6644c1e3c89 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_autoleds.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_autoleds.c @@ -20,28 +20,28 @@ /* The S32K148EVB has one RGB LED: * - * RedLED PTE21 - * GreenLED PTE22 - * BlueLED PTE23 + * RedLED PTE21 (FTM4 CH1) + * GreenLED PTE22 (FTM4 CH2) + * BlueLED PTE23 (FTM4 CH3) * * An output of '1' illuminates the LED. * * If CONFIG_ARCH_LEDs is defined, then NuttX will control the LED on board - * the Freedom K66F. The following definitions describe how NuttX controls - * the LEDs: + * the S32K148EVB. The following definitions describe how NuttX controls the + * LEDs: * - * SYMBOL Meaning LED state - * RED GREEN BLUE - * ------------------- ----------------------- ----------------- - * LED_STARTED NuttX has been started OFF OFF OFF - * LED_HEAPALLOCATE Heap has been allocated OFF OFF ON - * LED_IRQSENABLED Interrupts enabled OFF OFF ON - * LED_STACKCREATED Idle stack created OFF ON OFF - * LED_INIRQ In an interrupt (no change) - * LED_SIGNAL In a signal handler (no change) - * LED_ASSERTION An assertion failed (no change) - * LED_PANIC The system has crashed FLASH OFF OFF - * LED_IDLE K66 is in sleep mode (Optional, not used) + * SYMBOL Meaning LED state + * RED GREEN BLUE + * ---------------- ------------------------ -------------------- + * LED_STARTED NuttX has been started OFF OFF OFF + * LED_HEAPALLOCATE Heap has been allocated OFF OFF ON + * LED_IRQSENABLED Interrupts enabled OFF OFF ON + * LED_STACKCREATED Idle stack created OFF ON OFF + * LED_INIRQ In an interrupt (No change) + * LED_SIGNAL In a signal handler (No change) + * LED_ASSERTION An assertion failed (No change) + * LED_PANIC The system has crashed FLASH OFF OFF + * LED_IDLE S32K148 is in sleep mode (Optional, not used) */ /**************************************************************************** @@ -52,18 +52,12 @@ #include #include -#include #include -#include - -#include "arm_arch.h" -#include "arm_internal.h" #include "s32k1xx_pin.h" -#include "s32k148evb.h" -#include +#include "s32k148evb.h" #ifdef CONFIG_ARCH_LEDS @@ -73,11 +67,11 @@ /* Summary of all possible settings */ -#define LED_NOCHANGE 0 /* LED_IRQSENABLED, LED_INIRQ, LED_SIGNAL, LED_ASSERTION */ -#define LED_OFF_OFF_OFF 1 /* LED_STARTED */ -#define LED_OFF_OFF_ON 2 /* LED_HEAPALLOCATE */ -#define LED_OFF_ON_OFF 3 /* LED_STACKCREATED */ -#define LED_ON_OFF_OFF 4 /* LED_PANIC */ +#define LED_NOCHANGE 0 /* LED_IRQSENABLED, LED_INIRQ, LED_SIGNAL, LED_ASSERTION */ +#define LED_OFF_OFF_OFF 1 /* LED_STARTED */ +#define LED_OFF_OFF_ON 2 /* LED_HEAPALLOCATE */ +#define LED_OFF_ON_OFF 3 /* LED_STACKCREATED */ +#define LED_ON_OFF_OFF 4 /* LED_PANIC */ /**************************************************************************** * Public Functions diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_boot.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_boot.c index a85a397c2be..335cbd9f4d1 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_boot.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_boot.c @@ -23,9 +23,6 @@ ****************************************************************************/ #include - -#include - #include #include "s32k148evb.h" @@ -47,16 +44,8 @@ void s32k1xx_board_initialize(void) { -#ifdef CONFIG_S32K1XX_SPI - /* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak - * function s32k1xx_spidev_initialize() has been brought into the link. - */ - - s32k1xx_spidev_initialize(); -#endif - #ifdef CONFIG_ARCH_LEDS - /* Configure on-board LEDs if LED support has been selected. */ + /* Configure on-board LEDs if LED support has been selected */ board_autoled_initialize(); #endif diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_bringup.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_bringup.c index 9dda898183b..f60a4b600a6 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_bringup.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_bringup.c @@ -25,10 +25,9 @@ #include #include +#include #include -#include - #ifdef CONFIG_INPUT_BUTTONS # include #endif @@ -37,10 +36,22 @@ # include #endif +#ifdef CONFIG_FS_PROCFS +# include +#endif + +#ifdef CONFIG_S32K1XX_PROGMEM +# include +#endif + #ifdef CONFIG_S32K1XX_EEEPROM # include "s32k1xx_eeeprom.h" #endif +#ifdef CONFIG_S32K1XX_ENET +# include "s32k1xx_enet.h" +#endif + #ifdef CONFIG_S32K1XX_FLEXCAN # include "s32k1xx_flexcan.h" #endif @@ -99,10 +110,46 @@ int s32k1xx_bringup(void) } #endif +#ifdef CONFIG_S32K1XX_PROGMEM + FAR struct mtd_dev_s *mtd; + + mtd = progmem_initialize(); + if (mtd == NULL) + { + syslog(LOG_ERR, "ERROR: progmem_initialize() failed\n"); + } +#endif + #ifdef CONFIG_S32K1XX_EEEPROM /* Register EEEPROM block device */ - s32k1xx_eeeprom_register(0, 4096); + ret = s32k1xx_eeeprom_register(0, 4096); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: s32k1xx_eeeprom_register() failed\n"); + } +#endif + +#ifdef CONFIG_S32K1XX_LPI2C + /* Initialize I2C driver */ + + ret = s32k1xx_i2cdev_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: s32k1xx_i2cdev_initialize() failed: %d\n", + ret); + } +#endif + +#ifdef CONFIG_S32K1XX_LPSPI + /* Initialize SPI driver */ + + ret = s32k1xx_spidev_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: s32k1xx_spidev_initialize() failed: %d\n", + ret); + } #endif #ifdef CONFIG_NETDEV_LATEINIT diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_buttons.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_buttons.c index efb87123dc9..0c03d7b0466 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_buttons.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_buttons.c @@ -33,14 +33,14 @@ #include #include -#include #include #include "s32k1xx_pin.h" -#include "s32k148evb.h" #include +#include "s32k148evb.h" + #ifdef CONFIG_ARCH_BUTTONS /**************************************************************************** @@ -58,12 +58,13 @@ * ****************************************************************************/ -uin32_t board_button_initialize(void) +uint32_t board_button_initialize(void) { - /* Configure the GPIO pins as interrupting inputs. */ + /* Configure the GPIO pins as interrupting inputs */ s32k1xx_pinconfig(GPIO_SW3); s32k1xx_pinconfig(GPIO_SW4); + return NUM_BUTTONS; } @@ -88,6 +89,7 @@ uint32_t board_buttons(void) return ret; } +#ifdef CONFIG_ARCH_IRQBUTTONS /**************************************************************************** * Button support. * @@ -103,20 +105,19 @@ uint32_t board_buttons(void) * BUTTON_*_BIT definitions in board.h for the meaning of each bit. * * board_button_irq() may be called to register an interrupt handler that - * will be called when a button is depressed or released. The ID value is - * a button enumeration value that uniquely identifies a button resource. + * will be called when a button is pressed or released. The ID value is a + * button enumeration value that uniquely identifies a button resource. * See the BUTTON_* definitions in board.h for the meaning of enumeration * value. * ****************************************************************************/ -#ifdef CONFIG_ARCH_IRQBUTTONS int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg) { uint32_t pinset; int ret; - /* Map the button id to the GPIO bit set. */ + /* Map the button id to the GPIO bit set */ if (id == BUTTON_SW3) { @@ -147,5 +148,5 @@ int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg) return ret; } -#endif +#endif /* CONFIG_ARCH_IRQBUTTONS */ #endif /* CONFIG_ARCH_BUTTONS */ diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_clockconfig.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_clockconfig.c index ac597ce531f..a11e33ae3d0 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_clockconfig.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_clockconfig.c @@ -58,11 +58,9 @@ #include -#include -#include - #include "s32k1xx_clockconfig.h" #include "s32k1xx_start.h" + #include "s32k148evb.h" /**************************************************************************** diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_i2c.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_i2c.c new file mode 100644 index 00000000000..ef7c7c848b2 --- /dev/null +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_i2c.c @@ -0,0 +1,102 @@ +/**************************************************************************** + * boards/arm/s32k1xx/s32k148evb/src/s32k1xx_i2c.c + * + * 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include + +#include "s32k1xx_lpi2c.h" + +#include "s32k148evb.h" + +#ifdef CONFIG_S32K1XX_LPI2C + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: s32k1xx_i2cdev_initialize + * + * Description: + * Initialize I2C driver and register /dev/i2cN devices. + * + ****************************************************************************/ + +int weak_function s32k1xx_i2cdev_initialize(void) +{ + int ret = OK; + +#if defined(CONFIG_S32K1XX_LPI2C0) && defined(CONFIG_I2C_DRIVER) + /* LPI2C0 *****************************************************************/ + + /* Initialize the I2C driver for LPI2C0 */ + + struct i2c_master_s *lpi2c0 = s32k1xx_i2cbus_initialize(0); + if (lpi2c0 == NULL) + { + i2cerr("ERROR: FAILED to initialize LPI2C0\n"); + return -ENODEV; + } + + ret = i2c_register(lpi2c0, 0); + if (ret < 0) + { + i2cerr("ERROR: FAILED to register LPI2C0 driver\n"); + s32k1xx_i2cbus_uninitialize(lpi2c0); + return ret; + } +#endif /* CONFIG_S32K1XX_LPI2C0 && CONFIG_I2C_DRIVER */ + +#if defined(CONFIG_S32K1XX_LPI2C1) && defined(CONFIG_I2C_DRIVER) + /* LPI2C1 *****************************************************************/ + + /* Initialize the I2C driver for LPI2C1 */ + + struct i2c_master_s *lpi2c1 = s32k1xx_i2cbus_initialize(1); + if (lpi2c1 == NULL) + { + i2cerr("ERROR: FAILED to initialize LPI2C1\n"); + return -ENODEV; + } + + ret = i2c_register(lpi2c1, 1); + if (ret < 0) + { + i2cerr("ERROR: FAILED to register LPI2C1 driver\n"); + s32k1xx_i2cbus_uninitialize(lpi2c1); + return ret; + } +#endif /* CONFIG_S32K1XX_LPI2C1 && CONFIG_I2C_DRIVER */ + + return ret; +} + +#endif /* CONFIG_S32K1XX_LPSPI */ diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_periphclocks.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_periphclocks.c index 08ec07a5dbf..8c277e25bfb 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_periphclocks.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_periphclocks.c @@ -58,7 +58,9 @@ #include +#include "s32k14x/s32k14x_clocknames.h" #include "s32k1xx_periphclocks.h" + #include "s32k148evb.h" /**************************************************************************** @@ -84,7 +86,7 @@ const struct peripheral_clock_config_s g_peripheral_clockconfig0[] = }, { .clkname = FLEXCAN0_CLK, -#ifdef CONFIG_S32K1XX_FLEXCAN +#ifdef CONFIG_S32K1XX_FLEXCAN0 .clkgate = true, #else .clkgate = false, @@ -92,7 +94,7 @@ const struct peripheral_clock_config_s g_peripheral_clockconfig0[] = }, { .clkname = FLEXCAN1_CLK, -#ifdef CONFIG_S32K1XX_FLEXCAN +#ifdef CONFIG_S32K1XX_FLEXCAN1 .clkgate = true, #else .clkgate = false, @@ -100,7 +102,7 @@ const struct peripheral_clock_config_s g_peripheral_clockconfig0[] = }, { .clkname = FLEXCAN2_CLK, -#ifdef CONFIG_S32K1XX_FLEXCAN +#ifdef CONFIG_S32K1XX_FLEXCAN2 .clkgate = true, #else .clkgate = false, diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_spi.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_spi.c new file mode 100644 index 00000000000..f93efd9a962 --- /dev/null +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_spi.c @@ -0,0 +1,223 @@ +/**************************************************************************** + * boards/arm/s32k1xx/s32k148evb/src/s32k1xx_spi.c + * + * 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "s32k1xx_pin.h" +#include "s32k1xx_lpspi.h" + +#include + +#include "s32k148evb.h" + +#ifdef CONFIG_S32K1XX_LPSPI + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: s32k1xx_spidev_initialize + * + * Description: + * Configure chip select pins, initialize the SPI driver and register + * /dev/spiN devices. + * + ****************************************************************************/ + +int weak_function s32k1xx_spidev_initialize(void) +{ + int ret = OK; + +#ifdef CONFIG_S32K1XX_LPSPI0 + /* LPSPI0 *****************************************************************/ + + /* Configure LPSPI0 peripheral chip select */ + + s32k1xx_pinconfig(PIN_LPSPI0_PCS); + +# ifdef CONFIG_SPI_DRIVER + /* Initialize the SPI driver for LPSPI0 */ + + struct spi_dev_s *g_lpspi0 = s32k1xx_lpspibus_initialize(0); + if (g_lpspi0 == NULL) + { + spierr("ERROR: FAILED to initialize LPSPI0\n"); + return -ENODEV; + } + + ret = spi_register(g_lpspi0, 0); + if (ret < 0) + { + spierr("ERROR: FAILED to register LPSPI0 driver\n"); + return ret; + } +# endif /* CONFIG_SPI_DRIVER */ +#endif /* CONFIG_S32K1XX_LPSPI0 */ + +#ifdef CONFIG_S32K1XX_LPSPI1 + /* LPSPI1 *****************************************************************/ + + /* Configure LPSPI1 peripheral chip select */ + + s32k1xx_pinconfig(PIN_LPSPI1_PCS); + +# ifdef CONFIG_SPI_DRIVER + /* Initialize the SPI driver for LPSPI1 */ + + struct spi_dev_s *g_lpspi1 = s32k1xx_lpspibus_initialize(1); + if (g_lpspi1 == NULL) + { + spierr("ERROR: FAILED to initialize LPSPI1\n"); + return -ENODEV; + } + + ret = spi_register(g_lpspi1, 1); + if (ret < 0) + { + spierr("ERROR: FAILED to register LPSPI1 driver\n"); + return ret; + } +# endif /* CONFIG_SPI_DRIVER */ +#endif /* CONFIG_S32K1XX_LPSPI1 */ + +#ifdef CONFIG_S32K1XX_LPSPI2 + /* LPSPI2 *****************************************************************/ + + /* Configure LPSPI2 peripheral chip select */ + + s32k1xx_pinconfig(PIN_LPSPI2_PCS); + +# ifdef CONFIG_SPI_DRIVER + /* Initialize the SPI driver for LPSPI2 */ + + struct spi_dev_s *g_lpspi2 = s32k1xx_lpspibus_initialize(2); + if (g_lpspi2 == NULL) + { + spierr("ERROR: FAILED to initialize LPSPI2\n"); + return -ENODEV; + } + + ret = spi_register(g_lpspi2, 2); + if (ret < 0) + { + spierr("ERROR: FAILED to register LPSPI2 driver\n"); + return ret; + } +# endif /* CONFIG_SPI_DRIVER */ +#endif /* CONFIG_S32K1XX_LPSPI2 */ + + return ret; +} + +/**************************************************************************** + * Name: s32k1xx_lpspiNselect and s32k1xx_lpspiNstatus + * + * Description: + * The external functions, s32k1xx_lpspiNselect and s32k1xx_lpspiNstatus + * must be provided by board-specific logic. They are implementations of + * the select and status methods of the SPI interface defined by struct + * spi_ops_s (see include/nuttx/spi/spi.h). All other methods (including + * s32k1xx_lpspibus_initialize()) are provided by common logic. To use + * this common SPI logic on your board: + * + * 1. Provide logic in s32k1xx_boardinitialize() to configure SPI chip + * select pins. + * 2. Provide s32k1xx_lpspiNselect() and s32k1xx_lpspiNstatus() functions + * in your board-specific logic. These functions will perform chip + * selection and status operations using GPIOs in the way your board is + * configured. + * 3. Add a calls to s32k1xx_lpspibus_initialize() in your low level + * application initialization logic. + * 4. The handle returned by s32k1xx_lpspibus_initialize() may then be used + * to bind the SPI driver to higher level logic (e.g., calling + * mmcsd_spislotinitialize(), for example, will bind the SPI driver to + * the SPI MMC/SD driver). + * + ****************************************************************************/ + +#ifdef CONFIG_S32K1XX_LPSPI0 +/* LPSPI0 *******************************************************************/ + +void s32k1xx_lpspi0select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %" PRId32 ", CS: %s\n", devid, + selected ? "assert" : "de-assert"); + + s32k1xx_gpiowrite(PIN_LPSPI0_PCS, !selected); +} + +uint8_t s32k1xx_lpspi0status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif /* CONFIG_S32K1XX_LPSPI0 */ + +#ifdef CONFIG_S32K1XX_LPSPI1 +/* LPSPI1 *******************************************************************/ + +void s32k1xx_lpspi1select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %" PRId32 ", CS: %s\n", devid, + selected ? "assert" : "de-assert"); + + s32k1xx_gpiowrite(PIN_LPSPI1_PCS, !selected); +} + +uint8_t s32k1xx_lpspi1status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif /* CONFIG_S32K1XX_LPSPI1 */ + +#ifdef CONFIG_S32K1XX_LPSPI2 +/* LPSPI2 *******************************************************************/ + +void s32k1xx_lpspi2select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %" PRId32 ", CS: %s\n", devid, + selected ? "assert" : "de-assert"); + + s32k1xx_gpiowrite(PIN_LPSPI2_PCS, !selected); +} + +uint8_t s32k1xx_lpspi2status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif /* CONFIG_S32K1XX_LPSPI2 */ +#endif /* CONFIG_S32K1XX_LPSPI */ diff --git a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_userleds.c b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_userleds.c index 3637d642841..3ccc73af531 100644 --- a/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_userleds.c +++ b/boards/arm/s32k1xx/s32k148evb/src/s32k1xx_userleds.c @@ -26,18 +26,15 @@ #include #include -#include #include -#include "arm_arch.h" -#include "arm_internal.h" - #include "s32k1xx_pin.h" -#include "s32k148evb.h" #include +#include "s32k148evb.h" + #ifndef CONFIG_ARCH_LEDS /**************************************************************************** @@ -55,6 +52,7 @@ uint32_t board_userled_initialize(void) s32k1xx_pinconfig(GPIO_LED_R); s32k1xx_pinconfig(GPIO_LED_G); s32k1xx_pinconfig(GPIO_LED_B); + return BOARD_NLEDS; } @@ -83,7 +81,7 @@ void board_userled(int led, bool ledon) return; } - s32k1xx_gpiowrite(ledcfg, ledon); /* High illuminates */ + s32k1xx_gpiowrite(ledcfg, ledon); } /**************************************************************************** @@ -92,8 +90,6 @@ void board_userled(int led, bool ledon) void board_userled_all(uint32_t ledset) { - /* Low illuminates */ - s32k1xx_gpiowrite(GPIO_LED_R, (ledset & BOARD_LED_R_BIT) != 0); s32k1xx_gpiowrite(GPIO_LED_G, (ledset & BOARD_LED_G_BIT) != 0); s32k1xx_gpiowrite(GPIO_LED_B, (ledset & BOARD_LED_B_BIT) != 0);