ORFA — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
м
Строка 28: Строка 28:
 
== Команды UART->I<sup>2</sup>C ==
 
== Команды UART->I<sup>2</sup>C ==
 
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.
 
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.
 +
 +
Реализуется библиотекой <code>libserialgate.a</code>
  
 
{| class=standard
 
{| class=standard
Строка 93: Строка 95:
 
* data — uint8 array
 
* data — uint8 array
 
* rdata — uint8 array
 
* rdata — uint8 array
 +
|}
 +
 +
== Возможности подчиненного I<sup>2</sup>C устройства ==
 +
В случае использования <code>libserialgate.a</code> это внутреннее логическое устройство, его адрес задается командой <code>L<aa></code>.
 +
 +
Возможности зависят от конкретного контроллера, но есть интерфейс для простой интроспекции драйверов, есть всегда.
 +
 +
=== Интроспекция драйверов ===
 +
Реализовано с помощью специального драйвера в ядре, закреплен на регистре 0x00.
 +
 +
Пример работы с драйвером можно посмотреть в модуле [http://hg.vehq.ru/pyor/file/tip/pyor/introspection.py#l1 pyor.introspection]
 +
 +
Типы запросов (регистр, данные...):
 +
# <code>00 00</code> — запросить количество драйверов, нужно прочитать 1 байт
 +
# <code>00 nn</code> — запросить информацию о драйвере nn, нужно прочитать 6 байт
 +
 +
Структура информации запроса 2:
 +
{| class="standard"
 +
! Байт
 +
! Название
 +
! Комментарий
 +
|-
 +
|0, 1
 +
|UID
 +
|Уникальный идентификатор драйвера
 +
|-
 +
|2
 +
|Major Version
 +
|Старший номер версии
 +
|-
 +
|3
 +
|Minor Version
 +
|Младший номер версии
 +
|-
 +
|4
 +
|Start Register
 +
|Номер начального регистра
 +
|-
 +
|5
 +
|Count of registers
 +
|Количество регистров
 +
Т.е. все регистры драйвера это интервал <code>(Start Register)..(Start Register + Count of registers - 1)</code>
 +
|}
 +
 +
==== UIDs ====
 +
{| class="standard"
 +
!UID
 +
!Driver
 +
|-
 +
|0x0000
 +
|Introspection
 +
|-
 +
|0x0010
 +
|Port GPIO
 +
|-
 +
|0x0100
 +
|Motor (RoboMD2)
 +
|-
 +
|0x1000
 +
|SPI
 
|}
 
|}
  
 
== Установка ==
 
== Установка ==
Репозиторий исходных кодов: http://hg.vehq.ru/orfa
+
* Репозиторий исходных кодов: http://hg.vehq.ru/orfa
 +
* Лицензия: MIT
 +
 
 +
# Сделать клон репозитария <code>hg clone http://hg.vehq.ru/orfa</code><br />либо скачать архив с исходными кодами здесь: http://hg.vehq.ru/orfa
 +
# make (для модуля OR-AVR-M32-D, OR-AVR-M168-DX пока не поддерживается)
 +
# make program (если вы используете AVR Dragon)

Версия 23:54, 18 мая 2009


ORFA — это модульная архитектура для прошивок контроллеров семейства Open Robotics. Архитектура и сами прошивки сейчас находятся в разработке.

Описание

На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega.

Текущая версия состоит из монолитного шлюза UART->I2C и модульного виртуального подчиненного устройства на шине I2C.

При таком подходе ПК обращается к блокам МК как и к любым другим устройствам на шине i2c, что дает унификацию. А при незначительной модификации виртуального слейва можно сделать прошивку для второго контроллера, уже не являющегося шлюзом, управляемого через i2c.

Т.е. можно достаточно малой кровью получить хорошо расширяемую систему.

Or-ser-i2c-i2c.svg

Взаимодействие модулей подчиненного устройсва основано на регистровой модели, т.е. каждый драйвер устройства связан с определенным набором адресов ячеек.

Структура и взаимодействие модулей в варианте с модулем uart->i2t:

Or-gate-ser.svg

Структура и взаимодействие модулей в варианте только i2c slave:

Or-gate-i2c.svg

Команды UART->I2C

Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.

Реализуется библиотекой libserialgate.a

Название Запрос Ответ Комментарий
Get protocol version V V1.0
Clear I2C bus X X
Set local address L<addr> L<addr>
  • addr — uint8
Set bus speed (freq) C<freq> C<freq>
  • freq — uint16
Read register R<addr><reg>[<len>] SWASR<rdata>P
  • addr — uint8
  • reg — uint8
  • len — uint8, default 1
  • rdata — uint8 array
Write register W<addr><reg> SWA(A)+P
  • addr — uint8
  • reg — uint8

A = Ack

I2C request
  1. S<adr+w>
  2. S<adr+r><len>
  • \1P
  • \2P
  • (\1|\2)+P
  1. SW(A)+
  2. SR<rdata>
  • \1P
  • \2P
  • (\1|\2)+P
  • adr+w — uint8, &0xfe
  • adr+r — uint8, |0x01
  • len — uint8
  • data — uint8 array
  • rdata — uint8 array

Возможности подчиненного I2C устройства

В случае использования libserialgate.a это внутреннее логическое устройство, его адрес задается командой L<aa>.

Возможности зависят от конкретного контроллера, но есть интерфейс для простой интроспекции драйверов, есть всегда.

Интроспекция драйверов

Реализовано с помощью специального драйвера в ядре, закреплен на регистре 0x00.

Пример работы с драйвером можно посмотреть в модуле pyor.introspection

Типы запросов (регистр, данные...):

  1. 00 00 — запросить количество драйверов, нужно прочитать 1 байт
  2. 00 nn — запросить информацию о драйвере nn, нужно прочитать 6 байт

Структура информации запроса 2:

Байт Название Комментарий
0, 1 UID Уникальный идентификатор драйвера
2 Major Version Старший номер версии
3 Minor Version Младший номер версии
4 Start Register Номер начального регистра
5 Count of registers Количество регистров

Т.е. все регистры драйвера это интервал (Start Register)..(Start Register + Count of registers - 1)

UIDs

UID Driver
0x0000 Introspection
0x0010 Port GPIO
0x0100 Motor (RoboMD2)
0x1000 SPI

Установка

  1. Сделать клон репозитария hg clone http://hg.vehq.ru/orfa
    либо скачать архив с исходными кодами здесь: http://hg.vehq.ru/orfa
  2. make (для модуля OR-AVR-M32-D, OR-AVR-M168-DX пока не поддерживается)
  3. make program (если вы используете AVR Dragon)