首页 > 技术知识 > 正文

1. 前言

使用GPIO 7作为PWM8和GPIO 14作为PWM 7 在发布32.4.1版本上使用Jetson_Xavier_NX_Module_Pinmux_Configuration_Template。 提到的引脚作为gpio工作,但我无法将它们配置为pwm。

2.修改cfg文件

不像Jetson Nano, Xavier NX使用cfg文件(tegra19x-mb1-pinmux-p3668-a01.cfg) 来控制pinmux而不是dtb。

我能够看到GPIO14作为PWM工作,而我不能看到GPIO7作为PWM。 因此,我将GPIO14的cfg设置复制到tegra19x-mb1-pinmux-p3668-a01.cfg中的GPIO7中。

从电子表格创建dts文件后,请检查下面路径下的README文件,以使用python脚本生成新的cfg文件。

~/nvidia/nvidia_sdk/JetPack_4.4_DP_Linux_DP_JETSON_XAVIER_NX/Linux_for_Tegra/kernel/pinmux/t19x$ ls addr_info.txt mandatory_pinmux.txt pinmux-dts2cfg.py README.txt gpio_addr_info.txt pad_info.txt por_val.txt 3. 调试结果

我又试了一次,结果还是一样。GPIO14可以工作,但GPIO7不能工作。

我修改了(tegra19x-mb1-pinmux-p3668-a01.cfg),将GPIO7的值改为GPIO14,如下所示。cfg文件中“GPIO14”的值为

pinmux.0x0243d038 = 0x00000410; # gp_pwm2_px2: gp, tristate-enable, input-disable, lpdr-disable

但GPIO7的值为:

pinmux.0x0243d030 = 0x00000415; # gp_pwm3_px3: rsvd1, pull-down, tristate-enable, input-disable, lpdr-disable. So I changed GPIO7 to pinmux.0x0243d030 = 0x00000410; # gp_pwm3_px3: gp, tristate-enable, input-disable, lpdr-disable

在编译& 刷机后,我使用下面的说明来尝试触发模块上的PWM信号:

为了弄清楚GPIO7是否映射到3个pwm器件中的任何一个。 (3280000.pwm, 32c0000.pwm, 32f0000.pwm) 我在所有3上尝试了这些命令,并探测了一个pwm信号的引脚没有成功

CONFIG_PWM_SYSFS=y cd 32X0000.pwm/pwm/pwmchipY echo 0 > export cd pwm0 echo 200000 > period echo 100000 > duty_cycle echo 1 > enable 4. 检查pinmux

GPIO 7是PWM 8, GPIO14是PWM5

gpio7: pinmux.0x02430040 = 0x00000056; # soc_gpio44_pr0: rsvd2, pull-down, tristate-enable, input-enable, io_high_voltage-disable, lpdr-disable gpio14: pinmux.0x02434090 = 0x00000414; # soc_gpio12_ph0: rsvd0, pull-down, tristate-enable, input-disable, lpdr-disable

在两个寄存器中都将值改为0x455并检查PWM信号吗? 测试后没有任何改变。 GPIO 14在示波器上仍然显示为PWM信号,但GPIO7保持在0。

在这个cfg文件中进行了更改: tegra19x-mb1-pinmux-p3668-a01.cfg。 该文件存在于两个地方,都被修改了。 更改如下:

pinmux.0x02430040 = 0x00000455; # NVIDIA says GPIO7 = PWM8 pinmux.0x02434090 = 0x00000455; # NVIDIA says GPIO14 = PWM5

在pinmux电子表格上,GPIO07与GP_PWM8相同,但GPIO14是GP_PW6。

GPIO7应该是这样的

pinmux.0x02430040 = 0x00000401; # soc_gpio44_pr0: gp, tristate-disable, input-disable, lpdr-disable

GPIO14是这样的:

pinmux.0x02434098 = 0x00000401; # soc_gpio13_ph1: gp, tristate-disable, input-disable, lpdr-disable 5. 查看dts

将pinmux配置电子表格与pinmux.cfg文件进行比较, 我确定GPIO14/PWM6的寄存器是0x02434098,而GPIO7/PWM8的寄存器是0x02430040。

就像我之前说的,GPIO14/PWM6默认情况下工作,没有任何改变, 但是当GPIO7/PWM8被分配与GPIO14/PWM6相同的值时,GPIO7/PWM8保持低值,

例如0x455, 0x401, 0x409, 0x405, GPIO7/PWM8从不工作。 然而,GPIO14/PWM6的值变化似乎只影响启动duty_cycle/ cur_pwm值,即它是130还是0。

所有与PWM相关的节点在设备树上都是开启的

wm@3280000 { status = “okay”; }; pwm@32c0000 { status = “okay”; }; pwm@32d0000 { status = “okay”; }; pwm@32f0000 { status = “okay”; }; pwm@c340000 { status = “okay”; }; 6. 对比gpio寄存器

正确的寄存器是:

gpio7:(Pin 32 on 40-pin header) pinmux.0x02430040 = 0x00000056; # soc_gpio44_pr0: rsvd2, pull-down, tristate-enable, input-enable, io_high_voltage-disable, lpdr-disable gpio14: (FAN pin present on SOC) pinmux.0x02434090 = 0x00000414; # soc_gpio12_ph0: rsvd0, pull-down, tristate-enable, input-disable, lpdr-disablegpio7:(40针头部上的32针) pinmux 0x02430040 = 0 x00000056;# soc_gpio44_pr0: rsvd2,下拉,trstate -enable, input-enable, io_high_voltage-disable, lpdr-disable gpio14:(FAN引脚在SOC上) pinmux 0x02434090 = 0 x00000414;# soc_gpio12_ph0: rsvd0, pull-down, trstate -enable, input-disable, lpdr-disable pinmux 0x02434098 = 0 x00000401;# soc_gpio13_ph1是CPU_OVR_VID引脚,也指向GPIO14。

风扇PWM引脚在默认情况下是不使用的,使用CPU_OVR引脚,它已经被配置为PWM。 所以是有效的

在GPIO14的工作case中转储以下寄存器 0x02434098 (GPIO14: PWM6: CPU_OVR_VID) 0 x02434090 (GPIO14 PWM5):

以下是将0x02430040更改为0x401后的值。同时,在示波器的40引脚头上的pin32是0。

busybox devmem 0x02430040 0x00000401 busybox devmem 0x02434090 0x00000414 busybox devmem 0x02434098 0x00000401 7. 查询gpio是否在切换 不使用引脚作为PWM,保持gpio 短针31和32在40针头部 echo 424 > /sys/class/gpio/export echo 416 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio416/direction echo in > /sys/class/gpio/gpio424/direction echo 1 > /sys/class/gpio/gpio416/value cat /sys/class/gpio/gpio424/value ##在32脚测量电压,应该是3.3V echo 0 > /sys/class/gpio/gpio416/value cat /sys/class/gpio/gpio424/value ##检查32脚电压,应该是0V 重复步骤7的步骤3-4次。

猜你喜欢