Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
[решено] CAN mcp2515 и драйвер в linux
titan83
Добавлено 14.01.2014 14:40 Редактировалось 15.01.2014 14:09
0
Сообщение: 1
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Добрый день!
Сегодня провозился с настройкой драйвера CAN mcp2515, но застрял на последнем шаге, после которого уже можно слушать CAN-интерфейс, как сетевой.
Исходные данные: at91sam9g45, linux 3.2.18.
Что имею на данный момент:
1. Ядро скомпилировано с Microchip MCP251x SPI controllers, Can bit-timing calculation и Raw Can protocol
2. В файле борды написано:
static struct mcp251x_platform_data mcp251x_info =
{
.oscillator_frequency = 24000000,
// .board_specific_setup = NULL,
// .power_enable = NULL,
// .transceiver_enable = NULL,
};
{ /* CAN */
.modalias = "mcp2515",
.platform_data = &mcp251x_info,
.mode = SPI_MODE_0,
.chip_select = 2,
.max_speed_hz = 2 * 1000 * 1000,
.bus_num = 0,
.irq = gpio_to_irq(AT91_PIN_PB22),
},
3. В dmesg пишут:
CAN device driver interface
mcp251x spi0.2: CANSTAT 0x80 CANCTRL 0x07
mcp251x spi0.2: probed
4. В interfaces запись не делал, ибо пока и разово не работает, поэтому на перезагрузке говорю:
/sbin/ip link set can0 type can bitrate 125000 triple-sampling on
команда проходит (с ip из busybox, естественно, не работало).
финал уже близок:
/sbin/ifconfig can0 up, а в ответ получаю:
ifconfig: SIOCSIFFLAGS: Invalid argument
Интерфейс can0 остается down и я себя чувствую тем же)
Что делал:
1. Читал переписку sasamy - http://electronix.ru/forum/lofiversion/index.php/t105908.html. Там все относится к ветке 2.6, и проблема решилась обновлением драйвера. Возможно есть драйвер (патч?) для третьей ветки?
2. Вскользь смотрел исходники драйвера mcp251x.c - не увидел там обработки вызовов через ioctl, а именно эту функции, как я понимаю, вызывает ifconfig? Вполне вероятно что я заблуждаюсь.
Если кто-то ответит, то буду очень признателен, т.к. работать с mcp2515 через spidev желания немного.
Спасибо.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.01.2014 15:05 Редактировалось 14.01.2014 15:06 Сообщение: 2
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата

1. Читал переписку sasamy - http://electronix.ru/forum/lofiversion/index.php/t105908.html. Там все относится к ветке 2.6


Цитата

Перешёл на 34 ядро и всё заработало


Если на 3.2 не работает - попробуйте просто скопировать исходники относящиеся к mcp251x из 3.4 и пересобрать. Не думаю что между этими релизами ядра что-то в интерфейсах подсистемы CAN изменилось - должно прокатить.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 14.01.2014 15:48 Сообщение: 3
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Спасибо за ответ.
Мне почему-то казалось, что в той теме речь шла о 2.6.34, а не о 3.4. Из 3.4 я дернул сорцы и инклюды (кстати, практически не отличается), проверил - поведение аналогичное.
В одной из тем англоязычного интернета прочитал, что такое сообщение является следствием невыставленного битрейта, т.е. вроде как не отрабатывает команда ip link set can0 type can bitrate 1000000 triple-sampling on
Есть возможность это проверить? Посмотреть CF1,2,3.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 15.01.2014 09:10 Сообщение: 4
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Небольшие сдвиги в лучшую сторону: интерфейс удалось поднять, можно послать кадр и его видно осциллографом, даже скорость установлена правильно, устройство с другой стороны синхронизируется по скорости.
Но вот принять candump'ом ничего не получается.
Добиться этого удалось удалением строки с указанием прерывания (.irq), без этого, вероятно, прием не работает.
Сейчас буду читать на тему .irq и .irq_flags, ибо помню еще по первым опытам, что прерывание на порту срабатывает только если выставить детектирование по обоим фронтам.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 15.01.2014 14:09 Сообщение: 5
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
В общем закончу я свое повествование на позитивной ноте: все запустилось в итоге.
На всякий случай выложу инфу - вдруг кому поможет.
1. Добавил в раздел SPI устройств файла борды такое:
static struct mcp251x_platform_data mcp251x_info =
{
.oscillator_frequency = 24000000,
.irq_flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
};
static struct spi_board_info ek_spi_devices[] = {
{ /* CAN */
.modalias = "mcp2515",
.platform_data = &mcp251x_info,
.mode = SPI_MODE_0,
.chip_select = 2,
.max_speed_hz = 2 * 1000 * 1000,
.bus_num = 0,
.irq = AT91_PIN_PB22,
},
Тут указываем тактовую частоту mcp2515, пин, на который заведен выход INT, и по какому фронту обрабатывать прерывание.
У меня не получалось получить полноценную работу именно из-за неправильной настройки прерываний.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux