4

外部レーザーを制御する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 ドライバをプログラムするだけでよいのでしょうか?

4

1 に答える 1

7

ライン分野を見てください。これを使用して、カーネル空間で定義されたいくつかの読み取りおよび書き込みルーチンに tty デバイスを接続し、シリアル ラインを使用してドライバーを書き込むことができます。ライン制御はユーザー空間から接続され、残りはすべてカーネルが行います。

良い例はslcan (drivers/net/can/slcan.c) です。これを処理する libc 呼び出しの例は、can-utils ( https://gitorious.org/linux-can/can-utils ) にあります。Linux Device Drivers の第 18 章で作業することを好む場合は、最初のステップとしてhttp://www.makelinux.net/ldd3/chp-18を参照してください。ただし、この本は最新のものではありません。一部の詳細は、 http://www.linusakesson.net/programming/tty/にも記載されています。

于 2013-11-13T10:40:47.083 に答える