rp2040: add rp2040_gpio_get_function_pin()

This commit is contained in:
Yuichi Nakamura
2021-11-05 23:49:52 +09:00
committed by David Sidrane
parent f2405ccc57
commit c109262a7f
3 changed files with 198 additions and 0 deletions
+150
View File
@@ -51,6 +51,42 @@ static xcpt_t g_gpio_irq_handlers[RP2040_GPIO_NUM];
static FAR void *g_gpio_irq_args[RP2040_GPIO_NUM];
static int g_gpio_irq_modes[RP2040_GPIO_NUM];
/* GPIO pins function assignment */
static int g_gpio_function[RP2040_GPIO_NUM];
/* GPIO pins function mapping table */
static const int g_gpio_function_mapping_spi[2][5] =
{
{ 0, 4, 16, 20, -1 }, /* pin numbers assignable to SPI0 */
{ 8, 12, 24, 28, -1 }, /* pin numbers assignable to SPI1 */
};
static const int g_gpio_function_mapping_uart[2][5] =
{
{ 0, 12, 16, 28, -1 }, /* pin numbers assignable to UART0 */
{ 4, 8, 20, 24, -1 }, /* pin numbers assignable to UART1 */
};
static const int g_gpio_function_mapping_i2c[2][9] =
{
{ 0, 4, 8, 12, 16, 20, 24, 28, -1 }, /* pin numbers assignable to I2C0 */
{ 2, 6, 10, 14, 18, 22, 26, -1, -1 }, /* pin numbers assignable to I2C1 */
};
static const int g_gpio_function_mapping_pwm[8][3] =
{
{ 0, 16, -1 }, /* pin numbers assignable to PWM0 */
{ 2, 18, -1 }, /* pin numbers assignable to PWM1 */
{ 4, 20, -1 }, /* pin numbers assignable to PWM2 */
{ 6, 22, -1 }, /* pin numbers assignable to PWM3 */
{ 8, 24, -1 }, /* pin numbers assignable to PWM4 */
{ 10, 26, -1 }, /* pin numbers assignable to PWM5 */
{ 12, 28, -1 }, /* pin numbers assignable to PWM6 */
{ 14, -1, -1 }, /* pin numbers assignable to PWM7 */
};
/****************************************************************************
* Private Functions
****************************************************************************/
@@ -116,6 +152,84 @@ static int rp2040_gpio_interrupt(int irq, void *context, FAR void *arg)
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: r2040_gpio_get_function_pin
*
* Description:
* Get the GPIO pin number to which the specified function is assigned
*
****************************************************************************/
int rp2040_gpio_get_function_pin(uint32_t func, uint32_t port)
{
int i;
const int *mapping;
/* Get GPIO pins function mapping table */
switch (func)
{
case RP2040_GPIO_FUNC_SPI:
if (port >= 2)
{
return -1;
}
mapping = g_gpio_function_mapping_spi[port];
break;
case RP2040_GPIO_FUNC_UART:
if (port >= 2)
{
return -1;
}
mapping = g_gpio_function_mapping_uart[port];
break;
case RP2040_GPIO_FUNC_I2C:
if (port >= 2)
{
return -1;
}
mapping = g_gpio_function_mapping_i2c[port];
break;
case RP2040_GPIO_FUNC_PWM:
if (port >= 8)
{
return -1;
}
mapping = g_gpio_function_mapping_pwm[port];
break;
default:
return -1;
}
/* Find the specified function in the current assignment */
for (i = 0; mapping[i] >= 0; i++)
{
if (g_gpio_function[mapping[i]] == func)
{
return mapping[i];
}
}
return -1;
}
/****************************************************************************
* Name: r2040_gpio_set_function
*
* Description:
* Assign functions to the specified GPIO pin
*
****************************************************************************/
void rp2040_gpio_set_function(uint32_t gpio, uint32_t func)
{
DEBUGASSERT(gpio < RP2040_GPIO_NUM);
@@ -126,8 +240,18 @@ void rp2040_gpio_set_function(uint32_t gpio, uint32_t func)
putreg32(func & RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_MASK,
RP2040_IO_BANK0_GPIO_CTRL(gpio));
g_gpio_function[gpio] = func;
}
/****************************************************************************
* Name: r2040_gpio_set_pulls
*
* Description:
* Set pull-up or pull-down to the specified GPIO pin
*
****************************************************************************/
void rp2040_gpio_set_pulls(uint32_t gpio, int up, int down)
{
DEBUGASSERT(gpio < RP2040_GPIO_NUM);
@@ -138,6 +262,14 @@ void rp2040_gpio_set_pulls(uint32_t gpio, int up, int down)
RP2040_PADS_BANK0_GPIO(gpio));
}
/****************************************************************************
* Name: r2040_gpio_init
*
* Description:
* Initialize software-controlled GPIO function
*
****************************************************************************/
void rp2040_gpio_init(uint32_t gpio)
{
DEBUGASSERT(gpio < RP2040_GPIO_NUM);
@@ -229,3 +361,21 @@ void rp2040_gpio_disable_irq(uint32_t gpio)
clrbits_reg32(0xf << ((gpio % 8) * 4), reg);
}
}
/****************************************************************************
* Name: r2040_gpio_initialize
*
* Description:
* Initialize GPIO function management
*
****************************************************************************/
void rp2040_gpio_initialize(void)
{
int i;
for (i = 0; i < RP2040_GPIO_NUM; i++)
{
g_gpio_function[i] = RP2040_GPIO_FUNC_NULL;
}
}
+46
View File
@@ -130,8 +130,44 @@ static inline void rp2040_gpio_setdir(uint32_t gpio, int out)
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: r2040_gpio_get_function_pin
*
* Description:
* Get the GPIO pin number to which the specified function is assigned
*
****************************************************************************/
int rp2040_gpio_get_function_pin(uint32_t func, uint32_t port);
/****************************************************************************
* Name: r2040_gpio_set_function
*
* Description:
* Assign functions to the specified GPIO pin
*
****************************************************************************/
void rp2040_gpio_set_function(uint32_t gpio, uint32_t func);
/****************************************************************************
* Name: r2040_gpio_set_pulls
*
* Description:
* Set pull-up or pull-down to the specified GPIO pin
*
****************************************************************************/
void rp2040_gpio_set_pulls(uint32_t gpio, int up, int down);
/****************************************************************************
* Name: r2040_gpio_init
*
* Description:
* Initialize software-controlled GPIO function
*
****************************************************************************/
void rp2040_gpio_init(uint32_t gpio);
/****************************************************************************
@@ -165,6 +201,16 @@ void rp2040_gpio_enable_irq(uint32_t gpio);
void rp2040_gpio_disable_irq(uint32_t gpio);
/****************************************************************************
* Name: r2040_gpio_initialize
*
* Description:
* Initialize GPIO function management
*
****************************************************************************/
void rp2040_gpio_initialize(void);
#undef EXTERN
#if defined(__cplusplus)
}
@@ -55,6 +55,8 @@
void rp2040_boardearlyinitialize(void)
{
rp2040_gpio_initialize();
/* Disable IE on GPIO 26-29 */
clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));