59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
|
#include <stdint.h>
|
||
|
|
||
|
#include "rpi-gpio.h"
|
||
|
#include "rpi-mailbox.h"
|
||
|
|
||
|
extern void usDelay(unsigned nMicroSeconds);
|
||
|
|
||
|
/* Mailbox 0 mapped to it's base address */
|
||
|
static mailbox_t* rpiMailbox0 = (mailbox_t*)RPI_MAILBOX0_BASE;
|
||
|
|
||
|
void RPI_Mailbox0Write( mailbox0_channel_t channel, int value )
|
||
|
{
|
||
|
/* For information about accessing mailboxes, see:
|
||
|
https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes */
|
||
|
|
||
|
/* Add the channel number into the lower 4 bits */
|
||
|
value &= ~(0xF);
|
||
|
value |= channel;
|
||
|
|
||
|
/* Wait until the mailbox becomes available and then write to the mailbox
|
||
|
channel */
|
||
|
while( ( rpiMailbox0->Status & ARM_MS_FULL ) != 0 ) { }
|
||
|
|
||
|
/* Write the modified value + channel number into the write register */
|
||
|
rpiMailbox0->Write = value;
|
||
|
}
|
||
|
|
||
|
|
||
|
int RPI_Mailbox0Read( mailbox0_channel_t channel )
|
||
|
{
|
||
|
/* For information about accessing mailboxes, see:
|
||
|
https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes */
|
||
|
int value = -1;
|
||
|
|
||
|
/* Keep reading the register until the desired channel gives us a value */
|
||
|
while( ( value & 0xF ) != channel )
|
||
|
{
|
||
|
/* Wait while the mailbox is empty because otherwise there's no value
|
||
|
to read! */
|
||
|
while( rpiMailbox0->Status & ARM_MS_EMPTY ) { }
|
||
|
|
||
|
/* Extract the value from the Read register of the mailbox. The value
|
||
|
is actually in the upper 28 bits */
|
||
|
value = rpiMailbox0->Read;
|
||
|
}
|
||
|
|
||
|
/* Return just the value (the upper 28-bits) */
|
||
|
return value >> 4;
|
||
|
}
|
||
|
|
||
|
void RPI_Mailbox0Flush(void)
|
||
|
{
|
||
|
while (!(rpiMailbox0->Status & ARM_MS_EMPTY))
|
||
|
{
|
||
|
(void)rpiMailbox0->Read;
|
||
|
usDelay(20);
|
||
|
}
|
||
|
}
|