Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:04

0001 /**
0002  * @file
0003  *
0004  * @ingroup raspberrypi
0005  *
0006  * @brief mailbox support.
0007  */
0008 /*
0009  * Copyright (c) 2015 Yang Qiao
0010  *
0011  *  The license and distribution terms for this file may be
0012  *  found in the file LICENSE in this distribution or at
0013  *
0014  *  http://www.rtems.org/license/LICENSE
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 }