diff options
author | root <root@ps-pc.(none)> | 2014-07-09 21:25:21 +0300 |
---|---|---|
committer | root <root@ps-pc.(none)> | 2014-07-09 21:25:21 +0300 |
commit | ec4c2c43e00a0383bbe249d4a30419b7b0175079 (patch) | |
tree | b2bab65f43486fe161d917c8a7d03a76236fd2bc /boards/base/RaspberryPi/rpi_mailbox.c | |
parent | 0afcec1ddb9990b857ae06eadb8fbdbad86c9ca4 (diff) | |
parent | 2a40353883fe3574d668612e12c361dbd0e567b8 (diff) | |
download | uGFX-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.c | 47 |
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); +} |