[rtems commit] bsps/arm: Add PL050 support

Sebastian Huber sebh at rtems.org
Mon Jul 1 16:50:21 UTC 2013


Module:    rtems
Branch:    master
Commit:    3b645c1b0ce3358c1f1fe01a4b5b2aed856fd958
Changeset: http://git.rtems.org/rtems/commit/?id=3b645c1b0ce3358c1f1fe01a4b5b2aed856fd958

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Jun 28 21:26:59 2013 +0200

bsps/arm: Add PL050 support

---

 c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am   |    3 +
 .../arm/realview-pbx-a9/console/console-config.c   |   34 +++++
 c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am |    8 ++
 c/src/lib/libbsp/arm/shared/arm-pl050.c            |  133 ++++++++++++++++++++
 .../lib/libbsp/arm/shared/include/arm-pl050-regs.h |   49 +++++++
 c/src/lib/libbsp/arm/shared/include/arm-pl050.h    |   30 +++++
 6 files changed, 257 insertions(+), 0 deletions(-)

diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
index 7b961b3..ef8e2d6 100644
--- a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
+++ b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
@@ -43,6 +43,8 @@ include_bsp_HEADERS += ../shared/include/arm-gic-regs.h
 include_bsp_HEADERS += ../shared/include/arm-gic-tm27.h
 include_bsp_HEADERS += ../shared/include/arm-pl011.h
 include_bsp_HEADERS += ../shared/include/arm-pl011-regs.h
+include_bsp_HEADERS += ../shared/include/arm-pl050.h
+include_bsp_HEADERS += ../shared/include/arm-pl050-regs.h
 include_bsp_HEADERS += ../shared/include/arm-pl111-fb.h
 include_bsp_HEADERS += ../shared/include/arm-pl111-regs.h
 include_bsp_HEADERS += include/irq.h
@@ -112,6 +114,7 @@ libbsp_a_SOURCES += ../../shared/console_read.c
 libbsp_a_SOURCES += ../../shared/console_select.c
 libbsp_a_SOURCES += ../../shared/console_write.c
 libbsp_a_SOURCES += ../shared/arm-pl011.c
+libbsp_a_SOURCES += ../shared/arm-pl050.c
 libbsp_a_SOURCES += console/console-config.c
 
 # Clock
diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c b/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c
index e95280b..4814ef8 100644
--- a/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c
+++ b/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c
@@ -12,11 +12,16 @@
  * http://www.rtems.com/license/LICENSE.
  */
 
+#include <rtems/serial_mouse.h>
+
 #include <libchip/serial.h>
 
 #include <bsp.h>
 #include <bsp/irq.h>
 #include <bsp/arm-pl011.h>
