ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: CAN в Linux  (Прочитано 11000 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
CAN в Linux
« : 26 Сентября, 2013, 15:44:12 »

Подскажите, пожалуйста, поддерживается ли CAN в linux на Тион-Про28?
На странице с описанием на Тион-Про28, в списке интерфейсов, поддерживаемых linux, интерфейс CAN отсутствует, а при загрузке платы среди сообщений есть сообщение о загрузке драйвера FlexCAN.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #1 : 26 Сентября, 2013, 16:04:10 »

Кто-нибудь уже работал с CAN в линуксе?

1) Среди исходников образа linux нашел программу cantest, в rootfs она тоже имеется. Попробовал ее запустить и получил вот такое сообщение:

#cantest can0 001#12345678
can: request_module (can-proto-1) failed
socket: Protocol not supported

По исходникам нашел, что программа затыкается при попытке открытия сокета.

2) По команде ip link show выдается список сетевых интерфейсов, среди которых есть 2 интерфейса CAN:

2: can0: <NOARP> mtu 16 qdisc noop qlen 64
    link/[280]
3: can1: <NOARP> mtu 16 qdisc noop qlen 64
    link/[280]

Среди активных сетевых интерфейсов CANа нет (смотрел командой ifconfig).
Может быть он как-то включается/отключается?
« Последнее редактирование: 26 Сентября, 2013, 16:06:02 от Ziminets »
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #2 : 26 Сентября, 2013, 16:34:40 »

Сам задаю вопросы, сам же и отвечаю :-).
Нашел на сайте freescale как включать CAN:

canconfig can0 bitrate 125000
ifconfig can0 up 

К сожалению попробовать смогу только завтра.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #3 : 27 Сентября, 2013, 15:24:37 »

