Rockchip RK3399 - GPIO&PWM风扇调试

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板eMMC16GBLPDDR34GB
显示屏 :15.6英寸HDMI接口显示屏u-boot2023.04linux6.3
----------------------------------------------------------------------------------------------------------------------------

一、电路原理图

我所使用的NanoPC-T4开发板可以外接一个散热风扇,我们首先来介绍一下散热风扇硬件相关的内容。

1.1 电路原理图

下图是我们使用的NanoPC-T4开发板散热风扇的接线图:

VCC_12V0_SYS为系统电压,电压级别为12V。我们可以通过GPIOPWM实现对风扇的控制;

上图中:

  • GPIO4_C6/PWM1 输出高电平时,三极管Q41导通,N MOSQ1导通,BM03B-GHS-TBT 2号引脚输入12V电鱼,风扇转动;
  • GPIO4_C6/PWM1 输出低电平时,三极管Q41截止,N MOSQ1截止,BM03B-GHS-TBT 2号引脚没有电压输入,风扇停止;

至于GPIO2_A6_FAN_TACH引脚是用来测量转速的。

1.2 散热风扇接口引脚定义

连接器型号: JST GH系列连接器,3Pin,BM03B-GHS-TBT

Pin# Assignment Description
1 GND 0V
2 12V 12V输出,由GPIO4_C6/PWM1控制
3 GPIO2_A6_FAN_TACH 用来测量转速

二、GPIO控制

这一节我们将介绍如何通过控制GPIO口来实现控制散热风扇的运行和停止。

2.1 GPIO子系统简介

既然是控制GPIO口,那自然少不了GPIO子系统。我们在文章《linux驱动移植-GPIO子系统》中介绍过GPIO子系统相关的内容,但是有一块内容却遗漏掉了,那就是有关通过sysfs来将控制GPIO

linux内核对GPIO资源进行了抽象,抽象出来的概念就是gpiolibgpiolib汇总了GPIO的通用操作,根据GPIO的特性:

  • 对上gpiolib提供的一套统一通用的操作GPIO的软件接口,屏蔽了不同芯片的具体实现;
  • 对下gpiolib 提供了针对不同芯片操作的一套framework,针对不同芯片,只需要实现gpio controller driver ,然后使用gpiolib提供的注册函数,将其挂接到gpiolib上,这样就完成了这一套东西;

此外,为了方便应用层控制GPIO口,GPIO子系统提供了通过sysfs控制GPIO就的方式,应用层通过sysfs操作GPIO的前提是内核中已经向GPIO子系统注册GPIO资源,并且在/sys/class/目录下可以看到gpio类。

2.2 内核配置

这里我们需要进行如下配置:

General setup  ---> 
	[*] Configure standard kernel features (expert users) // CONFIG_EXPERT
Device Drivers  ---> 
	 -*- GPIO Support  --->  // CONFIG_GPIOLIB
		[*]   /sys/class/gpio/... (sysfs interface) // CONFIG_GPIO_SYSFS

其中:

  • CONFIG_GPIO_SYSFS:决定sysfs是否支持GPIO子系统,也就是能否在/sys/class/目录下看到gpio类;
  • CONFIG_GPIOLIB:决定是否将gpiolib编译进内核,如果选择否则在内核和驱动中不能使用GPIO子系统相关的函数接口;

CONFIG_GPIOLIB一般都是选择y,因为其它驱动会用到GPIO子系统;CONFIG_GPIO_SYSFS根据自己的需求来进行选择,如果不需要通过/sys/class/gpio目录下的文件来操作GPIO口,就不需要开启。

2.2.1 配置电源域

一般IO电源的电压有1.8v3.3v2.5v5.0v等,有些IO同时支持多种电压,io-domain就是配置IO电源域的寄存器,依据真实的硬件电压范围来配置对应的电压寄存器,否则无法正常工作。

RK3399datasheet中我们搜索GRF_IO_VSEL寄存器,位于GRF偏移地址offset(0x0e640):

支持两种电压配置:

  • 寄存器配置成1,一般对应的电压范围是1.62v ~ 1.98v,typical电压 1.8v;
  • 寄存器配置成0,一般对应的电压范围是3.00v ~ 3.60v,typical电压 3.3v。

在 Documentation/devicetree/bindings/power/rockchip-io-domain.yaml文中有关于RK3399 IO电源域的配置描述描述:

