arm/raspberrypi: run VideoCore and mailbox code through rtems.uncrustify.

Some changes have been reverted to keep readability.
For example squash of BCM2835_MBOX_TAG_* defines
which are visually aligned in column.
This commit is contained in:
Pavel Pisa
2016-06-28 16:15:38 +02:00
parent 48704cdebd
commit 68565b090e
5 changed files with 264 additions and 244 deletions

View File

@@ -30,31 +30,26 @@
* @{ * @{
*/ */
typedef struct typedef struct {
{
uint32_t width; uint32_t width;
uint32_t height; uint32_t height;
} bcm2835_get_display_size_entries; } bcm2835_get_display_size_entries;
int int bcm2835_mailbox_get_display_size(
bcm2835_mailbox_get_display_size(bcm2835_get_display_size_entries* _entries); bcm2835_get_display_size_entries *_entries );
typedef enum {
typedef enum
{
bcm2835_mailbox_pixel_order_bgr = 0, bcm2835_mailbox_pixel_order_bgr = 0,
bcm2835_mailbox_pixel_order_rgb = 1 bcm2835_mailbox_pixel_order_rgb = 1
} bcm2835_pixel_order; } bcm2835_pixel_order;
typedef enum typedef enum {
{
bcm2835_mailbox_alpha_mode_0_opaque = 0, bcm2835_mailbox_alpha_mode_0_opaque = 0,
bcm2835_mailbox_alpha_mode_0_transparent = 1, bcm2835_mailbox_alpha_mode_0_transparent = 1,
bcm2835_mailbox_alpha_mode_ignored = 2 bcm2835_mailbox_alpha_mode_ignored = 2
} bcm2835_alpha_mode; } bcm2835_alpha_mode;
typedef struct typedef struct {
{
uint32_t xres; uint32_t xres;
uint32_t yres; uint32_t yres;
uint32_t xvirt; uint32_t xvirt;
@@ -73,27 +68,22 @@ typedef struct
uint32_t pitch; uint32_t pitch;
} bcm2835_init_frame_buffer_entries; } bcm2835_init_frame_buffer_entries;
int int bcm2835_mailbox_init_frame_buffer(
bcm2835_mailbox_init_frame_buffer(bcm2835_init_frame_buffer_entries* _entries); bcm2835_init_frame_buffer_entries *_entries );
typedef struct typedef struct {
{
uint32_t pitch; uint32_t pitch;
}bcm2835_get_pitch_entries; } bcm2835_get_pitch_entries;
int int bcm2835_mailbox_get_pitch( bcm2835_get_pitch_entries *_entries );
bcm2835_mailbox_get_pitch(bcm2835_get_pitch_entries* _entries);
typedef struct typedef struct {
{ char cmdline[ 1024 ];
char cmdline[1024];
} bcm2835_get_cmdline_entries; } bcm2835_get_cmdline_entries;
int int bcm2835_mailbox_get_cmdline( bcm2835_get_cmdline_entries *_entries );
bcm2835_mailbox_get_cmdline(bcm2835_get_cmdline_entries* _entries);
typedef enum typedef enum {
{
bcm2835_mailbox_power_udid_sd_card = 0x00000000u, bcm2835_mailbox_power_udid_sd_card = 0x00000000u,
bcm2835_mailbox_power_udid_uart0 = 0x00000001u, bcm2835_mailbox_power_udid_uart0 = 0x00000001u,
bcm2835_mailbox_power_udid_uart1 = 0x00000002u, bcm2835_mailbox_power_udid_uart1 = 0x00000002u,
@@ -105,55 +95,46 @@ typedef enum
bcm2835_mailbox_power_udid_ccp2tx = 0x00000008u, bcm2835_mailbox_power_udid_ccp2tx = 0x00000008u,
} bcm2835_power_device_id; } bcm2835_power_device_id;
typedef struct typedef struct {
{
bcm2835_power_device_id dev_id; bcm2835_power_device_id dev_id;
uint32_t state; uint32_t state;
} bcm2835_set_power_state_entries; } bcm2835_set_power_state_entries;
#define BCM2835_MAILBOX_SET_POWER_STATE_REQ_ON (1 << 0) #define BCM2835_MAILBOX_SET_POWER_STATE_REQ_ON ( 1 << 0 )
#define BCM2835_MAILBOX_SET_POWER_STATE_REQ_WAIT (1 << 1) #define BCM2835_MAILBOX_SET_POWER_STATE_REQ_WAIT ( 1 << 1 )
#define BCM2835_MAILBOX_POWER_STATE_ON (1 << 0) #define BCM2835_MAILBOX_POWER_STATE_ON ( 1 << 0 )
#define BCM2835_MAILBOX_POWER_STATE_NODEV (1 << 1) #define BCM2835_MAILBOX_POWER_STATE_NODEV ( 1 << 1 )
int int bcm2835_mailbox_set_power_state( bcm2835_set_power_state_entries *_entries );
bcm2835_mailbox_set_power_state(bcm2835_set_power_state_entries* _entries);
typedef struct typedef struct {
{
uint32_t base; uint32_t base;
size_t size; size_t size;
}bcm2835_get_arm_memory_entries; } bcm2835_get_arm_memory_entries;
int int bcm2835_mailbox_get_arm_memory( bcm2835_get_arm_memory_entries *_entries );
bcm2835_mailbox_get_arm_memory(bcm2835_get_arm_memory_entries* _entries);
typedef struct typedef struct {
{
uint32_t base; uint32_t base;
size_t size; size_t size;
}bcm2835_get_vc_memory_entries; } bcm2835_get_vc_memory_entries;
int int bcm2835_mailbox_get_vc_memory( bcm2835_get_vc_memory_entries *_entries );
bcm2835_mailbox_get_vc_memory(bcm2835_get_vc_memory_entries* _entries);
typedef struct typedef struct {
{
uint32_t fw_rev; uint32_t fw_rev;
} bcm2835_mailbox_get_fw_rev_entries; } bcm2835_mailbox_get_fw_rev_entries;
int int bcm2835_mailbox_get_firmware_revision(
bcm2835_mailbox_get_firmware_revision(bcm2835_mailbox_get_fw_rev_entries* _entries); bcm2835_mailbox_get_fw_rev_entries *_entries );
typedef struct typedef struct {
{
uint32_t spec; uint32_t spec;
} bcm2835_get_board_spec_entries; } bcm2835_get_board_spec_entries;
int int bcm2835_mailbox_get_board_model( bcm2835_get_board_spec_entries *_entries );
bcm2835_mailbox_get_board_model(bcm2835_get_board_spec_entries* _entries);
int int bcm2835_mailbox_get_board_revision(
bcm2835_mailbox_get_board_revision(bcm2835_get_board_spec_entries* _entries); bcm2835_get_board_spec_entries *_entries );
/** @} */ /** @} */
#endif /* LIBBSP_ARM_RASPBERRYPI_VC_H */ #endif /* LIBBSP_ARM_RASPBERRYPI_VC_H */

View File

@@ -21,37 +21,43 @@
#include <bsp/raspberrypi.h> #include <bsp/raspberrypi.h>
#include <bsp/mailbox.h> #include <bsp/mailbox.h>
#define BCM2835_MBOX_DATA_MASK(data) (data & 0xFFFFFFF0U) #define BCM2835_MBOX_DATA_MASK( data ) ( data & 0xFFFFFFF0U )
#define BCM2835_MBOX_CHANNEL_MASK(data) (data & 0xFU) #define BCM2835_MBOX_CHANNEL_MASK( data ) ( data & 0xFU )
static inline bool bcm2835_mailbox_is_empty(void) static inline bool bcm2835_mailbox_is_empty( void )
{ {
return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_EMPTY); return ( BCM2835_REG( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_EMPTY );
} }
static inline bool bcm2835_mailbox_is_full(void) static inline bool bcm2835_mailbox_is_full( void )
{ {
return (BCM2835_REG(BCM2835_MBOX_STATUS) & BCM2835_MBOX_FULL); return ( BCM2835_REG( BCM2835_MBOX_STATUS ) & BCM2835_MBOX_FULL );
} }
unsigned int raspberrypi_mailbox_read(unsigned int channel) unsigned int raspberrypi_mailbox_read( unsigned int channel )
{ {
unsigned int raw; unsigned int raw;
unsigned int read_channel; unsigned int read_channel;
while (1){ while ( 1 ) {
while (bcm2835_mailbox_is_empty()); while ( bcm2835_mailbox_is_empty() ) ;
raw = BCM2835_REG (BCM2835_MBOX_READ );
read_channel = BCM2835_MBOX_CHANNEL_MASK(raw) ; raw = BCM2835_REG( BCM2835_MBOX_READ );
if (read_channel == channel) read_channel = BCM2835_MBOX_CHANNEL_MASK( raw );
return BCM2835_MBOX_DATA_MASK(raw);
if ( read_channel == channel )
return BCM2835_MBOX_DATA_MASK( raw );
} }
} }
void raspberrypi_mailbox_write(unsigned int channel, unsigned int data) void raspberrypi_mailbox_write(
unsigned int channel,
unsigned int data
)
{ {
while (bcm2835_mailbox_is_full()); while ( bcm2835_mailbox_is_full() ) ;
BCM2835_REG(BCM2835_MBOX_WRITE) =
BCM2835_MBOX_DATA_MASK(data) | BCM2835_REG( BCM2835_MBOX_WRITE ) =
BCM2835_MBOX_CHANNEL_MASK(channel); BCM2835_MBOX_DATA_MASK( data ) |
BCM2835_MBOX_CHANNEL_MASK( channel );
} }

View File

@@ -25,26 +25,24 @@ static bool benchmark_timer_find_average_overhead = false;
static uint64_t benchmark_timer_base; static uint64_t benchmark_timer_base;
void benchmark_timer_initialize(void) void benchmark_timer_initialize( void )
{ {
benchmark_timer_base = BCM2835_REG(BCM2835_GPU_TIMER_CLO); benchmark_timer_base = BCM2835_REG( BCM2835_GPU_TIMER_CLO );
} }
benchmark_timer_t benchmark_timer_read(void) benchmark_timer_t benchmark_timer_read( void )
{ {
uint32_t delta = BCM2835_REG(BCM2835_GPU_TIMER_CLO) - benchmark_timer_base; uint32_t delta = BCM2835_REG( BCM2835_GPU_TIMER_CLO ) - benchmark_timer_base;
if (benchmark_timer_find_average_overhead) if ( benchmark_timer_find_average_overhead ) {
{
return delta; return delta;
} } else {
else return BCM2835_REG( BCM2835_GPU_TIMER_CLO );
{
return BCM2835_REG(BCM2835_GPU_TIMER_CLO);
} }
} }
void benchmark_timer_disable_subtracting_average_overhead(bool find_average_overhead) void benchmark_timer_disable_subtracting_average_overhead(
bool find_average_overhead )
{ {
benchmark_timer_find_average_overhead = find_average_overhead; benchmark_timer_find_average_overhead = find_average_overhead;
} }

View File

@@ -25,25 +25,24 @@
#include <libcpu/arm-cp15.h> #include <libcpu/arm-cp15.h>
#include "vc_defines.h" #include "vc_defines.h"
#if (RPI_L2_CACHE_ENABLE == 1) #if ( RPI_L2_CACHE_ENABLE == 1 )
#define BCM2835_VC_MEMORY_MAPPING 0x40000000 #define BCM2835_VC_MEMORY_MAPPING 0x40000000
#else #else
#define BCM2835_VC_MEMORY_MAPPING 0xC0000000 #define BCM2835_VC_MEMORY_MAPPING 0xC0000000
#endif #endif
static inline bool static inline bool bcm2835_mailbox_buffer_suceeded(
bcm2835_mailbox_buffer_suceeded(const bcm2835_mbox_buf_hdr *hdr) const bcm2835_mbox_buf_hdr *hdr )
{ {
RTEMS_COMPILER_MEMORY_BARRIER(); RTEMS_COMPILER_MEMORY_BARRIER();
return (hdr->buf_code == BCM2835_MBOX_BUF_CODE_REQUEST_SUCCEED); return ( hdr->buf_code == BCM2835_MBOX_BUF_CODE_REQUEST_SUCCEED );
} }
static inline int static inline int bcm2835_mailbox_send_read_buffer( void *buf )
bcm2835_mailbox_send_read_buffer(void *buf)
{ {
raspberrypi_mailbox_write(BCM2835_MBOX_CHANNEL_PROP_AVC, raspberrypi_mailbox_write( BCM2835_MBOX_CHANNEL_PROP_AVC,
(unsigned int)buf + BCM2835_VC_MEMORY_MAPPING); (unsigned int) buf + BCM2835_VC_MEMORY_MAPPING );
raspberrypi_mailbox_read(BCM2835_MBOX_CHANNEL_PROP_AVC); raspberrypi_mailbox_read( BCM2835_MBOX_CHANNEL_PROP_AVC );
return 0; return 0;
} }
@@ -52,8 +51,10 @@ bcm2835_mailbox_send_read_buffer(void *buf)
* with VideoCore has to be propagated through ARM11/Cortex-A7 * with VideoCore has to be propagated through ARM11/Cortex-A7
* caches * caches
*/ */
static inline void static inline void bcm2835_mailbox_buffer_flush_and_invalidate(
bcm2835_mailbox_buffer_flush_and_invalidate(void *buf, size_t size) void *buf,
size_t size
)
{ {
uint32_t sctlr_val; uint32_t sctlr_val;
@@ -61,16 +62,17 @@ bcm2835_mailbox_buffer_flush_and_invalidate(void *buf, size_t size)
RTEMS_COMPILER_MEMORY_BARRIER(); RTEMS_COMPILER_MEMORY_BARRIER();
arm_cp15_drain_write_buffer(); arm_cp15_drain_write_buffer();
if (sctlr_val & (ARM_CP15_CTRL_C | ARM_CP15_CTRL_M)) {
if ( sctlr_val & ( ARM_CP15_CTRL_C | ARM_CP15_CTRL_M ) ) {
#if 0 #if 0
/* /*
These architecture independent RTEMS API functions should be These architecture independent RTEMS API functions should be
used there but CPU_DATA_CACHE_ALIGNMENT is not defined used there but CPU_DATA_CACHE_ALIGNMENT is not defined
for ARM architecture version used on RPi and functions for ARM architecture version used on RPi and functions
are dummy for now and do not provide required synchronization are dummy for now and do not provide required synchronization
*/ */
rtems_cache_flush_multiple_data_lines(buf, size); rtems_cache_flush_multiple_data_lines( buf, size );
rtems_cache_invalidate_multiple_data_lines(buf, size); rtems_cache_invalidate_multiple_data_lines( buf, size );
#else #else
/* Flush complete data cache */ /* Flush complete data cache */
arm_cp15_data_cache_clean_and_invalidate(); arm_cp15_data_cache_clean_and_invalidate();
@@ -78,32 +80,36 @@ bcm2835_mailbox_buffer_flush_and_invalidate(void *buf, size_t size)
} }
} }
#define BCM2835_MBOX_VAL_LENGTH_MASK(_val_len) \ #define BCM2835_MBOX_VAL_LENGTH_MASK( _val_len ) \
(_val_len&(~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE)) ( _val_len & ( ~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE ) )
int int bcm2835_mailbox_get_display_size(
bcm2835_mailbox_get_display_size(bcm2835_get_display_size_entries *_entries) bcm2835_get_display_size_entries *_entries )
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_display_size get_display_size; bcm2835_mbox_tag_display_size get_display_size;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_display_size, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_display_size,
BCM2835_MAILBOX_TAG_GET_DISPLAY_SIZE); BCM2835_MAILBOX_TAG_GET_DISPLAY_SIZE );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->width = buffer.get_display_size.body.resp.width; _entries->width = buffer.get_display_size.body.resp.width;
_entries->height = buffer.get_display_size.body.resp.height; _entries->height = buffer.get_display_size.body.resp.height;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_init_frame_buffer(
bcm2835_mailbox_init_frame_buffer(bcm2835_init_frame_buffer_entries* _entries) bcm2835_init_frame_buffer_entries *_entries )
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
@@ -118,52 +124,54 @@ bcm2835_mailbox_init_frame_buffer(bcm2835_init_frame_buffer_entries* _entries)
bcm2835_mbox_tag_get_pitch get_pitch; bcm2835_mbox_tag_get_pitch get_pitch;
uint32_t end_tag; uint32_t end_tag;
} buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG(&buffer.set_display_size, BCM2835_MBOX_INIT_TAG( &buffer.set_display_size,
BCM2835_MAILBOX_TAG_SET_DISPLAY_SIZE); BCM2835_MAILBOX_TAG_SET_DISPLAY_SIZE );
buffer.set_display_size.body.req.width = _entries->xres; buffer.set_display_size.body.req.width = _entries->xres;
buffer.set_display_size.body.req.height = _entries->yres; buffer.set_display_size.body.req.height = _entries->yres;
BCM2835_MBOX_INIT_TAG(&buffer.set_virtual_size, BCM2835_MBOX_INIT_TAG( &buffer.set_virtual_size,
BCM2835_MAILBOX_TAG_SET_VIRTUAL_SIZE); BCM2835_MAILBOX_TAG_SET_VIRTUAL_SIZE );
buffer.set_virtual_size.body.req.vwidth = _entries->xvirt; buffer.set_virtual_size.body.req.vwidth = _entries->xvirt;
buffer.set_virtual_size.body.req.vheight = _entries->yvirt; buffer.set_virtual_size.body.req.vheight = _entries->yvirt;
BCM2835_MBOX_INIT_TAG(&buffer.set_depth, BCM2835_MBOX_INIT_TAG( &buffer.set_depth,
BCM2835_MAILBOX_TAG_SET_DEPTH); BCM2835_MAILBOX_TAG_SET_DEPTH );
buffer.set_depth.body.req.depth = _entries->depth; buffer.set_depth.body.req.depth = _entries->depth;
BCM2835_MBOX_INIT_TAG(&buffer.set_pixel_order, BCM2835_MBOX_INIT_TAG( &buffer.set_pixel_order,
BCM2835_MAILBOX_TAG_SET_PIXEL_ORDER); BCM2835_MAILBOX_TAG_SET_PIXEL_ORDER );
buffer.set_pixel_order.body.req.pixel_order = _entries->pixel_order; buffer.set_pixel_order.body.req.pixel_order = _entries->pixel_order;
BCM2835_MBOX_INIT_TAG(&buffer.set_alpha_mode, BCM2835_MBOX_INIT_TAG( &buffer.set_alpha_mode,
BCM2835_MAILBOX_TAG_SET_ALPHA_MODE); BCM2835_MAILBOX_TAG_SET_ALPHA_MODE );
buffer.set_alpha_mode.body.req.alpha_mode = _entries->alpha_mode; buffer.set_alpha_mode.body.req.alpha_mode = _entries->alpha_mode;
BCM2835_MBOX_INIT_TAG(&buffer.set_virtual_offset, BCM2835_MBOX_INIT_TAG( &buffer.set_virtual_offset,
BCM2835_MAILBOX_TAG_SET_VIRTUAL_OFFSET); BCM2835_MAILBOX_TAG_SET_VIRTUAL_OFFSET );
buffer.set_virtual_offset.body.req.voffset_x = _entries->voffset_x; buffer.set_virtual_offset.body.req.voffset_x = _entries->voffset_x;
buffer.set_virtual_offset.body.req.voffset_x = _entries->voffset_y; buffer.set_virtual_offset.body.req.voffset_x = _entries->voffset_y;
BCM2835_MBOX_INIT_TAG(&buffer.set_overscan, BCM2835_MBOX_INIT_TAG( &buffer.set_overscan,
BCM2835_MAILBOX_TAG_SET_OVERSCAN); BCM2835_MAILBOX_TAG_SET_OVERSCAN );
buffer.set_overscan.body.req.overscan_top = _entries->overscan_top; buffer.set_overscan.body.req.overscan_top = _entries->overscan_top;
buffer.set_overscan.body.req.overscan_bottom = _entries->overscan_bottom; buffer.set_overscan.body.req.overscan_bottom = _entries->overscan_bottom;
buffer.set_overscan.body.req.overscan_left = _entries->overscan_left; buffer.set_overscan.body.req.overscan_left = _entries->overscan_left;
buffer.set_overscan.body.req.overscan_right = _entries->overscan_right; buffer.set_overscan.body.req.overscan_right = _entries->overscan_right;
BCM2835_MBOX_INIT_TAG(&buffer.allocate_buffer, BCM2835_MBOX_INIT_TAG( &buffer.allocate_buffer,
BCM2835_MAILBOX_TAG_ALLOCATE_BUFFER); BCM2835_MAILBOX_TAG_ALLOCATE_BUFFER );
buffer.allocate_buffer.body.req.align = 0x100; buffer.allocate_buffer.body.req.align = 0x100;
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_pitch, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_pitch,
BCM2835_MAILBOX_TAG_GET_PITCH); BCM2835_MAILBOX_TAG_GET_PITCH );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->xres = buffer.set_display_size.body.resp.width; _entries->xres = buffer.set_display_size.body.resp.width;
_entries->yres = buffer.set_display_size.body.resp.height; _entries->yres = buffer.set_display_size.body.resp.height;
_entries->xvirt = buffer.set_virtual_size.body.resp.vwidth; _entries->xvirt = buffer.set_virtual_size.body.resp.vwidth;
_entries->yvirt = buffer.set_virtual_size.body.resp.vheight; _entries->yvirt = buffer.set_virtual_size.body.resp.vheight;
_entries->depth = buffer.set_depth.body.resp.depth; _entries->depth = buffer.set_depth.body.resp.depth;
#if (BSP_IS_RPI2 == 1) #if ( BSP_IS_RPI2 == 1 )
_entries->base = buffer.allocate_buffer.body.resp.base; _entries->base = buffer.allocate_buffer.body.resp.base;
#else #else
_entries->base = buffer.allocate_buffer.body.resp.base _entries->base = buffer.allocate_buffer.body.resp.base -
- BCM2835_VC_MEMORY_MAPPING; BCM2835_VC_MEMORY_MAPPING;
#endif #endif
_entries->size = buffer.allocate_buffer.body.resp.size; _entries->size = buffer.allocate_buffer.body.resp.size;
_entries->pixel_order = buffer.set_pixel_order.body.resp.pixel_order; _entries->pixel_order = buffer.set_pixel_order.body.resp.pixel_order;
@@ -174,179 +182,208 @@ bcm2835_mailbox_init_frame_buffer(bcm2835_init_frame_buffer_entries* _entries)
_entries->overscan_right = buffer.set_overscan.body.resp.overscan_right; _entries->overscan_right = buffer.set_overscan.body.resp.overscan_right;
_entries->overscan_top = buffer.set_overscan.body.resp.overscan_top; _entries->overscan_top = buffer.set_overscan.body.resp.overscan_top;
_entries->overscan_bottom = buffer.set_overscan.body.resp.overscan_bottom; _entries->overscan_bottom = buffer.set_overscan.body.resp.overscan_bottom;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_pitch( bcm2835_get_pitch_entries *_entries )
bcm2835_mailbox_get_pitch(bcm2835_get_pitch_entries* _entries)
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_pitch get_pitch; bcm2835_mbox_tag_get_pitch get_pitch;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_pitch, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_pitch,
BCM2835_MAILBOX_TAG_GET_PITCH); BCM2835_MAILBOX_TAG_GET_PITCH );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->pitch = buffer.get_pitch.body.resp.pitch; _entries->pitch = buffer.get_pitch.body.resp.pitch;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_cmdline( bcm2835_get_cmdline_entries *_entries )
bcm2835_mailbox_get_cmdline(bcm2835_get_cmdline_entries* _entries)
{ {
int i; int i;
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_cmd_line get_cmd_line; bcm2835_mbox_tag_get_cmd_line get_cmd_line;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_cmd_line, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_cmd_line,
BCM2835_MAILBOX_TAG_GET_CMD_LINE); BCM2835_MAILBOX_TAG_GET_CMD_LINE );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
for (i = 0;
i < BCM2835_MBOX_VAL_LENGTH_MASK(buffer.get_cmd_line.tag_hdr.val_len); for ( i = 0;
++i) i < BCM2835_MBOX_VAL_LENGTH_MASK( buffer.get_cmd_line.tag_hdr.val_len );
{ ++i ) {
_entries->cmdline[i] = buffer.get_cmd_line.body.resp.cmdline[i]; _entries->cmdline[ i ] = buffer.get_cmd_line.body.resp.cmdline[ i ];
} }
_entries->cmdline[i] = '\0';
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) ) _entries->cmdline[ i ] = '\0';
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_set_power_state( bcm2835_set_power_state_entries *_entries )
bcm2835_mailbox_set_power_state(bcm2835_set_power_state_entries *_entries)
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_power_state set_power_state; bcm2835_mbox_tag_power_state set_power_state;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG(&buffer.set_power_state, BCM2835_MBOX_INIT_TAG( &buffer.set_power_state,
BCM2835_MAILBOX_TAG_SET_POWER_STATE); BCM2835_MAILBOX_TAG_SET_POWER_STATE );
buffer.set_power_state.body.req.dev_id = _entries->dev_id; buffer.set_power_state.body.req.dev_id = _entries->dev_id;
buffer.set_power_state.body.req.state = _entries->state; buffer.set_power_state.body.req.state = _entries->state;
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->dev_id = buffer.set_power_state.body.resp.dev_id; _entries->dev_id = buffer.set_power_state.body.resp.dev_id;
_entries->state = buffer.set_power_state.body.resp.state; _entries->state = buffer.set_power_state.body.resp.state;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_arm_memory( bcm2835_get_arm_memory_entries *_entries )
bcm2835_mailbox_get_arm_memory(bcm2835_get_arm_memory_entries* _entries)
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_arm_memory get_arm_memory; bcm2835_mbox_tag_get_arm_memory get_arm_memory;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_arm_memory, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_arm_memory,
BCM2835_MAILBOX_TAG_GET_ARM_MEMORY); BCM2835_MAILBOX_TAG_GET_ARM_MEMORY );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->base = buffer.get_arm_memory.body.resp.base; _entries->base = buffer.get_arm_memory.body.resp.base;
_entries->size = buffer.get_arm_memory.body.resp.size; _entries->size = buffer.get_arm_memory.body.resp.size;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_vc_memory( bcm2835_get_vc_memory_entries *_entries )
bcm2835_mailbox_get_vc_memory(bcm2835_get_vc_memory_entries* _entries)
{ {
struct { struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_vc_memory get_vc_memory; bcm2835_mbox_tag_get_vc_memory get_vc_memory;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_vc_memory, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_vc_memory,
BCM2835_MAILBOX_TAG_GET_VC_MEMORY); BCM2835_MAILBOX_TAG_GET_VC_MEMORY );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->base = buffer.get_vc_memory.body.resp.base; _entries->base = buffer.get_vc_memory.body.resp.base;
_entries->size = buffer.get_vc_memory.body.resp.size; _entries->size = buffer.get_vc_memory.body.resp.size;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_firmware_revision(
bcm2835_mailbox_get_firmware_revision(bcm2835_mailbox_get_fw_rev_entries* _entries) bcm2835_mailbox_get_fw_rev_entries *_entries )
{ {
struct{ struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_fw_rev get_fw_rev; bcm2835_mbox_tag_get_fw_rev get_fw_rev;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_fw_rev, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_fw_rev,
BCM2835_MAILBOX_TAG_FIRMWARE_REVISION); BCM2835_MAILBOX_TAG_FIRMWARE_REVISION );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->fw_rev = buffer.get_fw_rev.body.resp.rev; _entries->fw_rev = buffer.get_fw_rev.body.resp.rev;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_board_model( bcm2835_get_board_spec_entries *_entries )
bcm2835_mailbox_get_board_model(bcm2835_get_board_spec_entries* _entries)
{ {
struct{ struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_board_spec get_board_model; bcm2835_mbox_tag_get_board_spec get_board_model;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_board_model, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_board_model,
BCM2835_MAILBOX_TAG_GET_BOARD_MODEL); BCM2835_MAILBOX_TAG_GET_BOARD_MODEL );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->spec = buffer.get_board_model.body.resp.spec; _entries->spec = buffer.get_board_model.body.resp.spec;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }
int int bcm2835_mailbox_get_board_revision(
bcm2835_mailbox_get_board_revision(bcm2835_get_board_spec_entries* _entries) bcm2835_get_board_spec_entries *_entries )
{ {
struct{ struct {
bcm2835_mbox_buf_hdr hdr; bcm2835_mbox_buf_hdr hdr;
bcm2835_mbox_tag_get_board_spec get_board_revision; bcm2835_mbox_tag_get_board_spec get_board_revision;
uint32_t end_tag; uint32_t end_tag;
}buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
BCM2835_MBOX_INIT_BUF(&buffer); BCM2835_MBOX_INIT_BUF( &buffer );
BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_board_revision, BCM2835_MBOX_INIT_TAG_NO_REQ( &buffer.get_board_revision,
BCM2835_MAILBOX_TAG_GET_BOARD_VERSION); BCM2835_MAILBOX_TAG_GET_BOARD_VERSION );
bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); bcm2835_mailbox_buffer_flush_and_invalidate( &buffer, sizeof( &buffer ) );
if (bcm2835_mailbox_send_read_buffer(&buffer))
if ( bcm2835_mailbox_send_read_buffer( &buffer ) )
return -1; return -1;
_entries->spec = buffer.get_board_revision.body.resp.spec; _entries->spec = buffer.get_board_revision.body.resp.spec;
if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
if ( !bcm2835_mailbox_buffer_suceeded( &buffer.hdr ) )
return -2; return -2;
return 0; return 0;
} }

View File

@@ -30,7 +30,7 @@
* @{ * @{
*/ */
/** /**
* @name Mailbox Property tags (ARM <-> VC) * @name Mailbox Property tags (ARM <-> VC)
* *
* @{ * @{
@@ -51,7 +51,6 @@
* *
*/ */
typedef struct { typedef struct {
/** /**
* @brief Buffer Size * @brief Buffer Size
* *
@@ -70,7 +69,6 @@ typedef struct {
uint32_t buf_code; uint32_t buf_code;
} bcm2835_mbox_buf_hdr; } bcm2835_mbox_buf_hdr;
/** /**
* @brief Tag Header * @brief Tag Header
* *
@@ -96,24 +94,24 @@ typedef struct {
uint32_t val_len; uint32_t val_len;
} bcm2835_mbox_tag_hdr; } bcm2835_mbox_tag_hdr;
#define BCM2835_MBOX_INIT_BUF(_m_) { \ #define BCM2835_MBOX_INIT_BUF( _m_ ) { \
memset((_m_), 0, sizeof(*(_m_))); \ memset( ( _m_ ), 0, sizeof( *( _m_ ) ) ); \
(_m_)->hdr.buf_size = sizeof(*(_m_)); \ ( _m_ )->hdr.buf_size = sizeof( *( _m_ ) ); \
(_m_)->hdr.buf_code = BCM2835_MBOX_BUF_CODE_PROCESS_REQUEST; \ ( _m_ )->hdr.buf_code = BCM2835_MBOX_BUF_CODE_PROCESS_REQUEST; \
(_m_)->end_tag = 0; \ ( _m_ )->end_tag = 0; \
} }
#define BCM2835_MBOX_INIT_TAG(_t_, _id_) { \ #define BCM2835_MBOX_INIT_TAG( _t_, _id_ ) { \
(_t_)->tag_hdr.tag = _id_; \ ( _t_ )->tag_hdr.tag = _id_; \
(_t_)->tag_hdr.val_buf_size = sizeof((_t_)->body); \ ( _t_ )->tag_hdr.val_buf_size = sizeof( ( _t_ )->body ); \
(_t_)->tag_hdr.val_len = sizeof((_t_)->body.req); \ ( _t_ )->tag_hdr.val_len = sizeof( ( _t_ )->body.req ); \
} }
#define BCM2835_MBOX_INIT_TAG_NO_REQ(_t_, _id_) { \ #define BCM2835_MBOX_INIT_TAG_NO_REQ( _t_, _id_ ) { \
(_t_)->tag_hdr.tag = _id_; \ ( _t_ )->tag_hdr.tag = _id_; \
(_t_)->tag_hdr.val_buf_size = sizeof((_t_)->body); \ ( _t_ )->tag_hdr.val_buf_size = sizeof( ( _t_ )->body ); \
(_t_)->tag_hdr.val_len = 0; \ ( _t_ )->tag_hdr.val_len = 0; \
} }
/* /*
* Mailbox buffers has to be aligned to 16 bytes because * Mailbox buffers has to be aligned to 16 bytes because
@@ -131,7 +129,7 @@ typedef struct {
* Cache line length is 64 bytes for RPi2 Cortex-A7 data cache * Cache line length is 64 bytes for RPi2 Cortex-A7 data cache
* so align buffers to this value. * so align buffers to this value.
*/ */
#define BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE __attribute__((aligned (64))) #define BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE __attribute__( ( aligned( 64 ) ) )
/* Video Core */ /* Video Core */
#define BCM2835_MAILBOX_TAG_FIRMWARE_REVISION 0x00000001 #define BCM2835_MAILBOX_TAG_FIRMWARE_REVISION 0x00000001
@@ -217,7 +215,7 @@ typedef struct {
struct { struct {
} req; } req;
struct { struct {
uint8_t cmdline[1024]; uint8_t cmdline[ 1024 ];
} resp; } resp;
} body; } body;
} bcm2835_mbox_tag_get_cmd_line; } bcm2835_mbox_tag_get_cmd_line;