arm/raspberrypi: add VideoCore mailbox support read and write

This commit is contained in:
YANG Qiao
2016-05-19 13:21:40 +02:00
committed by Pavel Pisa
parent 12582291e0
commit 33e39d3102
5 changed files with 145 additions and 0 deletions
@@ -48,6 +48,7 @@ include_bsp_HEADERS += include/raspberrypi.h
include_bsp_HEADERS += include/rpi-gpio.h
include_bsp_HEADERS += include/i2c.h
include_bsp_HEADERS += include/spi.h
include_bsp_HEADERS += include/mailbox.h
include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \
../../../libcpu/arm/shared/include/arm-cp15.h
@@ -112,6 +113,9 @@ libbsp_a_SOURCES += ../../shared/console_write.c
libbsp_a_SOURCES += console/console-config.c
libbsp_a_SOURCES += console/usart.c
# Mailbox
libbsp_a_SOURCES += misc/mailbox.c
# clock
libbsp_a_SOURCES += clock/clockdrv.c ../../../shared/clockdrv_shell.h
@@ -0,0 +1,32 @@
/**
* @file
*
* @ingroup raspberrypi
*
* @brief mailbox support.
*/
/*
* Copyright (c) 2015 Yang Qiao
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
*
* http://www.rtems.org/license/LICENSE
*
*/
#ifndef LIBBSP_ARM_RASPBERRYPI_MAILBOX_H
#define LIBBSP_ARM_RASPBERRYPI_MAILBOX_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
extern unsigned int raspberrypi_mailbox_read(unsigned int channel);
extern void raspberrypi_mailbox_write(unsigned int channel, unsigned int data);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* LIBBSP_ARM_RASPBERRYPI_MAILBOX_H */
@@ -9,6 +9,7 @@
/*
* Copyright (c) 2014-2015 Andre Marques <andre.lousa.marques at gmail.com>
* Copyright (c) 2013 Alan Cudmore.
* Copyright (c) 2015 Yang Qiao
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -287,6 +288,54 @@
/** @} */
/**
* @name Mailbox Registers
*
* @{
*/
#define BCM2835_MBOX_BASE (RPI_PERIPHERAL_BASE+0xB880)
#define BCM2835_MBOX_PEEK (BCM2835_MBOX_BASE+0x10)
#define BCM2835_MBOX_READ (BCM2835_MBOX_BASE+0x00)
#define BCM2835_MBOX_WRITE (BCM2835_MBOX_BASE+0x20)
#define BCM2835_MBOX_STATUS (BCM2835_MBOX_BASE+0x18)
#define BCM2835_MBOX_SENDER (BCM2835_MBOX_BASE+0x14)
#define BCM2835_MBOX_CONFIG (BCM2835_MBOX_BASE+0x1C)
#define BCM2835_MBOX_FULL 0x80000000
#define BCM2835_MBOX_EMPTY 0x40000000
/** @} */
/**
* @name Mailbox Channels
*
* @{
*/
/* Power Manager channel */
#define BCM2835_MBOX_CHANNEL_PM 0
/* Framebuffer channel */
#define BCM2835_MBOX_CHANNEL_FB 1
/* Virtual UART channel */
#define BCM2835_MBOX_CHANNEL_VUART 2
/* VCHIQ channel */
#define BCM2835_MBOX_CHANNEL_VCHIQ 3
/* LEDs channel */
#define BCM2835_MBOX_CHANNEL_LED 4
/* Button channel */
#define BCM2835_MBOX_CHANNEL_BUTTON 5
/* Touch screen channel */
#define BCM2835_MBOX_CHANNEL_TOUCHS 6
/* Property tags (ARM <-> VC) channel */
#define BCM2835_MBOX_CHANNEL_PROP_AVC 8
/* Property tags (VC <-> ARM) channel */
#define BCM2835_MBOX_CHANNEL_PROP_VCA 9
/** @} */
/** @} */
#endif /* LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H */
@@ -0,0 +1,56 @@
/**
* @file
*
* @ingroup raspberrypi
*
* @brief mailbox support.
*/
/*
* Copyright (c) 2015 Yang Qiao
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
*
* http://www.rtems.org/license/LICENSE
*
*/
#include <stdint.h>
#include <stdbool.h>
#include <bsp/raspberrypi.h>
#include <bsp/mailbox.h>
#define BCM2835_MBOX_DATA_MASK(data) (data & 0xFFFFFFF0U)
#define BCM2835_MBOX_CHANNEL_MASK(data) (data & 0xFU)
static inline bool bcm2835_mailbox_is_empty(void)
{
return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_EMPTY);
}
static inline bool bcm2835_mailbox_is_full(void)
{
return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_FULL);
}
unsigned int raspberrypi_mailbox_read(unsigned int channel)
{
unsigned int raw;
unsigned int read_channel;
while (1){
while (bcm2835_mailbox_is_empty());
raw = BCM2835_REG (BCM2835_MBOX_READ );
read_channel = BCM2835_MBOX_CHANNEL_MASK(raw) ;
if (read_channel == channel)
return BCM2835_MBOX_DATA_MASK(raw);
}
}
void raspberrypi_mailbox_write(unsigned int channel, unsigned int data)
{
while (bcm2835_mailbox_is_full());
BCM2835_REG(BCM2835_MBOX_WRITE) =
BCM2835_MBOX_DATA_MASK(data) |
BCM2835_MBOX_CHANNEL_MASK(channel);
}
@@ -146,6 +146,10 @@ $(PROJECT_INCLUDE)/bsp/spi.h: include/spi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/spi.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/spi.h
$(PROJECT_INCLUDE)/bsp/mailbox.h: include/mailbox.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mailbox.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mailbox.h
$(PROJECT_INCLUDE)/libcpu/cache_.h: ../../../libcpu/arm/shared/include/cache_.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache_.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache_.h