一,开启内核PPS
二、修改设备树
1、设置PPS使用的IO口
pinctrl_pps_pins: pps_pins {
fsl,pins = <
MX6UL_PAD_CSI_HSYNC__GPIO4_IO20 0x17059
>;
};
pps_pins {
compatible = "pps-gpio"; //必须为pps-gpio
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pps_pins>;
gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;//必须gpios
status = "okay";
};
编译内核,设备树,模块,并更新开发板
三、重启开发板
1、输入:
dmesg |grep pps
如上图所示pps3即为设置的pps接口
2、查看pps中断
接上PPS信号,使用如下指令查看pps中断
date #查看日期
cat /proc/interrupts |grep pps #查看中断次数
四、程序测试
新建pps_test.c,接上PPS信号(1S一次)编译生成pps_test可执行文件,1S输出一次pps
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <poll.h>
#include <signal.h>
static int fd;
static void sig_func(int sig)
{
int val;
read(fd, &val, 4);
printf("pps\n");
}
/*
* ./pps_test /dev/pps3
*
*/
int main(int argc, char **argv)
{
int val;
struct pollfd fds[1];
int timeout_ms = 5000;
int ret;
int flags;
/* 1. 判断参数 */
if (argc != 2)
{
printf("Usage: %s <dev>\n", argv[0]);
return -1;
}
signal(SIGIO, sig_func);
/* 2. 打开文件 */
fd = open(argv[1], O_RDWR);
if (fd == -1)
{
printf("can not open file %s\n", argv[1]);
return -1;
}
fcntl(fd, F_SETOWN, getpid());
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | FASYNC);
while (1)
{
sleep(2);
}
close(fd);
return 0;
}