[PATCH 5/7] arm/raspberrypi: add VideoCore mailbox support read and write

ppisa4lists at pikron.com ppisa4lists at pikron.com
Thu May 19 11:16:15 UTC 2016


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 a092a28..2d74c68 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
@@ -48,6 +48,7 @@ include_bsp_HEADERS += include/raspberrypi.h
 include_bsp_HEADERS += include/rpi-gpio.h
 include_bsp_HEADERS += include/i2c.h
 include_bsp_HEADERS += include/spi.h
+include_bsp_HEADERS += include/mailbox.h
 
 include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \
     ../../../libcpu/arm/shared/include/arm-cp15.h
@@ -112,6 +113,9 @@ libbsp_a_SOURCES += ../../shared/console_write.c
 libbsp_a_SOURCES += console/console-config.c
 libbsp_a_SOURCES += console/usart.c
 
+# Mailbox
+libbsp_a_SOURCES += misc/mailbox.c
+
 # clock
 libbsp_a_SOURCES += clock/clockdrv.c ../../../shared/clockdrv_shell.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 2a4d772..d6f00e8 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
@@ -9,6 +9,7 @@
 /*
  *  Copyright (c) 2014-2015 Andre Marques <andre.lousa.marques at gmail.com>
  *  Copyright (c) 2013 Alan Cudmore.
+ *  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
@@ -287,6 +288,54 @@
 
 /** @} */
 
+/**
+* @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   0x80000000
+#define BCM2835_MBOX_EMPTY  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
+
+/** @} */
+
+
 /** @} */
 
 #endif /* LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H */
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..9d70c72
--- /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(void)
+{
+  return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_EMPTY);
+}
+
+static inline bool bcm2835_mailbox_is_full(void)
+{
+  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 902cc01..6072434 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
@@ -146,6 +146,10 @@ $(PROJECT_INCLUDE)/bsp/spi.h: include/spi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/spi.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/spi.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)/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
-- 
1.9.1



More information about the devel mailing list