Linux vs rs485-USB

FORUM_NAME: USB-RS485
Модератор: Модераторы
Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #121 Phoenix » 22.05.2016, 10:17

Второй способ заставить работать преобразователь Exar XR21B1411 в linux.
Этот преобразователь прекрасно работает со штатным драйвером ядра linux, но нужно изменить некоторые регистры преобразователя в момент его подключения. Для этого я написал небольшую программу и правило для udev. В момент подключения преобразователя срабатывает правило udev, запускает программу и передает ей адрес преобразователя на шине USB. Программа меняет нужные регистры и прекращает свою работу. И так каждый раз при переподключении преобразователя.

Программа распространяется в исходных кодах. Сборка и установка:

Код: Выделить всё

make
cp corExar /sbin/
cp 99-corExar.rules /etc/udev/rules.d/
udevadm control --reload

и переподключить преобразователь.

Программу проверял на USB-RS232, но должно заработать и на USB-RS485/С2000-USB, т.к. я меняю не один регистр (достаточно для USB-RS232), а четыре регистра, которые я подсмотрел раньше при работе с С2000-USB на этой же микросхеме (эти регистры устанавливал драйер от производителя микросхемы).

Возможно есть способ записать параметры инициализации этих регистров в постоянную память микросхемы, но как это сделать не написано в документации.

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #122 Phoenix » 26.05.2016, 20:28

Третий способ. Программирование параметров инициализации регистров в постоянную память.
Попереписывался с разработчиками чипа, объяснил какие мне нужно регистры записать в постоянную память, они мне выслали программу для записи этих регистров. Теперь мой преобразователь работает в linux со стандартным драйвером без всяких дополнительных настроек преобразователя и ОС. Проверил только на USB-RS232 (Exar XR21B1411) производства Болид.

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

Программа работает только в windows в командной строке:

Код: Выделить всё

OTPMongo -c COMn -f XR21B1411.xml

«n» - номер COM порта преобразователя в диспетчере устройств.

Меняются регистры:
CDC_ACM_FLOW_CONTROL (0x216) — с 0x01 до 0x00
CDC_ACM_GPIO_MODE (0x217) — с 0x01 до 0x0b
CDC_ACM_GPIO_DIRECTION ( 0x218) — с 0x08 до 0x28
CDC_ACM_GPIO_INT_MASK (0x219) — с 0x30 до 0x00
Вложения
OTPMongo.zip
(840.03 КБ) 63 скачивания

delovoy
Автор темы
delovoy
Автор темы
Репутация: 1
Сообщения: 60
Зарегистрирован: 28.11.2015
С нами: 1 год 10 месяцев
Профессия: IT

Непрочитанное сообщение #123 delovoy » 27.05.2016, 15:26

Спасибо огромное. Попробую. Значит сначало пробуем завести свисток без записи в ПЗУ, если заработает то заливаем в ПЗУ и сможем на любом линуксе без пляски с бубном программировать болиды?

Отправлено спустя 2 минуты 57 секунд:
---
Еще вопрос, а будут ли изменения в работе, если после записи в память постоянную использовать сия свисток в винде?

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #124 Phoenix » 27.05.2016, 15:48

Да. У меня в линуксе работает без всяких бубнов.
В винде тоже проверил. Работает. Никаких изменений.

delovoy
Автор темы
delovoy
Автор темы
Репутация: 1
Сообщения: 60
Зарегистрирован: 28.11.2015
С нами: 1 год 10 месяцев
Профессия: IT

Непрочитанное сообщение #125 delovoy » 14.08.2016, 00:50

delovoy писал(а):OTPMongo -c COMn -f XR21B1411.xml

На линуксе нет варианта записи в ПЗУ?

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #126 Phoenix » 14.08.2016, 14:03

Я не пробовал, может не получиться. Разработчики микросхемы писали что это нужно делать в windows.

GEgor
GEgor
Репутация: 0
Сообщения: 2
Зарегистрирован: 04.01.2017
С нами: 9 месяцев 16 дней
Профессия: Инженер

