Lines Matching refs:pin
44 aos_status_t aos_gpioc_get_mode(aos_gpioc_ref_t *ref, uint32_t pin, uint32_t *mode) in aos_gpioc_get_mode() argument
53 if (pin >= gpioc->num_pins) in aos_gpioc_get_mode()
57 *mode = gpioc->pins[pin].mode; in aos_gpioc_get_mode()
63 aos_status_t aos_gpioc_set_mode(aos_gpioc_ref_t *ref, uint32_t pin, uint32_t mode) in aos_gpioc_set_mode() argument
65 return aos_gpioc_set_mode_irq(ref, pin, mode, NULL, NULL); in aos_gpioc_set_mode()
70 aos_gpioc_pin_t *pin = (aos_gpioc_pin_t *)arg; in irq_task_func() local
73 gpioc = aos_container_of(pin, aos_gpioc_t, pins[pin->id]); in irq_task_func()
81 …(void)aos_event_get(&pin->irq_event, event_mask, AOS_EVENT_OR_CLEAR, &event_value, AOS_WAIT_FOREVE… in irq_task_func()
82 (void)aos_sem_wait(&pin->irq_sem, AOS_WAIT_FOREVER); in irq_task_func()
83 trig = mode_to_irq_trig(pin->mode); in irq_task_func()
85 aos_sem_signal(&pin->irq_sem); in irq_task_func()
92 pin->irq_handler(1, pin->irq_arg); in irq_task_func()
97 pin->irq_handler(0, pin->irq_arg); in irq_task_func()
102 pin->hard_irq_en = true; in irq_task_func()
103 gpioc->ops->enable_irq(gpioc, pin->id); in irq_task_func()
107 aos_sem_signal(&pin->irq_sem); in irq_task_func()
111 aos_status_t aos_gpioc_set_mode_irq(aos_gpioc_ref_t *ref, uint32_t pin, uint32_t mode, in aos_gpioc_set_mode_irq() argument
126 if (pin >= gpioc->num_pins) in aos_gpioc_set_mode_irq()
171 (void)aos_sem_wait(&gpioc->pins[pin].irq_sem, AOS_WAIT_FOREVER); in aos_gpioc_set_mode_irq()
172 old_mode = gpioc->pins[pin].mode; in aos_gpioc_set_mode_irq()
173 old_irq_handler = gpioc->pins[pin].irq_handler; in aos_gpioc_set_mode_irq()
174 old_irq_arg = gpioc->pins[pin].irq_arg; in aos_gpioc_set_mode_irq()
179 old_task = gpioc->pins[pin].irq_task; in aos_gpioc_set_mode_irq()
181 (void)aos_event_set(&gpioc->pins[pin].irq_event, 0, AOS_EVENT_AND); in aos_gpioc_set_mode_irq()
183 if (gpioc->pins[pin].hard_irq_en) { in aos_gpioc_set_mode_irq()
184 gpioc->pins[pin].hard_irq_en = false; in aos_gpioc_set_mode_irq()
185 gpioc->ops->disable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
199 ret = aos_task_new_ext(&gpioc->pins[pin].irq_task, "gpio_irq_task", irq_task_func, in aos_gpioc_set_mode_irq()
200 &gpioc->pins[pin], IRQ_TASK_STACK_SIZE, prio); in aos_gpioc_set_mode_irq()
204 gpioc->pins[pin].irq_task = old_task; in aos_gpioc_set_mode_irq()
206 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
207 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
211 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
217 gpioc->pins[pin].mode = mode; in aos_gpioc_set_mode_irq()
218 gpioc->pins[pin].irq_handler = irq_handler; in aos_gpioc_set_mode_irq()
219 gpioc->pins[pin].irq_arg = irq_arg; in aos_gpioc_set_mode_irq()
222 gpioc->pins[pin].value = !!(mode & AOS_GPIO_OUTPUT_INIT_HIGH); in aos_gpioc_set_mode_irq()
224 gpioc->pins[pin].value = 0; in aos_gpioc_set_mode_irq()
226 ret = gpioc->ops->set_mode(gpioc, pin); in aos_gpioc_set_mode_irq()
228 gpioc->pins[pin].mode = old_mode; in aos_gpioc_set_mode_irq()
229 gpioc->pins[pin].irq_handler = old_irq_handler; in aos_gpioc_set_mode_irq()
230 gpioc->pins[pin].irq_arg = old_irq_arg; in aos_gpioc_set_mode_irq()
234 (void)aos_task_delete(&gpioc->pins[pin].irq_task); in aos_gpioc_set_mode_irq()
238 gpioc->pins[pin].irq_task = old_task; in aos_gpioc_set_mode_irq()
240 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
241 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
245 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
257 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
258 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
262 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
267 aos_status_t aos_gpioc_get_value(aos_gpioc_ref_t *ref, uint32_t pin) in aos_gpioc_get_value() argument
278 if (pin >= gpioc->num_pins) in aos_gpioc_get_value()
282 mode = gpioc->pins[pin].mode; in aos_gpioc_get_value()
285 ret = (aos_status_t)!!gpioc->ops->get_value(gpioc, pin); in aos_gpioc_get_value()
287 ret = (aos_status_t)gpioc->pins[pin].value; in aos_gpioc_get_value()
296 aos_status_t aos_gpioc_set_value(aos_gpioc_ref_t *ref, uint32_t pin, int val) in aos_gpioc_set_value() argument
306 if (pin >= gpioc->num_pins) in aos_gpioc_set_value()
310 mode = gpioc->pins[pin].mode; in aos_gpioc_set_value()
318 if (gpioc->pins[pin].value == val) { in aos_gpioc_set_value()
323 gpioc->pins[pin].value = val; in aos_gpioc_set_value()
324 gpioc->ops->set_value(gpioc, pin); in aos_gpioc_set_value()
330 aos_status_t aos_gpioc_toggle(aos_gpioc_ref_t *ref, uint32_t pin) in aos_gpioc_toggle() argument
340 if (pin >= gpioc->num_pins) in aos_gpioc_toggle()
344 mode = gpioc->pins[pin].mode; in aos_gpioc_toggle()
351 gpioc->pins[pin].value = !gpioc->pins[pin].value; in aos_gpioc_toggle()
352 gpioc->ops->set_value(gpioc, pin); in aos_gpioc_toggle()
363 aos_gpioc_pin_t *pin = &gpioc->pins[i]; in dev_gpioc_unregister() local
365 if (mode_to_irq_trig(pin->mode) != AOS_GPIO_IRQ_TRIG_NONE) { in dev_gpioc_unregister()
369 (void)aos_sem_wait(&pin->irq_sem, AOS_WAIT_FOREVER); in dev_gpioc_unregister()
370 (void)aos_task_delete(&pin->irq_task); in dev_gpioc_unregister()
373 if (pin->hard_irq_en) { in dev_gpioc_unregister()
374 pin->hard_irq_en = false; in dev_gpioc_unregister()
381 pin->mode = AOS_GPIO_DIR_NONE; in dev_gpioc_unregister()
383 aos_sem_free(&pin->irq_sem); in dev_gpioc_unregister()
384 aos_event_free(&pin->irq_event); in dev_gpioc_unregister()
426 aos_gpioc_pin_t *pin = &gpioc->pins[i]; in aos_gpioc_register() local
428 pin->id = i; in aos_gpioc_register()
429 pin->mode = AOS_GPIO_DIR_NONE; in aos_gpioc_register()
430 pin->irq_handler = NULL; in aos_gpioc_register()
431 pin->irq_arg = NULL; in aos_gpioc_register()
432 pin->hard_irq_en = false; in aos_gpioc_register()
433 pin->value = 0; in aos_gpioc_register()
435 ret = aos_sem_new(&pin->irq_sem, 1); in aos_gpioc_register()
445 ret = aos_event_new(&pin->irq_event, 0); in aos_gpioc_register()