Перейти к содержанию
    

Делаем AVR USB (software) правильно

Мне надо сделать 2 устройства, но это не значит что абы-как.

 

Ставить ФТДИ просто смешно для данного проекта и не оправданно.

Вот как раз для 2х устройств FTDI ставить и оправданно.

+ Просто + надёжно.

Между прочим, скажите, чем вариант 3 при правильной реализации хуже хардварного ЮСБ?

1) Оверклокинг.

2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ставить ФТДИ просто смешно для данного проекта и не оправданно.

 

Так возьмите AT90USB162. Около $3 в глубокой рознице у наших торгашей. Можно и дешевле найти.

 

Для упрощения своей жизни мы сымитировали софтом саму FTDI. Т.е. наше железо выглядит как последовательный порт с FTDI'шными дровами. Только самой FTDI нету ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде АВР выдает АСК независимо от правильности полученных данных (на проверку нет времени)

 

Не могу так просто с вами согласиться.

Вот функция вычисления crc16. Она что, для мебели просто?!

Кстати, о чем речь собственно? Лично я про http://www.obdev.at/products/avrusb/index.html

И кстати драйвер не стоит на месте, а развивается.

 

; extern unsigned usbCrc16(unsigned char *data, unsigned char len);
; data: r24/25
; len: r22
; temp variables:
;   r18: data byte
;   r19: bit counter
;   r20/21: polynomial
;   r23: scratch
;   r24/25: crc-sum
;   r26/27=X: ptr
usbCrc16:
    mov     ptrL, argPtrL
    mov     ptrH, argPtrH
    ldi     resCrcL, 0
    ldi     resCrcH, 0
    ldi     polyL, lo8(0xa001)
    ldi     polyH, hi8(0xa001)
    com     argLen; argLen = -argLen - 1
crcByteLoop:
    subi    argLen, -1
    brcc    crcReady ; modified loop to ensure that carry is set below
    ld      byte, ptr+
    ldi     bitCnt, -8; strange loop counter to ensure that carry is set where we need it
    eor     resCrcL, byte
crcBitLoop:
    ror     resCrcH; carry is always set here
    ror     resCrcL
    brcs    crcNoXor
    eor     resCrcL, polyL
    eor     resCrcH, polyH
crcNoXor:
    subi    bitCnt, -1
    brcs    crcBitLoop
    rjmp    crcByteLoop
crcReady:
    ret

 

Вот как раз для 2х устройств FTDI ставить и оправданно.

+ Просто + надёжно.

 

1) Оверклокинг.

2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка.

 

Ну это кому как. Физически фтди сложнее поставить ( tqfp с шагом 0.5 против dip8 :) )

Мне и это просто, хотя немного менее надежно - да.

Я не против НОРМАЛЬНОГО юсб, просто это решение тоже имеет право на жизнь.

 

1) Нет.

для 2.7В - да, для 3.6В - нет (12МГц)

+1

 

2) Поясните поподробнее, что имеется ввиду. (про стек)

А физика в чем не та? Ну вместо дифф. передатчика 2 обычных, ну и что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу так просто с вами согласиться.

Вот функция вычисления crc16. Она что, для мебели просто?!

Функция эта используется для создания пакета для передачи и для проверки целостности пакета при приеме, но уже после того, как хосту сказано, что пакет принят нормально. Поэтому нет перепосылки неправильно принятого пакета. Еще раз повторюсь, ищите мои правки драйвера и доводите их до ума. Там контрольная сумма считается на ходу и хост ставится в известность о необходимости перепосылки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функция эта используется для создания пакета для передачи и для проверки целостности пакета при приеме, но уже после того, как хосту сказано, что пакет принят нормально. Поэтому нет перепосылки неправильно принятого пакета. Еще раз повторюсь, ищите мои правки драйвера и доводите их до ума. Там контрольная сумма считается на ходу и хост ставится в известность о необходимости перепосылки.

 

Ясно.

 

Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз.

 

Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана?

 

Более того, даже если некоторые (главное чтоб не все :) ) ответы пропадут, это не важно.

 

Так что то что ущербно для одной задачи, вполне приемлимо для другой!

 

Да, ваш опыт интересен, но нет возможности гонять МП на 20 МГц (питать буду от 3.3В и гонять на 12.8МГц, обеспечивая максимум аппаратной совместимости)

Да и нет необходимости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз.

 

похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО :(

 

Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана?

 

вопрос не понял.

 

Более того, даже если некоторые (главное чтоб не все :) ) ответы пропадут, это не важно.

 

Так что то что ущербно для одной задачи, вполне приемлимо для другой!

 

Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232

 

Теоретически да, нужно чтобы устройство имело 2 различных интерфейса, каждому из которых сопоставленны свои ендпоинты. (если в этом МК нет ограничений этому препятствующих, то можно и практически)

Каждый интерфейс реализует свою задачу.

 

похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО :(

 

вопрос не понял.

 

Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство".

 

Я-то разобрался.

А вот вы похоже пишете не поняв о чем я. И так и не разобравшись в чем суть темы вообще.

Я говорю, что если управляющий пакет потеряется (т.к. МП всегда шлет ACK), то соответственно программа не получит ответ в течении заданного времени, и повторит запрос.

Если вы не поняли, посмотрите выше - и поймете, что проверка ошибок реализованна ПОСЛЕ подтверждения приема пакета.

 

Я о функции

USB_PUBLIC uchar usbFunctionSetup(uchar data[8])

из драйвера ObDev (ссылка выше)

которая вызывается при приходе управляющей транзакции.

Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?

 

Я не об этом. Нумерация у меня всегда проходит без вопросов.

Я говорю уже про процесс обмена МОЕЙ программы с устройством.

И я для этого использую ендпоинт 0. И меня это вполне устраивает.

Задача: переодический запрос и получение нужного параметра. (всего несколько байт)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, что-то я раньше не обращал внимания, но тут

http://www.cesko.host.sk/IgorPlugUSB/IgorP...20(AVR)_eng.htm

тоже разновидность варианта 1. Но резисторы по 68Ом, да еще и подтяжка 1.5кОм от 5В

Удивительно, как это работает =)

 

А оно и не работает...

 

По твоей классификации вариант со стабилитронами

я делал так:

http://www.swordgreenline.narod.ru/IgorPlug2.html

 

При правильной сборке - заводится сразу...

(количество повторений превысило 2000, все возникшие проблемы решались.)

 

Знатоки AVR USB, отзовитесь!

 

И.

 

 

Теоретически да, нужно чтобы устройство имело 2 различных интерфейса, каждому из которых сопоставленны свои ендпоинты. (если в этом МК нет ограничений этому препятствующих, то можно и практически)

 

Сам то понял что написал?

Нужно два дескриптора, а не "ендпоинты"

 

пример - клава и мыша

 

static const char hidReportDescriptor0[] PROGMEM = {

/* partial keyboard */

0x05, 0x01, /* Usage Page (Generic Desktop), */

0x09, 0x06, /* Usage (Keyboard), */

0xA1, 0x01, /* Collection (Application), */

0x85, 0x01, /* Report Id (1) */

0x95, 0x04, /* Report Count (4), */

0x75, 0x08, /* Report Size (8), */

0x15, 0x00, /* Logical Minimum (0), */

0x25, 0x65, /* Logical Maximum(101), */

0x05, 0x07, /* Usage Page (Key Codes), */

0x19, 0x00, /* Usage Minimum (0), */

0x29, 0x65, /* Usage Maximum (101), */

0x81, 0x00, /* Input (Data, Array), ;Key arrays (4 bytes) */

0xC0, /* End Collection */

 

/* mouse */

0x05, 0x01, /* Usage Page (Generic Desktop), */

0x09, 0x02, /* Usage (Mouse), */

0xA1, 0x01, /* Collection (Application), */

0x09, 0x01, /* Usage (Pointer), */

0xA1, 0x00, /* Collection (Physical), */

0x05, 0x09, /* Usage Page (Buttons), */

0x19, 0x01, /* Usage Minimum (01), */

0x29, 0x03, /* Usage Maximun (03), */

0x15, 0x00, /* Logical Minimum (0), */

0x25, 0x01, /* Logical Maximum (1), */

0x85, 0x02, /* Report Id (2) */

0x95, 0x03, /* Report Count (3), */

0x75, 0x01, /* Report Size (1), */

0x81, 0x02, /* Input (Data, Variable, Absolute), ;3 button bits */

0x95, 0x01, /* Report Count (1), */

0x75, 0x05, /* Report Size (5), */

0x81, 0x01, /* Input (Constant), ;5 bit padding */

0x05, 0x01, /* Usage Page (Generic Desktop), */

0x09, 0x30, /* Usage (X), */

0x09, 0x31, /* Usage (Y), */

0x15, 0x81, /* Logical Minimum (-127), */

0x25, 0x7F, /* Logical Maximum (127), */

0x75, 0x08, /* Report Size (8), */

0x95, 0x02, /* Report Count (2), */

0x81, 0x06, /* Input (Data, Variable, Relative), ;2 position bytes (X & Y) */

0xC0, /* End Collection, */

0xC0, /* End Collection */

};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И.

 

