summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-28 21:26:59 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-29 15:15:50 +0200
commit3b645c1b0ce3358c1f1fe01a4b5b2aed856fd958 (patch)
tree59156ee795120d474be1ca47db62c4a7b5f8b4d8
parentbsps/arm: Add PL111 support (diff)
downloadrtems-3b645c1b0ce3358c1f1fe01a4b5b2aed856fd958.tar.bz2
bsps/arm: Add PL050 support
-rw-r--r--c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am3
-rw-r--r--c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c34
-rw-r--r--c/src/lib/libbsp/arm/realview-pbx-a9/preinstall.am8
-rw-r--r--c/src/lib/libbsp/arm/shared/arm-pl050.c133
-rw-r--r--c/src/lib/libbsp/arm/shared/include/arm-pl050-regs.h49
-rw-r--r--c/src/lib/libbsp/arm/shared/include/arm-pl050.h30
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 7b961b36d3..ef8e2d6bb3 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 e95280b70a..4814ef8107 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 fad0cf93f2..8d26e05341 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 0000000000..bc58ab1f59
--- /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@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 0000000000..93c99b65fa
--- /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@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 0000000000..4bb6b79f1d
--- /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@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 */