diff --git a/Image b/Image index fbda7f72e4e36..55258accd541f 100644 Binary files a/Image and b/Image differ diff --git a/boards/Kconfig b/boards/Kconfig index 5fed6ec4c0aaa..2c54074948350 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -1947,6 +1947,7 @@ config ARCH_BOARD_K230_CANMV config ARCH_BOARD_BL808_OX64 bool "PINE64 Ox64" depends on ARCH_CHIP_BL808 + select ARCH_HAVE_LEDS ---help--- This options selects support for NuttX on PINE64 Ox64 based on Bouffalo Lab BL808 SoC. diff --git a/boards/risc-v/bl808/ox64/configs/nsh/defconfig b/boards/risc-v/bl808/ox64/configs/nsh/defconfig index 7cdd365ef2b5b..c83021e5543ec 100644 --- a/boards/risc-v/bl808/ox64/configs/nsh/defconfig +++ b/boards/risc-v/bl808/ox64/configs/nsh/defconfig @@ -44,6 +44,7 @@ CONFIG_DEBUG_SYMBOLS=y CONFIG_DEV_ZERO=y CONFIG_ELF=y CONFIG_EXAMPLES_HELLO=m +CONFIG_EXAMPLES_LEDS=y CONFIG_FS_PROCFS=y CONFIG_FS_ROMFS=y CONFIG_IDLETHREAD_STACKSIZE=3072 @@ -83,3 +84,5 @@ CONFIG_TESTING_OSTEST=y CONFIG_UART3_BAUD=2000000 CONFIG_UART3_SERIAL_CONSOLE=y CONFIG_USEC_PER_TICK=1000 +CONFIG_USERLED=y +CONFIG_USERLED_LOWER=y diff --git a/boards/risc-v/bl808/ox64/include/board.h b/boards/risc-v/bl808/ox64/include/board.h index 59546c4c72f01..de6e2201f7767 100644 --- a/boards/risc-v/bl808/ox64/include/board.h +++ b/boards/risc-v/bl808/ox64/include/board.h @@ -31,6 +31,26 @@ * Pre-processor Definitions ****************************************************************************/ +/* LED definitions **********************************************************/ + +/* LED index values for use with board_userled() */ + +typedef enum +{ + BOARD_LED1 = 0, /* Green LED */ + BOARD_LED2 = 1, /* Red LED */ + BOARD_LED3 = 2, /* Blue LED */ + BOARD_LEDS /* Number of LEDs */ +} led_typedef_enum; + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* Auto LEDs */ + #define LED_STARTED 0 /* N/A */ #define LED_HEAPALLOCATE 1 /* N/A */ #define LED_IRQSENABLED 2 /* N/A */ @@ -39,7 +59,7 @@ #define LED_SIGNAL 5 /* N/A */ #define LED_ASSERTION 6 /* N/A */ #define LED_PANIC 7 /* N/A */ -#define LED_CPU 8 /* LED */ +#define LED_IDLE 8 /* LED */ /**************************************************************************** * Public Types diff --git a/boards/risc-v/bl808/ox64/src/Makefile b/boards/risc-v/bl808/ox64/src/Makefile index 0131625ea2434..3b072df342723 100644 --- a/boards/risc-v/bl808/ox64/src/Makefile +++ b/boards/risc-v/bl808/ox64/src/Makefile @@ -22,6 +22,6 @@ include $(TOPDIR)/Make.defs RCSRCS = etc/init.d/rc.sysinit etc/init.d/rcS -CSRCS = bl808_appinit.c +CSRCS = bl808_appinit.c bl808_autoleds.c bl808_userleds.c include $(TOPDIR)/boards/Board.mk diff --git a/boards/risc-v/bl808/ox64/src/bl808_appinit.c b/boards/risc-v/bl808/ox64/src/bl808_appinit.c index d854d129c8cac..a630d750622eb 100644 --- a/boards/risc-v/bl808/ox64/src/bl808_appinit.c +++ b/boards/risc-v/bl808/ox64/src/bl808_appinit.c @@ -167,13 +167,24 @@ void board_late_initialize(void) #endif +#ifdef CONFIG_USERLED + ////TODO: Move to bringup.c + /* Register the LED driver */ + + int ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif + ////TODO #define GPIO_PIN 29 #define GPIO_ATTR (GPIO_OUTPUT | GPIO_FUNC_SWGPIO) _info("Config GPIO: pin=%d, attr=0x%x\n", GPIO_PIN, GPIO_ATTR); - int ret = bl808_configgpio(GPIO_PIN, GPIO_ATTR); - DEBUGASSERT(ret == OK); + int ret2 = bl808_configgpio(GPIO_PIN, GPIO_ATTR); + DEBUGASSERT(ret2 == OK); _info("Set GPIO: pin=%d\n", GPIO_PIN); bl808_gpiowrite(GPIO_PIN, true); diff --git a/boards/risc-v/bl808/ox64/src/bl808_autoleds.c b/boards/risc-v/bl808/ox64/src/bl808_autoleds.c new file mode 100644 index 0000000000000..65d004d8214f7 --- /dev/null +++ b/boards/risc-v/bl808/ox64/src/bl808_autoleds.c @@ -0,0 +1,252 @@ +/**************************************************************************** + * boards/arm64/a64/pinephone/src/pinephone_autoleds.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 "chip.h" +////#include "arm64_internal.h" +////#include "pinephone.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* LED index */ + +// static const uint32_t g_led_map[BOARD_LEDS] = +// { +// LED1, +// LED2, +// LED3 +// }; + +static bool g_initialized; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* Turn on selected led */ + +static void bl808_led_on(led_typedef_enum led_num) +{ + ////TODO: gpio_write(g_led_map[led_num], true); +} + +/* Turn off selected led */ + +static void bl808_led_off(led_typedef_enum led_num) +{ + ////TODO: gpio_write(g_led_map[led_num], false); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + * + * Description: + * This function is called very early in initialization to perform board- + * specific initialization of LED-related resources. This includes such + * things as, for example, configure GPIO pins to drive the LEDs and also + * putting the LEDs in their correct initial state. + * + * NOTE: In most architectures, board_autoled_initialize() is called from + * board-specific initialization logic. But there are a few architectures + * where this initialization function is still called from common chip + * architecture logic. This interface is not, however, a common board + * interface in any event and, hence, the usage of the name + * board_autoled_initialize is deprecated. + * + * WARNING: This interface name will eventually be removed; do not use it + * in new board ports. New implementations should use the naming + * conventions for "Microprocessor-Specific Interfaces" or the "Board- + * Specific Interfaces" as described above. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + int i; + + /* Configure the LED GPIO for output. */ + + for (i = 0; i < BOARD_LEDS; i++) + { + ////TODO: int ret = gpio_config(g_led_map[i]); + ////TODO: DEBUGASSERT(ret == OK); + } +} + +/**************************************************************************** + * Name: board_autoled_on + * + * Description: + * Set the LED configuration into the ON condition for the state provided + * by the led parameter. This may be one of: + * + * LED_STARTED NuttX has been started + * LED_HEAPALLOCATE Heap has been allocated + * LED_IRQSENABLED Interrupts enabled + * LED_STACKCREATED Idle stack created + * LED_INIRQ In an interrupt + * LED_SIGNAL In a signal handler + * LED_ASSERTION An assertion failed + * LED_PANIC The system has crashed + * LED_IDLE MCU is in sleep mode + * + * Where these values are defined in a board-specific way in the standard + * board.h header file exported by every architecture. + * + * Input Parameters: + * led - Identifies the LED state to put in the ON state (which may or may + * not equate to turning an LED on) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_on(int led) +{ + switch (led) + { + case LED_HEAPALLOCATE: + bl808_led_on(BOARD_LED1); + break; + + case LED_IRQSENABLED: + bl808_led_on(BOARD_LED2); + break; + + case LED_STACKCREATED: + bl808_led_on(BOARD_LED3); + g_initialized = true; + break; + + case LED_INIRQ: + bl808_led_on(BOARD_LED1); + bl808_led_on(BOARD_LED2); + break; + + case LED_SIGNAL: + bl808_led_on(BOARD_LED1); + bl808_led_on(BOARD_LED3); + break; + + case LED_ASSERTION: + bl808_led_on(BOARD_LED2); + bl808_led_on(BOARD_LED3); + break; + + case LED_PANIC: + bl808_led_on(BOARD_LED1); + break; + + case LED_IDLE: + bl808_led_on(BOARD_LED2); + break; + + default: + break; + } +} + +/**************************************************************************** + * Name: board_autoled_off + * + * Description: + * Set the LED configuration into the OFF condition for the state provided + * by the led parameter. This may be one of: + * + * LED_INIRQ Leaving an interrupt + * LED_SIGNAL Leaving a signal handler + * LED_ASSERTION Recovering from an assertion failure + * LED_PANIC The system has crashed (blinking). + * LED_IDLE MCU is not in sleep mode + * + * Where these values are defined in a board-specific way in the standard + * board.h header file exported by every architecture. + * + * Input Parameters: + * led - Identifies the LED state to put in the OFF state (which may or may + * not equate to turning an LED off) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_off(int led) +{ + switch (led) + { + case LED_SIGNAL: + bl808_led_off(BOARD_LED1); + bl808_led_off(BOARD_LED3); + break; + + case LED_INIRQ: + bl808_led_off(BOARD_LED1); + bl808_led_off(BOARD_LED2); + break; + + case LED_ASSERTION: + bl808_led_off(BOARD_LED2); + bl808_led_off(BOARD_LED3); + break; + + case LED_PANIC: + bl808_led_off(BOARD_LED1); + break; + + case LED_IDLE: + bl808_led_off(BOARD_LED2); + break; + + default: + break; + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/risc-v/bl808/ox64/src/bl808_userleds.c b/boards/risc-v/bl808/ox64/src/bl808_userleds.c new file mode 100644 index 0000000000000..719f6c9de19e6 --- /dev/null +++ b/boards/risc-v/bl808/ox64/src/bl808_userleds.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * boards/arm64/a64/pinephone/src/pinephone_userleds.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 "chip.h" +#include "bl808_gpio.h" + +////TODO +#define GPIO_PIN 29 +#define GPIO_ATTR (GPIO_OUTPUT | GPIO_FUNC_SWGPIO) + +#ifdef CONFIG_USERLED + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* LED index */ + +// static const uint32_t g_led_map[BOARD_LEDS] = +// { +// LED1, +// LED2, +// LED3 +// }; + +static const uint32_t g_led_setmap[BOARD_LEDS] = +{ + BOARD_LED1_BIT, + BOARD_LED2_BIT, + BOARD_LED3_BIT +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + * + * Description: + * This function may called from application-specific logic during its + * to perform board-specific initialization of LED resources. This + * includes such things as, for example, configure GPIO pins to drive the + * LEDs and also putting the LEDs in their correct initial state. + * + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then this interfaces may be + * available to control the LEDs directly from user board logic or + * indirectly user applications (via the common LED character driver). + * + * Most boards have only a few LEDs and in those cases all LEDs may be + * used by the NuttX LED logic exclusively and may not be available for + * use by user logic if CONFIG_ARCH_LEDS=y. + * + * NOTE: The LED number is returned. + * + * Input Parameters: + * None + * + * Returned Value: + * Number of LEDs on board + * + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + int i; + + //// TODO + int ret = bl808_configgpio(GPIO_PIN, GPIO_ATTR); + DEBUGASSERT(ret == OK); + + /* Configure the LED GPIO for output. */ + + for (i = 0; i < BOARD_LEDS; i++) + { + ////TODO: int ret = gpio_config(g_led_map[i]); + ////TODO: DEBUGASSERT(ret == OK); + } + + return BOARD_LEDS; +} + +/**************************************************************************** + * Name: board_userled + * + * Description: + * This interface may be used by application specific logic to set the + * state of a single LED. Definitions for the led identification are + * provided in the board-specific board.h header file that may be included + * like: + * + * #included + * + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then this interfaces may be + * available to control the LEDs directly from user board logic or + * indirectly user applications (via the common LED character driver). + * + * Most boards have only a few LEDs and in those cases all LEDs may be + * used by the NuttX LED logic exclusively and may not be available for + * use by user logic if CONFIG_ARCH_LEDS=y. + * + * Input Parameters: + * led - LED number + * ledon - True if LED should be turned on; False to turn off + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + _info("led=%d, ledon=%d\n", led, ledon);//// + if ((unsigned)led < BOARD_LEDS) + { + ////TODO: gpio_write(g_led_map[led], ledon); + } +} + +/**************************************************************************** + * Name: board_userled_all + * + * Description: + * This interface may be used by application specific logic to set the + * state of all board LED. Definitions for the led set member + * identification is provided in the board-specific board.h header file + * that may be includedlike: + * + * #included + * + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then this interfaces may be + * available to control the LEDs directly from user board logic or + * indirectly user applications (via the common LED character driver). + * + * Most boards have only a few LEDs and in those cases all LEDs may be + * used by the NuttX LED logic exclusively and may not be available for + * use by user logic if CONFIG_ARCH_LEDS=y. + * + * Input Parameters: + * ledset - Bitset of LEDs to be turned on and off + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + _info("ledset=0x%x\n", ledset);//// + int i; + + // For LED 0 to 2... + for (i = 0; i < BOARD_LEDS; i++) + { + // Get the desired state of the LED + bool val = ((ledset & g_led_setmap[i]) != 0); + _info("led=%d, val=%d\n", i, val);//// + + // If this is LED 0... + if (i == 0) + { + bl808_gpiowrite(GPIO_PIN, val); + } + ////TODO: gpio_write(g_led_map[i], (ledset & g_led_setmap[i]) != 0); + } +} + +#endif /* CONFIG_USERLED */ diff --git a/initrd b/initrd index bbc676fe014b7..eee3daeddac34 100644 Binary files a/initrd and b/initrd differ