Введение
Данная статья черновая. Здесь будут публиковаться полезные ссылки и промежуточные результаты.
Предыстория
Проектируя своего робота, я выбирал интерфейс между отдельными модулями робота (платы управления и переферийными устройствами). Самым лучшим на тот момент мне показался итерфейс i2c. При минимальном количестве проводов шина поддерживает подключение сразу нескольких устройств и работу на довольно приличной скорости (400 кБит/с). К тому же многие уже готовые модули (акселерометры, гироскопы, сонары) имеют выход i2c.
Но не всё оказалось так просто, как казалось...
Текущее положение дел
В результате определённых усилий были написаны собственный драйверы шины i2c (да... люблю я изобретать велосипед).
- Драйвер аппаратной поддержки i2c для управляющей платы at91sam9260 (режим Master). Драйвер ядра Linux, взаимодействующий с аппараным интерфейсом TWI микроконтроллера. Драйвер создаёт символьное устройство /dev/i2c, к которому можно обратится из userspace. Протокол обмена данных с драйвером в userspace свой собственный.
- Userspace драйвер Linux. По сути небольшая обёртка, реализующая протокол обмена с драйвером ядра, и предоставляющая пользователю функции чтения и записи.
- Драйвер для AVR- микроконтроллера переферийного устройства (режим Slave). Драйвер реализующий надстройку над i2c для передачи комманд и сообщений. Использовался для управления ультразвуковым измерителем и шасси робота.
На данный момент всё работает, но немного не так как хотелось бы, и уже достаточно трудно что-то улучшать/переделывать.
Задумки
Хотелось бы создать некую систему универсальных драйверов для простого использования.
Планируется:
- Найти готовый драйвер ядра linux для контроллера at91sam9260. Или написать собственный, но в рамках существуюещей архитектуры и оперирующий существующими структурами системы i2c в ядре.
- Написать протокол верхнего уровня, оперирующий более удобными структурами данных, и позволяющий производить контроль ошибок.
Возможно для этой цели подойдёт SMBus, или надстройка над ним. - Написать драйвер для микроконтроллера AVR, реализующий собственный протокол верхнего уровня.
В результате должен получится набор драйверов, позволяющий без существенный усилий общаться между AVR-микроконтроллером и Linux-хостом по более высокоуровневому протоколу с возможностью контроля ошибок.
Ваша помощь
Если у вас есть какая-нибудь информация по данной теме. Или мысли, или собственные решения. То, пожалуйста, оставляйте комментарии к статье, или пишите.
Надеюсь, что общими усилиями можно разработать что-то удобное и унивесальное.
Ссылки по теме
- Устройство и написание драйверов i2c ядра Linux (англ.) I2C Drivers, Part I и I2C Drivers, Part II.
- Официальный сайт SMBus
- Использование драйвера i2c-dev
- Шина PMBus (Power management bus)
- Драйвер i2c для at91sam9260
- Патчи ядра Linux для AT91
- I2C Tools - набор userspace утилит для проверки работы шины i2c
- Применение микроконтроллеров AVR. Официальная документация и примеры кода