aboutsummaryrefslogtreecommitdiffstats
path: root/boards/base/RaspberryPi/rpi_mailbox.c
diff options
context:
space:
mode:
authorroot <root@ps-pc.(none)>2014-07-09 21:25:21 +0300
committerroot <root@ps-pc.(none)>2014-07-09 21:25:21 +0300
commitec4c2c43e00a0383bbe249d4a30419b7b0175079 (patch)
treeb2bab65f43486fe161d917c8a7d03a76236fd2bc /boards/base/RaspberryPi/rpi_mailbox.c
parent0afcec1ddb9990b857ae06eadb8fbdbad86c9ca4 (diff)
parent2a40353883fe3574d668612e12c361dbd0e567b8 (diff)
downloaduGFX-ec4c2c43e00a0383bbe249d4a30419b7b0175079.tar.gz
uGFX-ec4c2c43e00a0383bbe249d4a30419b7b0175079.tar.bz2
uGFX-ec4c2c43e00a0383bbe249d4a30419b7b0175079.zip
Merge branch 'pcf8812' of https://bitbucket.org/pashamray/ugfx into pcf8812
Diffstat (limited to 'boards/base/RaspberryPi/rpi_mailbox.c')
-rw-r--r--boards/base/RaspberryPi/rpi_mailbox.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/boards/base/RaspberryPi/rpi_mailbox.c b/boards/base/RaspberryPi/rpi_mailbox.c
new file mode 100644
index 00000000..798cbb1f
--- /dev/null
+++ b/boards/base/RaspberryPi/rpi_mailbox.c
@@ -0,0 +1,47 @@
+/*
+ * Access system mailboxes
+ */
+#include "rpi_mailbox.h"
+
+/* Mailbox memory addresses */
+static volatile unsigned int *MAILBOX0READ = (unsigned int *) (0x2000b880);
+static volatile unsigned int *MAILBOX0STATUS = (unsigned int *) (0x2000b898);
+static volatile unsigned int *MAILBOX0WRITE = (unsigned int *) (0x2000b8a0);
+
+/* Bit 31 set in status register if the write mailbox is full */
+#define MAILBOX_FULL 0x80000000
+
+/* Bit 30 set in status register if the read mailbox is empty */
+#define MAILBOX_EMPTY 0x40000000
+
+unsigned int rpi_readmailbox(unsigned int channel)
+{
+ unsigned int val;
+
+ if (channel > 15)
+ return 0xFFFFFFFF;
+
+ /* Wait for mailbox to be full */
+ while (*MAILBOX0STATUS & MAILBOX_EMPTY);
+
+ val = *MAILBOX0READ;
+
+ if ((val & 15) == channel)
+ return (val & 0xFFFFFFF0);
+ else
+ return 0xFFFFFFFF;
+}
+
+void rpi_writemailbox(unsigned int channel, unsigned int data)
+{
+ if (channel > 15)
+ return;
+
+ if (data & 0x000F)
+ return;
+
+ /* Wait for mailbox to be not full */
+ while (*MAILBOX0STATUS & MAILBOX_FULL);
+
+ *MAILBOX0WRITE = (data | channel);
+}