GPIO使用指南

大部分外设的驱动开发都和GPIO的操作相关,因此,熟悉我们平台的GPIO使用是非常重要的

PD1开头的port对应ck域的port

PD2开头的port对应A7域的port

PD2PORT0 - PD2PORT31 对应 gpa0 组

PD2PORT32 - PD2PORT51 对应 gpa1 组

PD1PORT0 - PD1PORT31 对应ck_gpa0 组

在VSP代码上使用GPIO

VSP控制我们芯片内的一个独立的ck-mcu芯片

CK域的GPIO支持拉高,拉低,中断,PMW操作

每一个GPIO都支持中断使能,共支持8路PMW输出

使用参考 vsp/mcu/drivers/gpio

在arm的linux上使用GPIO

每一个GPIO都支持中断使能

arm上可以操作CK域的GPIO,除了中断操作不能。但是CK不能操作arm上的GPIO

GPIO 应用层使用方法:

echo 进 export 的数字有一个换算关系: A7域的port echo 进 export 的数字就是PD1PORTXX的数字

ck域的port echo 进 export 的数字是PD1PORTXX的数字加上64

例子: 控制PD2PORT1脚

echo 1 > export cd gpio1 echo out > direction //设置管脚为输出

echo 1 > value //设置管脚为高电平

参考:https://blog.csdn.net/u014213012/article/details/53140781

驱动层使用方法:

例子:控制PD2PORT1脚

设备树节点

test:test{ compatible = "nationalchip,LEO_A7-test"; test1-gpio = <&gpa0 1 GPIO_ACTIVE_HIGH>; };

驱动代码

desc = devm_gpiod_get(&pdev->dev, "test1", GPIOD_OUT_LOW); //申请test1-gpio这个属性对应的GPIO口描述符

gpiod_direction_input(desc); //设置desc描述符对应的GPIO口为输入模式

gpiod_to_irq(desc) //获取此gpio对应的中断号

gpiod_direction_output(desc,1); //设置desc描述符对应的GPIO口为输出模式

gpiod_set_value(desc,0); //设置desc描述符对应的GPIO口输出值为0

gpio_level = gpiod_get_value(desc); //得到desc描述符对应的GPIO口的电平

devm_gpiod_put(&test_pdev->dev, desc); //释放desc描述符对应的GPIO口


关于GPIO中断在驱动和应用上的使用,提供了sample代码

链接:https://pan.baidu.com/s/19ZJrU-RpeLsE0w1uhssxTw 密码:eamd

管脚复用:

arm端的:

在uboot中修改

board/nationalchip/leo_gx8010_ssd_1v/pinmux.c

