fgpio.md 9.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
# FGPIO 驱动程序

## 1. 概述

- 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,具体差异请参考软件编程手册

## 2. 功能

- FGPIO 驱动程序主要完成GPIO相关的功能配置,包括

- 1. GPIO 控制器初始化
- 2. GPIO 引脚输入输出方向设置
- 3. GPIO 引脚输出和输入
- 4. GPIO 引脚中断使能和屏蔽
- 5. GPIO 引脚中断类型设置
- 6. GPIO 引脚中断回调函数注册

- 驱动相关的源文件如下,
- drivers/pin/fgpio
```
.
├── Kconfig
├── fgpio.c
├── fgpio.h
├── fgpio_g.c
├── fgpio_hw.h
├── fgpio_selftest.c
├── fgpio_intr.c
└── fgpio_sinit.c
```

## 3. 配置方法

- FGPIO 驱动支持 FT2000/4, D2000和E2000,在 D2000 和 E2000 上完成测试

- 参考以下步骤完成 FGPIO 硬件配置,
- 1. 获取FT2000/4, D2000或E2000的软件编程手册,参考引脚复用表,设置引脚复用为 GPIO
- 2. 初始化 GPIO 控制器实例
- 3. 设置 GPIO 引脚的输入,输出方向
- 4. 获取 GPIO 引脚上的输入,或者设置 GPIO 引脚的输出电平
- 5. 设置 GPIO 引脚的中断屏蔽位和中断触发类型,注册引脚的中断回调函数

## 4 应用示例

- 设置 GPIO 引脚的输出电平,获取引脚的输入电平,通过外部输入触发 GPIO 中断

### [fgpio_irq](../../../baremetal/example/peripheral/pin/fgpio_irq)

- 通过 GPIO 产生占空比和频率可配的 PWM 波形

### [fgpio_soft_pwm](../../../baremetal/example/peripheral/pin/fgpio_soft_pwm)

## 5. API参考

### 5.1. 用户数据结构

#### FGpioConfig

```c
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控制器配置 */
```

#### FGpioPin

```c
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引脚实例 */
```

#### FGpio

```c
typedef struct _FGpio
{
    FGpioConfig config;
    u32 is_ready;
    FGpioPin *pins[FGPIO_PORT_NUM][FGPIO_PIN_NUM];
} FGpio; /* GPIO控制器实例 */
```
### 5.2  错误码定义

- [0x0] FGPIO_SUCCESS : success

- [0x1050000] FGPIO_ERR_INVALID_PARA : invalid input parameters

- [0x1050001] FGPIO_ERR_INVALID_STATE : invalid state


### 5.3 用户API接口

#### FGpioLookupConfig

```c
const FGpioConfig *FGpioLookupConfig(u32 instance_id);
```

Note:

- 获取GPIO控制器的默认配置

Input:

-  {u32} instance_id, GPIO控制器实例号

Return:

- {const FGpioConfig *} GPIO控制器的默认配置

#### FGpioCfgInitialize

```c
FError FGpioCfgInitialize(FGpio *const instance, const FGpioConfig *const config);
```

Note:

- 初始化GPIO控制器实例

Input:

- {FGpio} *instance, GPIO控制器实例
- {FGpioConfig} *config, GPIO控制器配置

Return:

- {FError} FGPIO_SUCCESS 表示初始化成功

#### FGpioDeInitialize

```c
void FGpioDeInitialize(FGpio *const instance);
```

Note:

- 去初始化GPIO控制器实例

Input:

- {FGpio} *instance, GPIO控制器实例

Return:

-

#### FGpioPinInitialize

```c
FError FGpioPinInitialize(FGpio *const instance, FGpioPin *const pin,
                          const FGpioPinId pin_id);
```

Note:

- 初始化GPIO引脚实例

Input:

- {FGpio} *instance, GPIO控制器实例
- {FGpioPin} *pin_instance, GPIO引脚实例
- {FGpioPinId} index, GPIO引脚索引

Return:

- {FError} FGPIO_SUCCESS 表示初始化成功

#### FGpioPinDeInitialize

```c
void FGpioPinDeInitialize(FGpioPin *const pin);
```

Note:

- 去初始化GPIO引脚实例

Input:

- {FGpioPin} *pin_instance, GPIO引脚实例

Return:

- {FError} FGPIO_SUCCESS 表示初始化成功

#### FGpioGetPinIrqSourceType

```c
FGpioIrqSourceType FGpioGetPinIrqSourceType(FGpioPin *const pin);
```

Note:

- 获取引脚中断的上报方式

Input:

- {FGpioPin} *pin_instance, GPIO引脚实例

Return:

- {FGpioIrqSourceType} 引脚中断的上报方式

#### FGpioSetDirection

```c
void FGpioSetDirection(FGpioPin *const pin, FGpioDirection dir);
```

Note:

- 设置GPIO引脚的输入输出方向
- 初始化 GPIO 实例后使用此函数

Input:

- @param {FGpioPin} *instance, GPIO控制器实例
- @param {FGpioDirection} dir, 待设置的GPIO的方向

Return:

-

#### FGpioGetDirection

```c
FGpioDirection FGpioGetDirection(FGpioPin *const pin);
```

Note:

- 获取GPIO引脚的输入输出方向
- 初始化 GPIO 实例后使用此函数

Input:

- {FGpioPin} *pin, GPIO引脚实例

Return:

- {FGpioDirection} GPIO引脚方向

#### FGpioSetOutputValue

```c
FError FGpioSetOutputValue(FGpioPin *const pin, const FGpioPinVal output);
```

Note:

- 设置GPIO引脚的输出值
- 初始化 GPIO 实例后使用此函数,先设置 GPIO 引脚为输出后调用此函数

Input:

- {FGpioPin} *pin, GPIO引脚实例
- {FGpioPinVal} output, GPIO引脚的输出值

Return:

- {FError} FGPIO_SUCCESS 表示设置成功

#### FGpioGetInputValue

- 获取GPIO引脚的输入值

```c
FGpioPinVal FGpioGetInputValue(FGpioPin *const pin);
```

Note:

- 初始化 GPIO 实例后使用此函数,先设置 GPIO 引脚为输入后调用此函数

Input:

- {FGpioPin} *instance, GPIO引脚实例
- {FGpioPinVal} output, GPIO引脚的输出值

Return:

- {FGpioPinVal} 获取的输入值,高电平/低电平

#### FGpioGetInterruptMask

- 获取GPIO A组引脚的中断屏蔽位 

```c
void FGpioGetInterruptMask(FGpio *const instance, u32 *mask, u32 *enabled)
```

Note:

- 获取的是A组所有Pin的中断屏蔽位和中断使能位

Input:

- {FGpio} *instance, GPIO控制器实例
- {u32} *mask, 返回的GPIO A组引脚中断屏蔽位
- {u32} *enabled, 返回的GPIO A组中断使能位

Return:

-
#### FGpioSetInterruptMask

- 设置GPIO A组引脚的中断屏蔽位

```c
void FGpioSetInterruptMask(FGpioPin *const pin, boolean enable);
```

Note:

- index对应的引脚必须为A组引脚,B组引脚不支持中断

Input:

- {FGpioPin} *pin, GPIO引脚实例
- {boolean} enable, TRUE表示使能GPIO引脚中断,FALSE表示去使能GPIO引脚中断

Return:

-
#### FGpioGetInterruptType

- 获取GPIO A组引脚的中断类型和中断极性

```c
void FGpioGetInterruptType(FGpio *const instance, u32 *levels, u32 *polarity)
```

Note:

- 获取的是A组所有Pin的电平和极性

Input:

- {FGpio} *instance, GPIO控制器实例
- {u32} *levels, GPIO A组引脚中断电平类型
- {u32} *polarity, GPIO A组引脚中断极性类型

Return:

-

#### FGpioSetInterruptType

- 设置GPIO引脚的中断类型

```c
void FGpioSetInterruptType(FGpioPin *const pin, const FGpioIrqType type)
```

Note:

- index对应的引脚必须为A组引脚,B组引脚不支持中断

Input:

- {FGpioPin} *pin, GPIO引脚实例
- {FGpioIrqType} type, GPIO引脚中断触发类型

Return:

-

#### FGpioInterruptHandler

- GPIO中断处理函数

```c
void FGpioInterruptHandler(s32 vector, void *param)
```

Note:

- 需要用户将此函数注册到Interrtup上,使能GPIO中断才能生效

Input:

- {s32} vector, 中断输入参数1
- {void} *param, 中断输入参数2

Return:

-


#### FGpioPinInterruptHandler

- GPIO中断处理函数

```c
void FGpioPinInterruptHandler(s32 vector, void *param)
```

Note:

- 需要用户将此函数注册Gic上,才能生效

Input:

- {s32} vector, 中断输入参数1
- {void} *param, 中断输入参数2

Return:

-

#### FGpioRegisterInterruptCB

- 注册GPIO引脚中断回调函数

```c
void FGpioRegisterInterruptCB(FGpioPin *const pin, FGpioInterruptCallback cb, void *cb_param, boolean irq_one_time)
```

Note:

- 注册的回调函数在`FGpioInterruptHandler`中被调用

Input:

- {FGpioPin} pin, GPIO引脚实例
- {FGpioInterruptCallback} cb, GPIO引脚中断回调函数
- {void} *cb_param, GPIO引脚中断回调函数输入参数
- {boolean} irq_one_time, TRUE表示引脚中断触发一次后自动关闭中断,用于电平敏感中断

Return:

-