mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-24 13:26:45 +08:00
arm/raspberrypi: add VideoCore mailbox support read and write
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user