大家好,今天小白给大家介绍一下,关于mdm9206 threadx_os的gpio操作相关的api,希望能和大家一起交流学习.
1、gpio模块概述
SoC具有许多功能,但由于尺寸缩小,通常会受到限制, 通过在软件控制下结合硬件以灵活地复用给定物理引脚上的若干不同功能,可以克服此限制。该模块公开了一个接口,允许其客户端在SoC上的一组物理GPIO引脚上管理所需的功能。 此接口的最常见用法是为离散输入或输出配置引脚,以实现与外围设备,传感器或执行器的交互。该模块要求客户端在SoC上使用物理引脚编号,查阅硬件原理图或使用设备配置数据库确定正确的引脚编号。
2、相关宏定义
typedef enum
{
QAPI_GPIO_2MA_E = 0, // Specify a 2 mA drive.
QAPI_GPIO_4MA_E = 0x1, // Specify a 4 mA drive.
QAPI_GPIO_6MA_E = 0x2, // Specify a 6 mA drive.
QAPI_GPIO_8MA_E = 0x3, // Specify an 8 mA drive.
QAPI_GPIO_10MA_E = 0x4, // Specify a 10 mA drive.
QAPI_GPIO_12MA_E = 0x5, // Specify a 12 mA drive.
QAPI_GPIO_14MA_E = 0x6, // Specify a 14 mA drive.
QAPI_GPIO_16MA_E = 0x7, // Specify a 16 mA drive.
QAPI_GPIO_INVALID_STRENGTH_E = 0x7fffffff
}qapi_GPIO_Drive_t;
typedef enum
{
QAPI_GPIO_NO_PULL_E = 0x0, // Specify no pull.
QAPI_GPIO_PULL_DOWN_E = 0x1, // Pull the GPIO down.
QAPI_GPIO_KEEPER_E = 0x2, // Keep the GPIO as it is.
QAPI_GPIO_PULL_UP_E = 0x3, // Pull the GPIO up.
QAPI_GPIO_INVALID_PULL_E = 0x7fffffff // Placeholder - Do not use
}qapi_GPIO_Pull_t;
typedef enum
{
QAPI_GPIO_INPUT_E = 0, // Specify the pin as an input to the SoC.
QAPI_GPIO_OUTPUT_E = 1, // Specify the pin as an output to the SoC.
QAPI_GPIO_INVALID_DIR_E = 0x7fffffff // Placeholder - Do not use
}qapi_GPIO_Direction_t;
3、API介绍
a. qapi_Status_t qapi_TLMM_Get_Gpio_ID ( qapi_TLMM_Config_t ∗qapi_TLMM_Config, qapi_GPIO_ID_t ∗ qapi_GPIO_ID )
功能:此功能为指定的GPIO提供唯一的访问ID。 这是访问GPIO配置API所必需的。
入参:
in: qapi_TLMM_Config, 配置数据的指针
out: qapi_GPIO_ID,指向存储访问ID的位置的指针。
涉及类型:
typedef struct
{
uint32_t pin; // Physical pin number.
uint32_t func; // Pin function select.
qapi_GPIO_Direction_t dir; // Direction (input or output)
qapi_GPIO_Pull_t pull; // Pull value.
qapi_GPIO_Drive_t drive; // Drive strength.
}qapi_TLMM_Config_t;
typedef uint16_t qapi_GPIO_ID_t;
typedef uint16_t qapi_GPIO_ID_t;
返回值:
QAPI_OK – 引脚GPIO ID已成功创建
QAPI_ERR – 引脚GPIO当前正在使用或不可编程
b. qapi_Status_t qapi_TLMM_Config_Gpio ( qapi_GPIO_ID_t qapi_GPIO_ID,qapi_TLMM_Config_t ∗ qapi_TLMM_Config )
功能:此函数根据作为参数传入的配置结构引用中指定的一组字段配置SoC引脚。
入参:
in: qapi_GPIO_ID, 待配置的gpio id
in: qapi_TLMM_Config, 填充好的配置参数的指针
返回值:
QAPI_OK:配置成功
QAPI_ERR:配置失败
c. qapi_Status_t qapi_TLMM_Drive_Gpio ( qapi_GPIO_ID_t qapi_GPIO_ID, uint32_t pin, qapi_GPIO_Value_t value )
功能:此功能将已配置为通用输出功能的引脚设为成指定电平值。
in:qapi_GPIO_ID,引脚id
in:pin, 要配置的引脚号
in:value,待设置的值。
涉及类型:
typedef enum
{
QAPI_GPIO_LOW_VALUE_E, // Drive the output LOW.
QAPI_GPIO_HIGH_VALUE_E, // Drive the output HIGH.
QAPI_GPIO_INVALID_VALUE_E = 0x7fffffff // Placeholder - Do not use
}qapi_GPIO_Value_t;
返回值:
QAPI_OK:设置成功
QAPI_ERR:设置失败
4、用法举例
//第一步:变量定义:
qapi_GPIO_ID_t gpio_id;
qapi_TLMM_Config_t tlmm_config;
qapi_Status_t status = QAPI_OK;
//第二步:结构体填充
tlmm_config.pin = 13;
tlmm_config.func = 1 // Using the functionality tied to pin mux value 1
tlmm_config.dir = QAPI_GPIO_INPUT_E;
tlmm_config.pull = QAPI_GPIO_PULL_DOWN_E;
tlmm_config.drive = QAPI_GPIO_2MA_E; // drive is for output pins, specify the default here
//第三步:获取带配置引脚的gpio_id
status = qapi_TLMM_Get_Gpio_ID( &tlmm_config, &gpio_id); //获取gpio_id
if (status == QAPI_OK)
{
//第四步:将填充好的结构体以及获取到的gpio_id传给该接口用以配置相应的引脚
status = qapi_TLMM_Config_Gpio(gpio_id, &tlmm_config);
if (status != QAPI_OK)
{
// Handle failed case here
}
//第五步:设置引脚电平(也可以是其他操作。)
qapi_TLMM_Drive_Gpio(gpio_id_tbl[pin_gpio], gpio_map_tbl[pin_gpio].gpio_id, QAPI_GPIO_HIGH_VALUE_E);
}
5、总结
本篇简单介绍了gpio操作相关的API,并给出了一个简单的示例程序以供参考,欢迎一起学习交流。