目录
5. 重新编译内核Image并更新后,查看dmesg信息,申请pps 成功
前言描述
由于公司的项目中采用了GPS/北斗模块进行定位和授时,在使用PPS进行授时时发现,Kernel-5.10版本在申请pps gpio时报错失败,错误信息如下图所示
问题分析
1. 检查DTSI是否有配置PPS
pps {
// here use gpio for the pin in which you want pps signal. GPIO13_based_SCH
gpios = <&tegra_main_gpio TEGRA234_MAIN_GPIO(H, 0) GPIO_ACTIVE_LOW>;
compatible = "pps-gpio";
assert-falling-edge;
status = "okay";
};
2. 检查DTB更新系统启动后的dts信息是否匹配
待系统启动后,检查升级的dtb 文件是否已更新
$sudo dtc -I fs -O dts -o extracted.dts /proc/device-tree
$gedit extracted.dts
检查是否与步骤1 中的内容相符
3. 检查系统启动后的pps log信息
dmesg log 查看是failed to request PPS GPIO
nvidia@nvidia-desktop:~$ sudo dmesg | grep pps
[sudo] password for nvidia:
[ 1.602688] pps_core: LinuxPPS API ver. 1 registered
[ 1.607650] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 4.339057] pps-gpio pps: failed to request PPS GPIO
[ 4.344157] pps-gpio pps: failed to map GPIO to IRQ: -22
[ 4.349623] pps-gpio: probe of pps failed with error -22
4. 排查代码并对比Kernel4.9版本
kernel/kernel-5.10/drivers/pps/clients/pps-gpio.c
需修改Line189 一行内容,“return -EINVAL;” 改为 “return ret;”
/* GPIO setup */
if (pdata) {
data->gpio_pin = pdata->gpio_pin;
data->echo_pin = pdata->echo_pin;
data->assert_falling_edge = pdata->assert_falling_edge;
data->capture_clear = pdata->capture_clear;
data->echo_active_ms = pdata->echo_active_ms;
} else {
ret = pps_gpio_setup(pdev);
if (ret)
return ret; //-EINVAL;
}
5. 重新编译内核Image并更新后,查看dmesg信息,申请pps 成功
nvidia@nvidia-desktop:~$ sudo dmesg | grep pps
[ 1.589752] pps_core: LinuxPPS API ver. 1 registered
[ 1.594714] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 14.385358] pps pps0: new PPS source pps.
[ 14.389714] pps pps0: Registered IRQ 294 as PPS source
nvidia@nvidia-desktop:~$ ls -l /dev/pps0
crw------- 1 root root 246, 0 Sep 8 05:58 /dev/pps0
#安装pps-tools 进行对应操作即可
sudo apt install pps-tools
sudo ppstest /dev/pps*
sudo ppswatch -a /dev/pps0
#Debug 查看IO和Interrupt状态
sudo cat /sys/kernel/debug/gpio | grep -i pps
sudo cat /proc/interrupts | grep pps
后续搜寻NVIDIA Forum上发现也有给出对应的解决措施!
参考连接: