1.适配CH32 gpio驱动。
This commit is contained in:
@@ -10,55 +10,55 @@
|
||||
|
||||
#include "drv_gpio.h"
|
||||
|
||||
#if (MR_CONF_PIN == MR_CONF_ENABLE)
|
||||
#if (MR_CFG_PIN == MR_CFG_ENABLE)
|
||||
|
||||
#define PIN_PORT(pin) ((uint8_t)(((pin) >> 4) & 0x0Fu))
|
||||
#define PIN_STPORT(pin) ((GPIO_TypeDef *)(GPIOA_BASE + (0x400u * PIN_PORT(pin))))
|
||||
#define PIN_STPIN(pin) ((uint16_t)(1u << (mr_uint8_t)(pin & 0x0Fu)))
|
||||
#define PIN_RCC(pin) (RCC_APB2Periph_GPIOA << PIN_PORT(pin))
|
||||
|
||||
static IRQn_Type irqno[] =
|
||||
{
|
||||
EXTI0_IRQn,
|
||||
EXTI1_IRQn,
|
||||
EXTI2_IRQn,
|
||||
EXTI3_IRQn,
|
||||
EXTI4_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
};
|
||||
static IRQn_Type irq[] =
|
||||
{
|
||||
EXTI0_IRQn,
|
||||
EXTI1_IRQn,
|
||||
EXTI2_IRQn,
|
||||
EXTI3_IRQn,
|
||||
EXTI4_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI9_5_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
EXTI15_10_IRQn,
|
||||
};
|
||||
|
||||
static mr_pos_t mask[16] = {-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1};
|
||||
static mr_pos_t irq_mask[16] = {-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1};
|
||||
|
||||
static struct mr_pin pin_device;
|
||||
|
||||
static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
static mr_err_t ch32_pin_configure(mr_pin_t pin, mr_pin_config_t config)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
GPIO_InitTypeDef GPIO_InitStructure = {0};
|
||||
EXTI_InitTypeDef EXTI_InitStructure = {0};
|
||||
NVIC_InitTypeDef NVIC_InitStructure = {0};
|
||||
|
||||
@@ -123,17 +123,20 @@ static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
}
|
||||
|
||||
default:
|
||||
return -MR_ERR_GENERIC;
|
||||
{
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (config->mode >= MR_PIN_MODE_IRQ_RISING)
|
||||
{
|
||||
if ((mask[config->number % 16] != -1 && mask[config->number % 16] != config->number))
|
||||
if ((irq_mask[config->number % 16] != -1 && irq_mask[config->number % 16] != config->number))
|
||||
{
|
||||
return -MR_ERR_BUSY;
|
||||
}
|
||||
|
||||
mask[config->number % 16] = config->number;
|
||||
irq_mask[config->number % 16] = config->number;
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
|
||||
|
||||
@@ -144,16 +147,16 @@ static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
GPIO_EXTILineConfig(PIN_PORT(config->number), config->number % 16);
|
||||
EXTI_Init(&EXTI_InitStructure);
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = irqno[config->number % 16];
|
||||
NVIC_InitStructure.NVIC_IRQChannel = irq[config->number % 16];
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
} else if (config->number == mask[config->number % 16])
|
||||
} else if (config->number == irq_mask[config->number % 16])
|
||||
{
|
||||
if (config->number % 16 >= 5 && config->number % 16 <= 9)
|
||||
{
|
||||
if (mask[5] == -1 && mask[6] == -1 && mask[7] == -1 && mask[8] == -1 && mask[9] == -1)
|
||||
if (irq_mask[5] == -1 && irq_mask[6] == -1 && irq_mask[7] == -1 && irq_mask[8] == -1 && irq_mask[9] == -1)
|
||||
{
|
||||
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
|
||||
} else
|
||||
@@ -163,8 +166,9 @@ static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
|
||||
} else if (config->number % 16 >= 10 && config->number % 16 <= 15)
|
||||
{
|
||||
if (mask[10] == -1 && mask[11] == -1 && mask[12] == -1 && mask[13] == -1 && mask[14] == -1
|
||||
&& mask[15] == -1)
|
||||
if (irq_mask[10] == -1 && irq_mask[11] == -1 && irq_mask[12] == -1 && irq_mask[13] == -1 &&
|
||||
irq_mask[14] == -1
|
||||
&& irq_mask[15] == -1)
|
||||
{
|
||||
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
|
||||
} else
|
||||
@@ -176,7 +180,7 @@ static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
|
||||
}
|
||||
|
||||
mask[config->number % 16] = -1;
|
||||
irq_mask[config->number % 16] = -1;
|
||||
|
||||
EXTI_InitStructure.EXTI_Line = PIN_STPIN(config->number);
|
||||
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
||||
@@ -190,23 +194,23 @@ static mr_err_t ch32_pin_configure(mr_pin_t pin, struct mr_pin_config *config)
|
||||
return MR_ERR_OK;
|
||||
}
|
||||
|
||||
static void ch32_pin_write(mr_pin_t pin, mr_pos_t number, mr_level_t level)
|
||||
{
|
||||
GPIO_WriteBit(PIN_STPORT(number), PIN_STPIN(number), level);
|
||||
}
|
||||
|
||||
static mr_level_t ch32_pin_read(mr_pin_t pin, mr_pos_t number)
|
||||
{
|
||||
return GPIO_ReadInputDataBit(PIN_STPORT(number), PIN_STPIN(number));
|
||||
}
|
||||
|
||||
static void ch32_pin_write(mr_pin_t pin, mr_pos_t number, mr_level_t level)
|
||||
{
|
||||
GPIO_WriteBit(PIN_STPORT(number), PIN_STPIN(number), level);
|
||||
}
|
||||
|
||||
void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
|
||||
void EXTI0_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[0]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[0]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line0);
|
||||
}
|
||||
}
|
||||
@@ -217,7 +221,7 @@ void EXTI1_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line1) != RESET)
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[1]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[1]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line1);
|
||||
}
|
||||
}
|
||||
@@ -228,7 +232,7 @@ void EXTI2_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line2) != RESET)
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[2]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[2]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line2);
|
||||
}
|
||||
}
|
||||
@@ -239,7 +243,7 @@ void EXTI3_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line3) != RESET)
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[3]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[3]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line3);
|
||||
}
|
||||
}
|
||||
@@ -250,7 +254,7 @@ void EXTI4_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line4) != RESET)
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[4]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[4]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line4);
|
||||
}
|
||||
}
|
||||
@@ -265,11 +269,11 @@ void EXTI9_5_IRQHandler(void)
|
||||
|| (EXTI_GetITStatus(EXTI_Line8) != RESET)
|
||||
|| (EXTI_GetITStatus(EXTI_Line9) != RESET))
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[5]);
|
||||
mr_pin_device_isr(&pin_device, mask[6]);
|
||||
mr_pin_device_isr(&pin_device, mask[7]);
|
||||
mr_pin_device_isr(&pin_device, mask[8]);
|
||||
mr_pin_device_isr(&pin_device, mask[9]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[5]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[6]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[7]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[8]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[9]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8 | EXTI_Line9);
|
||||
}
|
||||
}
|
||||
@@ -285,30 +289,30 @@ void EXTI15_10_IRQHandler(void)
|
||||
|| (EXTI_GetITStatus(EXTI_Line14) != RESET)
|
||||
|| (EXTI_GetITStatus(EXTI_Line15) != RESET))
|
||||
{
|
||||
mr_pin_device_isr(&pin_device, mask[10]);
|
||||
mr_pin_device_isr(&pin_device, mask[11]);
|
||||
mr_pin_device_isr(&pin_device, mask[12]);
|
||||
mr_pin_device_isr(&pin_device, mask[13]);
|
||||
mr_pin_device_isr(&pin_device, mask[14]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[10]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[11]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[12]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[13]);
|
||||
mr_pin_device_isr(&pin_device, irq_mask[14]);
|
||||
EXTI_ClearITPendingBit(EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15);
|
||||
}
|
||||
}
|
||||
|
||||
mr_err_t ch32_gpio_init(void)
|
||||
mr_err_t drv_gpio_init(void)
|
||||
{
|
||||
static struct mr_pin_ops drv_ops =
|
||||
{
|
||||
ch32_pin_configure,
|
||||
ch32_pin_read,
|
||||
ch32_pin_write,
|
||||
};
|
||||
mr_err_t ret = MR_ERR_OK;
|
||||
static struct mr_pin_ops driver =
|
||||
{
|
||||
ch32_pin_configure,
|
||||
ch32_pin_write,
|
||||
ch32_pin_read,
|
||||
};
|
||||
|
||||
ret = mr_pin_device_add(&pin_device, "pin", MR_NULL, &driver);
|
||||
ret = mr_pin_device_add(&pin_device, "pin", &drv_ops, MR_NULL);
|
||||
MR_ASSERT(ret == MR_ERR_OK);
|
||||
|
||||
return MR_ERR_OK;
|
||||
}
|
||||
AUTO_INIT_DRIVER_EXPORT(ch32_gpio_init);
|
||||
MR_INIT_DRIVER_EXPORT(drv_gpio_init);
|
||||
|
||||
#endif /* MR_CONF_PIN */
|
||||
#endif
|
||||
@@ -13,10 +13,4 @@
|
||||
|
||||
#include "device/pin/pin.h"
|
||||
|
||||
#if (MR_CONF_PIN == MR_CONF_ENABLE)
|
||||
|
||||
mr_err_t ch32_gpio_init(void);
|
||||
|
||||
#endif /* MR_CONF_PIN */
|
||||
|
||||
#endif /* _DRV_GPIO_H_ */
|
||||
Reference in New Issue
Block a user