我编写了一个函数来处理来自用户空间的自定义键盘的输入。我用“direction”(输入)和“edge”(上升)属性配置了 gpios。然后我的函数使用 poll 来获取文件描述符的中断:
const unsigned int POLL_TIMEOUT = 3000;
const unsigned int MAX_BUF = 64;
struct pollfd fdset[6];
int nfds = 6;
int KEY_UP_fd, KEY_DOWN_fd, KEY_STOP_fd, KEY_LEFT_fd, KEY_RIGHT_fd, KEY_OK_fd;
char *buf0[MAX_BUF], *buf1[MAX_BUF], *buf2[MAX_BUF],*buf3[MAX_BUF],*buf4[MAX_BUF],*buf5[MAX_BUF];
int len,timeout, rc;
KEY_UP_fd = gpio_fd_open(KEY_UP);
KEY_DOWN_fd = gpio_fd_open(KEY_DOWN);
KEY_STOP_fd = gpio_fd_open(KEY_STOP);
KEY_EVAC_fd = gpio_fd_open(KEY_LEFT);
KEY_CANCEL_fd = gpio_fd_open(KEY_RIGHT);
KEY_OK_fd = gpio_fd_open(KEY_OK);
timeout = POLL_TIMEOUT;
while (1)
{
memset((void*)fdset, 0, sizeof(fdset));
fdset[0].fd = KEY_UP_fd;
fdset[0].events = POLLPRI;
fdset[1].fd = KEY_DOWN_fd;
fdset[1].events = POLLPRI;
fdset[2].fd = KEY_STOP_fd;
fdset[2].events = POLLPRI;
fdset[3].fd = KEY_LEFT_fd;
fdset[3].events = POLLPRI;
fdset[4].fd = KEY_RIGHT_fd;
fdset[4].events = POLLPRI;
fdset[5].fd = KEY_OK_fd;
fdset[5].events = POLLPRI;
rc = poll(fdset, nfds, timeout);
if (rc < 0) {
printf("Error!");
}
if (fdset[0].revents & POLLPRI) {
lseek(fdset[0].fd, 0, SEEK_SET);
len = read(fdset[0].fd, buf0, MAX_BUF);
}
if (fdset[1].revents & POLLPRI) {
lseek(fdset[1].fd, 0, SEEK_SET);
len = read(fdset[1].fd, buf1, MAX_BUF);
}
if (fdset[2].revents & POLLPRI) {
lseek(fdset[2].fd, 0, SEEK_SET);
len = read(fdset[2].fd, buf2, MAX_BUF);
}
if (fdset[3].revents & POLLPRI) {
lseek(fdset[3].fd, 0, SEEK_SET);
len = read(fdset[3].fd, buf3, MAX_BUF);
}
if (fdset[4].revents & POLLPRI) {
lseek(fdset[4].fd, 0, SEEK_SET);
len = read(fdset[4].fd, buf4, MAX_BUF);
}
if (fdset[5].revents & POLLPRI) {
lseek(fdset[5].fd, 0, SEEK_SET);
len = read(fdset[5].fd, buf5, MAX_BUF);
}
fflush(stdout);
有没有办法在代码中添加去抖动功能?通常去抖动器使用“直接” gpio 读取,而不是中断,所以我现在不知道它是否可行。