[Devel] Драйверы canbus4linux, can4linux и advcan. Was: [Задача 5496] Поддержка 512 PDO библиотекой UCan2

Evgeny Sinelnikov sin на etersoft.ru
Вт Фев 8 15:28:12 MSK 2011


Здравствуйте,

хочу вынести вопрос обсуждения адаптации драйверов из баги сюда.

8 февраля 2011 г. 0:15 пользователь  <bugs на lists.etersoft.ru> написал:
> http://bugs.etersoft.ru/show_bug.cgi?id=5496
>
> Pavel Vainerman <pv на etersoft.ru> changed:
>
>           What    |Removed                     |Added
> ----------------------------------------------------------------------------
>       Hours Worked|                            |0.23
>
> --- Comment #22 from Pavel Vainerman <pv на etersoft.ru> 2011-02-08 00:15:49 MSK ---
>> Ну, во-первых, не ясно почему они раздельные. А, во-вторых, можно договориться
>> оставить какой-то один из методов, как обёртку над другим, или более точно
>> определиться с семантикой.
>  Ну так в было canbus... Я к сожалению не могу щаз тебе привести пример..
> но собственно можешь увидеть в /proc/canbus у них это как-бы рездеделно
> mode и протокол...
>
>> > > > ...мы используем везде где можно "canbus".
>> > > А старый драйвер pci1680 из canbus4linux? У меня он не пошёл. canbus тоже не
>> > > пошёл (слишком универсальный наверное).
>> >   Где не пошёл? На 2.6.32-el-smp у меня работает.
>>
>> 2.6.32-el-smp-alt12, возможно, я неправильно его готовил. Вот сборка под
>> последний релиз.
>> /var/ftp/pub/Etersoft/LINUX на Etersoft/Sisyphus/i586/RPMS.addon/kernel-modules-canbus4linux-el-smp-0.4-alt8.132640.13.i586.rpm
>  Т.е. проблема не в сборке? Могу если надо дать свою..

Нет, проблема не в сборке, твои тесты работают. Но только с протоколом CAN 2.B:
http://bugs.etersoft.ru/show_bug.cgi?id=5496#c25

А мою сборку можно теперь из репозиториев установить для ядра el-smp.
Для std-def и всех новых ядер  canbus4linux надо фиксить.

>> > > Я адаптировал новый advcan-2.10 для
>> > > canbus4linux. Драйвер собран сюда:
>> > > /var/ftp/pub/Etersoft/LINUX на Etersoft/Sisyphus/files/i586/RPMS/kernel-modules-advcan-el-smp-2.10-eter3.132640.13.i586.rpm
>> >   Зря.. потому-что canbus всё-таки универсальное решение типа comedi...
>>
>> Почему же зря?
>  Я видимо плохо прочитал и не заметил "адаптировал для canbus".
> Так что если ты просто в рамках canbus сделал новый драйвер. То хорошо.

Нет, сначала ты всё верно понял. Я адаптировал UCan2 для нового
драйвера advcan-2.10 в объекте SimpleCanDevicePCI_1680, вместо старого
который не работал.

Стоит ли внести эти изменения в основную ветку UCan2? Я так понимаю,
что поддержка старого драйвера всё равно не интересна, а поддержка
нового ничему не помешает, но даст возможность сравнить
производительность при уточнении внутренней архитектуры canbus во
время модификации под новые ядра.


>
>> - canbus4linux на новых ядрах не собирается - его нужно переделывать под новый
>> интерфейс ядра:
>  Думаю всё-равно это лучше будет сделать.. Щаз как раз проводу подобную работу
> в нашем comedi..
>

Тогда вот бага:
http://bugs.etersoft.ru/show_bug.cgi?id=6896

> canbus - хорошо тем, что (главное) обладает модульной архитектурой с единым
> интерфейсом (для пользователя) и позволяет делать "модули" на разные платы
> (как comedi).
> И ещё обладает "полезностями" типа:
> 1. Возможность создать вирутальное устройство
>  Очень нужная вещь для наладки в отсутствии железа.
> Хотя сейчас мы пока не использовали этого, но просто потому-что не работали на
> UCan2..

Я не пробовал. У нас есть документация на этот счёт?

> 2. Управление через /proc
>  Тоже мы пока не используем всех преимуществ.. Хотя обмен можно написать,
> чуть-ли не на баше..
>

Это архитектурное решение (/proc интерфейс) имеет преимущества (доступ
к управление и состоянию из скриптов) и недостатки (отсутствие
стандартного программного управления)

Если управление доступно через ioctl(), то достаточно создать суидную
утилиту, которой можно назначить права, в отличие от
proc-интерфейса...


8 февраля 2011 г. 0:32 пользователь  <bugs на lists.etersoft.ru> написал:
> http://bugs.etersoft.ru/show_bug.cgi?id=5496
>
> Pavel Vainerman <pv на etersoft.ru> changed:
>
>           What    |Removed                     |Added
> ----------------------------------------------------------------------------
>       Hours Worked|                            |0.05
>
> --- Comment #24 from Pavel Vainerman <pv на etersoft.ru> 2011-02-08 00:32:10 MSK ---
> пропустил ещё одно..
> Что это http://www.port.de/pages/misc/can4linux.php?
> Я не совсем понял.. Если ты предлагаешь как замену canbus4linux..
> это обсуждаемо..

Я заметил, что в can4linux подобная архитектура, что и в нашем
canbus4linux. Забавно, что в Advantech решили сохранить внешний
интерфейс can4linux (семантику read/write и номера ioctl), но сам
драйвер переработали под свои драйвера.

Вместе модуля can появился модуль advcan. Вместе с нашим драйвером
canbus, это получается три вида can-драйверов.

Мне кажется разумным, после правки canbus4linux для новых ядер,
адаптировать его интерфейс под общий can4linux интерфейс.

Существенные отличия, которые я заметил:
- чтение и запись проводятся с помощью вызовов read и write, при этом
указывается не число читаемых и записываемых байт, а число структур
вида:
/**
* The CAN message structure.
* Used for all data transfers between the application and the driver
* using read() or write().
*/
typedef struct.
{
    /** flags, indicating or controlling special message properties */
    int             flags;
    int             cob;               /**< CAN object number, used in
Full CAN  */
    unsigned   long id;           /**< CAN message ID, 4 bytes  */
    struct timeval  timestamp; /**< time stamp for received messages */
    short      int  length;          /**< number of bytes in the CAN message */
    unsigned   char data[CAN_MSG_LENGTH]; /**< data, 0...8 bytes */
} canmsg_t;
- режим CAN 2.A или CAN 2.B определяются флагом MSG_EXT в теле
структуры. Он же означает тип фрейма соответственно.
- есть некоторое количество ioctl-вызовов для управления состоянием устройства:
# define CONF_ACC                0  /* mask and code */
# define CONF_ACCM               1  /* mask only */
# define CONF_ACCC               2  /* code only */
# define CONF_TIMING             3  /* bit timing */
# define CONF_OMODE              4  /* output control register */
# define CONF_FILTER            5
# define CONF_FENABLE        6
# define CONF_FDISABLE        7
# define CONF_LISTEN_ONLY_MODE 8  /* for SJA1000 PeliCAN */
# define CONF_SELF_RECEPTION   9
# define CONF_BTR                10 /* set direct bit timing
registers(SJA1000) */
# define CONF_TIMESTAMP          11 /* use TS in received messages */
# define CONF_WAKEUP             12 /* wake up processes */


-- 
Sin (Sinelnikov Evgeny)


Подробная информация о списке рассылки Devel