外部レーザーを制御するLinux v3.2用のカーネル モジュールを作成していますが、マシンのRS232 シリアル ポートを介した信号の通信に問題があります。
アクセスしたい ioport アドレスへの所有権を保持しているカーネルで既にコンパイルされているシリアルドライバーがあるようです。
# cat /proc/ioports | grep serial
02e8-02ef : serial
02f8-02ff : serial
03f8-03ff : serial
/dev/ttyS*
Linux ではユーザー空間プログラムがデバイス ノードを使用してシリアル ポート経由で通信できるため、これは理にかなっています。たとえば、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 ドライバをプログラムするだけでよいのでしょうか?