File indexing completed on 2025-05-11 08:23:04
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <stdint.h>
0019 #include <stdbool.h>
0020 #include <bsp.h>
0021 #include <bsp/raspberrypi.h>
0022 #include <bsp/mailbox.h>
0023
0024 #define BCM2835_MBOX_DATA_MASK( data ) ( data & 0xFFFFFFF0U )
0025 #define BCM2835_MBOX_CHANNEL_MASK( data ) ( data & 0xFU )
0026
0027 static inline bool bcm2835_mailbox_is_empty( void )
0028 {
0029 return ( BCM2835_REG( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_EMPTY );
0030 }
0031
0032 static inline bool bcm2835_mailbox_is_full( void )
0033 {
0034 return ( BCM2835_REG( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_FULL );
0035 }
0036
0037 unsigned int raspberrypi_mailbox_read( unsigned int channel )
0038 {
0039 unsigned int raw;
0040 unsigned int read_channel;
0041
0042 while ( 1 ) {
0043 while ( bcm2835_mailbox_is_empty() ) ;
0044
0045 raw = BCM2835_REG( BCM2835_MBOX_READ );
0046 read_channel = BCM2835_MBOX_CHANNEL_MASK( raw );
0047
0048 if ( read_channel == channel )
0049 return BCM2835_MBOX_DATA_MASK( raw );
0050 }
0051 }
0052
0053 void raspberrypi_mailbox_write(
0054 unsigned int channel,
0055 unsigned int data
0056 )
0057 {
0058 while ( bcm2835_mailbox_is_full() ) ;
0059
0060 BCM2835_REG( BCM2835_MBOX_WRITE ) =
0061 BCM2835_MBOX_DATA_MASK( data ) |
0062 BCM2835_MBOX_CHANNEL_MASK( channel );
0063 }