[PATCH 6/6] add fbcons support for rpi bsp
YANG QIAO
yangqiao0505 at me.com
Wed Aug 12 22:08:05 UTC 2015
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 | 113 +++++++++++++
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 +
7 files changed, 365 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 65cc0c0..8b94642 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
@@ -47,6 +47,7 @@ include_bsp_HEADERS += include/raspberrypi.h
include_bsp_HEADERS += include/rpi-gpio.h
include_bsp_HEADERS += include/mailbox.h
include_bsp_HEADERS += include/vc.h
+include_bsp_HEADERS += console/fbcons.h
include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \
../../../libcpu/arm/shared/include/arm-cp15.h
@@ -111,11 +112,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
# clock
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..ad24d33
--- /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 <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"
+
+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;
+ opt = rpi_cmdline_arg("--console=");
+ if (opt)
+ {
+ opt += sizeof("--console=")-1;
+ if (strncmp(opt,"fbcons", sizeof("fbcons"-1)) == 0)
+ {
+ Console_Port_Minor = BSP_CONSOLE_FB;
+ BSPPrintkPort = BSP_CONSOLE_FB;
+ }
+ }
+ else
+ {
+ Console_Port_Minor = BSP_CONSOLE_UART0;
+ BSPPrintkPort = BSP_CONSOLE_UART0;
+ }
+
+ /*
+ * 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..be86717
--- /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_outch( c );
+ if( c == '\n')
+ _RPI_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 )
+ {
+ bcm2835_get_display_size_entries entries;
+ bcm2835_mailbox_get_display_size(&entries);
+ if(entries.width == 0x290 && entries.height ==0x1A0 )
+ {
+ 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 546c46d..ed27028 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h
@@ -40,6 +40,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(void);
const char* rpi_cmdline_arg(const char* arg);
diff --git a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
index a89e143..1d6ed35 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
@@ -142,6 +142,10 @@ $(PROJECT_INCLUDE)/bsp/vc.h: include/vc.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/vc.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/vc.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
--
2.1.0
More information about the devel
mailing list