Сам то понял что написал?

Нужно два дескриптора, а не "ендпоинты"

 

Что, И?

 

Вопрос задан:

USB_PUBLIC uchar usbFunctionSetup(uchar data[8])

из драйвера ObDev (ссылка выше)

которая вызывается при приходе управляющей транзакции.

Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?

 

Я-то понял, а вы?

Я написал, что надо 2 ИНТЕРФЕЙСА. (а бывают интерфейсы без ЕП?!)

Соответственно каждому интерфейсу по дескриптору.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос задан:

USB_PUBLIC uchar usbFunctionSetup(uchar data[8])

из драйвера ObDev (ссылка выше)

которая вызывается при приходе управляющей транзакции.

Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?

 

У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232

 

тебя спросили про два устройства.

и не в теории а на практике.

 

Соответственно каждому интерфейсу по дескриптору.

 

и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тебя спросили про два устройства.

и не в теории а на практике.

и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один.

 

А я про это и ответил. На практике. Разговор про теорию был т.к. я не знаком конкретно с этим МК.

 

И получиться 2 интерфейса, которые видяться виндой как 2 логических устройства.

 

А зачем вы привели дескрипторы Hid Repport'ов? Это тут причем?

Я говорю про общий случай, когда в одном физическом устройстве могут быть совершенно разные логические устройства, а не только хид клава и мышь.

 

Хоть бы объяснили человеку (кто спросил) что это за дескрипторы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хоть бы объяснили человеку (кто спросил) что это за дескрипторы!

 

Это стандартный пример.

 

у атмела есть кривая пояснялка

doc7599.pdf

doc7805.pdf

 

Основная тонкость в секции usbFunctionSetup

Т.е. как разрулить ReportID для разных устройств...

а с докой на эту часть небольшой напряг.

все делают стандартные связки...

(кроме клава мышей в нете проектов с исходниками я невидел, хотя долго искал)

 

если кому интересно поковыряться с этой частью предлагаю свернуться в мыло...

 

uchar usbFunctionSetup(uchar data[8])

{

usbRequest_t *rq = (void *) data;

 

DBG1(0xa0, data, 8);

 

if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { /* class request type */

if (rq->bRequest == USBRQ_HID_GET_REPORT) {

/* wValue: ReportType (highbyte), ReportID (lowbyte) */

if (rq->wValue.bytes[0] == 1) {

usbMsgPtr = inputBuffer1;

return sizeof(inputBuffer1);

} else if (rq->wValue.bytes[0] == 2) {

usbMsgPtr = inputBuffer2;

return sizeof(inputBuffer2);

}

return 0;

} else if (rq->bRequest == USBRQ_HID_SET_REPORT) {

/* wValue: ReportType (highbyte), ReportID (lowbyte) */

/* we have no output/feature reports */

return 0;

} else if (rq->bRequest == USBRQ_HID_GET_IDLE) {

usbMsgPtr = &idleRate;

return 1;

} else if (rq->bRequest == USBRQ_HID_SET_IDLE) {

idleRate = rq->wValue.bytes[1];

}

return 0;

}

 

return 0;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...