/* * Copyright (c) 2022, Artinchip Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include "aic_hal_gpio.h" #ifdef RT_USING_PIN void drv_pin_bias_set(unsigned int pin, unsigned int pull) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); hal_gpio_set_bias_pull(g, p, pull); } void drv_pin_drive_set(unsigned int pin, unsigned int strength) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); hal_gpio_set_drive_strength(g, p, strength); } void drv_pin_mux_set(unsigned int pin, unsigned int func) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); hal_gpio_set_func(g, p, func); } unsigned int drv_pin_mux_get(unsigned int pin) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); unsigned int func; hal_gpio_get_func(g, p, &func); return func; } void drv_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); hal_gpio_set_func(g, p, 1); switch (mode) { case PIN_MODE_INPUT: hal_gpio_set_bias_pull(g, p, PIN_PULL_DIS); hal_gpio_direction_input(g, p); break; case PIN_MODE_INPUT_PULLUP: hal_gpio_set_bias_pull(g, p, PIN_PULL_UP); hal_gpio_direction_input(g, p); break; case PIN_MODE_INPUT_PULLDOWN: hal_gpio_set_bias_pull(g, p, PIN_PULL_DOWN); hal_gpio_direction_input(g, p); break; case PIN_MODE_OUTPUT: case PIN_MODE_OUTPUT_OD: default: hal_gpio_set_bias_pull(g, p, PIN_PULL_DIS); hal_gpio_direction_output(g, p); break; } } void drv_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); if (PIN_LOW == value) { hal_gpio_clr_output(g, p); } else { hal_gpio_set_output(g, p); } } int drv_pin_read(struct rt_device *device, rt_base_t pin) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); unsigned int value = PIN_LOW; hal_gpio_get_value(g, p, &value); return value; } #ifdef AIC_GPIO_IRQ_DRV_EN rt_err_t drv_pin_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args) { unsigned int g = GPIO_GROUP(pin); unsigned int p = GPIO_GROUP_PIN(pin); unsigned int irq_mode = 0; switch (mode) { case PIN_IRQ_MODE_RISING: irq_mode=PIN_IRQ_MODE_EDGE_RISING; break; case PIN_IRQ_MODE_FALLING: irq_mode=PIN_IRQ_MODE_EDGE_FALLING; break; case PIN_IRQ_MODE_RISING_FALLING: irq_mode=PIN_IRQ_MODE_EDGE_BOTH; break; case PIN_IRQ_MODE_HIGH_LEVEL: irq_mode=PIN_IRQ_MODE_LEVEL_HIGH; break; case PIN_IRQ_MODE_LOW_LEVEL: irq_mode=PIN_IRQ_MODE_LEVEL_LOW; break; } hal_gpio_set_irq_mode(g, p, irq_mode); aicos_request_irq(AIC_GPIO_TO_IRQ(pin), (irq_handler_t)hdr, 0, "pin", args); return RT_EOK; } rt_err_t drv_pin_detach_irq(struct rt_device *device, rt_int32_t pin) { return RT_EOK; } irqreturn_t drv_gpio_group_irqhandler(int irq, void * data) { unsigned int g = irq - GPIO_IRQn; unsigned int stat = 0; unsigned int mask = 0; unsigned int i = 0; unsigned int gpio_irq = 0; hal_gpio_group_get_irq_stat(g, &stat); hal_gpio_group_get_irq_en(g, &mask); stat &= mask; for (i=0; i<32; i++){ if (!(stat & (1U<