1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2020 Andrew Turner 5 * 6 * This work was supported by Innovate UK project 105694, "Digital Security 7 * by Design (DSbD) Technology Platform Prototype". 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 31 #ifndef _BCM2835_FIRMWARE_H_ 32 #define _BCM2835_FIRMWARE_H_ 33 34 #define BCM2835_FIRMWARE_TAG_GET_CLOCK_RATE 0x00030002 35 #define BCM2835_FIRMWARE_TAG_SET_CLOCK_RATE 0x00038002 36 #define BCM2835_FIRMWARE_TAG_GET_MAX_CLOCK_RATE 0x00030004 37 #define BCM2835_FIRMWARE_TAG_GET_MIN_CLOCK_RATE 0x00030007 38 39 #define BCM2835_FIRMWARE_CLOCK_ID_EMMC 0x00000001 40 #define BCM2835_FIRMWARE_CLOCK_ID_UART 0x00000002 41 #define BCM2835_FIRMWARE_CLOCK_ID_ARM 0x00000003 42 #define BCM2835_FIRMWARE_CLOCK_ID_CORE 0x00000004 43 #define BCM2835_FIRMWARE_CLOCK_ID_V3D 0x00000005 44 #define BCM2835_FIRMWARE_CLOCK_ID_H264 0x00000006 45 #define BCM2835_FIRMWARE_CLOCK_ID_ISP 0x00000007 46 #define BCM2835_FIRMWARE_CLOCK_ID_SDRAM 0x00000008 47 #define BCM2835_FIRMWARE_CLOCK_ID_PIXEL 0x00000009 48 #define BCM2835_FIRMWARE_CLOCK_ID_PWM 0x0000000a 49 #define BCM2838_FIRMWARE_CLOCK_ID_EMMC2 0x0000000c 50 51 union msg_get_clock_rate_body { 52 struct { 53 uint32_t clock_id; 54 } req; 55 struct { 56 uint32_t clock_id; 57 uint32_t rate_hz; 58 } resp; 59 }; 60 61 union msg_set_clock_rate_body { 62 struct { 63 uint32_t clock_id; 64 uint32_t rate_hz; 65 } req; 66 struct { 67 uint32_t clock_id; 68 uint32_t rate_hz; 69 } resp; 70 }; 71 72 #define BCM2835_FIRMWARE_TAG_GET_VOLTAGE 0x00030003 73 #define BCM2835_FIRMWARE_TAG_SET_VOLTAGE 0x00038003 74 #define BCM2835_FIRMWARE_TAG_GET_MAX_VOLTAGE 0x00030005 75 #define BCM2835_FIRMWARE_TAG_GET_MIN_VOLTAGE 0x00030008 76 77 #define BCM2835_FIRMWARE_VOLTAGE_ID_CORE 0x00000001 78 #define BCM2835_FIRMWARE_VOLTAGE_ID_SDRAM_C 0x00000002 79 #define BCM2835_FIRMWARE_VOLTAGE_ID_SDRAM_P 0x00000003 80 #define BCM2835_FIRMWARE_VOLTAGE_ID_SDRAM_I 0x00000004 81 82 union msg_get_voltage_body { 83 struct { 84 uint32_t voltage_id; 85 } req; 86 struct { 87 uint32_t voltage_id; 88 uint32_t value; 89 } resp; 90 }; 91 92 union msg_set_voltage_body { 93 struct { 94 uint32_t voltage_id; 95 uint32_t value; 96 } req; 97 struct { 98 uint32_t voltage_id; 99 uint32_t value; 100 } resp; 101 }; 102 103 #define BCM2835_FIRMWARE_TAG_GET_TEMPERATURE 0x00030006 104 #define BCM2835_FIRMWARE_TAG_GET_MAX_TEMPERATURE 0x0003000a 105 106 union msg_get_temperature_body { 107 struct { 108 uint32_t temperature_id; 109 } req; 110 struct { 111 uint32_t temperature_id; 112 uint32_t value; 113 } resp; 114 }; 115 116 #define BCM2835_FIRMWARE_TAG_GET_TURBO 0x00030009 117 #define BCM2835_FIRMWARE_TAG_SET_TURBO 0x00038009 118 119 #define BCM2835_FIRMWARE_TURBO_ON 1 120 #define BCM2835_FIRMWARE_TURBO_OFF 0 121 122 union msg_get_turbo_body { 123 struct { 124 uint32_t id; 125 } req; 126 struct { 127 uint32_t id; 128 uint32_t level; 129 } resp; 130 }; 131 132 union msg_set_turbo_body { 133 struct { 134 uint32_t id; 135 uint32_t level; 136 } req; 137 struct { 138 uint32_t id; 139 uint32_t level; 140 } resp; 141 }; 142 143 #define BCM2835_FIRMWARE_TAG_GET_GPIO_STATE 0x00030041 144 #define BCM2835_FIRMWARE_TAG_SET_GPIO_STATE 0x00038041 145 #define BCM2835_FIRMWARE_TAG_GET_GPIO_CONFIG 0x00030043 146 #define BCM2835_FIRMWARE_TAG_SET_GPIO_CONFIG 0x00038043 147 148 #define BCM2835_FIRMWARE_GPIO_IN 0 149 #define BCM2835_FIRMWARE_GPIO_OUT 1 150 151 union msg_get_gpio_state { 152 struct { 153 uint32_t gpio; 154 } req; 155 struct { 156 uint32_t gpio; 157 uint32_t state; 158 } resp; 159 }; 160 161 union msg_set_gpio_state { 162 struct { 163 uint32_t gpio; 164 uint32_t state; 165 } req; 166 struct { 167 uint32_t gpio; 168 } resp; 169 }; 170 171 union msg_get_gpio_config { 172 struct { 173 uint32_t gpio; 174 } req; 175 struct { 176 uint32_t gpio; 177 uint32_t dir; 178 uint32_t pol; 179 uint32_t term_en; 180 uint32_t term_pull_up; 181 } resp; 182 }; 183 184 union msg_set_gpio_config { 185 struct { 186 uint32_t gpio; 187 uint32_t dir; 188 uint32_t pol; 189 uint32_t term_en; 190 uint32_t term_pull_up; 191 uint32_t state; 192 } req; 193 struct { 194 uint32_t gpio; 195 } resp; 196 }; 197 198 int bcm2835_firmware_property(device_t, uint32_t, void *, size_t); 199 200 #endif 201