跳到主要内容

Rockchip RT-THREAD GPIO Developer Guide

ID: RK-KF-YK-137

Release Version: V1.0.0

Release Date: 2020-12-15

Security Level: □Top-Secret □Secret □Internal ■Public

DISCLAIMER

THIS DOCUMENT IS PROVIDED “AS IS”. ROCKCHIP ELECTRONICS CO., LTD.(“ROCKCHIP”)DOES NOT PROVIDE ANY WARRANTY OF ANY KIND, EXPRESSED, IMPLIED OR OTHERWISE, WITH RESPECT TO THE ACCURACY, RELIABILITY, COMPLETENESS,MERCHANTABILITY, FITNESS FOR ANY PARTICULAR PURPOSE OR NON-INFRINGEMENT OF ANY REPRESENTATION, INFORMATION AND CONTENT IN THIS DOCUMENT. THIS DOCUMENT IS FOR REFERENCE ONLY. THIS DOCUMENT MAY BE UPDATED OR CHANGED WITHOUT ANY NOTICE AT ANY TIME DUE TO THE UPGRADES OF THE PRODUCT OR ANY OTHER REASONS.

Trademark Statement

"Rockchip", "瑞芯微", "瑞芯" shall be Rockchip’s registered trademarks and owned by Rockchip. All the other trademarks or registered trademarks mentioned in this document shall be owned by their respective owners.

All rights reserved. ©2020. Rockchip Electronics Co., Ltd.

Beyond the scope of fair use, neither any entity nor individual shall extract, copy, or distribute this document in any form in whole or in part without the written approval of Rockchip.

Rockchip Electronics Co., Ltd.

No.18 Building, A District, No.89, software Boulevard Fuzhou, Fujian,PRC

Website: www.rock-chips.com

Customer service Tel: +86-4007-700-590

Customer service Fax: +86-591-83951833

Customer service e-Mail: fae@rock-chips.com


Preface

Overview

This document introduces how to use pin module APIs of RT-Thread os.

Since the rt-thread lacks of iomux related API currently, user must to call HAL_PINCTRL_* APIs to do iomux and io configure.

Product Version

ChipsetKernel Version
RK625/RK2108/RK2206/RV1126RT-Thread

Intended Audience

This document (this guide) is mainly intended for:

Technical support engineers

Software development engineers


Revision History

VersionAuthorDateChange Description
V1.0.0Jianqun Xu2020-12-15Initial version

Contents

[TOC]


PIN

The eGPIO_bankId is the index for gpio group.

On Rockchip SoCs, there are several gpio controllers, each one has max to 32 pins.

The gpio controllers are sorted in an index called bank id:

  • GPIO0 called to bank0,
  • GPIO1 called to bank1,
  • GPIO2 called to bank2,
  • ...

PIN Index

typedef enum {
GPIO0_A0 = 0,
GPIO0_A1,
GPIO0_A2,
GPIO0_A3,
GPIO0_A4,
GPIO0_A5,
GPIO0_A6,
GPIO0_A7,
GPIO0_B0 = 8,
GPIO0_B1,
GPIO0_B2,
GPIO0_B3,
GPIO0_B4,
GPIO0_B5,
GPIO0_B6,
GPIO0_B7,
GPIO0_C0 = 16,
GPIO0_C1,
GPIO0_C2,
GPIO0_C3,
GPIO0_C4,
GPIO0_C5,
GPIO0_C6,
GPIO0_C7,
GPIO0_D0 = 24,
GPIO0_D1,
GPIO0_D2,
GPIO0_D3,
GPIO0_D4,
GPIO0_D5,
GPIO0_D6,
GPIO0_D7,
GPIO1_A0 = 32,
...
GPIO2_A0 = 64,
...
GPIO3_A0 = 96,
...
GPIO4_A0 = 128,
...
GPIO4_D0 = 152,
GPIO4_D1,
GPIO4_D2,
GPIO4_D3,
GPIO4_D4,
GPIO4_D5,
GPIO4_D6,
GPIO4_D7,
GPIO_NUM_MAX = 160
} ePINCTRL_PIN;

PIN Bit

The mPins is used by multiply pins to configure once time, each bit in uint32 type indicates on pin.

