Skip to content

Commit

Permalink
Add LED Driver for Ox64 BL808
Browse files Browse the repository at this point in the history
  • Loading branch information
lupyuen committed Feb 12, 2024
1 parent 8f75f37 commit 4f39969
Show file tree
Hide file tree
Showing 9 changed files with 494 additions and 4 deletions.
Binary file modified Image
Binary file not shown.
1 change: 1 addition & 0 deletions boards/Kconfig
Expand Up @@ -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.
Expand Down
3 changes: 3 additions & 0 deletions boards/risc-v/bl808/ox64/configs/nsh/defconfig
Expand Up @@ -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
Expand Down Expand Up @@ -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
22 changes: 21 additions & 1 deletion boards/risc-v/bl808/ox64/include/board.h
Expand Up @@ -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 */
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion boards/risc-v/bl808/ox64/src/Makefile
Expand Up @@ -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
15 changes: 13 additions & 2 deletions boards/risc-v/bl808/ox64/src/bl808_appinit.c
Expand Up @@ -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);
Expand Down
252 changes: 252 additions & 0 deletions 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 <nuttx/config.h>

#include <stdint.h>
#include <stdbool.h>
#include <debug.h>

#include <sys/param.h>

#include <nuttx/board.h>
#include <arch/board/board.h>

#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 */

0 comments on commit 4f39969

Please sign in to comment.