大家好,今天小白給大家介紹一下,關于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,并給出了一個簡單的示例程式以供參考,歡迎一起學習交流。