Непрочитанное сообщение #127 GEgor » 04.01.2017, 04:56

Чего-то господа вы тут намудрили.... Целый год обсуждали и даже чего-то получилось. А четкого понимания нет, чего делать-то надо.
Так к чему это я. Давича купил ноутбук и решил Винду не ставить, но так как работаю с болидовским оборудованием нужен был соответствующий функианал. Ставил ubuntu 16.04 пол дня поковырял и заработало.
К стати, на эту ветку натолкнулся случайно уже после того как нарисовал статью по настройке сего чуда. http://itsx.ru/2017/01/04/ubuntu-usb-болид-c2000-usb/
Информации в сети практически нет. Поэтому и решил изобразить что-то подобное. Надеюсь кому-то ещё пригодится.
Всех Вам благ.

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #128 Phoenix » 04.01.2017, 20:31

GEgor, видимо разработчики ubuntu включили нужный модуль в состав ядра. В вашей статье вы ведь не устанавливаете модуль ядра, а констатируете факт, что модуль уже присутствует в системе. Особо хочу подчеркнуть, что оригинальный модуль от производителя чипа не подходил, в нем кое-чего не хватало. В этом то и была проблема.

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

GEgor
GEgor
Репутация: 0
Сообщения: 2
Зарегистрирован: 04.01.2017
С нами: 9 месяцев 16 дней
Профессия: Инженер

Непрочитанное сообщение #129 GEgor » 05.01.2017, 23:12

Phoenix, все верно, модуль ядра я не устанавливал и настроил работу интерфейса в симулятором wine. Добился коннекта с устройством и каюсь опрометчиво подумал что все работает, после чего и написал статью.... Но на самом деле дела обстояли намного хуже чем мне показалось. Несмотря на то что при попытке опроса приборов которые не были подключены, светодиодный индикатор моргал так как будто он искал приборы, на самом деле ни чего не происходило. Т.е. линия 485 молчала.
Учитывая то, что я читал выше описанные вами операции с регистрами + чтение мануала привело меня к пониманию того что мне нужны исходники модуля чтобы его перенастроить (запись в регистры). Исходники взял тут https://www.exar.com/common/content/document.ashx?id=21651 Версия ядра 3,6 и выше (у меня 4.4.), компилировал по РИДМИ.
Сразу скажу что, к сожалению OTPMongo не помогла, связываю это с тем что в логе ядра четко видно как модуль ядра засылает команду на смену значения в регистра:
cdc_xr_usb_serial 1-1:1.0: xr_usb_serial_set_reg Channel:0 0xc0c = 0x0b
(это рабочий вариант)
Такой вывод сделал на основании того что компиляции модуля с значением по умолчанию
#define UART_GPIO_MODE_SEL_GPIO 0x0
В логе ядра видел следующее:
cdc_xr_usb_serial 1-1:1.0: xr_usb_serial_set_reg Channel:0 0xc0c = 0x00
Такая конфигурация к успеху не привела...
Дальше я посмотрел вашу программу и увидел адреса регистра GPIO_MODE - 0x217 и записываемое содержимое GPIO_MODE - 0xC0C данная схема мне тоже не помогла. Спасло собственно то что OTPMongo есть XML файл с необходимыми значения регистров + в вашем сообщении от » 26.05.2016, 20:28 сказано именно это.
Далее в дефолтовых исходниках модуля ядра , а точнее в файле xr_usb_serial_common.h в строке #define UART_GPIO_MODE_SEL_GPIO 0x0, заменил значениена 0x0 на 0х0b, после чего перекомпилировал модуль и запустил его. Только после этого приборы начали искаться и удалось считать конфигурацию с пульта С2000М.
Резюмируя:
1. Работоспособности удалось добиться компиляцией модуля ядра
2. Исходники модуля ядра по умолчанию не обеспечивают работоспособности преобразователя интерфейса
3. Необходима правка xr_usb_serial_common.h в строке #define UART_GPIO_MODE_SEL_GPIO 0x0
4. Статью подправлю, добавлю туда ссылки на исходники модуля ядра, а так же инструкцию по настройке модуля
Phoenix, ваши публикации в данной ветке были действительно полезными, благодарю!

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #130 Phoenix » 06.01.2017, 08:39

