1 /* 2 * Access various peripherals on a board. 3 * 4 * Copyright (C) 2023 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA 20 */ 21 22 #pragma once 23 24 #include <l4/re/c/dma_space.h> 25 #include <l4/sys/types.h> 26 #include <l4/devices/clocks.h> 27 #include <l4/devices/gpio.h> 28 #include <stdint.h> 29 30 31 32 /* AIC adapter functions. */ 33 34 void *aic_init(l4_addr_t aic_start, l4_addr_t start, l4_addr_t end, void *cpm); 35 36 void *aic_get_channel(void *aic, int num, void *channel); 37 38 long aic_get_buffer(void *channel, uint32_t count, l4_addr_t *addr); 39 40 unsigned int aic_transfer(void *channel, uint32_t count, uint32_t sample_rate, 41 uint8_t sample_size); 42 43 44 45 /* CPM adapter functions. */ 46 47 void *cpm_init(l4_addr_t cpm_base); 48 49 const char *cpm_clock_type(void *cpm, enum Clock_identifiers clock); 50 51 int cpm_have_clock(void *cpm, enum Clock_identifiers clock); 52 53 void cpm_start_clock(void *cpm, enum Clock_identifiers clock); 54 55 void cpm_stop_clock(void *cpm, enum Clock_identifiers clock); 56 57 int cpm_get_parameters(void *cpm, enum Clock_identifiers clock, 58 uint32_t parameters[]); 59 60 int cpm_set_parameters(void *cpm, enum Clock_identifiers clock, 61 int num_parameters, uint32_t parameters[]); 62 63 uint8_t cpm_get_source(void *cpm, enum Clock_identifiers clock); 64 65 void cpm_set_source(void *cpm, enum Clock_identifiers clock, uint8_t source); 66 67 enum Clock_identifiers cpm_get_source_clock(void *cpm, enum Clock_identifiers clock); 68 69 void cpm_set_source_clock(void *cpm, enum Clock_identifiers clock, 70 enum Clock_identifiers source); 71 72 uint64_t cpm_get_source_frequency(void *cpm, enum Clock_identifiers clock); 73 74 uint64_t cpm_get_frequency(void *cpm, enum Clock_identifiers clock); 75 76 int cpm_set_frequency(void *cpm, enum Clock_identifiers clock, uint64_t frequency); 77 78 79 80 /* DMA adapter functions. */ 81 82 void *dma_init(l4_addr_t start, l4_addr_t end, void *cpm); 83 84 void dma_disable(void *dma_chip); 85 86 void dma_enable(void *dma_chip); 87 88 void *dma_get_channel(void *dma, uint8_t channel, l4_cap_idx_t irq); 89 90 unsigned int dma_transfer(void *dma_channel, 91 uint32_t source, uint32_t destination, 92 unsigned int count, 93 int source_increment, int destination_increment, 94 uint8_t source_width, uint8_t destination_width, 95 uint8_t transfer_unit_size, 96 int type); 97 98 unsigned int dma_wait(void *dma_channel); 99 100 101 102 /* GPIO adapter functions. */ 103 104 void *gpio_init(l4_addr_t start, l4_addr_t end, unsigned pins, 105 l4_uint32_t pull_ups, l4_uint32_t pull_downs); 106 107 void gpio_setup(void *gpio, unsigned pin, unsigned mode, int value); 108 109 void gpio_config_pull(void *gpio, unsigned pin, unsigned mode); 110 111 void gpio_config_pad(void *gpio, unsigned pin, unsigned func, unsigned value); 112 113 void gpio_config_get(void *gpio, unsigned pin, unsigned reg, unsigned *value); 114 115 void gpio_config_pad_get(void *gpio, unsigned pin, unsigned *func, unsigned *value); 116 117 void gpio_multi_setup(void *gpio, Pin_slice const *mask, unsigned mode, unsigned outvalues); 118 119 void gpio_multi_config_pad(void *gpio, Pin_slice const *mask, unsigned func, unsigned value); 120 121 void gpio_multi_set(void *gpio, Pin_slice const *mask, unsigned data); 122 123 unsigned gpio_multi_get(void *gpio, unsigned offset); 124 125 int gpio_get(void *gpio, unsigned pin); 126 127 void gpio_set(void *gpio, unsigned pin, int value); 128 129 void *gpio_get_irq(void *gpio, unsigned pin); 130 131 bool gpio_irq_set_mode(void *gpio_irq, unsigned mode); 132 133 134 135 /* I2C adapter functions. */ 136 137 void *i2c_init(l4_addr_t start, l4_addr_t end, void *cpm, uint32_t frequency); 138 139 void *i2c_get_channel(void *i2c, uint8_t channel); 140 141 uint32_t i2c_get_frequency(void *i2c_channel); 142 143 void i2c_set_target(void *i2c_channel, uint8_t addr); 144 145 void i2c_start_read(void *i2c_channel, uint8_t buf[], unsigned int total, 146 int stop); 147 148 void i2c_read(void *i2c_channel); 149 150 void i2c_start_write(void *i2c_channel, uint8_t buf[], unsigned int total, 151 int stop); 152 153 void i2c_write(void *i2c_channel); 154 155 int i2c_read_done(void *i2c_channel); 156 157 int i2c_write_done(void *i2c_channel); 158 159 unsigned int i2c_have_read(void *i2c_channel); 160 161 unsigned int i2c_have_written(void *i2c_channel); 162 163 int i2c_failed(void *i2c_channel); 164 165 void i2c_stop(void *i2c_channel); 166 167 168 169 /* SPI adapter functions. */ 170 171 void *spi_get_channel(void *clock_chip, int clock_pin, 172 void *data_chip, int data_pin, 173 void *enable_chip, int enable_pin, 174 uint32_t frequency); 175 176 void spi_send(void *channel, int bytes, const uint8_t data[]); 177 178 179 180 /* Memory regions. */ 181 182 enum memory_regions 183 { 184 AIC, CPM, DMA, GPIO, I2C 185 }; 186 187 188 189 /* CPM definitions. */ 190 191 struct clock_info 192 { 193 const char *id; 194 enum Clock_identifiers clock; 195 const char *name; 196 }; 197 198 199 200 /* DMA definitions. */ 201 202 struct dma_region 203 { 204 unsigned int size; 205 unsigned int align; 206 l4_addr_t vaddr; 207 l4re_dma_space_dma_addr_t paddr; 208 l4_cap_idx_t mem; 209 }; 210 211 212 213 /* GPIO definitions. */ 214 215 struct gpio_port 216 { 217 const uint32_t pull_ups, pull_downs; 218 };