[PATCH 1/6] mailbox support for rpi bsp
YANG QIAO
yangqiao0505 at me.com
Mon Aug 10 12:47:10 UTC 2015
From: YANG Qiao <yangqiao0505 at me.com>
---
c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 4 ++
c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h | 32 +++++++++++++
.../libbsp/arm/raspberrypi/include/raspberrypi.h | 49 +++++++++++++++++++
c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c | 56 ++++++++++++++++++++++
c/src/lib/libbsp/arm/raspberrypi/preinstall.am | 4 ++
5 files changed, 145 insertions(+)
create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h
create mode 100644 c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c
diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
index c6133df..70bc01d 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
@@ -43,6 +43,7 @@ include_bsp_HEADERS += ../shared/include/arm-release-id.h
include_bsp_HEADERS += include/irq.h
include_bsp_HEADERS += include/mmu.h
include_bsp_HEADERS += include/usart.h
+include_bsp_HEADERS += include/mailbox.h
include_bsp_HEADERS += include/raspberrypi.h
include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \
@@ -123,6 +124,9 @@ libbsp_a_SOURCES += misc/timer.c
# I2C
+# Mailbox
+libbsp_a_SOURCES += misc/mailbox.c
+
# Cache
libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c
libbsp_a_SOURCES += ../../../libcpu/arm/shared/include/cache_.h
diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h b/c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h
new file mode 100644
index 0000000..e6cb0f8
--- /dev/null
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h
@@ -0,0 +1,32 @@
+/**
+ * @file
+ *
+ * @ingroup raspberrypi
+ *
+ * @brief mailbox 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 LIBBSP_ARM_RASPBERRYPI_MAILBOX_H
+#define LIBBSP_ARM_RASPBERRYPI_MAILBOX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern unsigned int raspberrypi_mailbox_read(unsigned int channel);
+extern void raspberrypi_mailbox_write(unsigned int channel, unsigned int data);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LIBBSP_ARM_RASPBERRYPI_MAILBOX_H */
diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
index c33e22a..dc1be07 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
@@ -8,6 +8,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
@@ -208,6 +210,53 @@
/** @} */
+ /**
+ * @name Mailbox Registers
+ *
+ * @{
+ */
+
+#define BCM2835_MBOX_BASE (RPI_PERIPHERAL_BASE+0xB880)
+
+#define BCM2835_MBOX_PEEK (BCM2835_MBOX_BASE+0x10)
+#define BCM2835_MBOX_READ (BCM2835_MBOX_BASE+0x00)
+#define BCM2835_MBOX_WRITE (BCM2835_MBOX_BASE+0x20)
+#define BCM2835_MBOX_STATUS (BCM2835_MBOX_BASE+0x18)
+#define BCM2835_MBOX_SENDER (BCM2835_MBOX_BASE+0x14)
+#define BCM2835_MBOX_CONFIG (BCM2835_MBOX_BASE+0x1C)
+
+#define BCM2835_MBOX_FULL (BCM2835_MBOX_BASE+0x80000000)
+#define BCM2835_MBOX_EMPTY (BCM2835_MBOX_BASE+0x40000000)
+
+/**
+* @name Mailbox Channels
+*
+* @{
+*/
+
+/* Power Manager channel */
+#define BCM2835_MBOX_CHANNEL_PM 0
+/* Framebuffer channel */
+#define BCM2835_MBOX_CHANNEL_FB 1
+ /* Virtual UART channel */
+#define BCM2835_MBOX_CHANNEL_VUART 2
+ /* VCHIQ channel */
+#define BCM2835_MBOX_CHANNEL_VCHIQ 3
+ /* LEDs channel */
+#define BCM2835_MBOX_CHANNEL_LED 4
+ /* Button channel */
+#define BCM2835_MBOX_CHANNEL_BUTTON 5
+ /* Touch screen channel */
+#define BCM2835_MBOX_CHANNEL_TOUCHS 6
+/* Property tags (ARM <-> VC) channel */
+#define BCM2835_MBOX_CHANNEL_PROP_AVC 8
+ /* Property tags (VC <-> ARM) channel */
+#define BCM2835_MBOX_CHANNEL_PROP_VCA 9
+
+/** @} */
+
+/** @} */
+
/** @} */
diff --git a/c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c b/c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c
new file mode 100644
index 0000000..8ec730a
--- /dev/null
+++ b/c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c
@@ -0,0 +1,56 @@
+/**
+ * @file
+ *
+ * @ingroup raspberrypi
+ *
+ * @brief mailbox 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 <stdint.h>
+#include <stdbool.h>
+#include <bsp/raspberrypi.h>
+#include <bsp/mailbox.h>
+
+#define BCM2835_MBOX_DATA_MASK(data) (data & 0xFFFFFFF0U)
+#define BCM2835_MBOX_CHANNEL_MASK(data) (data & 0xFU)
+
+static inline bool bcm2835_mailbox_is_empty()
+{
+ return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_EMPTY);
+}
+
+static inline bool bcm2835_mailbox_is_full()
+{
+ return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_FULL);
+}
+
+unsigned int raspberrypi_mailbox_read(unsigned int channel)
+{
+ unsigned int raw;
+ unsigned int read_channel;
+
+ while (1){
+ while (bcm2835_mailbox_is_empty());
+ raw = BCM2835_REG (BCM2835_MBOX_READ );
+ read_channel = BCM2835_MBOX_CHANNEL_MASK(raw) ;
+ if (read_channel == channel)
+ return BCM2835_MBOX_DATA_MASK(raw);
+ }
+}
+
+void raspberrypi_mailbox_write(unsigned int channel, unsigned int data)
+{
+ while (bcm2835_mailbox_is_full());
+ BCM2835_REG(BCM2835_MBOX_WRITE) =
+ BCM2835_MBOX_DATA_MASK(data) |
+ BCM2835_MBOX_CHANNEL_MASK(channel);
+}
diff --git a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
index 70259e2..4cb7ed6 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
@@ -126,6 +126,10 @@ $(PROJECT_INCLUDE)/bsp/usart.h: include/usart.h $(PROJECT_INCLUDE)/bsp/$(dirstam
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/usart.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/usart.h
+$(PROJECT_INCLUDE)/bsp/mailbox.h: include/mailbox.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mailbox.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mailbox.h
+
$(PROJECT_INCLUDE)/bsp/raspberrypi.h: include/raspberrypi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/raspberrypi.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/raspberrypi.h
--
2.1.0
More information about the devel
mailing list