Форум программистов, компьютерный форум, киберфорум
Софт для Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370

Драйвер для работы с COM портом в Linux 5.4

28.10.2021, 21:04. Показов 1838. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Спрашиваю здесь, т.к. раздел "Написание драйверов", похоже, весь для Windows.

Просьба сказать, где можно найти описание того, как для ядра 5.4 писать драйвера
для работы с COM-портами или где можно найти пример такого драйвера.
Сам я драйверо не писал, только однажды написал простенький модуль ядра.

*****************

Есть плата MIC-3612 от Advantech с шиной cPCI и COM-портами, но драйвер для неё
только старый, с ядром 4.15 работает, а для ядра 5.4 драйвера нет.
В дравйвере используется структура tty_operations с элементом:
C
1
    const struct file_operations *proc_fops;
и этой proc_fops присваивается адрес стрруктуры uart_proc_fops вот такой:
C
1
2
3
4
5
6
7
static const struct file_operations uart_proc_fops = {
    .owner      = THIS_MODULE,
    .open       = uart_proc_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};
____________________

В ядре 5.4 в структуре tty_operations вместо proc_fops такая строка:
C
1
int (*proc_show)(struct seq_file *, void *);
*****************

Т.е. элемент типа file_operations, похоже, должен быть отдельно, но всё равно я не знаю,
что делать с вышеприведёнными структурами, нужно описани или пример, а лучпе и то и другое.
В обоих ядрах структуры seq_file и seq_operations одинаковы, но я не знаю, как их приспособить
к строке
int (*proc_show)(struct seq_file *, void *);
что должна делать proc_show(), что передаваться через (void *).

*****************
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct seq_file {
    char *buf;
    size_t size;
    size_t from;
    size_t count;
    size_t pad_until;
    loff_t index;
    loff_t read_pos;
    u64 version;
    struct mutex lock;
    const struct seq_operations *op;
    int poll_event;
    const struct file *file;
    void *private;
};
 
struct seq_operations {
    void * (*start) (struct seq_file *m, loff_t *pos);
    void (*stop) (struct seq_file *m, void *v);
    void * (*next) (struct seq_file *m, void *v, loff_t *pos);
    int (*show) (struct seq_file *m, void *v);
};
*****************
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2021, 21:04
Ответы с готовыми решениями:

Класс для работы с com портом
Доброго времени суток! Начинаю работать с с# есть у кого-нибудь готовый класс для работы с SerialPort: открытие и закрытие...

Программа для работы с com портом
Пишу программу, которая будет посылать сообщение на com порт. Нужно виртуальное устройство com, которое выводила бы полученные сообщения. ...

Библиотека для работы с COM портом
Добрый вечер! Пишу программу, которая общается с внешним устройством, через СОМ порт. Я сделал библиотеку, которая прописывает функции...

10
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
28.10.2021, 22:04
А как именно заполняется этот file_operations? Могу предположить, что он и не нужен для tty.
Можете выложить тот драйвер... просто любопытно посмотреть, какие колбеки там используют.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
28.10.2021, 22:22  [ТС]
Humanoid, а выше приведено, там, где .owner, .open, .read и т.д.
Это ведь необходимо для любого модуля, прежде всего .owner.
Текст сейчас поищу.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
28.10.2021, 22:31  [ТС]
Humanoid, пробую вложить архив, каталог 4.15. Там в *.zip исходный архив.
Вложения
Тип файла: zip adv950_source_v3.42.6.tar.gz.zip (239.7 Кб, 41 просмотров)
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
28.10.2021, 22:34
Скорее всего, вся это работа с файлами теперь делается в более высокоуровневом слое. Например, в том же 4.15 нашёл всего пару драйверов serial, которые использовали file_operations... и то там эти колбеки заполнялись:
Code
1
2
3
4
5
    .owner      = THIS_MODULE,
    .open       = crisv10_proc_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
А crisv10_proc_open() просто вызывал single_open(), который в качестве аргумента преедавал указатель на функцию crisv10_proc_show(). Видимо, теперь эта функция сразу записывается в tty_operations.

