summaryrefslogtreecommitdiff
path: root/bsp/raspberry-pi/dm/include/firmware-raspberrypi.h
blob: ab949ae1aa5de4a2f215629020b7cb8b6ad165ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
 * Copyright (c) 2006-2022, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-08-24     GuEe-GUI     first version
 */

#ifndef __RASPBERRYPI_FIRMWARE_H__
#define __RASPBERRYPI_FIRMWARE_H__

#include <rtdevice.h>

struct rpi_firmware;

enum rpi_firmware_property_status
{
    RPI_FIRMWARE_STATUS_REQUEST = 0,
    RPI_FIRMWARE_STATUS_SUCCESS = 0x80000000,
    RPI_FIRMWARE_STATUS_ERROR   = 0x80000001,
};

struct rpi_firmware_property_tag_header
{
    rt_uint32_t tag;
    rt_uint32_t buf_size;
    rt_uint32_t req_resp_size;  /* always 4 byte aligned */
};

enum rpi_firmware_property_tag
{
    RPI_FIRMWARE_PROPERTY_END =                           0,
    RPI_FIRMWARE_GET_FIRMWARE_REVISION =                  0x00000001,
    RPI_FIRMWARE_GET_FIRMWARE_VARIANT =                   0x00000002,
    RPI_FIRMWARE_GET_FIRMWARE_HASH =                      0x00000003,

    RPI_FIRMWARE_SET_CURSOR_INFO =                        0x00008010,
    RPI_FIRMWARE_SET_CURSOR_STATE =                       0x00008011,

    RPI_FIRMWARE_GET_BOARD_MODEL =                        0x00010001,
    RPI_FIRMWARE_GET_BOARD_REVISION =                     0x00010002,
    RPI_FIRMWARE_GET_BOARD_MAC_ADDRESS =                  0x00010003,
    RPI_FIRMWARE_GET_BOARD_SERIAL =                       0x00010004,
    RPI_FIRMWARE_GET_ARM_MEMORY =                         0x00010005,
    RPI_FIRMWARE_GET_VC_MEMORY =                          0x00010006,
    RPI_FIRMWARE_GET_CLOCKS =                             0x00010007,
    RPI_FIRMWARE_GET_POWER_STATE =                        0x00020001,
    RPI_FIRMWARE_GET_TIMING =                             0x00020002,
    RPI_FIRMWARE_SET_POWER_STATE =                        0x00028001,
    RPI_FIRMWARE_GET_CLOCK_STATE =                        0x00030001,
    RPI_FIRMWARE_GET_CLOCK_RATE =                         0x00030002,
    RPI_FIRMWARE_GET_VOLTAGE =                            0x00030003,
    RPI_FIRMWARE_GET_MAX_CLOCK_RATE =                     0x00030004,
    RPI_FIRMWARE_GET_MAX_VOLTAGE =                        0x00030005,
    RPI_FIRMWARE_GET_TEMPERATURE =                        0x00030006,
    RPI_FIRMWARE_GET_MIN_CLOCK_RATE =                     0x00030007,
    RPI_FIRMWARE_GET_MIN_VOLTAGE =                        0x00030008,
    RPI_FIRMWARE_GET_TURBO =                              0x00030009,
    RPI_FIRMWARE_GET_MAX_TEMPERATURE =                    0x0003000a,
    RPI_FIRMWARE_GET_STC =                                0x0003000b,
    RPI_FIRMWARE_ALLOCATE_MEMORY =                        0x0003000c,
    RPI_FIRMWARE_LOCK_MEMORY =                            0x0003000d,
    RPI_FIRMWARE_UNLOCK_MEMORY =                          0x0003000e,
    RPI_FIRMWARE_RELEASE_MEMORY =                         0x0003000f,
    RPI_FIRMWARE_EXECUTE_CODE =                           0x00030010,
    RPI_FIRMWARE_EXECUTE_QPU =                            0x00030011,
    RPI_FIRMWARE_SET_ENABLE_QPU =                         0x00030012,
    RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE =       0x00030014,
    RPI_FIRMWARE_GET_EDID_BLOCK =                         0x00030020,
    RPI_FIRMWARE_GET_CUSTOMER_OTP =                       0x00030021,
    RPI_FIRMWARE_GET_EDID_BLOCK_DISPLAY =                 0x00030023,
    RPI_FIRMWARE_GET_USER_OTP =                           0x00030024,
    RPI_FIRMWARE_GET_DOMAIN_STATE =                       0x00030030,
    RPI_FIRMWARE_GET_THROTTLED =                          0x00030046,
    RPI_FIRMWARE_GET_CLOCK_MEASURED =                     0x00030047,
    RPI_FIRMWARE_NOTIFY_REBOOT =                          0x00030048,
    RPI_FIRMWARE_SET_CLOCK_STATE =                        0x00038001,
    RPI_FIRMWARE_SET_CLOCK_RATE =                         0x00038002,
    RPI_FIRMWARE_SET_VOLTAGE =                            0x00038003,
    RPI_FIRMWARE_SET_TURBO =                              0x00038009,
    RPI_FIRMWARE_SET_CUSTOMER_OTP =                       0x00038021,
    RPI_FIRMWARE_SET_USER_OTP =                           0x00038024,
    RPI_FIRMWARE_SET_DOMAIN_STATE =                       0x00038030,
    RPI_FIRMWARE_GET_GPIO_STATE =                         0x00030041,
    RPI_FIRMWARE_SET_GPIO_STATE =                         0x00038041,
    RPI_FIRMWARE_SET_SDHOST_CLOCK =                       0x00038042,
    RPI_FIRMWARE_GET_GPIO_CONFIG =                        0x00030043,
    RPI_FIRMWARE_SET_GPIO_CONFIG =                        0x00038043,
    RPI_FIRMWARE_GET_PERIPH_REG =                         0x00030045,
    RPI_FIRMWARE_SET_PERIPH_REG =                         0x00038045,
    RPI_FIRMWARE_GET_POE_HAT_VAL =                        0x00030049,
    RPI_FIRMWARE_SET_POE_HAT_VAL =                        0x00038049,
    RPI_FIRMWARE_SET_POE_HAT_VAL_OLD =                    0x00030050,
    RPI_FIRMWARE_NOTIFY_XHCI_RESET =                      0x00030058,
    RPI_FIRMWARE_GET_REBOOT_FLAGS =                       0x00030064,
    RPI_FIRMWARE_SET_REBOOT_FLAGS =                       0x00038064,
    RPI_FIRMWARE_NOTIFY_DISPLAY_DONE =                    0x00030066,
    RPI_FIRMWARE_GET_BUTTONS_PRESSED =                    0x00030088,
    RPI_FIRMWARE_GET_RTC_REG =                            0x00030087,
    RPI_FIRMWARE_SET_RTC_REG =                            0x00038087,

