[PATCH 5/5] arm/raspberrypi: add fbcons support for rpi bsp
Gedare Bloom
gedare at rtems.org
Sat May 21 13:07:03 UTC 2016
On Sat, May 21, 2016 at 6:54 AM, <ppisa4lists at pikron.com> wrote:
> From: YANG Qiao <yangqiao0505 at me.com>
>
> ---
> c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 4 +-
> .../arm/raspberrypi/console/console-config.c | 12 +-
> .../arm/raspberrypi/console/console_select.c | 114 +++++++++++++
> c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c | 184 +++++++++++++++++++++
> 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, 370 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 f5b87ab..e115745 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 b948b77..dfb9826 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 <bsp/irq.h>
> #include <bsp/usart.h>
> #include <bsp/raspberrypi.h>
> +#include <bsp/fbcons.h>
>
> 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 0000000..2b5d872
> --- /dev/null
> +++ b/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c
> @@ -0,0 +1,114 @@
> +/**
> + * @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 <bsp.h>
> +#include <bsp/fatal.h>
> +#include <rtems/libio.h>
> +#include <stdlib.h>
> +#include <assert.h>
> +#include <termios.h>
> +
> +#include <rtems/termiostypes.h>
> +#include <libchip/serial.h>
> +#include "../../../shared/console_private.h"
> +#include <bsp/rpi-fb.h>
> +
> +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 0000000..e69ea82
> --- /dev/null
> +++ b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c
> @@ -0,0 +1,184 @@
> +/**
> + * @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 <rtems.h>
> +#include <rtems/libio.h>
> +
> +#include <stdlib.h>
> +
> +#include <libchip/serial.h>
> +#include <libchip/sersupp.h>
> +
> +#include <bsp.h>
> +#include <bsp/fbcons.h>
> +#include <bsp/vc.h>
> +
> +/*
> + * 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;
> + // }
delete unused code
> +
> + 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;
delete unused code
> + static bool firstTime = true;
> + static bool ret = false;
> +
> + /*
> + * keyboard interrupt should be registered when the keyboard is available
> + */
> + if ( firstTime )
> + {
> + bcm2835_get_display_size_entries entries;
> + bcm2835_mailbox_get_display_size(&entries);
> + if(entries.width == 0x290 && entries.height ==0x1A0 )
> + {
Again with style, but also these hard-coded constants need some
explanation. I don't remember the problem being worked around here
exactly.
> + 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 0000000..f6ce9c4
> --- /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 <libchip/serial.h>
> +
> +#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 67df810..5241979 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 cbfa79f..e6f0ca0 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 d44be03..0a90e7a 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 <bsp/raspberrypi.h>
> #include <bsp/mm.h>
> #include <libcpu/arm-cp15.h>
> +#include <bsp.h>
> +
>
> 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();
> }
> --
> 1.9.1
>
More information about the devel
mailing list