В общем, это всё похоже на вывод отладочной информации, которая для работы не нужна. Попробуйте закомментировать присвоение uart_proc_fops для tty_operations.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
28.10.2021, 22:39  [ТС]
Humanoid, благодарю, буду пробовать.
Забыл сказать, что для ядра 5.4 в Makefile надо "SUBDIRS" заменить на "M".
Но ведь модуль без .owner невозможен?
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
28.10.2021, 23:08
Закомментировал строку
Code
1
.proc_fops  = &uart_proc_fops,
и всё собралось. Но проверить только вы сможете. Но в более новых версиях ядра это уже не прокатит... видимо, там было много изменений.

Кстати, драйвер 8250 есть уже довольно давно в основной ветке ядра. Он не работает с этим адаптером?

Добавлено через 2 минуты
Если так не будет работать, то можете вместо этой строки указать
Code
1
.proc_show = &uart_proc_show,
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
28.10.2021, 23:12  [ТС]
Humanoid, ещё раз благодарю, буду пробовать. Не знаю, успею ли завтра.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
29.10.2021, 13:48  [ТС]
Humanoid, вроде бы драйвер работает. Достаточно оказалось именить одну строку по Вашему совету:
C
1
.proc_show = &uart_proc_show,
Благодарю за помощь.
0
0 / 0 / 0
Регистрация: 22.11.2024
Сообщений: 1
22.11.2024, 11:36
Коллеги, а для ядра 5.10 можно пересобрать драйвер?

Добавлено через 11 минут
Пробовал на ядре 4.19 в ALT Linux 10.2 собрать драйвер, который здесь прикреплен, но он не собирается из-за ошибки в serial_core.o
Если не сложно, посоветуйте как поправить serial_core.o, чтобы убрать ошибку?