#define GPIO_PIN_A0 (0x00000001U)  /*!< Pin 0 selected    */
#define GPIO_PIN_A1 (0x00000002U) /*!< Pin 1 selected */
#define GPIO_PIN_A2 (0x00000004U) /*!< Pin 2 selected */
#define GPIO_PIN_A3 (0x00000008U) /*!< Pin 3 selected */
#define GPIO_PIN_A4 (0x00000010U) /*!< Pin 4 selected */
#define GPIO_PIN_A5 (0x00000020U) /*!< Pin 5 selected */
#define GPIO_PIN_A6 (0x00000040U) /*!< Pin 6 selected */
#define GPIO_PIN_A7 (0x00000080U) /*!< Pin 7 selected */
#define GPIO_PIN_B0 (0x00000100U) /*!< Pin 8 selected */
#define GPIO_PIN_B1 (0x00000200U) /*!< Pin 9 selected */
#define GPIO_PIN_B2 (0x00000400U) /*!< Pin 10 selected */
#define GPIO_PIN_B3 (0x00000800U) /*!< Pin 11 selected */
#define GPIO_PIN_B4 (0x00001000U) /*!< Pin 12 selected */
#define GPIO_PIN_B5 (0x00002000U) /*!< Pin 13 selected */
#define GPIO_PIN_B6 (0x00004000U) /*!< Pin 14 selected */
#define GPIO_PIN_B7 (0x00008000U) /*!< Pin 15 selected */
#define GPIO_PIN_C0 (0x00010000U) /*!< Pin 16 selected */
#define GPIO_PIN_C1 (0x00020000U) /*!< Pin 17 selected */
#define GPIO_PIN_C2 (0x00040000U) /*!< Pin 18 selected */
#define GPIO_PIN_C3 (0x00080000U) /*!< Pin 19 selected */
#define GPIO_PIN_C4 (0x00100000U) /*!< Pin 20 selected */
#define GPIO_PIN_C5 (0x00200000U) /*!< Pin 21 selected */
#define GPIO_PIN_C6 (0x00400000U) /*!< Pin 22 selected */
#define GPIO_PIN_C7 (0x00800000U) /*!< Pin 23 selected */
#define GPIO_PIN_D0 (0x01000000U) /*!< Pin 24 selected */
#define GPIO_PIN_D1 (0x02000000U) /*!< Pin 25 selected */
#define GPIO_PIN_D2 (0x04000000U) /*!< Pin 26 selected */
#define GPIO_PIN_D3 (0x08000000U) /*!< Pin 27 selected */
#define GPIO_PIN_D4 (0x10000000U) /*!< Pin 28 selected */
#define GPIO_PIN_D5 (0x20000000U) /*!< Pin 29 selected */
#define GPIO_PIN_D6 (0x40000000U) /*!< Pin 30 selected */
#define GPIO_PIN_D7 (0x80000000U) /*!< Pin 31 selected */

#define GPIO_PIN_ALL (0xFFFFFFFFU) /*!< All pins selected */

IOMUX

API

PIN MUX

HAL_PINCTRL_SetIOMUX(eGPIO_bankId bank, uint32_t mPins, ePINCTRL_configParam param);

PIN CONFIG

HAL_PINCTRL_SetParam(eGPIO_bankId bank, uint32_t mPins, ePINCTRL_configParam param);

Other

HAL_Status HAL_PINCTRL_Suspend(void);
HAL_Status HAL_PINCTRL_Resume(void);
HAL_Status HAL_PINCTRL_Init(void);
HAL_Status HAL_PINCTRL_DeInit(void);

Params

eGPIO_bankId

typedef enum {
#ifdef GPIO0
GPIO_BANK0 = 0,
#endif
#ifdef GPIO1
GPIO_BANK1 = 1,
#endif
#ifdef GPIO2
GPIO_BANK2 = 2,
#endif
#ifdef GPIO3
GPIO_BANK3 = 3,
#endif
#ifdef GPIO4
GPIO_BANK4 = 4,
#endif
GPIO_BANK_NUM
} eGPIO_bankId;

mPins

See above.

Example

Set iomux for i2c0

#define FUNC_GPIO0B4_FUNC1_I2C0_SDA GPIO_BANK0,GPIO_PIN_B4,PIN_CONFIG_MUX_FUNC1
#define FUNC_GPIO0B5_FUNC1_I2C0_SCL GPIO_BANK0,GPIO_PIN_B5,PIN_CONFIG_MUX_FUNC1

void i2c0_iomux_config(void)
{
HAL_PINCTRL_SetIOMUX(FUNC_GPIO0B4_FUNC1_I2C0_SDA);
HAL_PINCTRL_SetIOMUX(FUNC_GPIO0B5_FUNC1_I2C0_SCL);
}

GPIO

API

PIN MODE

void rt_pin_mode(rt_base_t pin, rt_base_t mode);

PIN WRITE

void rt_pin_write(rt_base_t pin, rt_base_t value);

PIN READ

int  rt_pin_read(rt_base_t pin);

PIN IRQ

ATTACH

rt_err_t
rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args);

DETACH

rt_err_t rt_pin_detach_irq(rt_int32_t pin);

ENABLE

rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);

Example

Set INPUT

HAL_PINCTRL_SetIOMUX(GPIO_BANK0, GPIO_PIN_B0, PIN_CONFIG_MUX_FUNC0);
rt_pin_mode(GPIO0_B0, PIN_MODE_INPUT);

Set OUT HIGH

HAL_PINCTRL_SetIOMUX(GPIO_BANK0, GPIO_PIN_B0, PIN_CONFIG_MUX_FUNC0);
rt_pin_mode(GPIO0_B0, PIN_MODE_OUTPUT);
rt_pin_write(GPIO0_B0, GPIO_HIGH);

Set IRQ

pin_info = BANK_PIN(bank, pin);
rt_pin_attach_irq(pin_info, PIN_IRQ_MODE_RISING_FALLING, isr, NULL);
rt_pin_irq_enable(pin_info, PIN_IRQ_ENABLE);