Back to home page

LXR

 
 

    


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

0001 /**
0002  * @file
0003  *
0004  * @ingroup raspberrypi_vc
0005  *
0006  * @brief video core support.
0007  *
0008  */
0009 
0010 /*
0011  * Copyright (c) 2015 Yang Qiao
0012  *
0013  *  The license and distribution terms for this file may be
0014  *  found in the file LICENSE in this distribution or at
0015  *
0016  *  http://www.rtems.org/license/LICENSE
0017  *
0018  */
0019 
0020 #ifndef LIBBSP_ARM_RASPBERRYPI_VC_DEFINES_H
0021 #define LIBBSP_ARM_RASPBERRYPI_VC_DEFINES_H
0022 
0023 #include <string.h>
0024 
0025 /**
0026  * @defgroup raspberrypi_vc Register Definitions
0027  *
0028  * @ingroup RTEMSBSPsARMRaspberryPi
0029  *
0030  * @brief Register Definitions
0031  *
0032  * @{
0033  */
0034 
0035 /**
0036  * @name Mailbox Property tags (ARM <-> VC)
0037  *
0038  * @{
0039  */
0040 
0041 #define BCM2835_MBOX_BUF_CODE_PROCESS_REQUEST         0x00000000
0042 #define BCM2835_MBOX_BUF_CODE_REQUEST_SUCCEED         0x80000000
0043 #define BCM2835_MBOX_BUF_CODE_REQUEST_PARSING_ERROR   0x80000001
0044 #define BCM2835_MBOX_TAG_VAL_LEN_REQUEST              0x00000000
0045 #define BCM2835_MBOX_TAG_VAL_LEN_RESPONSE             0x80000000
0046 
0047 /**
0048  * @brief Buffer Header
0049  *
0050  * All message buffers should start with this header, called 'hdr'.
0051  * Then it should be followed by a list of tags.
0052  * An additional empty tag should be added at the end, called 'end_tag'
0053  *
0054  */
0055 typedef struct {
0056   /**
0057    * @brief Buffer Size
0058    *
0059    * The size of whole structure including the header(size and code),
0060    *   tags, end tag and padding.
0061    */
0062   uint32_t buf_size;
0063 
0064   /**
0065    * @brief Buffer Code
0066    *
0067    * The code indicate the status of operation.
0068    * Use function BCM2835_MAILBOX_BUFFER_IS_SUCCEED(bcm2835_mailbox_buffer*)
0069    * to check if the operation is succeed
0070    */
0071   uint32_t buf_code;
0072 } bcm2835_mbox_buf_hdr;
0073 
0074 /**
0075  * @brief Tag Header
0076  *
0077  * Tag is used for getting/testing/setting an property.
0078  * All tags should start with this header.
0079  * Then it should be followed by a data buffer for request and response.
0080  *
0081  */
0082 typedef struct {
0083   /**
0084    * @brief Property Tag ID
0085    */
0086   uint32_t tag;
0087   /**
0088    * @brief The size of request qnd responce buffer
0089    */
0090   uint32_t val_buf_size;
0091   /**
0092    * @brief The size of response buffer set by videocore.
0093    *
0094    * upper bit reserved for request/response indicator
0095    */
0096   uint32_t val_len;
0097 } bcm2835_mbox_tag_hdr;
0098 
0099 #define BCM2835_MBOX_TAG_REPLY_IS_SET( _t_ ) \
0100    ( ( _t_ )->tag_hdr.val_len & 0x80000000 )
0101 
0102 #define BCM2835_MBOX_INIT_BUF( _m_ ) { \
0103     memset( ( _m_ ), 0,  sizeof( *( _m_ ) ) ); \
0104     ( _m_ )->hdr.buf_size = (void *)&(( _m_ )->end_tag) + 4 - (void *)( _m_ ); \
0105     ( _m_ )->hdr.buf_code = BCM2835_MBOX_BUF_CODE_PROCESS_REQUEST; \
0106     ( _m_ )->end_tag = 0; \
0107 }
0108 
0109 #define BCM2835_MBOX_INIT_TAG( _t_, _id_ ) { \
0110     ( _t_ )->tag_hdr.tag = _id_; \
0111     ( _t_ )->tag_hdr.val_buf_size = sizeof( ( _t_ )->body ); \
0112     ( _t_ )->tag_hdr.val_len = sizeof( ( _t_ )->body.req ); \
0113 }
0114 
0115 #define BCM2835_MBOX_INIT_TAG_NO_REQ( _t_, _id_ ) { \
0116     ( _t_ )->tag_hdr.tag = _id_; \
0117     ( _t_ )->tag_hdr.val_buf_size = sizeof( ( _t_ )->body ); \
0118     ( _t_ )->tag_hdr.val_len = 0; \
0119 }
0120 
0121 /*
0122  * Mailbox buffers has to be aligned to 16 bytes because
0123  * 4 LSB bits of the BCM2835_MBOX_WRITE and BCM2835_MBOX_READ
0124  * registers are used to pass channel number.
0125  *
0126  * But there is another requirement for buffer allocation
0127  * as well when interface is called after cache is enabled.
0128  * The buffer should not share cache line with another variable
0129  * which can be updated during data exchange with VideoCore.
0130  * If cache is filled to satisfy another variable update
0131  * during VideoCore output is stored into main memory then
0132  * part of received data can be lost.
0133  *
0134  * Cache line length is 64 bytes for RPi2 Cortex-A7 data cache
0135  * so align buffers to this value.
0136  */
0137 #define BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE __attribute__( ( aligned( 64 ) ) )
0138 
0139 /* Video Core */
0140 #define BCM2835_MAILBOX_TAG_FIRMWARE_REVISION   0x00000001
0141 typedef struct {
0142   bcm2835_mbox_tag_hdr tag_hdr;
0143   union {
0144     struct {
0145     } req;
0146     struct {
0147       uint32_t rev;
0148     } resp;
0149   } body;
0150 } bcm2835_mbox_tag_get_fw_rev;
0151 
0152 /* Hardware */
0153 #define BCM2835_MAILBOX_TAG_GET_BOARD_MODEL     0x00010001
0154 #define BCM2835_MAILBOX_TAG_GET_BOARD_VERSION   0x00010002
0155 typedef struct {
0156   bcm2835_mbox_tag_hdr tag_hdr;
0157   union {
0158     struct {
0159     } req;
0160     struct {
0161       uint32_t spec;
0162     } resp;
0163   } body;
0164 } bcm2835_mbox_tag_get_board_spec;
0165 
0166 #if (BSP_IS_RPI2 == 1)
0167 #define BCM2836_MAILBOX_BOARD_V_2_B             0x4
0168 #else
0169 #define BCM2835_MAILBOX_BOARD_V_B_I2C0_2        0x2
0170 #define BCM2835_MAILBOX_BOARD_V_B_I2C0_3        0x3
0171 #define BCM2835_MAILBOX_BOARD_V_B_I2C1_4        0x4
0172 #define BCM2835_MAILBOX_BOARD_V_B_I2C1_5        0x5
0173 #define BCM2835_MAILBOX_BOARD_V_B_I2C1_6        0x6
0174 #define BCM2835_MAILBOX_BOARD_V_A_7             0x7
0175 #define BCM2835_MAILBOX_BOARD_V_A_8             0x8
0176 #define BCM2835_MAILBOX_BOARD_V_A_9             0x9
0177 #define BCM2835_MAILBOX_BOARD_V_B_REV2_d        0xd
0178 #define BCM2835_MAILBOX_BOARD_V_B_REV2_e        0xe
0179 #define BCM2835_MAILBOX_BOARD_V_B_REV2_f        0xf
0180 #define BCM2835_MAILBOX_BOARD_V_B_PLUS          0x10
0181 #define BCM2835_MAILBOX_BOARD_V_CM              0x11
0182 #define BCM2835_MAILBOX_BOARD_V_A_PLUS          0x12
0183 #endif
0184 
0185 #define BCM2835_MAILBOX_TAG_GET_BOARD_MAC       0x00010003
0186 #define BCM2835_MAILBOX_TAG_GET_BOARD_SERIAL    0x00010004
0187 typedef struct {
0188   bcm2835_mbox_tag_hdr tag_hdr;
0189   union {
0190     struct {
0191     } req;
0192     struct {
0193       uint64_t board_serial;
0194     } resp;
0195   } body;
0196 } bcm2835_mbox_tag_get_board_serial;
0197 
0198 #define BCM2835_MAILBOX_TAG_GET_ARM_MEMORY      0x00010005
0199 typedef struct {
0200   bcm2835_mbox_tag_hdr tag_hdr;
0201   union {
0202     struct {
0203     } req;
0204     struct {
0205       uint32_t base;
0206       uint32_t size;
0207     } resp;
0208   } body;
0209 } bcm2835_mbox_tag_get_arm_memory;
0210 
0211 #define BCM2835_MAILBOX_TAG_GET_VC_MEMORY       0x00010006
0212 typedef struct {
0213   bcm2835_mbox_tag_hdr tag_hdr;
0214   union {
0215     struct {
0216     } req;
0217     struct {
0218       uint32_t base;
0219       uint32_t size;
0220     } resp;
0221   } body;
0222 } bcm2835_mbox_tag_get_vc_memory;
0223 
0224 #define BCM2835_MAILBOX_TAG_GET_CLOCKS          0x00010007
0225 typedef struct {
0226   bcm2835_mbox_tag_hdr tag_hdr;
0227   union {
0228     struct {
0229       uint32_t clock_id;
0230     } req;
0231     struct {
0232       uint32_t clock_id;
0233       uint32_t clock_rate;
0234     } resp;
0235   } body;
0236 } bcm2835_mbox_tag_get_clock_rate;
0237 
0238 /* Config */
0239 #define BCM2835_MAILBOX_TAG_GET_CMD_LINE        0x00050001
0240 typedef struct {
0241   bcm2835_mbox_tag_hdr tag_hdr;
0242   union {
0243     struct {
0244     } req;
0245     struct {
0246       uint8_t cmdline[ 1024 ];
0247     } resp;
0248   } body;
0249 } bcm2835_mbox_tag_get_cmd_line;
0250 
0251 /* Shared resource management */
0252 #define BCM2835_MAILBOX_TAG_GET_DMA_CHANNELS    0x00060001
0253 
0254 /* Power */
0255 #define BCM2835_MAILBOX_POWER_UDID_SD_Card           0x00000000
0256 #define BCM2835_MAILBOX_POWER_UDID_UART0             0x00000001
0257 #define BCM2835_MAILBOX_POWER_UDID_UART1             0x00000002
0258 #define BCM2835_MAILBOX_POWER_UDID_USB_HCD           0x00000003
0259 #define BCM2835_MAILBOX_POWER_UDID_I2C0              0x00000004
0260 #define BCM2835_MAILBOX_POWER_UDID_I2C1              0x00000005
0261 #define BCM2835_MAILBOX_POWER_UDID_I2C2              0x00000006
0262 #define BCM2835_MAILBOX_POWER_UDID_SPI               0x00000007
0263 #define BCM2835_MAILBOX_POWER_UDID_CCP2TX            0x00000008
0264 
0265 #define BCM2835_MAILBOX_TAG_GET_POWER_STATE     0x00020001
0266 typedef struct {
0267   bcm2835_mbox_tag_hdr tag_hdr;
0268   union {
0269     struct {
0270       uint32_t dev_id;
0271     } req;
0272     struct {
0273       uint32_t dev_id;
0274       uint32_t state;
0275     } resp;
0276   } body;
0277 } bcm2835_mbox_tag_get_power_state;
0278 
0279 #define BCM2835_MAILBOX_POWER_STATE_RESP_ON       (1 << 0)
0280 #define BCM2835_MAILBOX_POWER_STATE_RESP_NODEV    (1 << 1)
0281 
0282 #define BCM2835_MAILBOX_TAG_GET_TIMING          0x00020002
0283 #define BCM2835_MAILBOX_TAG_SET_POWER_STATE     0x00028001
0284 typedef struct {
0285   bcm2835_mbox_tag_hdr tag_hdr;
0286   union {
0287     struct {
0288       uint32_t dev_id;
0289       uint32_t state;
0290     } req;
0291     struct {
0292       uint32_t dev_id;
0293       uint32_t state;
0294     } resp;
0295   } body;
0296 } bcm2835_mbox_tag_power_state;
0297 
0298 #ifndef BCM2835_MAILBOX_SET_POWER_STATE_REQ_ON
0299 /* Value is defined as a part of public VideoCore API */
0300 #define BCM2835_MAILBOX_SET_POWER_STATE_REQ_ON    (1 << 0)
0301 #define BCM2835_MAILBOX_SET_POWER_STATE_REQ_WAIT  (1 << 1)
0302 #endif
0303 
0304 /* Clocks */
0305 #define BCM2835_MAILBOX_UCID_CLOCK_RESERVED          0x000000000
0306 #define BCM2835_MAILBOX_UCID_CLOCK_EMMC              0x000000001
0307 #define BCM2835_MAILBOX_UCID_CLOCK_UART              0x000000002
0308 #define BCM2835_MAILBOX_UCID_CLOCK_ARM               0x000000003
0309 #define BCM2835_MAILBOX_UCID_CLOCK_CORE              0x000000004
0310 #define BCM2835_MAILBOX_UCID_CLOCK_V3D               0x000000005
0311 #define BCM2835_MAILBOX_UCID_CLOCK_H264              0x000000006
0312 #define BCM2835_MAILBOX_UCID_CLOCK_ISP               0x000000007
0313 #define BCM2835_MAILBOX_UCID_CLOCK_SDRAM             0x000000008
0314 #define BCM2835_MAILBOX_UCID_CLOCK_PIXEL             0x000000009
0315 #define BCM2835_MAILBOX_UCID_CLOCK_PWM               0x00000000a
0316 
0317 #define BCM2835_MAILBOX_TAG_GET_CLOCK_STATE     0x00030001
0318 #define BCM2835_MAILBOX_TAG_SET_CLOCK_STATE     0x00038001
0319 #define BCM2835_MAILBOX_TAG_GET_CLOCK_RATE      0x00030002
0320 #define BCM2835_MAILBOX_TAG_SET_CLOCK_RATE      0x00038002
0321 #define BCM2835_MAILBOX_TAG_GET_MAX_CLOCK_RATE  0x00030004
0322 #define BCM2835_MAILBOX_TAG_GET_MIN_CLOCK_RATE  0x00030007
0323 #define BCM2835_MAILBOX_TAG_GET_TRUBO           0x00030009
0324 #define BCM2835_MAILBOX_TAG_SET_TURBO           0x00038009
0325 
0326 #define BCM2835_MAILBOX_TAG_GET_DOMAIN_STATE    0x00030030
0327 #define BCM2835_MAILBOX_TAG_SET_DOMAIN_STATE    0x00038030
0328 
0329 /* Voltage */
0330 #define BCM2835_MAILBOX_VOLTAGE_RESERVED_UVID        0x000000000
0331 #define BCM2835_MAILBOX_VOLTAGE_CORE_UVID            0x000000001
0332 #define BCM2835_MAILBOX_VOLTAGE_SDRAM_C_UVID         0x000000002
0333 #define BCM2835_MAILBOX_VOLTAGE_SDRAM_P_UVID         0x000000003
0334 #define BCM2835_MAILBOX_VOLTAGE_SDRAM_I_UVID         0x000000004
0335 
0336 #define BCM2835_MAILBOX_TAG_GET_VOLTAGE         0x00030003
0337 #define BCM2835_MAILBOX_TAG_SET_VOLTAGE         0x00038003
0338 #define BCM2835_MAILBOX_TAG_GET_MAX_VOLTAGE     0x00030005
0339 #define BCM2835_MAILBOX_TAG_GET_MIN_VOLTAGE     0x00030008
0340 #define BCM2835_MAILBOX_TAG_GET_TEMPERATURE     0x00030006
0341 #define BCM2835_MAILBOX_TAG_GET_MAX_TEMPERATURE 0x0003000a
0342 
0343 /* Memory */
0344 #define BCM2835_MAILBOX_TAG_ALLOCATE_MEMORY     0x0003000c
0345 #define BCM2835_MAILBOX_TAG_LOCK_MEMORY         0x0003000d
0346 #define BCM2835_MAILBOX_TAG_UNLOCK_MEMORY       0x0003000e
0347 #define BCM2835_MAILBOX_TAG_RELEASE_MEMORY      0x0003000f
0348 #define BCM2835_MAILBOX_TAG_EXECUTE_CODE        0x00030010
0349 #define BCM2835_MAILBOX_TAG_GET_DISPMANX_RESOURCE_MEM_HANDLE     0x00030014
0350 
0351 #define BCM2835_MAILBOX_TAG_GET_EDID_BLOCK      0x00030020
0352 
0353 /* Framebuffer */
0354 #define BCM2835_MAILBOX_TAG_ALLOCATE_BUFFER     0x00040001
0355 typedef struct {
0356   bcm2835_mbox_tag_hdr tag_hdr;
0357   union {
0358     struct {
0359       uint32_t align;
0360     } req;
0361     struct {
0362       uint32_t base;
0363       uint32_t size;
0364     } resp;
0365   } body;
0366 } bcm2835_mbox_tag_allocate_buffer;
0367 
0368 #define BCM2835_MAILBOX_TAG_RELEASE_BUFFER      0x00048001
0369 
0370 #define BCM2835_MAILBOX_TAG_BLANK_SCREEN        0x00040002
0371 
0372 #define BCM2835_MAILBOX_TAG_GET_DISPLAY_SIZE          0x00040003
0373 #define BCM2835_MAILBOX_TAG_TEST_DISPLAY_SIZE         0x00044003
0374 #define BCM2835_MAILBOX_TAG_SET_DISPLAY_SIZE          0x00048003
0375 typedef struct {
0376   bcm2835_mbox_tag_hdr tag_hdr;
0377   union {
0378     struct {
0379       uint32_t width;
0380       uint32_t height;
0381     } req;
0382     struct {
0383       uint32_t width;
0384       uint32_t height;
0385     } resp;
0386   } body;
0387 } bcm2835_mbox_tag_display_size;
0388 
0389 #define BCM2835_MAILBOX_TAG_GET_VIRTUAL_SIZE     0x00040004
0390 #define BCM2835_MAILBOX_TAG_TEST_VIRTUAL_SIZE    0x00044004
0391 #define BCM2835_MAILBOX_TAG_SET_VIRTUAL_SIZE     0x00048004
0392 typedef struct {
0393   bcm2835_mbox_tag_hdr tag_hdr;
0394   union {
0395     struct {
0396       uint32_t vwidth;
0397       uint32_t vheight;
0398     } req;
0399     struct {
0400       uint32_t vwidth;
0401       uint32_t vheight;
0402     } resp;
0403   } body;
0404 } bcm2835_mbox_tag_virtual_size;
0405 
0406 #define BCM2835_MAILBOX_TAG_GET_DEPTH           0x00040005
0407 #define BCM2835_MAILBOX_TAG_TEST_DEPTH          0x00044005
0408 #define BCM2835_MAILBOX_TAG_SET_DEPTH           0x00048005
0409 typedef struct {
0410   bcm2835_mbox_tag_hdr tag_hdr;
0411   union {
0412     struct {
0413       uint32_t depth;
0414     } req;
0415     struct {
0416       uint32_t depth;
0417     } resp;
0418   } body;
0419 } bcm2835_mbox_tag_depth;
0420 
0421 #define BCM2835_MAILBOX_TAG_GET_PIXEL_ORDER     0x00040006
0422 #define BCM2835_MAILBOX_TAG_TEST_PIXEL_ORDER    0x00044006
0423 #define BCM2835_MAILBOX_TAG_SET_PIXEL_ORDER     0x00048006
0424 
0425 #define BCM2835_MAILBOX_PIXEL_ORDER_BGR    0
0426 #define BCM2835_MAILBOX_PIXEL_ORDER_RGB    1
0427 typedef struct {
0428   bcm2835_mbox_tag_hdr tag_hdr;
0429   union {
0430     struct {
0431       uint32_t pixel_order;
0432     } req;
0433     struct {
0434       uint32_t pixel_order;
0435     } resp;
0436   } body;
0437 } bcm2835_mbox_tag_pixel_order;
0438 
0439 #define BCM2835_MAILBOX_TAG_GET_ALPHA_MODE      0x00040007
0440 #define BCM2835_MAILBOX_TAG_TEST_ALPHA_MODE     0x00044007
0441 #define BCM2835_MAILBOX_TAG_SET_ALPHA_MODE      0x00048007
0442 typedef struct {
0443   bcm2835_mbox_tag_hdr tag_hdr;
0444   union {
0445     struct {
0446       uint32_t alpha_mode;
0447     } req;
0448     struct {
0449       uint32_t alpha_mode;
0450     } resp;
0451   } body;
0452 } bcm2835_mbox_tag_alpha_mode;
0453 
0454 #define BCM2835_MAILBOX_ALPHA_MODE_0_OPAQUE  0
0455 #define BCM2835_MAILBOX_ALPHA_MODE_0_TRANSPARENT 1
0456 #define BCM2835_MAILBOX_ALPHA_MODE_IGNORED   2
0457 
0458 #define BCM2835_MAILBOX_TAG_GET_PITCH           0x00040008
0459 typedef struct {
0460   bcm2835_mbox_tag_hdr tag_hdr;
0461   union {
0462     struct {
0463     } req;
0464     struct {
0465       uint32_t pitch;
0466     } resp;
0467   } body;
0468 } bcm2835_mbox_tag_get_pitch;
0469 
0470 #define BCM2835_MAILBOX_TAG_GET_VIRTUAL_OFFSET  0x00040009
0471 #define BCM2835_MAILBOX_TAG_TEST_VIRTUAL_OFFSET 0x00044009
0472 #define BCM2835_MAILBOX_TAG_SET_VIRTUAL_OFFSET  0x00048009
0473 typedef struct {
0474   bcm2835_mbox_tag_hdr tag_hdr;
0475   union {
0476     struct {
0477       uint32_t voffset_x;
0478       uint32_t voffset_y;
0479     } req;
0480     struct {
0481       uint32_t voffset_x;
0482       uint32_t voffset_y;
0483     } resp;
0484   } body;
0485 } bcm2835_mbox_tag_virtual_offset;
0486 
0487 #define BCM2835_MAILBOX_TAG_GET_OVERSCAN        0x0004000a
0488 #define BCM2835_MAILBOX_TAG_TEST_OVERSCAN       0x0004400a
0489 #define BCM2835_MAILBOX_TAG_SET_OVERSCAN        0x0004800a
0490 typedef struct {
0491   bcm2835_mbox_tag_hdr tag_hdr;
0492   union {
0493     struct {
0494       uint32_t overscan_top;
0495       uint32_t overscan_bottom;
0496       uint32_t overscan_left;
0497       uint32_t overscan_right;
0498     } req;
0499     struct {
0500       uint32_t overscan_top;
0501       uint32_t overscan_bottom;
0502       uint32_t overscan_left;
0503       uint32_t overscan_right;
0504     } resp;
0505   } body;
0506 } bcm2835_mbox_tag_overscan;
0507 
0508 #define BCM2835_MAILBOX_TAG_GET_PALETTE         0x0004000b
0509 #define BCM2835_MAILBOX_TAG_TEST_PALETTE        0x0004400b
0510 #define BCM2835_MAILBOX_TAG_SET_PALETTE         0x0004800b
0511 #define BCM2835_MAILBOX_TAG_SET_CURSOR_INFO     0x00008011
0512 #define BCM2835_MAILBOX_TAG_SET_CURSOR_STATE    0x00008010
0513 
0514 /** @} */
0515 
0516 /** @} */
0517 
0518 #endif /* LIBBSP_ARM_RASPBERRYPI_VC_DEFINES_H */