181
180
{ pinmux(18), 8, 2 },
184
int gpio_request(int gp, const char *label)
186
if (gp >= MAX_NUM_GPIOS)
189
if (gpio_registry[gp].is_registered)
192
gpio_registry[gp].is_registered = 1;
193
strncpy(gpio_registry[gp].name, label, GPIO_NAME_SIZE);
194
gpio_registry[gp].name[GPIO_NAME_SIZE - 1] = 0;
196
davinci_configure_pin_mux(&gpio_pinmux[gp], 1);
201
void gpio_free(int gp)
203
gpio_registry[gp].is_registered = 0;
206
void gpio_toggle_value(int gp)
208
gpio_set_value(gp, !gpio_get_value(gp));
211
int gpio_direction_input(int gp)
213
struct davinci_gpio *bank;
215
bank = GPIO_BANK(gp);
216
setbits_le32(&bank->dir, 1U << GPIO_BIT(gp));
220
int gpio_direction_output(int gp, int value)
222
struct davinci_gpio *bank;
224
bank = GPIO_BANK(gp);
225
clrbits_le32(&bank->dir, 1U << GPIO_BIT(gp));
226
gpio_set_value(gp, value);
230
int gpio_get_value(int gp)
183
int gpio_request(unsigned gpio, const char *label)
185
if (gpio >= MAX_NUM_GPIOS)
188
if (gpio_registry[gpio].is_registered)
191
gpio_registry[gpio].is_registered = 1;
192
strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE);
193
gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0;
195
davinci_configure_pin_mux(&gpio_pinmux[gpio], 1);
200
int gpio_free(unsigned gpio)
202
if (gpio >= MAX_NUM_GPIOS)
205
if (!gpio_registry[gpio].is_registered)
208
gpio_registry[gpio].is_registered = 0;
209
gpio_registry[gpio].name[0] = '\0';
210
/* Do not configure as input or change pin mux here */
214
int gpio_direction_input(unsigned gpio)
216
struct davinci_gpio *bank;
218
bank = GPIO_BANK(gpio);
219
setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
223
int gpio_direction_output(unsigned gpio, int value)
225
struct davinci_gpio *bank;
227
bank = GPIO_BANK(gpio);
228
clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio));
229
gpio_set_value(gpio, value);
233
int gpio_get_value(unsigned gpio)
232
235
struct davinci_gpio *bank;
235
bank = GPIO_BANK(gp);
236
ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gp));
238
bank = GPIO_BANK(gpio);
239
ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio));
237
240
return ip ? 1 : 0;
240
void gpio_set_value(int gp, int value)
243
int gpio_set_value(unsigned gpio, int value)
242
245
struct davinci_gpio *bank;
244
bank = GPIO_BANK(gp);
247
bank = GPIO_BANK(gpio);
247
bank->set_data = 1U << GPIO_BIT(gp);
250
bank->set_data = 1U << GPIO_BIT(gpio);
249
bank->clr_data = 1U << GPIO_BIT(gp);
252
bank->clr_data = 1U << GPIO_BIT(gpio);
252
257
void gpio_info(void)
259
unsigned gpio, dir, val;
255
260
struct davinci_gpio *bank;
257
for (gp = 0; gp < MAX_NUM_GPIOS; ++gp) {
258
bank = GPIO_BANK(gp);
259
dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gp));
260
val = gpio_get_value(gp);
262
for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) {
263
bank = GPIO_BANK(gpio);
264
dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio));
265
val = gpio_get_value(gpio);
262
267
printf("% 4d: %s: %d [%c] %s\n",
263
gp, dir ? " in" : "out", val,
264
gpio_registry[gp].is_registered ? 'x' : ' ',
265
gpio_registry[gp].name);
268
gpio, dir ? " in" : "out", val,
269
gpio_registry[gpio].is_registered ? 'x' : ' ',
270
gpio_registry[gpio].name);