+#include <bsp/arm-pl050.h>
+
+static const char psaux[] = "/dev/psaux";
 
 console_tbl Console_Configuration_Ports[] = {
   {
@@ -37,6 +42,24 @@ console_tbl Console_Configuration_Ports[] = {
     .setData = NULL,
     .ulClock = 0,
     .ulIntVector = RVPBXA9_IRQ_UART_0
+  }, {
+    .sDeviceName = &psaux[0],
+    .deviceType = SERIAL_CUSTOM,
+    .pDeviceFns = &arm_pl050_fns,
+    .deviceProbe = NULL,
+    .pDeviceFlow = NULL,
+    .ulMargin = 10,
+    .ulHysteresis = 0,
+    .pDeviceParams = (void *) 115200,
+    .ulCtrlPort1 = 0x10007000,
+    .ulCtrlPort2 = 0,
+    .ulDataPort = 0,
+    .getRegister = NULL,
+    .setRegister = NULL,
+    .getData = NULL,
+    .setData = NULL,
+    .ulClock = 0,
+    .ulIntVector = RVPBXA9_IRQ_KMI1
   }
 };
 
@@ -73,3 +96,14 @@ static void output_char_init(char c)
 BSP_output_char_function_type BSP_output_char = output_char_init;
 
 BSP_polling_getchar_function_type BSP_poll_char = NULL;
+
+bool bsp_get_serial_mouse_device(
+  const char **name,
+  const char **type
+)
+{
+  *name = &psaux[0];
+  *type = "ps2";
+
+  return true;
+}
diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am b/c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am
index fad0cf9..8d26e05 100644
--- a/c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am
+++ b/c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am
@@ -126,6 +126,14 @@ $(PROJECT_INCLUDE)/bsp/arm-pl011-regs.h: ../shared/include/arm-pl011-regs.h $(PR
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-pl011-regs.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-pl011-regs.h
 
+$(PROJECT_INCLUDE)/bsp/arm-pl050.h: ../shared/include/arm-pl050.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-pl050.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-pl050.h
+
+$(PROJECT_INCLUDE)/bsp/arm-pl050-regs.h: ../shared/include/arm-pl050-regs.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-pl050-regs.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-pl050-regs.h
+
 $(PROJECT_INCLUDE)/bsp/arm-pl111-fb.h: ../shared/include/arm-pl111-fb.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-pl111-fb.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-pl111-fb.h
diff --git a/c/src/lib/libbsp/arm/shared/arm-pl050.c b/c/src/lib/libbsp/arm/shared/arm-pl050.c
new file mode 100644
index 0000000..bc58ab1
--- /dev/null
+++ b/c/src/lib/libbsp/arm/shared/arm-pl050.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <info at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <assert.h>
+
+#include <bsp/irq.h>
+#include <bsp/arm-pl050.h>
+#include <bsp/arm-pl050-regs.h>
+
+#include <libchip/sersupp.h>
+
+static volatile pl050 *pl050_get_regs(int minor)
+{
+  const console_tbl *ct = Console_Port_Tbl[minor];
+
+  return (volatile pl050 *) ct->ulCtrlPort1;
+}
+
+static void pl050_interrupt(void *arg)
+{
+  int minor = (int) arg;
+  const console_data *cd = &Console_Port_Data[minor];
+  volatile pl050 *regs = pl050_get_regs(minor);
+  uint32_t kmiir_rx = PL050_KMIIR_KMIRXINTR;
+  uint32_t kmiir_tx = (regs->kmicr & PL050_KMICR_KMITXINTREN) != 0 ?
+    PL050_KMIIR_KMITXINTR : 0;
+  uint32_t kmiir = regs->kmiir;
+
+  if ((kmiir & kmiir_rx) != 0) {
+    char c = (char) PL050_KMIDATA_KMIDATA_GET(regs->kmidata);
+
+    rtems_termios_enqueue_raw_characters(cd->termios_data, &c, 1);
+  }
+
+  if ((kmiir & kmiir_tx) != 0) {
+    rtems_termios_dequeue_characters(cd->termios_data, 1);
+  }
+}
+
+static void pl050_initialize(int minor)
+{
+  /* Nothing to do */
+}
+
+static int pl050_first_open(int major, int minor, void *arg)
+{
+  rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg;
+  struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1;
+  console_data *cd = &Console_Port_Data[minor];
+  const console_tbl *ct = Console_Port_Tbl[minor];
+  volatile pl050 *regs = pl050_get_regs(minor);
+  rtems_status_code sc;
+
+  cd->termios_data = tty;
+  rtems_termios_set_initial_baud(tty, (rtems_termios_baud_t) ct->pDeviceParams);
+
+  regs->kmicr = PL050_KMICR_KMIEN | PL050_KMICR_KMIRXINTREN;
+
+  sc = rtems_interrupt_handler_install(
+    ct->ulIntVector,
+    ct->sDeviceName,
+    RTEMS_INTERRUPT_UNIQUE,
+    pl050_interrupt,
+    (void *) minor
+  );
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  return 0;
+}
+
+static int pl050_last_close(int major, int minor, void *arg)
+{
+  const console_tbl *ct = Console_Port_Tbl[minor];
+  volatile pl050 *regs = pl050_get_regs(minor);
+  rtems_status_code sc;
+
+  regs->kmicr = 0;
+
+  sc = rtems_interrupt_handler_remove(
+    ct->ulIntVector,
+    pl050_interrupt,
+    (void *) minor
+  );
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  return 0;
+}
+
+static ssize_t pl050_write_support(
+  int minor,
+  const char *s,
+  size_t n
+)
+{
+  volatile pl050 *regs = pl050_get_regs(minor);
+
+  if (n > 0) {
+    regs->kmidata = PL050_KMIDATA_KMIDATA(s[0]);
+    regs->kmicr |= PL050_KMICR_KMITXINTREN;
+  } else {
+    regs->kmicr &= ~PL050_KMICR_KMITXINTREN;
+  }
+
+  return 0;
+}
+
+static int pl050_set_attribues(int minor, const struct termios *term)
+{
+  return -1;
+}
+
+const console_fns arm_pl050_fns = {
+  .deviceProbe = libchip_serial_default_probe,
+  .deviceFirstOpen = pl050_first_open,
+  .deviceLastClose = pl050_last_close,
+  .deviceRead = NULL,
+  .deviceWrite = pl050_write_support,
+  .deviceInitialize = pl050_initialize,
+  .deviceWritePolled = NULL,
+  .deviceSetAttributes = pl050_set_attribues,
+  .deviceOutputUsesInterrupts = true
+};
diff --git a/c/src/lib/libbsp/arm/shared/include/arm-pl050-regs.h b/c/src/lib/libbsp/arm/shared/include/arm-pl050-regs.h
new file mode 100644
index 0000000..93c99b6
--- /dev/null
+++ b/c/src/lib/libbsp/arm/shared/include/arm-pl050-regs.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <info at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#ifndef LIBBSP_ARM_SHARED_ARM_PL050_REGS_H
+#define LIBBSP_ARM_SHARED_ARM_PL050_REGS_H
+
+#include <bsp/utility.h>
+
+typedef struct {
+	uint32_t kmicr;
+#define PL050_KMICR_KMITYPE BSP_BIT32(5)
+#define PL050_KMICR_KMIRXINTREN BSP_BIT32(4)
+#define PL050_KMICR_KMITXINTREN BSP_BIT32(3)
+#define PL050_KMICR_KMIEN BSP_BIT32(2)
+#define PL050_KMICR_FKMID BSP_BIT32(1)
+#define PL050_KMICR_FKMIC BSP_BIT32(0)
+	uint32_t kmistat;
+#define PL050_KMISTAT_TXEMPTY BSP_BIT32(6)
+#define PL050_KMISTAT_TXBUSY BSP_BIT32(5)
+#define PL050_KMISTAT_RXFULL BSP_BIT32(4)
+#define PL050_KMISTAT_RXBUSY BSP_BIT32(3)
+#define PL050_KMISTAT_RXPARITY BSP_BIT32(2)
+#define PL050_KMISTAT_KMIC BSP_BIT32(1)
+#define PL050_KMISTAT_KMID BSP_BIT32(0)
+	uint32_t kmidata;
+#define PL050_KMIDATA_KMIDATA(val) BSP_FLD32(val, 0, 7)
+#define PL050_KMIDATA_KMIDATA_GET(reg) BSP_FLD32GET(reg, 0, 7)
+#define PL050_KMIDATA_KMIDATA_SET(reg, val) BSP_FLD32SET(reg, val, 0, 7)
+	uint32_t kmiclkdiv;
+#define PL050_KMICLKDIV_KMICLKDIV(val) BSP_FLD32(val, 0, 3)
+#define PL050_KMICLKDIV_KMICLKDIV_GET(reg) BSP_FLD32GET(reg, 0, 3)
+#define PL050_KMICLKDIV_KMICLKDIV_SET(reg, val) BSP_FLD32SET(reg, val, 0, 3)
+	uint32_t kmiir;
+#define PL050_KMIIR_KMITXINTR BSP_BIT32(1)
+#define PL050_KMIIR_KMIRXINTR BSP_BIT32(0)
+} pl050;
+
+#endif /* LIBBSP_ARM_SHARED_ARM_PL050_REGS_H */
diff --git a/c/src/lib/libbsp/arm/shared/include/arm-pl050.h b/c/src/lib/libbsp/arm/shared/include/arm-pl050.h
new file mode 100644
index 0000000..4bb6b79
--- /dev/null
+++ b/c/src/lib/libbsp/arm/shared/include/arm-pl050.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <info at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#ifndef LIBBSP_ARM_SHARED_ARM_PL050_H
+#define LIBBSP_ARM_SHARED_ARM_PL050_H
+
+#include <libchip/serial.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern const console_fns arm_pl050_fns;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LIBBSP_ARM_SHARED_ARM_PL050_H */




More information about the vc mailing list