rk3568设备树修改 我要屏蔽spi0spi1uart4这几个功能将其端口设置为普通io口。首先要屏蔽其功能uart4{// status okay;statusdisabled;// pinctrl-names default;// pinctrl-0 uart4m1_xfer;};spi0{statusdisabled;/* status okay; spi0_dev0 { compatible rockchip,spidev; reg 0; spi-max-frequency 12000000; spi-lsb-first; };*/};spi1{statusdisabled;/* status okay; pinctrl-names default; pinctrl-0 spi1m1_cs0 spi1m1_pins; spi1_dev0 { compatible rockchip,spidev; reg 0; spi-max-frequency 12000000; spi-lsb-first; };*/};然后再根目录下增加一下内容。/* 新增GPIO不改动下方rp_power原有内容 */gpio_pb1_pb2:gpio-pb1-pb2{gpiosgpio3 RK_PB1 GPIO_ACTIVE_LOW,gpio3 RK_PB2 GPIO_ACTIVE_LOW;pinctrl-namesdefault;pinctrl-0gpio_uart4_pb;statusokay;};gpio_spi0:gpio-spi0{gpiosgpio0 RK_PB5 GPIO_ACTIVE_LOW,gpio0 RK_PB6 GPIO_ACTIVE_LOW,gpio0 RK_PC5 GPIO_ACTIVE_LOW,gpio0 RK_PC6 GPIO_ACTIVE_LOW;pinctrl-namesdefault;pinctrl-0gpio_spi0_pins;statusokay;};gpio_spi1:gpio-spi1{gpiosgpio3 RK_PA1 GPIO_ACTIVE_LOW,gpio3 RK_PC1 GPIO_ACTIVE_LOW,gpio3 RK_PC2 GPIO_ACTIVE_LOW,gpio3 RK_PC3 GPIO_ACTIVE_LOW;pinctrl-namesdefault;pinctrl-0gpio_spi1_pins;statusokay;};然后在pinctrl增加io模式 {……/* 只在这里添加引脚复用配置只有rockchip,pins没有gpios*/gpio_uart4_pb:gpio-uart4-pb{rockchip,pins3RK_PB1 RK_FUNC_GPIOpcfg_pull_up,3RK_PB2 RK_FUNC_GPIOpcfg_pull_up;};gpio_spi0_pins:gpio-spi0-pins{rockchip,pins0RK_PB5 RK_FUNC_GPIOpcfg_pull_up,0RK_PB6 RK_FUNC_GPIOpcfg_pull_up,0RK_PC5 RK_FUNC_GPIOpcfg_pull_up,0RK_PC6 RK_FUNC_GPIOpcfg_pull_up;};gpio_spi1_pins:gpio-spi1-pins{rockchip,pins3RK_PA1 RK_FUNC_GPIOpcfg_pull_up,3RK_PC1 RK_FUNC_GPIOpcfg_pull_up,3RK_PC2 RK_FUNC_GPIOpcfg_pull_up,3RK_PC3 RK_FUNC_GPIOpcfg_pull_up;};}最后/* 在这里添加确保gpio0和gpio3使用我们定义的pinctrl */gpio0{pinctrl-namesdefault;pinctrl-0gpio_spi0_pins;statusokay;};gpio3{pinctrl-namesdefault;pinctrl-0gpio_uart4_pbgpio_spi1_pins;statusokay;};在运行时通过 /sys/class/gpio 修改方向echo 13 /sys/class/gpio/export # gpio0 PB5设置为输出echo out /sys/class/gpio/gpio13/direction# 设置输出值echo 1 /sys/class/gpio/gpio13/valueecho 0 /sys/class/gpio/gpio13/value# 读取输入值cat /sys/class/gpio/gpio13/value 测试 UART4 的 GPIO (gpio3 PB1, PB2) # 编号: 105, 106echo 105 /sys/class/gpio/exportecho out /sys/class/gpio/gpio105/directionecho 1 /sys/class/gpio/gpio105/valuecat /sys/class/gpio/gpio105/valueecho 0 /sys/class/gpio/gpio105/value# 测试 SPI0 的 GPIO # 编号: 13, 14, 21, 22echo 13 /sys/class/gpio/exportecho in /sys/class/gpio/gpio13/direction # 设置为输入cat /sys/class/gpio/gpio13/value # 读取电平# 或者设置为输出echo out /sys/class/gpio/gpio13/directionecho 1 /sys/class/gpio/gpio13/value# 测试 SPI1 的 GPIO # 编号: 97, 113, 114, 115echo 97 /sys/class/gpio/exportecho out /sys/class/gpio/gpio97/directionecho 1 /sys/class/gpio/gpio97/valueQt中读取GPIO电平的实现下面是具体的代码实现和解释它会做和命令行一样的操作// 同样三步操作// 1. 导出// 2. 设置方向为in// 3. 读取value导出ExportGPIO相当于执行 echo13/sys/class/gpio/export。 设置方向为输入相当于执行 echo in/sys/class/gpio/gpio13/direction。 读取值Value相当于执行 cat/sys/class/gpio/gpio13/value。#includeQFile#includeQTextStream#includeQDebug// 假设要读取的GPIO编号是13intgpioNumber13;QString gpioBasePath/sys/class/gpio/;// 1. 导出GPIOQFileexportFile(gpioBasePathexport);if(exportFile.open(QIODevice::WriteOnly)){QTextStreamout(exportFile);outgpioNumber;exportFile.close();}// 2. 设置方向为输入QString directionPathgpioBasePathgpioQString::number(gpioNumber)/direction;QFiledirectionFile(directionPath);if(directionFile.open(QIODevice::WriteOnly)){QTextStreamout(directionFile);outin;directionFile.close();}// 3. 读取电平值QString valuePathgpioBasePathgpioQString::number(gpioNumber)/value;QFilevalueFile(valuePath);if(valueFile.open(QIODevice::ReadOnly)){QTextStreamin(valueFile);QString valuein.readLine();qDebug()GPIOgpioNumbervalue:value;// 输出 0 或 1valueFile.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)echoGPIO13 value: $value (0LOW, 1HIGH)echo13/sys/class/gpio/unexport2/dev/null测试所有GPIOforgpio 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)echoGPIO$gpio: $valueecho $gpio/sys/class/gpio/unexport2/dev/null done也可以在在rp_gpio{gpio3a7{// pcie clockgpio_numgpio3 RK_PA7 GPIO_ACTIVE_HIGH;gpio_function0;bias-pull-up;// 内部上拉保证空闲高电平 以下两句没有测试input-enable;// 明确设为输入方向可选驱动会自动处理}这个比较简单了。这个会在/proc/rp_gpio/gpio3a7.然后用cat echo等实现读值和写值。