From 6b5df955a651043f930df85bfc41a3c8fb57fde7 Mon Sep 17 00:00:00 2001 From: YANG Qiao Date: Thu, 13 Aug 2015 00:06:49 +0200 Subject: arm/raspberrypi: add fbcons support for rpi bsp --- c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 4 +- .../arm/raspberrypi/console/console-config.c | 12 +- .../arm/raspberrypi/console/console_select.c | 113 +++++++++++++ c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c | 177 +++++++++++++++++++++ c/src/lib/libbsp/arm/raspberrypi/console/fbcons.h | 47 ++++++ c/src/lib/libbsp/arm/raspberrypi/include/bsp.h | 3 + c/src/lib/libbsp/arm/raspberrypi/preinstall.am | 4 + .../libbsp/arm/raspberrypi/startup/bspstarthooks.c | 4 + 8 files changed, 362 insertions(+), 2 deletions(-) create mode 100644 c/src/lib/libbsp/arm/raspberrypi/console/console_select.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/console/fbcons.h diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am index d8b1fb3073..abb68652aa 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am @@ -53,6 +53,7 @@ include_bsp_HEADERS += include/spi.h include_bsp_HEADERS += include/mailbox.h include_bsp_HEADERS += include/vc.h include_bsp_HEADERS += include/rpi-fb.h +include_bsp_HEADERS += console/fbcons.h include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \ ../../../libcpu/arm/shared/include/arm-cp15.h @@ -113,11 +114,12 @@ libbsp_a_SOURCES += irq/irq.c libbsp_a_SOURCES += ../../shared/console.c libbsp_a_SOURCES += ../../shared/console_control.c libbsp_a_SOURCES += ../../shared/console_read.c -libbsp_a_SOURCES += ../../shared/console_select.c libbsp_a_SOURCES += ../../shared/console_write.c libbsp_a_SOURCES += console/console-config.c +libbsp_a_SOURCES += console/console_select.c libbsp_a_SOURCES += console/usart.c libbsp_a_SOURCES += console/fb.c +libbsp_a_SOURCES += console/fbcons.c libbsp_a_SOURCES += console/outch.c # Mailbox diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c b/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c index b948b77b5b..dfb9826307 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c +++ b/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c @@ -7,6 +7,8 @@ */ /* + * Copyright (c) 2015 Yang Qiao + * based on work by: * Copyright (c) 2013 Alan Cudmore * * The license and distribution terms for this file may be @@ -24,6 +26,7 @@ #include #include #include +#include console_tbl Console_Configuration_Ports [] = { { @@ -36,7 +39,14 @@ console_tbl Console_Configuration_Ports [] = { .ulCtrlPort2 = 0, .ulClock = USART0_DEFAULT_BAUD, .ulIntVector = BCM2835_IRQ_ID_UART - } + }, + { + .sDeviceName ="/dev/fbcons", + .deviceType = SERIAL_CUSTOM, + .pDeviceFns = &fbcons_fns, + .deviceProbe = fbcons_probe, + .pDeviceFlow = NULL, + }, }; #define PORT_COUNT \ diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c b/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c new file mode 100644 index 0000000000..c038cd9e31 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c @@ -0,0 +1,113 @@ +/** + * @file + * + * @ingroup raspberrypi_console + * + * @brief console select + */ + +/* + * Copyright (c) 2015 Yang Qiao + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.org/license/LICENSE + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../../../shared/console_private.h" +#include + +rtems_device_minor_number BSPPrintkPort = 0; + +/* + * Method to return true if the device associated with the + * minor number probs available. + */ +static bool bsp_Is_Available( rtems_device_minor_number minor ) +{ + console_tbl *cptr = Console_Port_Tbl[ minor ]; + + /* + * First perform the configuration dependent probe, then the + * device dependent probe + */ + if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor ) ) && + cptr->pDeviceFns->deviceProbe( minor ) ) { + return true; + } + + return false; +} + +/* + * Method to return the first available device. + */ +static rtems_device_minor_number bsp_First_Available_Device( void ) +{ + rtems_device_minor_number minor; + + for ( minor = 0; minor < Console_Port_Count; minor++ ) { + console_tbl *cptr = Console_Port_Tbl[ minor ]; + + /* + * First perform the configuration dependent probe, then the + * device dependent probe + */ + + if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor ) ) && + cptr->pDeviceFns->deviceProbe( minor ) ) { + return minor; + } + } + + /* + * Error No devices were found. We will want to bail here. + */ + bsp_fatal( BSP_FATAL_CONSOLE_NO_DEV ); +} + +void bsp_console_select( void ) +{ + /* + * Reset Console_Port_Minor and + * BSPPrintkPort here if desired. + * + * This default version allows the bsp to set these + * values at creation and will not touch them again + * unless the selected port number is not available. + */ + const char *opt; + + Console_Port_Minor = BSP_CONSOLE_UART0; + BSPPrintkPort = BSP_CONSOLE_UART0; + + opt = rpi_cmdline_get_arg( "--console=" ); + + if ( opt ) { + if ( strncmp( opt, "fbcons", sizeof( "fbcons" - 1 ) ) == 0 ) { + if ( rpi_video_is_initialized() > 0 ) { + Console_Port_Minor = BSP_CONSOLE_FB; + BSPPrintkPort = BSP_CONSOLE_FB; + } + } + } + + /* + * If the device that was selected isn't available then + * let the user know and select the first available device. + */ + if ( !bsp_Is_Available( Console_Port_Minor ) ) { + Console_Port_Minor = bsp_First_Available_Device(); + } +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c new file mode 100644 index 0000000000..3669ba458d --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c @@ -0,0 +1,177 @@ +/** + * @file + * + * @ingroup raspberrypi_console + * + * @brief framebuffer graphic console support. + */ + +/* + * Copyright (c) 2015 Yang Qiao + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.org/license/LICENSE + * + */ + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +/* + * fbcons_init + * + * This function initializes the fb console to a quiecsent state. + */ +static void fbcons_init( int minor ) +{ +} + +/* + * fbcons_open + * + * This function opens a port for communication. + * + * Default state is 9600 baud, 8 bits, No parity, and 1 stop bit. + */ +static int fbcons_open( + int major, + int minor, + void *arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * fbcons_close + * + * This function shuts down the requested port. + */ +static int fbcons_close( + int major, + int minor, + void *arg +) +{ + return ( RTEMS_SUCCESSFUL ); +} + +/* + * fbcons_write_polled + * + * This routine polls out the requested character. + */ +static void fbcons_write_polled( + int minor, + char c +) +{ + rpi_fb_outch( c ); + + if ( c == '\n' ) + rpi_fb_outch( '\r' ); /* LF = LF + CR */ +} + +/* + * fbcons_write_support_polled + * + * Console Termios output entry point when using polled output. + * + */ +static ssize_t fbcons_write_support_polled( + int minor, + const char *buf, + size_t len +) +{ + int nwrite = 0; + + /* + * poll each byte in the string out of the port. + */ + while ( nwrite < len ) { + fbcons_write_polled( minor, *buf++ ); + nwrite++; + } + + /* + * return the number of bytes written. + */ + return nwrite; +} + +/* + * fbcons_inbyte_nonblocking_polled + * + * Console Termios polling input entry point. + */ +static int fbcons_inbyte_nonblocking_polled( int minor ) +{ + // if( rtems_kbpoll() ) { + // int c = getch(); + // return c; + // } + + return -1; +} + +/* + * fbcons_set_attributes + * + * This function sets the UART channel to reflect the requested termios + * port settings. + */ +static int fbcons_set_attributes( + int minor, + const struct termios *t +) +{ + return 0; +} + +bool fbcons_probe( int minor ) +{ + // rtems_status_code status; + static bool firstTime = true; + static bool ret = false; + + /* + * keyboard interrupt should be registered when the keyboard is available + */ + if ( firstTime ) { + if ( !rpi_fb_hdmi_is_present() ) { + ret = false; + } else { + ret = true; + } + } + + firstTime = false; + + return ret; +} + +const console_fns fbcons_fns = +{ + .deviceProbe = libchip_serial_default_probe, /* deviceProbe */ + .deviceFirstOpen = fbcons_open, /* deviceFirstOpen */ + .deviceLastClose = fbcons_close, /* deviceLastClose */ + .deviceRead = fbcons_inbyte_nonblocking_polled, /* deviceRead */ + .deviceWrite = fbcons_write_support_polled, /* deviceWrite */ + .deviceInitialize = fbcons_init, /* deviceInitialize */ + .deviceWritePolled = fbcons_write_polled, /* deviceWritePolled */ + .deviceSetAttributes = fbcons_set_attributes, /* deviceSetAttributes */ + .deviceOutputUsesInterrupts = FALSE, /* deviceOutputUsesInterrupts*/ +}; diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.h b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.h new file mode 100644 index 0000000000..d0e126699a --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.h @@ -0,0 +1,47 @@ +/** + * @file + * + * @ingroup raspberrypi_console + * + * @brief framebuffer graphic console support. + */ + +/* + * Copyright (c) 2015 Yang Qiao + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.org/license/LICENSE + * + */ + +#ifndef _FBCONS_H_ +#define _FBCONS_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This is the ASCII for "PI" in the upper word and 2835 + * in the lower which should be unique enough to + * distinguish this type of serial device from others. + */ + +#define FB_CONSOLE 0x50492835 + +bool fbcons_probe( int minor ); + +/* + * Driver function table + */ +extern const console_fns fbcons_fns; + +#ifdef __cplusplus +} +#endif + +#endif /* _FBCONS_H_ */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h b/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h index 67df810e4b..5241979f49 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h +++ b/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h @@ -38,6 +38,9 @@ extern "C" { #define BSP_GPIO_PINS_PER_BANK 32 #define BSP_GPIO_PINS_PER_SELECT_BANK 10 +#define BSP_CONSOLE_UART0 0 +#define BSP_CONSOLE_FB 1 + void rpi_init_cmdline(void); const char *rpi_cmdline_get_cached(void); const char *rpi_cmdline_get_raw(void); diff --git a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am index cbfa79fbc2..e6f0ca0d32 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am +++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am @@ -158,6 +158,10 @@ $(PROJECT_INCLUDE)/bsp/rpi-fb.h: include/rpi-fb.h $(PROJECT_INCLUDE)/bsp/$(dirst $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/rpi-fb.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/rpi-fb.h +$(PROJECT_INCLUDE)/bsp/fbcons.h: console/fbcons.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/fbcons.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/fbcons.h + $(PROJECT_INCLUDE)/libcpu/cache_.h: ../../../libcpu/arm/shared/include/cache_.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache_.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache_.h diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c index d44be03ac3..0a90e7aab9 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c @@ -27,6 +27,8 @@ #include #include #include +#include + void BSP_START_TEXT_SECTION bsp_start_hook_0(void) { @@ -71,4 +73,6 @@ void BSP_START_TEXT_SECTION bsp_start_hook_1(void) bsp_start_copy_sections(); bsp_memory_management_initialize(); bsp_start_clear_bss(); + + rpi_video_init(); } -- cgit v1.2.3