/ src / piolib / include / rp1_pio_if.h
rp1_pio_if.h
  1  // SPDX-License-Identifier: GPL-2.0
  2  /*
  3   * Copyright (c) 2023-24 Raspberry Pi Ltd.
  4   * All rights reserved.
  5   */
  6  #ifndef _RP1_PIO_IF_H
  7  #define _RP1_PIO_IF_H
  8  
  9  #include <sys/ioctl.h>
 10  
 11  #define RP1_PIO_INSTRUCTION_COUNT 32
 12  #define RP1_PIO_SM_COUNT 4
 13  #define RP1_PIO_GPIO_COUNT 28
 14  #define RP1_GPIO_FUNC_PIO 7
 15  
 16  #define RP1_PIO_ORIGIN_ANY ((uint16_t)(~0))
 17  
 18  #define RP1_PIO_DIR_TO_SM 0
 19  #define RP1_PIO_DIR_FROM_SM 1
 20  #define RP1_PIO_DIR_COUNT 2
 21  
 22  typedef struct {
 23      uint32_t clkdiv;
 24      uint32_t execctrl;
 25      uint32_t shiftctrl;
 26      uint32_t pinctrl;
 27  } rp1_pio_sm_config;
 28  
 29  struct rp1_pio_add_program_args {
 30      uint16_t num_instrs;
 31      uint16_t origin;
 32      uint16_t instrs[RP1_PIO_INSTRUCTION_COUNT];
 33  };
 34  
 35  struct rp1_pio_remove_program_args {
 36      uint16_t num_instrs;
 37      uint16_t origin;
 38  };
 39  
 40  struct rp1_pio_sm_claim_args {
 41      uint16_t mask;
 42  };
 43  
 44  struct rp1_pio_sm_init_args {
 45      uint16_t sm;
 46      uint16_t initial_pc;
 47      rp1_pio_sm_config config;
 48  };
 49  
 50  struct rp1_pio_sm_set_config_args {
 51      uint16_t sm;
 52      uint16_t rsvd;
 53      rp1_pio_sm_config config;
 54  };
 55  
 56  struct rp1_pio_sm_exec_args {
 57      uint16_t sm;
 58      uint16_t instr;
 59      uint8_t blocking;
 60      uint8_t rsvd;
 61  };
 62  
 63  struct rp1_pio_sm_clear_fifos_args {
 64      uint16_t sm;
 65  };
 66  
 67  struct rp1_pio_sm_set_clkdiv_args {
 68      uint16_t sm;
 69      uint16_t div_int;
 70      uint8_t div_frac;
 71      uint8_t rsvd;
 72  };
 73  
 74  struct rp1_pio_sm_set_pins_args {
 75      uint16_t sm;
 76      uint16_t rsvd;
 77      uint32_t values;
 78      uint32_t mask;
 79  };
 80  
 81  struct rp1_pio_sm_set_pindirs_args {
 82      uint16_t sm;
 83      uint16_t rsvd;
 84      uint32_t dirs;
 85      uint32_t mask;
 86  };
 87  
 88  struct rp1_pio_sm_set_enabled_args {
 89      uint16_t mask;
 90      uint8_t enable;
 91      uint8_t rsvd;
 92  };
 93  
 94  struct rp1_pio_sm_restart_args {
 95      uint16_t mask;
 96  };
 97  
 98  struct rp1_pio_sm_clkdiv_restart_args {
 99      uint16_t mask;
100  };
101  
102  struct rp1_pio_sm_enable_sync_args {
103      uint16_t mask;
104  };
105  
106  struct rp1_pio_sm_put_args {
107      uint16_t sm;
108      uint8_t blocking;
109      uint8_t rsvd;
110      uint32_t data;
111  };
112  
113  struct rp1_pio_sm_get_args {
114      uint16_t sm;
115      uint8_t blocking;
116      uint8_t rsvd;
117      uint32_t data; /* OUT */
118  };
119  
120  struct rp1_pio_sm_set_dmactrl_args {
121      uint16_t sm;
122      uint8_t is_tx;
123      uint8_t rsvd;
124      uint32_t ctrl;
125  };
126  
127  struct rp1_pio_sm_fifo_state_args {
128      uint16_t sm;
129      uint8_t tx;
130      uint8_t rsvd;
131      uint16_t level; /* OUT */
132      uint8_t empty;  /* OUT */
133      uint8_t full;   /* OUT */
134  };
135  
136  struct rp1_gpio_init_args {
137      uint16_t gpio;
138  };
139  
140  struct rp1_gpio_set_function_args {
141      uint16_t gpio;
142      uint16_t fn;
143  };
144  
145  struct rp1_gpio_set_pulls_args {
146      uint16_t gpio;
147      uint8_t up;
148      uint8_t down;
149  };
150  
151  struct rp1_gpio_set_args {
152      uint16_t gpio;
153      uint16_t value;
154  };
155  
156  struct rp1_pio_sm_config_xfer_args {
157      uint16_t sm;
158      uint16_t dir;
159      uint16_t buf_size;
160      uint16_t buf_count;
161  };
162  
163  struct rp1_pio_sm_xfer_data_args {
164      uint16_t sm;
165      uint16_t dir;
166      uint16_t data_bytes;
167      void *data;
168  };
169  
170  struct rp1_access_hw_args {
171      uint32_t addr;
172      uint32_t len;
173      void *data;
174  };
175  
176  #define PIO_IOC_MAGIC 102
177  
178  #define PIO_IOC_SM_CONFIG_XFER                                                 \
179      _IOW(PIO_IOC_MAGIC, 0, struct rp1_pio_sm_config_xfer_args)
180  #define PIO_IOC_SM_XFER_DATA                                                   \
181      _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args)
182  
183  #ifdef CONFIG_COMPAT
184  // XXX #define PIO_IOC_SM_XFER_DATA32 _IOW(PIO_IOC_MAGIC, 2, struct
185  // pio_sm_xfer_data_args)
186  #endif
187  
188  #define PIO_IOC_READ_HW _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args)
189  #define PIO_IOC_WRITE_HW _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args)
190  
191  #define PIO_IOC_CAN_ADD_PROGRAM                                                \
192      _IOW(PIO_IOC_MAGIC, 10, struct rp1_pio_add_program_args)
193  #define PIO_IOC_ADD_PROGRAM                                                    \
194      _IOW(PIO_IOC_MAGIC, 11, struct rp1_pio_add_program_args)
195  #define PIO_IOC_REMOVE_PROGRAM                                                 \
196      _IOW(PIO_IOC_MAGIC, 12, struct rp1_pio_remove_program_args)
197  #define PIO_IOC_CLEAR_INSTR_MEM _IO(PIO_IOC_MAGIC, 13)
198  
199  #define PIO_IOC_SM_CLAIM _IOW(PIO_IOC_MAGIC, 20, struct rp1_pio_sm_claim_args)
200  #define PIO_IOC_SM_UNCLAIM _IOW(PIO_IOC_MAGIC, 21, struct rp1_pio_sm_claim_args)
201  #define PIO_IOC_SM_IS_CLAIMED                                                  \
202      _IOW(PIO_IOC_MAGIC, 22, struct rp1_pio_sm_claim_args)
203  
204  #define PIO_IOC_SM_INIT _IOW(PIO_IOC_MAGIC, 30, struct rp1_pio_sm_init_args)
205  #define PIO_IOC_SM_SET_CONFIG                                                  \
206      _IOW(PIO_IOC_MAGIC, 31, struct rp1_pio_sm_set_config_args)
207  #define PIO_IOC_SM_EXEC _IOW(PIO_IOC_MAGIC, 32, struct rp1_pio_sm_exec_args)
208  #define PIO_IOC_SM_CLEAR_FIFOS                                                 \
209      _IOW(PIO_IOC_MAGIC, 33, struct rp1_pio_sm_clear_fifos_args)
210  #define PIO_IOC_SM_SET_CLKDIV                                                  \
211      _IOW(PIO_IOC_MAGIC, 34, struct rp1_pio_sm_set_clkdiv_args)
212  #define PIO_IOC_SM_SET_PINS                                                    \
213      _IOW(PIO_IOC_MAGIC, 35, struct rp1_pio_sm_set_pins_args)
214  #define PIO_IOC_SM_SET_PINDIRS                                                 \
215      _IOW(PIO_IOC_MAGIC, 36, struct rp1_pio_sm_set_pindirs_args)
216  #define PIO_IOC_SM_SET_ENABLED                                                 \
217      _IOW(PIO_IOC_MAGIC, 37, struct rp1_pio_sm_set_enabled_args)
218  #define PIO_IOC_SM_RESTART                                                     \
219      _IOW(PIO_IOC_MAGIC, 38, struct rp1_pio_sm_restart_args)
220  #define PIO_IOC_SM_CLKDIV_RESTART                                              \
221      _IOW(PIO_IOC_MAGIC, 39, struct rp1_pio_sm_restart_args)
222  #define PIO_IOC_SM_ENABLE_SYNC                                                 \
223      _IOW(PIO_IOC_MAGIC, 40, struct rp1_pio_sm_enable_sync_args)
224  #define PIO_IOC_SM_PUT _IOW(PIO_IOC_MAGIC, 41, struct rp1_pio_sm_put_args)
225  #define PIO_IOC_SM_GET _IOWR(PIO_IOC_MAGIC, 42, struct rp1_pio_sm_get_args)
226  #define PIO_IOC_SM_SET_DMACTRL                                                 \
227      _IOW(PIO_IOC_MAGIC, 43, struct rp1_pio_sm_set_dmactrl_args)
228  #define PIO_IOC_SM_FIFO_STATE                                                  \
229      _IOW(PIO_IOC_MAGIC, 44, struct rp1_pio_sm_fifo_state_args)
230  #define PIO_IOC_SM_DRAIN_TX                                                    \
231      _IOW(PIO_IOC_MAGIC, 45, struct rp1_pio_sm_clear_fifos_args)
232  
233  #define PIO_IOC_GPIO_INIT _IOW(PIO_IOC_MAGIC, 50, struct rp1_gpio_init_args)
234  #define PIO_IOC_GPIO_SET_FUNCTION                                              \
235      _IOW(PIO_IOC_MAGIC, 51, struct rp1_gpio_set_function_args)
236  #define PIO_IOC_GPIO_SET_PULLS                                                 \
237      _IOW(PIO_IOC_MAGIC, 52, struct rp1_gpio_set_pulls_args)
238  #define PIO_IOC_GPIO_SET_OUTOVER                                               \
239      _IOW(PIO_IOC_MAGIC, 53, struct rp1_gpio_set_args)
240  #define PIO_IOC_GPIO_SET_INOVER                                                \
241      _IOW(PIO_IOC_MAGIC, 54, struct rp1_gpio_set_args)
242  #define PIO_IOC_GPIO_SET_OEOVER                                                \
243      _IOW(PIO_IOC_MAGIC, 55, struct rp1_gpio_set_args)
244  #define PIO_IOC_GPIO_SET_INPUT_ENABLED                                         \
245      _IOW(PIO_IOC_MAGIC, 56, struct rp1_gpio_set_args)
246  #define PIO_IOC_GPIO_SET_DRIVE_STRENGTH                                        \
247      _IOW(PIO_IOC_MAGIC, 57, struct rp1_gpio_set_args)
248  
249  #endif