GPIO(General-purpose input/output),即通用型输入输出,其引脚可以供使用者通过程序控制其输入、输出,常用于产生时钟,作为片选信号和模拟低速通信协议等场景
FT2000/4和D2000提供两个 GPIO 模块,每个 GPIO 模块有 16 位接口,每8位一组,分别是A组和B组,GPIO可以控制外部IO的输入输出方向,作为输出时,内部寄存器的数据输出到片外,作为输入时,片外的数据被锁存在内部寄存器
FGPIO 驱动支持配置 GPIO 引脚的输入输出方向,输出高低电平,或者获取输入电平,配置引脚的中断触发模式,配置引脚的中断响应回调函数等
FGPIO_VERSION_1 对应 FT2000/4和D2000 的 GPIO,FGPIO_VERSION_2 对应 E2000的 GPIO,具体差异请参考软件编程手册
FGPIO 驱动程序主要完成GPIO相关的功能配置,包括
驱动相关的源文件如下,
drivers/pin/fgpio
.
├── Kconfig
├── fgpio.c
├── fgpio.h
├── fgpio_g.c
├── fgpio_hw.h
├── fgpio_selftest.c
├── fgpio_intr.c
└── fgpio_sinit.c
FGPIO 驱动支持 FT2000/4, D2000和E2000,在 D2000 和 E2000 上完成测试
参考以下步骤完成 FGPIO 硬件配置,
typedef struct
{
u32 instance_id; /* GPIO实例ID */
uintptr base_addr; /* GPIO控制器基地址 */
#if defined(FGPIO_VERSION_1) /* FT2000-4, D2000 */
u32 irq_num; /* GPIO控制器中断号 */
#elif defined(FGPIO_VERSION_2) /* E2000 GPIO 0 ~ 5 */
u32 irq_num[FGPIO_PIN_NUM]; /* GPIO各引脚的中断号 */
#endif
u32 irq_priority; /* 中断优先级 */
} FGpioConfig; /* GPIO控制器配置 */
typedef struct _FGpioPin
{
FGpioPinId index; /* 索引 */
u32 is_ready;
FGpio *instance;
FGpioInterruptCallback irq_cb; /* 中断回调函数, Port-A有效 */
void *irq_cb_params; /* 中断回调函数的入参, Port-A有效 */
boolean irq_one_time; /* Port-A有效, TRUE: 进入中断后关闭该引脚的中断,用于电平敏感中断,防止一直进入中断 */
} FGpioPin; /* GPIO引脚实例 */
typedef struct _FGpio
{
FGpioConfig config;
u32 is_ready;
FGpioPin *pins[FGPIO_PORT_NUM][FGPIO_PIN_NUM];
} FGpio; /* GPIO控制器实例 */
[0x0] FGPIO_SUCCESS : success
[0x1050000] FGPIO_ERR_INVALID_PARA : invalid input parameters
[0x1050001] FGPIO_ERR_INVALID_STATE : invalid state
const FGpioConfig *FGpioLookupConfig(u32 instance_id);
Note:
Input:
Return:
FError FGpioCfgInitialize(FGpio *const instance, const FGpioConfig *const config);
Note:
Input:
Return:
void FGpioDeInitialize(FGpio *const instance);
Note:
Input:
Return:
FError FGpioPinInitialize(FGpio *const instance, FGpioPin *const pin,
const FGpioPinId pin_id);
Note:
Input:
Return:
void FGpioPinDeInitialize(FGpioPin *const pin);
Note:
Input:
Return:
FGpioIrqSourceType FGpioGetPinIrqSourceType(FGpioPin *const pin);
Note:
Input:
Return:
void FGpioSetDirection(FGpioPin *const pin, FGpioDirection dir);
Note:
Input:
Return:
FGpioDirection FGpioGetDirection(FGpioPin *const pin);
Note:
Input:
Return:
FError FGpioSetOutputValue(FGpioPin *const pin, const FGpioPinVal output);
Note:
Input:
Return:
获取GPIO引脚的输入值
FGpioPinVal FGpioGetInputValue(FGpioPin *const pin);
Note:
Input:
Return:
获取GPIO A组引脚的中断屏蔽位
void FGpioGetInterruptMask(FGpio *const instance, u32 *mask, u32 *enabled)
Note:
Input:
Return:
无
设置GPIO A组引脚的中断屏蔽位
void FGpioSetInterruptMask(FGpioPin *const pin, boolean enable);
Note:
Input:
Return:
无
获取GPIO A组引脚的中断类型和中断极性
void FGpioGetInterruptType(FGpio *const instance, u32 *levels, u32 *polarity)
Note:
Input:
Return:
设置GPIO引脚的中断类型
void FGpioSetInterruptType(FGpioPin *const pin, const FGpioIrqType type)
Note:
Input:
Return:
GPIO中断处理函数
void FGpioInterruptHandler(s32 vector, void *param)
Note:
Input:
Return:
GPIO中断处理函数
void FGpioPinInterruptHandler(s32 vector, void *param)
Note:
Input:
Return:
注册GPIO引脚中断回调函数
void FGpioRegisterInterruptCB(FGpioPin *const pin, FGpioInterruptCallback cb, void *cb_param, boolean irq_one_time)
Note:
FGpioInterruptHandler中被调用Input:
Return: