GPIO 驱动

基于 lisa_device 框架的 GPIO 设备驱动,为 ARCS 平台提供统一的 GPIO 操作接口。

功能特性

  • 设备支持: GPIOA、GPIOB 两个 GPIO 控制器

  • 引脚配置: 支持输入/输出模式、上下拉电阻、去抖动

  • IO 操作: 引脚电平读写

  • 中断支持: 多种触发模式(上升沿、下降沿、双边沿、高低电平)

配置选项

prj.conf 中启用驱动:

CONFIG_LISA_GPIO_DEVICE=y
CONFIG_LISA_GPIOA=y        # 启用 GPIOA 设备
CONFIG_LISA_GPIOB=y        # 启用 GPIOB 设备

根据需要选择启用 GPIOA 或 GPIOB 设备。

API 接口

引脚配置

int lisa_gpio_configure(lisa_device_t *dev, uint32_t pin, lisa_gpio_flags_t flags);
int lisa_gpio_get_config(lisa_device_t *dev, uint32_t pin, lisa_gpio_flags_t *flags);

IO 操作

int lisa_gpio_read_pin(lisa_device_t *dev, uint32_t pin);   // 返回 LISA_GPIO_LOW/HIGH
int lisa_gpio_write_pin(lisa_device_t *dev, uint32_t pin, uint32_t value);

中断管理

int lisa_gpio_configure_irq(lisa_device_t *dev, uint32_t pin, lisa_gpio_irq_mode_t mode, 
                            lisa_gpio_irq_callback_t callback, void *user_data);
int lisa_gpio_enable_irq(lisa_device_t *dev, uint32_t pin);
int lisa_gpio_disable_irq(lisa_device_t *dev, uint32_t pin);

使用示例

输出模式

#include "lisa_gpio.h"

// 获取 GPIOA 设备
lisa_device_t *gpioa = lisa_device_get("gpioa");
if (!gpioa) {
    return -1;
}

// 配置引脚 5 为输出模式,初始电平为高
lisa_gpio_configure(gpioa, 5, LISA_GPIO_OUTPUT | LISA_GPIO_OUTPUT_INIT_HIGH);

// 设置高电平
lisa_gpio_write_pin(gpioa, 5, LISA_GPIO_HIGH);

// 设置低电平
lisa_gpio_write_pin(gpioa, 5, LISA_GPIO_LOW);

输入模式

// 配置引脚 3 为输入上拉模式
lisa_gpio_configure(gpioa, 3, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);

// 配置引脚 4 为输入下拉模式,启用去抖动
lisa_gpio_configure(gpioa, 4, LISA_GPIO_INPUT | LISA_GPIO_PULL_DOWN | LISA_GPIO_DEBOUNCE);

// 读取引脚电平
int level = lisa_gpio_read_pin(gpioa, 3);
if (level == LISA_GPIO_HIGH) {
    // 高电平处理
}

中断模式

// 中断回调函数
void gpio_irq_handler(uint32_t pin, void *user_data)
{
    // 中断处理逻辑(在中断上下文中执行,应尽量简短)
    printf("GPIO Pin %d interrupt triggered\n", pin);
}

// 配置引脚 10 为输入上拉模式
lisa_gpio_configure(gpioa, 10, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);

// 配置上升沿中断
lisa_gpio_configure_irq(gpioa, 10, LISA_GPIO_IRQ_EDGE_RISING,
                        gpio_irq_handler, NULL);

// 启用中断
lisa_gpio_enable_irq(gpioa, 10);

配置标志位

驱动使用标志位方式进行配置,可以通过按位或(|)组合多个标志:

方向标志

  • LISA_GPIO_INPUT - 输入模式(默认)

  • LISA_GPIO_OUTPUT - 输出模式

上下拉标志

  • LISA_GPIO_PULL_UP - 启用上拉电阻

  • LISA_GPIO_PULL_DOWN - 启用下拉电阻

去抖动标志

  • LISA_GPIO_DEBOUNCE - 启用去抖动

初始电平标志(仅用于输出模式)

  • LISA_GPIO_OUTPUT_INIT_LOW - 输出初始化为低电平

  • LISA_GPIO_OUTPUT_INIT_HIGH - 输出初始化为高电平

示例组合

// 输入模式 + 上拉
LISA_GPIO_INPUT | LISA_GPIO_PULL_UP

// 输入模式 + 下拉 + 去抖动
LISA_GPIO_INPUT | LISA_GPIO_PULL_DOWN | LISA_GPIO_DEBOUNCE

// 输出模式 + 初始高电平
LISA_GPIO_OUTPUT | LISA_GPIO_OUTPUT_INIT_HIGH

中断触发模式

  • LISA_GPIO_IRQ_EDGE_RISING - 上升沿触发

  • LISA_GPIO_IRQ_EDGE_FALLING - 下降沿触发

  • LISA_GPIO_IRQ_EDGE_BOTH - 双边沿触发

  • LISA_GPIO_IRQ_LEVEL_HIGH - 高电平触发

  • LISA_GPIO_IRQ_LEVEL_LOW - 低电平触发

硬件配置

引脚复用配置

GPIO 驱动在初始化时会自动调用板型目录中定义的引脚复用函数,用于配置 GPIO 引脚的复用功能。

配置位置:

  • 定义: boards/<板型名>/pinmux.c 中实现 lisa_gpioa_pinmux()lisa_gpiob_pinmux() 函数

  • 声明: boards/<板型名>/pinmux.h 中声明 void lisa_gpioa_pinmux()void lisa_gpiob_pinmux()

  • 调用时机: GPIOA/GPIOB 设备初始化时自动调用

示例 (参考 boards/arcs_evb/pinmux.c):

void lisa_gpioa_pinmux()
{
    // 配置 PA20 为 GPIO 功能(功能码 1)
    IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 20, 1);
    // 配置 PA21 为 GPIO 功能(功能码 0,默认 GPIO)
    IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 21, 0);
}

void lisa_gpiob_pinmux()
{
    // 配置 PB08 为 GPIO 功能(功能码 0)
    IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 8, 0);
}

注意:

  • 该函数由板型相关代码实现,不同板型的引脚配置可能不同

  • 只需配置实际使用的 GPIO 引脚

  • 功能码需根据芯片手册确定,通常 GPIO 功能对应功能码 0 或 1

注意事项

  1. 引脚范围: 每个 GPIO 控制器支持 0-31 共 32 个引脚

  2. 中断回调: 在中断上下文执行,应保持简短快速

  3. 线程安全: 驱动内部使用互斥锁保护中断配置操作

  4. 设备初始化: 使用前需确保设备已正确初始化

文件说明

  • lisa_gpio.h - 驱动头文件,包含所有 API 和类型定义

  • lisa_gpio_arcs.c - ARCS 平台适配实现

  • CMakeLists.txt - 构建配置

  • Kconfig - 配置选项