我正在为Linux v3.2编写内核模块,用于控制外部激光器,但我在通过机器上的RS232串行端口进行信号传输时遇到了问题。
似乎已经在我的内核中编译了一个串行驱动程序,拥有我想要访问的ioport地址的所有权:
然而,这是一个用户空间接口,因此与我的内核空间模块 不兼容。我需要一种方法来在内核空间中产生相同的效果(RS232串行I/O)。
虽然我可以卸载默认的Linux 串行驱动程序并用自己的自定义RS232驱动程序替换它,但我不想重复造轮子 - 默认的Linux 串行 驱动程序似乎支持我所需的功能。
是否有一种简单的方式可以通过内核空间使用RS232串行端口(也许是通过默认的Linux 串行驱动程序),还是我只能编写自己的自定义RS232驱动程序?
# cat /proc/ioports | grep serial
02e8-02ef : serial
02f8-02ff : serial
03f8-03ff : serial
这是有道理的,因为Linux允许用户空间程序使用/dev/ttyS*
设备节点通过串行端口进行通信。例如,以下是我为LCD面板设置设备的方法:
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
...
/* Initialization and configuration */
const char *const lcd_dev = "/dev/ttyS1";
int lcd_dev_fd = open(lcd_dev, O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(lcd_dev_fd, F_SETFL, 0);
struct termios options;
tcgetattr(lcd_dev_fd, &options);
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
tcsetattr(lcd_dev_fd, TCSANOW, &options);
...
/* sending bytes */
const unsigned char scls[] = {0xFE, 'X', 0xFE, 75, 0xFE, 84, 0xFE, 'H'};
write(lcd_dev_fd, scls, sizeof(scls);
然而,这是一个用户空间接口,因此与我的内核空间模块 不兼容。我需要一种方法来在内核空间中产生相同的效果(RS232串行I/O)。
虽然我可以卸载默认的Linux 串行驱动程序并用自己的自定义RS232驱动程序替换它,但我不想重复造轮子 - 默认的Linux 串行 驱动程序似乎支持我所需的功能。
是否有一种简单的方式可以通过内核空间使用RS232串行端口(也许是通过默认的Linux 串行驱动程序),还是我只能编写自己的自定义RS232驱动程序?
ioctl()
公开您的 ioport 操作,然后其余部分可以存在于用户空间中。 - Peter