GEgor, пользователем delovoy был найден рабочий драйвер. Это тот-же драйвер от производителя чипа, но с нужным значением регистра. Ссылка на это есть в самом первом сообщении ветки форума.

Вы немного запутались в исходнике моей программы. В ней закомментирована строка, содержащая "GPIO_MODE 0xC0C", - это не записываемое значение, а другой регистр с которым я экспериментировал, но он оказался ненужен. Нужный регистр: "CDC_ACM_GPIO_MODE 0x217".

Любой из трех методов, на которые есть ссылка в самом первом сообщении ветки форума, рабочие. Кому что удобнее. Я пробовал все. После третьего метода, нет больше необходимости возиться с драйверами, работает в любой Linux. Особенно это актуально для всяких сборок для Raspberry.

Добавлено спустя 9 минут 17 секунд:
Добавлю, что для второго и третьего способа нужен стандартный драйвер ядра linux: cdc_acm. Драйвер от exar не нужен и скорее всего с ним не заработает.

vmf
Аватара
vmf
Репутация: 0
Сообщения: 3
Зарегистрирован: 09.02.2017
С нами: 8 месяцев 11 дней
Профессия: IT

Непрочитанное сообщение #131 vmf » 09.02.2017, 13:47

Добрый день.
Благодаря этой теме я настроил подключение к счетчику через Bolid-свисток. Программа от производителя работает под wine и без проблем считывает показания. Но хочется большего... :)
Пытаюсь работать с прибором непосредственно через bash-скрипт и ничего не выходит. Прибор не отвечает.
Собственно запрос/ответ организую так:

Код: Выделить всё

stty -F /dev/ttyXRUSB0 57600 parenb -parodd cs8 -cstopb
printf "\x01\x11\x2C\xC0">/dev/ttyXRUSB0
dd if=$port count=256

Таким же способом я считывал показания с других приборов (весы, сканеры штрихкодов), но там был RS232.
Я подозреваю, что неправильно настраиваю порт, перепробовал много вариантов, безрезультатно.
Подскажите, где подкрутить.

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #132 Phoenix » 09.02.2017, 16:35

Добрый день. Я так не пробовал, мне проще написать программу, которая обменивается с устройством. Судля по описанию stty, можно попробовать такие варианты параметров:

Код: Выделить всё

stty -F /dev/ttyXRUSB0 57600 -parenb cs8 -cstopb

Код: Выделить всё

stty -F /dev/ttyXRUSB0 57600 -parenb cs8 -cstopb clocal

Код: Выделить всё

stty -F /dev/ttyXRUSB0 57600 -parenb cs8 -cstopb clocal -crtscts


-parenb (с минусом) - отключает проверку на четность
clocal (без минуса) - отменить управляющие сигналы модема
-crtscts (с минусом) - запретить использовать RTS/CTS

vmf
Аватара
vmf
Репутация: 0
Сообщения: 3
Зарегистрирован: 09.02.2017
С нами: 8 месяцев 11 дней
Профессия: IT

USB-RS485

Непрочитанное сообщение #133 vmf » 10.02.2017, 09:46

Добрый день.
Спасибо. Попробовал предложенные варианты. Но не взлетело
Я и сам пытался играться с этими же параметрами. Видимо причина в чем то другом.

MadHacker M
Активный участник
Активный участник
Аватара
MadHacker M
Активный участник
Активный участник
Возраст: 27
Репутация: 13
Сообщения: 852
Зарегистрирован: 28.05.2012
С нами: 5 лет 4 месяца
Профессия: Программист
Откуда: МО г. Королёв

Непрочитанное сообщение #134 MadHacker » 10.02.2017, 10:06