static const struct pin_config pin_table[] = {

/* id |func function0 | function1 | function2 | function3 | function4 | function5 */

{ 0, 1}, // BTDAT00    \| PD2PORT00

{ 1, 1}, // BTDAT01    \| PD2PORT01

{ 2, 1}, // BTDAT02    \| PD2PORT02

{ 3, 1}, // BTDAT03    \| PD2PORT03

{ 4, 1}, // BTCLKIN    \| PD2PORT04

{ 5, 1}, // BTRESET    \| PD2PORT05

{ 6, 1}, // BTCLKVSYNC \| PD2PORT06

{ 7, 1}, // BTCLKHREF  \| PD2PORT07

{ 8, 1}, // BTCLKOUT   \| PD2PORT08

{ 9, 3}, // BTDAT04    \| SDA2      \| SPI1SCK   \| PD2PORT09

{10, 3}, // BTDAT05    \| SCL2      \| SPI1MOSI  \| PD2PORT10

{11, 3}, // BTDAT06    \| UART2RX   \| SPI1CSn   \| PD2PORT11

{12, 5}, // BTDAT07    \| UART2TX   \| SPI1MISO  \| NUARTTX   \| AUARTTX   \| PD2PORT12

{13, 1}, // BTDAT08    \| PD2PORT13

{14, 1}, // BTDAT09    \| PD2PORT14

{15, 1}, // BTDAT10    \| PD2PORT15

{16, 1}, // BTDAT11    \| PD2PORT16

{17, 1}, // BTDAT12    \| PD2PORT17

{18, 1}, // BTDAT13    \| PD2PORT18

{19, 1}, // BTDAT14    \| PD2PORT19

{20, 1}, // BTDAT15    \| PD2PORT20

{21, 0}, // UART3RX    \| SD1CDn    \| SDA3      \| PD2PORT21

{22, 0}, // UART3TX    \| SD1DAT1   \| SCL3      \| PD2PORT22

{23, 3}, // DBGTDI     \| SD1DAT0   \| SPI2SCK   \| PD2PORT23

{24, 3}, // DBGTDO     \| SD1CLK    \| SPI2MOSI  \| PD2PORT24

{25, 3}, // DBGTMS     \| SD1CMD    \| SPI2CSn   \| PD2PORT25

{26, 3}, // DBGTCK     \| SD1DAT3   \| SPI2MISO  \| PD2PORT26

{27, 2}, // DBGTRST    \| SD1DAT2   \| PD2PORT27

{28, 0}, // UART2RX    \| SDA2      \| PD2PORT28

{29, 0}, // UART2TX    \| SCL2      \| PD2PORT29

{30, 3}, // SPI1SCK    \| NDBGTDI   \| ADBGTDI   \| PD2PORT30

{31, 3}, // SPI1MOSI   \| NDBGTDO   \| ADBGTDO   \| PD2PORT31

{32, 3}, // SPI1CSn    \| NDBGTMS   \| ADBGTMS   \| PD2PORT32

{33, 3}, // SPI1MISO   \| NDBGTCK   \| ADBGTCK   \| PD2PORT33

{34, 3}, // SPI2SCK    \| NDBGTRST  \| ADBGTRST  \| PD2PORT34

{35, 1}, // SPI2MOSI   \| PD2PORT35

{36, 1}, // SPI2CSn    \| PD2PORT36

{37, 1}, // SPI2MISO   \| PD2PORT37

{38, 0}, // SD0CDn     \| PD2PORT38

{39, 0}, // SD0DAT1    \| PD2PORT39

{40, 0}, // SD0DAT0    \| PD2PORT40

{41, 0}, // SD0CLK     \| PD2PORT41

{42, 0}, // SD0CMD     \| PD2PORT42

{43, 0}, // SD0DAT3    \| PD2PORT43

{44, 0}, // SD0DAT2    \| PD2PORT44

{45, 0}, // SD1CDn     \| PD2PORT45

{46, 0}, // SD1DAT1    \| PD2PORT46

{47, 0}, // SD1DAT0    \| PD2PORT47

{48, 0}, // SD1CLK     \| PD2PORT48

{49, 0}, // SD1CMD     \| PD2PORT49

{50, 0}, // SD1DAT3    \| PD2PORT50

{51, 0}, // SD1DAT2    \| PD2PORT51

};

ck端的:

在对应板级的 misc_board.c 代码内

索引以0开头

比如,看硬件原理图,我们要用 PD1PORT02

就修改:

{ 2, 0}, //*UART0RX | PD1PORT02 |

为:

{ 2, 1}, //*UART0RX | PD1PORT02 |

在arm上gpio输出pwm的使用:

先将对应引脚设置为gpio模式,参考管脚复用

  • pwmchip0 对应gpa0组
  • pwmchip32对应gpa1组
控制PD2PORT26脚
echo 26 > /sys/class/pwm/pwmchip0/export
cd /sys/class/pwm/pwmchip0/pwm26
echo 0 > enable          //关闭此port的pwm
echo 100000 > period     //周期设置为100 us
echo  50000 > duty_cycle //高电平持续时间设置为 50 us
echo 1 > enable
控制PD2PORT33脚
echo 1 > /sys/class/pwm/pwmchip32/export
cd /sys/class/pwm/pwmchip32/pwm1
echo 0 > enable          //关闭此port的pwm
echo 100000 > period     //周期设置为100 us
echo  50000 > duty_cycle //高电平持续时间设置为 50 us
  • 周期period和高电平持续时间最小单位为1000(1us),即输入的值要是1000的整数倍 周期最小能输入2us(2000),此时高电平持续时间为1us(1000),频率达500kHz

results matching ""

    No results matching ""