[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