Line data Source code
1 0 : /*
2 : * Copyright (c) 2023 Tokita, Hiroshi <tokita.hiroshi@fujitsu.com>
3 : * Copyright (c) 2023 Yonatan Schachter
4 : * Copyright (c) 2023 Ionut Pavel <iocapa@iocapa.com>
5 : *
6 : * SPDX-License-Identifier: Apache-2.0
7 : */
8 :
9 : #ifndef ZEPHYR_DRIVERS_MISC_PIO_PICO_RPI_PIO_PICO_RPI_H_
10 : #define ZEPHYR_DRIVERS_MISC_PIO_PICO_RPI_PIO_PICO_RPI_H_
11 :
12 : #include <zephyr/devicetree/gpio.h>
13 :
14 : #include <hardware/pio.h>
15 :
16 : /**
17 : * @brief Utility macro to define a PIO program. The program is a list
18 : * of 16 bit instructions, generated by the pioasm tool.
19 : *
20 : * @param name Name of the program.
21 : * @param wrap_target Wrap target as specified by the PIO program.
22 : * @param wrap Wrap source as specified by the PIO program.
23 : * @param ... Comma separated list of PIO instructions.
24 : */
25 1 : #define RPI_PICO_PIO_DEFINE_PROGRAM(name, wrap_target, wrap, ...) \
26 : static const uint32_t name ## _wrap_target = wrap_target; \
27 : static const uint32_t name ## _wrap = wrap; \
28 : static const uint16_t name ## _program_instructions[] = { \
29 : __VA_ARGS__ \
30 : }; \
31 : static const struct pio_program name ## _program = { \
32 : .instructions = name ## _program_instructions, \
33 : .length = ARRAY_SIZE(name ## _program_instructions), \
34 : .origin = -1, \
35 : }
36 :
37 : /**
38 : * @brief Utility macro to get the wrap target of a program.
39 : *
40 : * @param name Name of the program.
41 : */
42 1 : #define RPI_PICO_PIO_GET_WRAP_TARGET(name) name ## _wrap_target
43 :
44 : /**
45 : * @brief Utility macro to get the wrap source of a program.
46 : *
47 : * @param name Name of the program.
48 : */
49 1 : #define RPI_PICO_PIO_GET_WRAP(name) name ## _wrap
50 :
51 : /**
52 : * @brief Utility macro to get a pointer to a PIO program.
53 : *
54 : * @param name Name of the program.
55 : */
56 1 : #define RPI_PICO_PIO_GET_PROGRAM(name) &name ## _program
57 :
58 : /**
59 : * @brief Get a pin number from a pinctrl / group name and index
60 : *
61 : * Example devicetree fragment(s):
62 : *
63 : * @code{.dts}
64 : * pinctrl {
65 : * pio_child_default: pio_child_default {
66 : * tx_gpio {
67 : * pinmux = <PIO0_P0>, <PIO0_P2>;
68 : * };
69 : *
70 : * rx_gpio {
71 : * pinmux = <PIO0_P1>;
72 : * input-enable;
73 : * };
74 : * };
75 : * };
76 : * @endcode
77 : *
78 : * @code{.dts}
79 : * pio {
80 : * status = "okay";
81 : * c: child {
82 : * pinctrl-0 = <&pio_child_default>;
83 : * pinctrl-names = "default";
84 : * };
85 : * };
86 : * @endcode
87 : *
88 : * Example usage:
89 : *
90 : * @code{.c}
91 : * DT_RPI_PICO_PIO_PIN_BY_NAME(node, default, 0, tx_gpio, 0) // 0
92 : * DT_RPI_PICO_PIO_PIN_BY_NAME(node, default, 0, tx_gpio, 1) // 2
93 : * DT_RPI_PICO_PIO_PIN_BY_NAME(node, default, 0, rx_gpio, 0) // 1
94 : * @endcode
95 : *
96 : * @param node_id node identifier
97 : * @param p_name pinctrl name
98 : * @param p_idx pinctrl index
99 : * @param g_name group name
100 : * @param g_idx group index
101 : * @return pin number
102 : */
103 1 : #define DT_RPI_PICO_PIO_PIN_BY_NAME(node_id, p_name, p_idx, g_name, g_idx) \
104 : RP2_GET_PIN_NUM(DT_PROP_BY_IDX( \
105 : DT_CHILD(DT_PINCTRL_BY_NAME(node_id, p_name, p_idx), g_name), pinmux, g_idx))
106 :
107 : /**
108 : * @brief Get a pin number from a pinctrl / group name and index
109 : *
110 : * @param inst instance number
111 : * @param p_name pinctrl name
112 : * @param p_idx pinctrl index
113 : * @param g_name group name
114 : * @param g_idx group index
115 : * @return pin number
116 : *
117 : * @see DT_RPI_PICO_PIO_PIN_BY_NAME
118 : */
119 1 : #define DT_INST_RPI_PICO_PIO_PIN_BY_NAME(inst, p_name, p_idx, g_name, g_idx) \
120 : DT_RPI_PICO_PIO_PIN_BY_NAME(DT_DRV_INST(inst), p_name, p_idx, g_name, g_idx)
121 :
122 : /**
123 : * @brief Get the pin number of a pin by its name.
124 : *
125 : * @param inst instance number
126 : * @param name name of the pin (e.g. tx, rx, sck).
127 : */
128 1 : #define DT_INST_PIO_PIN_BY_NAME(inst, name) \
129 : DT_PIO_PIN_BY_NAME(DT_DRV_INST(inst), name)
130 :
131 : /**
132 : * Get PIO object
133 : *
134 : * @param dev Pointer to device structure for rpi_pio device instance
135 : * @return PIO object
136 : */
137 1 : PIO pio_rpi_pico_get_pio(const struct device *dev);
138 :
139 : /**
140 : * Allocate a state machine.
141 : *
142 : * @param dev Pointer to device structure for rpi_pio device instance
143 : * @param sm Pointer to store allocated state machine
144 : * @retval 0 on success
145 : * @retval -EBUSY if no state machines were available
146 : */
147 1 : int pio_rpi_pico_allocate_sm(const struct device *dev, size_t *sm);
148 :
149 : #endif /* ZEPHYR_DRIVERS_MISC_PIO_PICO_RPI_PIO_PICO_RPI_H_ */
|