rk3399:
    if:
      properties:
        compatible:
          contains:
            const: rockchip,rk3399-io-voltage-domain

    then:
      properties:
        audio-supply:
          description: The supply connected to APIO5_VDD.
        bt656-supply:
          description: The supply connected to APIO2_VDD.
        gpio1830-supply:
          description: The supply connected to APIO4_VDD.
        sdmmc-supply:
          description: The supply connected to SDMMC0_VDD.

  rk3399-pmu:
    if:
      properties:
        compatible:
          contains:
            const: rockchip,rk3399-pmu-io-voltage-domain

    then:
      properties:
        pmu1830-supply:
          description: The supply connected to PMUIO2_VDD.

通过查看rockchip-io-domain.yaml文中文档, 我们知道了RK3399的电源域需要配置包含bt565audiosdmmcgpio1830,以及PMUGRF下面的pmu1830这几个supply,后面的The supplyconnected to ***_VDD表示在硬件原理图上对应的名称。

我们在rockchip-io-domain.yml中找到了gpio1830-supply对应的硬件原理图上表示为APIO4_VDD。所以通过搜索APIO4_VDD得到NanoPC-T4开发板 硬件原理图上的APIO4_VDD电源VCC_3V0是由rk808下的15号引脚VLDO8输出的;

得到了配置的名称和供电源头,在设备树里面找到对应的regulator: vcc_3v0,就可以在arch/arm64/boot/dts/rockchip/rk3399-evb.dts中追加配置;

&io_domains {
        bt656-supply = <&vcc_1v8>;
        audio-supply = <&vcca1v8_codec>;
        sdmmc-supply = <&vcc_sdio>;
        gpio1830-supply = <&vcc_3v0>;
        status = "okay";
};

&pmu_io_domains {
        pmu1830-supply = <&vcc_3v0>;
        status = "okay";
};

注意:这里为了方便我直接把所有可能用到的电源域都配置上了。

2.2.2 编译内核

linux内核根目录下执行如下命令进行编译内核:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# make -j8

u-boot-2023.04路径下的mkimage工具拷贝过来,然后在命令行使用mkimage工具编译即可:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp ../u-boot-2023.04/tools/mkimage ./
root@zhengyang:/work/sambashare/rk3399/linux-6.3# ./mkimage -f kernel.its kernel.itb
2.2.3 通过tftp烧录内核

给开发板上电,同时连接上网线,进入uboot命令行。我们将内核拷贝到tftp文件目录:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp kernel.itb /work/tftpboot/

接着给开发板上电。通过uboot命令行将kernel.itb下到内存地址0x10000000处:

=> tftp 0x10000000 kernel.itb

通过mmc write命令将内核镜像烧录到eMMC0x8000个扇区处:

=> mmc erase 0x8000 0xA000
=> mmc write 0x10000000 0x8000 0xA000
2.3 /sys/class/gpio

开发板上电后,查看/sys/class/gpio目录;

root@rk3399:~# ls /sys/class/gpio
export   gpiochip0    gpiochip32  gpiochip96
gpio156  gpiochip128  gpiochip64  unexport

gpiochipXX:每个文件夹对应一个GPIO控制器,名字的末尾是GPIO控制器中第一个GPIO口在内核中的编号;

每个gpiochipXX文件夹下面都有baselabelngpio文件;

root@rk3399:~# ll /sys/class/gpio/gpiochip128
lrwxrwxrwx 1 root root 0 Mar 15  2023 /sys/class/gpio/gpiochip128 -> ../../devices/platform/pinctrl/ff790000.gpio/gpio/gpiochip128/
root@rk3399:~# ls /sys/class/gpio/gpiochip128
base  device  label  ngpio  power  subsystem  uevent

其中:

  • base:保存的是GPIO控制器的第一个GPIO编号;
  • label:保存GPIO控制器标签;
  • ngpioGPIO控制器包含的GPIO数量;

这些数据是和内核中用来表示GPIO控制器的struct gpio_chip结构体对应的,以gpiochip128为例;

root@rk3399:~# cat /sys/class/gpio/gpiochip128/base
128
root@rk3399:~# cat /sys/class/gpio/gpiochip128/label
gpio4
root@rk3399:~# cat /sys/class/gpio/gpiochip128/ngpio
32

GPIO控制器名字是gpio4,包含32GPIO口(GPIO4_A0~A7GPIO4_B0~B7GPIO4_C0~B7GPIO4_D0~D7),第一个GPIO口在内核的编号是128,所以该端口包含128-159GPIO口。

2.4 操作GPIO

GPIO资源对上层应用是以文件的形式呈现的ÿ

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值