Ну несколько очевидных вещей которые стоит проверить:
1 - вы настраиваете, пишете\читаете из одного и того же порта. Банально но мало-ли.
2 - вы уверены, что устройство должно ответить именно на такую команду? Протокол устройства является открытым или это результат исследования? Возможно что-то не учли.

Как самое простое - взять и сравнить трафик на порту от родной программы и от вашего скрипта.

vmf
Аватара
vmf
Репутация: 0
Сообщения: 3
Зарегистрирован: 09.02.2017
С нами: 8 месяцев 11 дней
Профессия: IT

Непрочитанное сообщение #135 vmf » 10.02.2017, 11:01

1. Ну это исключено. В скрипте имя файл устройства присваивается переменной, делее по тексту используется переменная.
2. Вот тут 100% уверенности нет. Ибо описание протокола есть, но не особо внятное. Конкретно команда, приведенная в примере - перехвачена из посылки родной программы.

Вопрос чем перехватить трафик... Первую команду я поймал просто подменив в wine ссылку на порт обычным файлом. Делее программа, не получив ответа, выдала ошибку и ничего больше в порт не отправляла.

Еще заметил такую вещь:
Если передернуть свисток, потом сразу запустить родную программу - связи нет. После того как я настраиваю порт с помощью stty, связь появляется.

MadHacker M
Активный участник
Активный участник
Аватара
MadHacker M
Активный участник
Активный участник
Возраст: 27
Репутация: 13
Сообщения: 852
Зарегистрирован: 28.05.2012
С нами: 5 лет 4 месяца
Профессия: Программист
Откуда: МО г. Королёв

Непрочитанное сообщение #136 MadHacker » 10.02.2017, 11:56

По первому пункту, просто из того что вы привели в качестве примера кода где смешаны переменные и полные имена.
А по второму гуглить надо. Под linux не приходилось таким заниматься. Под виндой это portmon, но в вайне он не должен взлететь - очень низкоуровневая вещь. Да и в linux должно быть что-то родное и удобное.

delovoy
Автор темы
delovoy
Автор темы
Репутация: 1
Сообщения: 60
Зарегистрирован: 28.11.2015
С нами: 1 год 10 месяцев
Профессия: IT

Непрочитанное сообщение #137 delovoy » 19.09.2017, 14:00

При подключении свистка:

Спойлер
Sep 19 14:45:04 IdeaPad kernel: [639.920729] usb 5-2: new full-speed USB device number 3 using xhci_hcd
Sep 19 14:45:04 IdeaPad kernel: [640.088056] usb 5-2: New USB device found, idVendor = 04e2, idProduct = 1411
Sep 19 14:45:04 IdeaPad kernel: [640.088060] usb 5-2: New USB device strings: Mfr = 1, Product = 2, SerialNumber = 3
Sep 19 14:45:04 IdeaPad kernel: [640.088063] usb 5-2: Product: XR21B1411
Sep 19 14:45:04 IdeaPad kernel: [640.088066] usb 5-2: Manufacturer: Exar Corp.
Sep 19 14:45:04 IdeaPad kernel: [640.088068] usb 5-2: SerialNumber: H7925505141
Sep 19 14:45:04 IdeaPad kernel: [640.091205] cdc_xr_usb_serial 5-2: 1.0: This device can not do calls on its own. It is not a modem.
Sep 19 14:45:04 IdeaPad kernel: [640.091273] cdc_xr_usb_serial 5-2: 1.0: ttyXR_USB_SERIAL0: USB XR_USB_SERIAL device
Sep 19 14:45:04 IdeaPad mtp-probe: checking bus 5, device 3: "/sys/devices/pci0000:00/0000:00:10.0/usb5/5-2"
Sep 19 14:45:04 IdeaPad mtp-probe: bus: 5, device: 3 was not an MTP device
Sep 19 14:45:23 IdeaPad ModemManager [914]: <info> Creating modem with plugin 'Generic' and '1' ports
Sep 19 14:45:23 IdeaPad ModemManager [914]: <warn> Could not grab port (tty / ttyXRUSB0): 'Can not add port' tty / ttyXRUSB0 ', unhandled serial type'
Sep 19 14:45:23 IdeaPad ModemManager [914]: <warn> Could not create modem for device at '/sys/devices/pci0000:00/0000:00:10.0/usb5/5-2': Failed to find primary AT port

