[PATCH] [RPI BSP] mailbox

QIAO YANG yangqiao0505 at me.com
Mon Apr 6 21:12:07 UTC 2015


-----

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..abdb258
--- /dev/null
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/mailbox.h
@@ -0,0 +1,7 @@
+#ifndef MAILBOX_H
+#define MAILBOX_H
+
+extern unsigned int readmailbox(unsigned int channel);
+extern void writemailbox(unsigned int channel, unsigned int data);
+
+#endif /* MAILBOX_H */
\ No newline at end of file
diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
index c33e22a..e4ce18f 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
@@ -208,6 +208,52 @@
 
 /** @} */
 
+ /**
+ * @name Mailbox Registers
+ *
+ * @{
+ */
+
+/**
+ * NOTE:
+ */
+#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)
+
+/* 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 <-> Video Core) channel */
+#define BCM2835_MBOX_CHANNEL_PROP_AVC  8
+ /* Property tags (Video Core <-> ARM) channel */
+#define BCM2835_MBOX_CHANNEL_PROP_VCA  9
+
+#define BCM2835_MBOX_SUCCESS (BCM2835_MBOX_BASE+0x80000000)
+
+#define BCM2835_MBOX_FULL (BCM2835_MBOX_BASE+0x80000000)
+#define BCM2835_MBOX_EMPTY (BCM2835_MBOX_BASE+0x40000000)
+
+
+
+/** @} */
+
 
 /** @} */
 
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..7bfb7e3
--- /dev/null
+++ b/c/src/lib/libbsp/arm/raspberrypi/misc/mailbox.c
@@ -0,0 +1,22 @@
+#include <stdint.h>
+#include <bsp/raspberrypi.h>
+#include <bsp/mailbox.h>
+unsigned int readmailbox ( unsigned int channel )
+{
+       unsigned int data;
+       unsigned int read_channel;
+
+       while ( 1 )
+       {
+               while ( BCM2835_REG ( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_EMPTY );
+               data = BCM2835_REG ( BCM2835_MBOX_READ );
+               read_channel = ( unsigned int ) ( data & 0xF );
+               if ( read_channel == channel )
+                       return ( data & 0xFFFFFFF0 );
+       }
+}
+void writemailbox( unsigned int channel, unsigned int data )
+{
+       while ( BCM2835_REG ( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_FULL );
+       BCM2835_REG (BCM2835_MBOX_WRITE) = ( data & 0xFFFFFFF0 ) | (unsigned int) ( channel & 0xF );
+}
\ No newline at end of file
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


-----

Here is a patch for rpi bsp which include the operation and chanel defininitions for mailbox and its implementations.

I've only tested the framebuffer with it and it works well : set the screen size and get the informations.
Andre used it for sd card reading. I've checked it out and added full channel definitions.
Please point it out if further tests should be done.

YANG QIAO
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20150406/a27b189e/attachment-0001.html>


More information about the devel mailing list