rk3568设备树修改

我要屏蔽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等实现读值和写值。