我要屏蔽spi0,spi1,uart4这几个功能,将其端口设置为普通io口。
首先要屏蔽其功能,
c
&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原有内容 */
c
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,没有
c
gpios */
gpio_uart4_pb: gpio-uart4-pb {
rockchip,pins =<3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>,
<3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>;
};
gpio_spi0_pins: gpio-spi0-pins {
rockchip,pins =<0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>,
<0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>,
<0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>,
<0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
};
gpio_spi1_pins: gpio-spi1-pins {
rockchip,pins =<3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>,
<3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_up>,
<3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>,
<3 RK_PC3 RK_FUNC_GPIO &pcfg_pull_up>;
};
}
最后,
/* 在这里添加,确保gpio0和gpio3使用我们定义的pinctrl */
c
&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电平的实现,下面是具体的代码实现和解释,它会做和命令行一样的操作:
c
// 同样三步操作
// 1. 导出
// 2. 设置方向为in
// 3. 读取value
导出(Export)GPIO:相当于执行 echo 13 > /sys/class/gpio/export。
设置方向为输入:相当于执行 echo in > /sys/class/gpio/gpio13/direction。
读取值(Value):相当于执行 cat /sys/class/gpio/gpio13/value。
c
#include <QFile>
#include <QTextStream>
#include <QDebug>
// 假设要读取的GPIO编号是13
int gpioNumber = 13;
QString gpioBasePath = "/sys/class/gpio/";
// 1. 导出GPIO
QFile exportFile(gpioBasePath + "export");
if (exportFile.open(QIODevice::WriteOnly)) {
QTextStream out(&exportFile);
out << gpioNumber;
exportFile.close();
}
// 2. 设置方向为输入
QString directionPath = gpioBasePath + "gpio" + QString::number(gpioNumber) + "/direction";
QFile directionFile(directionPath);
if (directionFile.open(QIODevice::WriteOnly)) {
QTextStream out(&directionFile);
out << "in";
directionFile.close();
}
// 3. 读取电平值
QString valuePath = gpioBasePath + "gpio" + QString::number(gpioNumber) + "/value";
QFile valueFile(valuePath);
if (valueFile.open(QIODevice::ReadOnly)) {
QTextStream in(&valueFile);
QString value = in.readLine();
qDebug() << "GPIO" << gpioNumber << "value:" << value; // 输出 "0" 或 "1"
valueFile.close();
}
测试GPIO13 (SPI0 PB5)
c
echo "=== Testing GPIO13 ==="
echo 13 > /sys/class/gpio/export 2>/dev/null
echo in > /sys/class/gpio/gpio13/direction 2>/dev/null
value=$(cat /sys/class/gpio/gpio13/value 2>/dev/null)
echo "GPIO13 value: $value (0=LOW, 1=HIGH)"
echo 13 > /sys/class/gpio/unexport 2>/dev/null
测试所有GPIO
c
for gpio in 13 14 21 22 105 106 97 113 114 115; do
echo $gpio > /sys/class/gpio/export 2>/dev/null
echo in > /sys/class/gpio/gpio$gpio/direction 2>/dev/null
value=$(cat /sys/class/gpio/gpio$gpio/value 2>/dev/null)
echo "GPIO$gpio: $value"
echo $gpio > /sys/class/gpio/unexport 2>/dev/null
done
也可以在在
c
rp_gpio{
gpio3a7 { // pcie clock
gpio_num = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>;
gpio_function = <0>;
bias-pull-up; // 内部上拉,保证空闲高电平 以下两句没有测试
input-enable; // 明确设为输入方向(可选,驱动会自动处理)
}
}
这个比较简单了。这个会在/proc/rp_gpio/gpio3a7.
然后,用cat, echo等实现读值和写值。