    /* Dispmanx TAGS */
    RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE =                   0x00040001,
    RPI_FIRMWARE_FRAMEBUFFER_BLANK =                      0x00040002,
    RPI_FIRMWARE_FRAMEBUFFER_GET_PHYSICAL_WIDTH_HEIGHT =  0x00040003,
    RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_WIDTH_HEIGHT =   0x00040004,
    RPI_FIRMWARE_FRAMEBUFFER_GET_DEPTH =                  0x00040005,
    RPI_FIRMWARE_FRAMEBUFFER_GET_PIXEL_ORDER =            0x00040006,
    RPI_FIRMWARE_FRAMEBUFFER_GET_ALPHA_MODE =             0x00040007,
    RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH =                  0x00040008,
    RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET =         0x00040009,
    RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN =               0x0004000a,
    RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE =                0x0004000b,
    RPI_FIRMWARE_FRAMEBUFFER_GET_LAYER =                  0x0004000c,
    RPI_FIRMWARE_FRAMEBUFFER_GET_TRANSFORM =              0x0004000d,
    RPI_FIRMWARE_FRAMEBUFFER_GET_VSYNC =                  0x0004000e,
    RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF =               0x0004000f,
    RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF =            0x00040010,
    RPI_FIRMWARE_FRAMEBUFFER_RELEASE =                    0x00048001,
    RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_ID =             0x00040016,
    RPI_FIRMWARE_FRAMEBUFFER_SET_DISPLAY_NUM =            0x00048013,
    RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS =           0x00040013,
    RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_SETTINGS =       0x00040014,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT =  0x00044004,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH =                 0x00044005,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_PIXEL_ORDER =           0x00044006,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_ALPHA_MODE =            0x00044007,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET =        0x00044009,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN =              0x0004400a,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE =               0x0004400b,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_LAYER =                 0x0004400c,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_TRANSFORM =             0x0004400d,
    RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC =                 0x0004400e,
    RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT =  0x00048003,
    RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT =   0x00048004,
    RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH =                  0x00048005,
    RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER =            0x00048006,
    RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE =             0x00048007,
    RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH =                  0x00048008,
    RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET =         0x00048009,
    RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN =               0x0004800a,
    RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE =                0x0004800b,

    RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
    RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
    RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC =                  0x0004800e,
    RPI_FIRMWARE_FRAMEBUFFER_SET_LAYER =                  0x0004800c,
    RPI_FIRMWARE_FRAMEBUFFER_SET_TRANSFORM =              0x0004800d,
    RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT =              0x0004800f,

    RPI_FIRMWARE_VCHIQ_INIT =                             0x00048010,

    RPI_FIRMWARE_SET_PLANE =                              0x00048015,
    RPI_FIRMWARE_GET_DISPLAY_TIMING =                     0x00040017,
    RPI_FIRMWARE_SET_TIMING =                             0x00048017,
    RPI_FIRMWARE_GET_DISPLAY_CFG =                        0x00040018,
    RPI_FIRMWARE_SET_DISPLAY_POWER =                      0x00048019,
    RPI_FIRMWARE_GET_COMMAND_LINE =                       0x00050001,
    RPI_FIRMWARE_GET_DMA_CHANNELS =                       0x00060001,
};

enum rpi_firmware_clk_id
{
    RPI_FIRMWARE_EMMC_CLK_ID = 1,
    RPI_FIRMWARE_UART_CLK_ID,
    RPI_FIRMWARE_ARM_CLK_ID,
    RPI_FIRMWARE_CORE_CLK_ID,
    RPI_FIRMWARE_V3D_CLK_ID,
    RPI_FIRMWARE_H264_CLK_ID,
    RPI_FIRMWARE_ISP_CLK_ID,
    RPI_FIRMWARE_SDRAM_CLK_ID,
    RPI_FIRMWARE_PIXEL_CLK_ID,
    RPI_FIRMWARE_PWM_CLK_ID,
    RPI_FIRMWARE_HEVC_CLK_ID,
    RPI_FIRMWARE_EMMC2_CLK_ID,
    RPI_FIRMWARE_M2MC_CLK_ID,
    RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
    RPI_FIRMWARE_VEC_CLK_ID,
    RPI_FIRMWARE_DISP_CLK_ID,
    RPI_FIRMWARE_NUM_CLK_ID,
};

#define GET_DISPLAY_SETTINGS_PAYLOAD_SIZE 64

rt_packed(struct rpi_firmware_clk_rate_request
{
    rt_le32_t id;   /* ID of the clock being queried */
    rt_le32_t rate; /* Rate in Hertz. Set by the firmware */
});

#define RPI_FIRMWARE_CLK_RATE_REQUEST(ID)   \
{                                           \
    .id = ID,                               \
}

void *rpi_firmware_property_raw_alloc(struct rpi_firmware *rpi_fw,
        rt_size_t max_header_tag_size, rt_ubase_t *out_bus_addr);
void rpi_firmware_property_raw_free(struct rpi_firmware *rpi_fw,
        rt_size_t max_header_tag_size, void *buf, rt_ubase_t bus_addr);

rt_err_t rpi_firmware_property(struct rpi_firmware *rpi_fw,
        rt_uint32_t tag, void *tag_data, rt_size_t buf_size);
rt_err_t rpi_firmware_property_raw(struct rpi_firmware *rpi_fw, rt_uint32_t tag,
        rt_ubase_t bus_addr, struct rpi_firmware_property_tag_header *header, rt_size_t req_size);
rt_err_t rpi_firmware_property_list(struct rpi_firmware *rpi_fw,
        void *data, rt_size_t tag_size);
rt_err_t rpi_firmware_property_list_raw(struct rpi_firmware *rpi_fw,
        rt_ubase_t bus_addr, void *data, rt_size_t tag_size);

rt_uint32_t rpi_firmware_clk_get_max_rate(struct rpi_firmware *rpi_fw, rt_uint32_t id);

struct rt_ofw_node *rpi_firmware_find_node(void);
struct rpi_firmware *rpi_firmware_get(struct rt_ofw_node *fw_np);
void rpi_firmware_put(struct rpi_firmware *rpi_fw);

#endif /* __RASPBERRYPI_FIRMWARE_H__ */