Разбираюсь с CAN-ом дальше.
Оказалось, что поддержка CAN была отключена в ядре. Включил, откомпилировал, запустил... cantest выполнился без ошибки... Только вот на разъемах ничего :-(
Так что повторяю мой первый вопрос: CAN  под линуксом вообще работает? А то может быть я вообще зря стараюсь?
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: CAN в Linux
« Ответ #4 : 27 Сентября, 2013, 20:17:52 »

Ножки интерфейса CAN0 по умолчанию сконфигурированы под интерфейс UART3. Поэтому на выводах нет сигнала.
Нужно отключить UART3 - убрать из конфига ядра CONFIG_MXS_AUART3_DEVICE_ENABLE (через меню ltib отключить, похоже, нельзя), или внести изменения в файл mx28evk_pins.c.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #5 : 30 Сентября, 2013, 15:47:25 »

Спасибо, Danila! Отключение UART3 помогло. CAN заработал, но пока работает только на 500 кбит/с.
Изменить скорость его работы не получается.

ip link set can0 up type can bitrate 125000
ip: either "dev" is duplicate, or "type" is garbage

или, используя canutils:

canconfig can0 bitrate 125000
RTNETLINK answers: Operation not supported
failed to set bitrate of can0 to 125000

Прочитал, что, вроде бы, должно помочь включение пакета iproute2, но с ним образ отказывается компилироваться. Пишет, что iproute2-2.6.11-050330.tar.gz не найден. Как его правильно добавить, если на рабочем месте у меня нет интернета (сам пакет я скачал)?
« Последнее редактирование: 30 Сентября, 2013, 16:21:40 от Ziminets »
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: CAN в Linux
« Ответ #6 : 30 Сентября, 2013, 16:22:36 »

Попробуйте этой командой:

echo 500000 >> /sys/devices/platform/FlexCAN.0/bitrate
Еще инструкции по работе с CAN можно посмотреть тут: https://community.freescale.com/docs/DOC-1437
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #7 : 01 Октября, 2013, 17:49:15 »

Еще раз спасибо, Danila! Изменение /sys/devices/platform/FlexCAN.0/bitrate работает!
А вот команда canconfig can0 bitrate 125000 выдает ошибку, даже при добавлении в проект пакета iproute2. Вот здесь http://www.armadeus.com/wiki/index.php?title=CAN_bus_Linux_driver пишут, что в старых версиях ядра не поддерживаются команды изменения скорости CAN. Видимо для iproute2 это тоже справедливо. Но самое главное, что CAN под линуксом работает! Так что, можете смело добавлять поддержку CAN в linux, на странице с описанием Тион-Про28.
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: CAN в Linux
« Ответ #8 : 01 Октября, 2013, 18:09:37 »

Спасибо за проверку.

Для работы canconfig возможно требуется установка пакетов Canutils and Libsocketcan. Но я это не проверял.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #9 : 02 Октября, 2013, 15:41:57 »

Для работы canconfig возможно требуется установка пакетов Canutils and Libsocketcan.
Canconfig - одна из утилит которая входит в пакет Canutils. Я устанавливал пакеты Canutils и Libsocketcan. Все остальные команды кроме canconfig работают, да собственно и canconfig тоже работает, только она видимо использует в своей работе команду "ip", или работает аналогичным образом, поэтому и выдает ошибку.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #10 : 02 Октября, 2013, 17:22:19 »

Решил подвести итог по настройке работы CAN.
Получилась вот такая кратенькая инструкция:

1. Настраиваем ltib:
    * отмечаем [ * ] Configure the kernel и в Package list -> [ * ] cantest (там же еще можно выбрать can4linux, но он у меня не заработал):
    * в Linux Kernel Configuration отключаем UART3:
System Type  --->
   Freescale Application UART:  --->
      [ ] Application uart 3 enabled.
      и включаем поддержку CAN:
[*] Networking support  --->
    <*> CAN bus subsystem support  --->
        <*>  Raw CAN Protocol (raw access with CAN-ID filtering)
        <*>  Broadcast Manager CAN Protocol (with content filtering)
    CAN Device Drivers  --->
        <*> Virtual Local CAN Interface (vcan)
        [*] CAN devices debugging messages
        <*> Freescale FlexCAN
2. Если есть желание использовать Canutils, то делаем по этой инструкции: https://community.freescale.com/docs/DOC-1437
3. Проверяем работу CAN:
    * устанавливаем скорость работы CAN:
echo 1000000 > /sys/devices/platform/FlexCAN.0/bitrate    * включаем CAN-порт:
ifconfig can0 up    * и отправляем тестовое сообщение:
cantest can0 001#12345678    Если установлен Canutils, то для приема сообщений используем команду:
candump can0    Для просмотра статистики по порту используем:
cat /proc/net/can/stats    Для отключения порта:
ifconfig can0 down
« Последнее редактирование: 04 Октября, 2013, 17:46:52 от Ziminets »
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #11 : 24 Октября, 2013, 06:50:02 »

Написал тестовую программу с использованием функций SocketCAN. Сообщения передаются, принимаются, но вот состояние шины никак не контролируется. Никакие ошибки шины до программы не доходят. Видимо ошибки где-то перехватываются или блокируются на уровнях ниже SocketCAN.
В связи с этим такой вопрос: через какие протоколы проходит сообщение CAN и как они взаимодействуют?
Я так понял, на самом нижнем уровне имеется драйвер FlexCAN, а на самом верхнем - SocketCAN. Еще в операционке имеется VirtualCAN (vcan). Хотелось бы понять как всё это взаимодействует. Может кто подскажет хотя бы в каком направлении копать.
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #12 : 20 Ноября, 2013, 16:01:29 »

Продолжаю разбираться с модулем CAN.
На данный момент выяснил что тот драйвер, который имеется в bsp 10.12.01 не выдает сообщения об ошибках на шине. Кроме того с этим драйвером не работает утилита canconfig из пакета canutils.
В конце концов нашел вот такое решение: https://community.freescale.com/message/280645#280645
Патч 420-kernel2.6.35NewCANDriver.patch удаляет старый драйвер FlexCAN и заменяет его новым, взятым из ядра 2.6.38. Некоторые странности в работе модуля CAN еще остались, но по крайней мере, сообщения об ошибках я получаю. Сейчас подключил еще к своему проекту библиотеку libsocketcan и теперь могу управлять работой модуля CAN из своей программы. Могу даже посмотреть счетчик ошибок шины и её текущее состояние.
Что касается проблем нового драйвера, то они следующие:
1. Перестали работать в программе фильтры loopback и фильтр собственных сообщений. Так что теперь я всегда получаю обратно своё отправленное сообщение.
2. Сообщения об ошибках приходят как-то странно (с этим еще надо разбираться).
Записан

Ziminets

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 64
Re: CAN в Linux
« Ответ #13 : 28 Февраля, 2014, 16:17:43 »

Получил в личку вопрос по поводу работы CAN в Linux (к сожалению узнал об этом слишком поздно и похоже ЗАО ЗЕО потерял потенциального клиента). Поэтому подведу итог, чтобы люди не пугались работать с этим интерфейсом.
CAN в Linux на Тион-Про28 РАБОТАЕТ. Для нормальной работы CAN нужно установить патч 420-kernel2.6.35NewCANDriver.patch. Вся информация по этой ссылке: https://community.freescale.com/message/280645#280645.
Записан

btolfa

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 10
Re: CAN в Linux
« Ответ #14 : 26 Августа, 2014, 16:41:47 »

Ядро со всеми патчами от zao-zeo и с патчем для CAN из этой ветки https://github.com/btolfa/kernel_tion_pro28
Кому-нибудь обязательно пригодится
Записан