Linux vs rs485-USB

FORUM_NAME: USB-RS485
Модератор: Модераторы
Phoenix M
Phoenix M
Возраст: 35
Репутация: 16
Сообщения: 277
Зарегистрирован: 21.09.2012
С нами: 4 года 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
Возраст: 35
Репутация: 16
Сообщения: 277
Зарегистрирован: 21.09.2012
С нами: 4 года 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 КБ) 32 скачивания

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Непрочитанное сообщение #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
Возраст: 35
Репутация: 16
Сообщения: 277
Зарегистрирован: 21.09.2012
С нами: 4 года 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
С нами: 12 дней 14 часов
Профессия: 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
Возраст: 35
Репутация: 16
Сообщения: 277
Зарегистрирован: 21.09.2012
С нами: 4 года 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
С нами: 12 дней 14 часов
Профессия: IT

USB-RS485

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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