Skip to main content

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", "Rockchip", "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);