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