我要屏蔽spi0,spi1,uart4这几个功能,将其端口设置为普通io口。
首先要屏蔽其功能,
&uart4{// status = "okay";status="disabled";// pinctrl-names = "default";// pinctrl-0 = <&uart4m1_xfer>;};&spi0{status="disabled";/* status = "okay"; spi0_dev@0 { compatible = "rockchip,spidev"; reg = <0>; spi-max-frequency = <12000000>; spi-lsb-first; };*/};&spi1{status="disabled";/* status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi1m1_cs0 &spi1m1_pins>; spi1_dev@0 { compatible = "rockchip,spidev"; reg = <0>; spi-max-frequency = <12000000>; spi-lsb-first; };*/};然后再根目录下,增加一下内容。
/* 新增GPIO,不改动下方rp_power原有内容 */
gpio_pb1_pb2:gpio-pb1-pb2{gpios=<&gpio3 RK_PB1 GPIO_ACTIVE_LOW>,<&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;pinctrl-names="default";pinctrl-0=<&gpio_uart4_pb>;status="okay";};gpio_spi0:gpio-spi0{gpios=<&gpio0 RK_PB5 GPIO_ACTIVE_LOW>,<&gpio0 RK_PB6 GPIO_ACTIVE_LOW>,<&gpio0 RK_PC5 GPIO_ACTIVE_LOW>,<&gpio0 RK_PC6 GPIO_ACTIVE_LOW>;pinctrl-names="default";pinctrl-0=<&gpio_spi0_pins>;status="okay";};gpio_spi1:gpio-spi1{gpios=<&gpio3 RK_PA1 GPIO_ACTIVE_LOW>,<&gpio3 RK_PC1 GPIO_ACTIVE_LOW>,<&gpio3 RK_PC2 GPIO_ACTIVE_LOW>,<&gpio3 RK_PC3 GPIO_ACTIVE_LOW>;pinctrl-names="default";pinctrl-0=<&gpio_spi1_pins>;status="okay";};然后在&pinctrl增加io模式 {
……
/* 只在这里添加引脚复用配置,只有rockchip,pins,没有
gpios*/gpio_uart4_pb:gpio-uart4-pb{rockchip,pins=<3RK_PB1 RK_FUNC_GPIO&pcfg_pull_up>,<3RK_PB2 RK_FUNC_GPIO&pcfg_pull_up>;};gpio_spi0_pins:gpio-spi0-pins{rockchip,pins=<0RK_PB5 RK_FUNC_GPIO&pcfg_pull_up>,<0RK_PB6 RK_FUNC_GPIO&pcfg_pull_up>,<0RK_PC5 RK_FUNC_GPIO&pcfg_pull_up>,<0RK_PC6 RK_FUNC_GPIO&pcfg_pull_up>;};gpio_spi1_pins:gpio-spi1-pins{rockchip,pins=<3RK_PA1 RK_FUNC_GPIO&pcfg_pull_up>,<3RK_PC1 RK_FUNC_GPIO&pcfg_pull_up>,<3RK_PC2 RK_FUNC_GPIO&pcfg_pull_up>,<3RK_PC3 RK_FUNC_GPIO&pcfg_pull_up>;};}最后,
/* 在这里添加,确保gpio0和gpio3使用我们定义的pinctrl */
&gpio0{pinctrl-names="default";pinctrl-0=<&gpio_spi0_pins>;status="okay";};&gpio3{pinctrl-names="default";pinctrl-0=<&gpio_uart4_pb&gpio_spi1_pins>;status="okay";};在运行时通过 /sys/class/gpio 修改方向:
echo 13 > /sys/class/gpio/export # gpio0 PB5
设置为输出echo out > /sys/class/gpio/gpio13/direction# 设置输出值
echo 1 > /sys/class/gpio/gpio13/value
echo 0 > /sys/class/gpio/gpio13/value# 读取输入值
cat /sys/class/gpio/gpio13/value
=== 测试 UART4 的 GPIO (gpio3 PB1, PB2) ===# 编号: 105, 106
echo 105 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio105/direction
echo 1 > /sys/class/gpio/gpio105/value
cat /sys/class/gpio/gpio105/value
echo 0 > /sys/class/gpio/gpio105/value# === 测试 SPI0 的 GPIO ===# 编号: 13, 14, 21, 22
echo 13 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio13/direction # 设置为输入
cat /sys/class/gpio/gpio13/value # 读取电平# 或者设置为输出
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value# === 测试 SPI1 的 GPIO ===# 编号: 97, 113, 114, 115
echo 97 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio97/direction
echo 1 > /sys/class/gpio/gpio97/value
Qt中读取GPIO电平的实现,下面是具体的代码实现和解释,它会做和命令行一样的操作:
// 同样三步操作// 1. 导出// 2. 设置方向为in// 3. 读取value导出(Export)GPIO:相当于执行 echo13>/sys/class/gpio/export。 设置方向为输入:相当于执行 echo in>/sys/class/gpio/gpio13/direction。 读取值(Value):相当于执行 cat/sys/class/gpio/gpio13/value。#include<QFile>#include<QTextStream>#include<QDebug>// 假设要读取的GPIO编号是13intgpioNumber=13;QString gpioBasePath="/sys/class/gpio/";// 1. 导出GPIOQFileexportFile(gpioBasePath+"export");if(exportFile.open(QIODevice::WriteOnly)){QTextStreamout(&exportFile);out<<gpioNumber;exportFile.close();}// 2. 设置方向为输入QString directionPath=gpioBasePath+"gpio"+QString::number(gpioNumber)+"/direction";QFiledirectionFile(directionPath);if(directionFile.open(QIODevice::WriteOnly)){QTextStreamout(&directionFile);out<<"in";directionFile.close();}// 3. 读取电平值QString valuePath=gpioBasePath+"gpio"+QString::number(gpioNumber)+"/value";QFilevalueFile(valuePath);if(valueFile.open(QIODevice::ReadOnly)){QTextStreamin(&valueFile);QString value=in.readLine();qDebug()<<"GPIO"<<gpioNumber<<"value:"<<value;// 输出 "0" 或 "1"valueFile.close();}测试GPIO13 (SPI0 PB5)
echo"=== Testing GPIO13 ==="echo13>/sys/class/gpio/export2>/dev/null echo in>/sys/class/gpio/gpio13/direction2>/dev/null value=$(cat/sys/class/gpio/gpio13/value2>/dev/null)echo"GPIO13 value: $value (0=LOW, 1=HIGH)"echo13>/sys/class/gpio/unexport2>/dev/null测试所有GPIO
forgpio in1314212210510697113114115;doecho $gpio>/sys/class/gpio/export2>/dev/null echo in>/sys/class/gpio/gpio$gpio/direction2>/dev/null value=$(cat/sys/class/gpio/gpio$gpio/value2>/dev/null)echo"GPIO$gpio: $value"echo $gpio>/sys/class/gpio/unexport2>/dev/null done也可以在在
rp_gpio{gpio3a7{// pcie clockgpio_num=<&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>;gpio_function=<0>;bias-pull-up;// 内部上拉,保证空闲高电平 以下两句没有测试input-enable;// 明确设为输入方向(可选,驱动会自动处理)}这个比较简单了。这个会在/proc/rp_gpio/gpio3a7.
然后,用cat, echo等实现读值和写值。