Я вот не пойму, подхватился ли драйвер и зачем modemmanager пытается что то сделать с устройством. Раньше по другому выхлоп выглядел

При попытки найти устройства по rs сыпит ошибки:

Спойлер
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b0020 (device=1b access=0 func=8 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b0020 (device=1b access=0 func=8 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b0020 (device=1b access=0 func=8 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b0020 (device=1b access=0 func=8 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b001c (device=1b access=0 func=7 method=0)
fixme:ntdll:server_ioctl_file Unsupported ioctl 1b0020 (device=1b access=0 func=8 method=0)

pet-and M
Активный участник
Активный участник
pet-and M
Активный участник
Активный участник
Возраст: 38
Репутация: 43
Сообщения: 2115
Зарегистрирован: 11.11.2012
С нами: 4 года 11 месяцев
Профессия: инженер
Откуда: Санкт-Петербург

Непрочитанное сообщение #138 pet-and » 19.09.2017, 15:45

Видимо после обновления ядра какого-нибудь, драйвер снова лег не на те рельсы и надо заново назначать 485.

Phoenix M
Phoenix M
Возраст: 36
Репутация: 25
Сообщения: 313
Зарегистрирован: 21.09.2012
С нами: 5 лет
Профессия: Проектировщик
Откуда: Пятигорск

Непрочитанное сообщение #139 Phoenix » 19.09.2017, 17:31

Скорее всего разработчики дистрибутива включили в состав ядра драйвер от Exar, поэтому он загрузился вместо стандартного cdc_acm.

delovoy
Автор темы
delovoy
Автор темы
Репутация: 1
Сообщения: 60
Зарегистрирован: 28.11.2015
С нами: 1 год 10 месяцев
Профессия: IT

Непрочитанное сообщение #140 delovoy » 19.09.2017, 17:56

Phoenix писал(а):Скорее всего разработчики дистрибутива включили в состав ядра драйвер от Exar, поэтому он загрузился вместо стандартного cdc_acm.

Не, я отключал загрузку драйвера exar и смотрел логи, грузиться по прежнему cdc_acm, я делал это для того, чтобы понять какой модуль закидывать в черные списки.
pet-and писал(а):Видимо после обновления ядра какого-нибудь, драйвер снова лег не на те рельсы и надо заново назначать 485.

Я год назад переустанавливал ОС, были критические ошибки, с которыми не было желания бороться. Да и мусора много накопилось за пару лет, не хотел вручную чистить. И считайте, данная манипуляция и последующие проблемы с новой ОС. Сейчас, кстати, тоже хочу переустановить ОС, так как компилировал mesa и множество было установлено, чуть ли не 2 гига (что и когда устанавливал не помню, но мусора много) проблема пока актуальна, после переустановки ОС и установки дров, я отпишусь.

Добавлено спустя 1 минуту 35 секунд:
кстати, в хаутушки проблема с путями, где то относительные, где то абсолютные

Добавлено спустя 1 час 58 минут:
Вроде заработало, причины моей проблемы крылись в wine, сборка gallium-nine стояла и там было лишнее отключено. По поводу того, что не работало, первый текст под спойлером (это якобы) на самом деле без разницы чего там хочет модемманагер, нам главное, чтобы был подгружен драйвер cdc_xr_usb_serial. В общем, все пока работает как и раньше. Единственное, изменился драйвер exar, меньше срет в логи)))

Добавлено спустя 3 минуты 59 секунд:
И кстати, устройство теперь /dev/ttyXRUSB0, его необходимо знать, чтобы прокидывать сим.линки на com1 в директории wine и поддиректории dos[TAB] (не помню как точно)


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «USB-RS485»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость

forum-bolid.ru : Отказ от ответственности