2013-09-30 5 views
3

ядра системы Я пишу модуль ядра Linux v3.2 контролировать внешний лазер, но у меня возникают проблемы передачи сигналов через последовательный порт RS232 на машине.RS232 последовательный коммуникационный порт в

Там кажется серийный драйвер уже скомпилирован в моем ядре холдинга собственности на ioport адреса Я хочу получить доступ:

# cat /proc/ioports | grep serial 
    02e8-02ef : serial 
    02f8-02ff : serial 
    03f8-03ff : serial 

Это имеет смысл, так как Linux позволяет Пользовательские программы использовать узлы устройств в /dev/ttyS* для связи через последовательные порты. Например, вот как я могу настроить устройство для ЖК-панели:

#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), но изнутри kernelspace.

Хотя я могу выгрузить по умолчанию Linux серийного драйвера и заменить его с моим собственным драйвером пользовательского RS232, я не хочу, чтобы изобретать колесо здесь - по умолчанию Linux серийного драйвер появляется для поддержки функциональности I требуют.

Есть ли простой способ связи через последовательные порты RS232 в kernelspace (возможно, с помощью этого стандартного Linux драйвера серийного), или мне просто нужно запрограммировать собственный драйвер RS232?

+0

Рассмотрите вопрос, как «Я пытаюсь сделать это (пример кода), и мне нужен этот результат (ожидаемый вывод), но я получаю это вместо (фактический вывод)». Как бы то ни было, вы просите нас угадать, на каком из возможных сценариев более 100 вариантов ваше текущее решение. Удачи. – shellter

+0

@shellter Является ли эта обновленная версия моего вопроса более ясной сфера моей проблемы? –

+0

намного лучше, и теперь мы знаем, что вы используете 'c' (вы получите большую помощь, если вы добавите тег для 'c'). Но я до сих пор не знаю, что вы имеете в виду «общаться», я предполагаю, что вы имеете в виду отправку и получение информации, но реальный пример «привет мир» -> «мир sez hello back» прояснит то, что вы надеетесь достичь , Поскольку у вас это помечено как 'linux', я думал о скрипте' bash | ksh' для связи с '/ dev/tty/1' и т. Д. Я не думаю, что мне будет очень полезно дать ваш c-код (не делали ничего подобного в течение длительного времени ;-)). Удачи! – shellter

ответ

4

Посмотрите на линии дисциплин. Вы можете использовать его, чтобы прикрепить устройство tty к некоторым процедурам чтения и записи, определенным в kernelspace, и, таким образом, написать драйвер, используя последовательную линию. Линейная дисциплина привязана к нему из пользовательского пространства, и ядро ​​сделает все остальное.

Хорошим примером является slcan (drivers/net/can/slcan.c). Примеры обработки вызовов libc можно найти в can-utils (https://gitorious.org/linux-can/can-utils). Если вы предпочитаете работать по книге 18 главы Linux Device Drivers, мы сделаем хороший первый шаг: http://www.makelinux.net/ldd3/chp-18, хотя книга не очень актуальна. Некоторые детали также можно найти по адресу http://www.linusakesson.net/programming/tty/.

Смежные вопросы