[root@ktm-test 4.15]# make -w -C /lib/modules/4.19.252-xenomai-alt1.cip78.23/build/ M=/tmp/adv950_source_v3.42.6/4.15 modules
make[1]: вход в каталог «/usr/src/linux-4.19.252-xenomai-alt1.cip78.23»
CC [M] /tmp/adv950_source_v3.42.6/4.15/8250.o
CC [M] /tmp/adv950_source_v3.42.6/4.15/8250_pci.o
CC [M] /tmp/adv950_source_v3.42.6/4.15/serial_core.o
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘uart_port_startup’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:234:21: error: ‘ASYNC_CTS_FLOW’ undeclared (first use in this function)
234 | if (port->flags & ASYNC_CTS_FLOW) {
| ^~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:234:21: note: each undeclared identifier is reported only once for each function it appears in
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘uart_change_speed’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:541:11: error: ‘ASYNCB_CTS_FLOW’ undeclared (first use in this function)
541 | set_bit(ASYNCB_CTS_FLOW, &port->flags);
| ^~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:546:13: error: ‘ASYNCB_CHECK_CD’ undeclared (first use in this function)
546 | clear_bit(ASYNCB_CHECK_CD, &port->flags);
| ^~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘uart_set_info’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:1021:20: error: ‘ASYNC_INITIALIZED’ undeclared (first use in this function)
1021 | if (port->flags & ASYNC_INITIALIZED) {
| ^~~~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘uart_hangup’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:1688:20: error: ‘ASYNC_NORMAL_ACTIVE’ undeclared (first use in this function)
1688 | if (port->flags & ASYNC_NORMAL_ACTIVE) {
| ^~~~~~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:1693:13: error: ‘ASYNCB_NORMAL_ACTIVE’ undeclared (first use in this function)
1693 | clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags);
| ^~~~~~~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘adv_uart_suspend_port’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:2243:20: error: ‘ASYNC_INITIALIZED’ undeclared (first use in this function)
2243 | if (port->flags & ASYNC_INITIALIZED) {
| ^~~~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:2248:12: error: ‘ASYNCB_SUSPENDED’ undeclared (first use in this function); did you mean ‘ASYNC_SUSPENDED’?
2248 | set_bit(ASYNCB_SUSPENDED, &port->flags);
| ^~~~~~~~~~~~~~~~
| ASYNC_SUSPENDED
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:2249:14: error: ‘ASYNCB_INITIALIZED’ undeclared (first use in this function); did you mean ‘RCU_INITIALIZER’?
2249 | clear_bit(ASYNCB_INITIALIZED, &port->flags);
| ^~~~~~~~~~~~~~~~~~
| RCU_INITIALIZER
In file included from ./include/linux/tty.h:12,
from /tmp/adv950_source_v3.42.6/4.15/serial_core.c:27:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘adv_uart_resume_port’:
./include/uapi/linux/tty_flags.h:57:33: error: ‘ASYNCB_SUSPENDED’ undeclared (first use in this function); did you mean ‘ASYNC_SUSPENDED’?
57 | #define ASYNC_SUSPENDED (1U << ASYNCB_SUSPENDED)
| ^~~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:2352:20: note: in expansion of macro ‘ASYNC_SUSPENDED’
2352 | if (port->flags & ASYNC_SUSPENDED) {
| ^~~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:2371:13: error: ‘ASYNCB_INITIALIZED’ undeclared (first use in this function); did you mean ‘RCU_INITIALIZER’?
2371 | set_bit(ASYNCB_INITIALIZED, &port->flags);
| ^~~~~~~~~~~~~~~~~~
| RCU_INITIALIZER
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘adv_uart_handle_dcd_change’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:3066:20: error: ‘ASYNC_CHECK_CD’ undeclared (first use in this function)
3066 | if (port->flags & ASYNC_CHECK_CD) {
| ^~~~~~~~~~~~~~
/tmp/adv950_source_v3.42.6/4.15/serial_core.c: In function ‘adv_uart_handle_cts_change’:
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:3117:20: error: ‘ASYNC_CTS_FLOW’ undeclared (first use in this function)
3117 | if (port->flags & ASYNC_CTS_FLOW) {
| ^~~~~~~~~~~~~~
make[2]: *** [scripts/Makefile.build:304: /tmp/adv950_source_v3.42.6/4.15/serial_core.o] Ошибка 1
make[1]: *** [Makefile:1546: _module_/tmp/adv950_source_v3.42.6/4.15] Ошибка 2
make[1]: выход из каталога «/usr/src/linux-4.19.252-xenomai-alt1.cip78.23»
make: *** [/tmp/adv950_source_v3.42.6/4.15/Makefile:32: all] Ошибка 2
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
23.11.2024, 01:08
Цитата Сообщение от strmitrich Посмотреть сообщение
/tmp/adv950_source_v3.42.6/4.15/serial_core.c:234:21: error: ‘ASYNC_CTS_FLOW’ undeclared (first use in this function)
Вроде, эти дефайны есть в 5.10... в том же файле, где были в 5.4: https://elixir.bootlin.com/lin... ty_flags.h
Возможно, раньше этот файл инклудился внутри другого инклуда... можно попробовать его напрямую инклудить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2024, 01:08
Помогаю со студенческими работами здесь

C# класс для работы с COM-портом
подскажите, плз, где можно найти это чудо для .NET Framework 1.0. У MS нашел этот класс в 'C# 100 Samples', но он почему-то не...

терминал для работы с com портом.
Привет. Нужно передать на компьютер большей массив данных (размер массива более 10000 точек переменных типо double). terminal v 1.9b не...

Не устанавливается компонент для работы с COM-портом
Здравствуйте. Очень нужно программно обратиться к ком порту. Пришлось вспоминать delphi (лет 14 наверное вообще не трогал). Нашел...

Программа для работы с параллельным портом
Доброго времени! Не мог бы кто выручить, очень давно не занимаюсь программированием все забыл напрочь. Нужно простенькое приложение, даже...

Простая программа для работы с СОМ-портом
Уважаемые СПЕЦЫ! Я в Visual С++ полный &quot;0&quot;, и, учитывая возраст и работу, особо вникать не получится, поэтому прошу помочь: существует одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru