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

USB CDC (AT91SAM7S64) не работает

Там стоит запрос состояния->запрет->восстановление. Чтобы не разрешать, если были уже запрещены.

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


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

ОК. Подождем, когда код заточится, но на AMD работать не будет :(

в моем случае я так понимаю нет никакого SAM-BA, я же прошиваю через IAR...

 

aaarrr

Огромное спасибо!!!

Хотя всё опять же по моей вине не так как надо... реально там другой код ))) я опять таки взял не от той версии BasicUSB... я уже запутался в них...

при том тот же файл cdc_enumerate.с в каждой новой версии такие радикальный изменения переживает... не сиделось им прям...

фактически как обернуть я понял, могу применить и к этому...

только в той версии что у меня сейчас - нет разбиения на эти inline... все процедуры уже такие массивные, вот пример одной из записей:

static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
    AT91PS_UDP pUdp = pCdc->pUdp;
    uint cpt = 0;

    // Send the first packet
    cpt = MIN(length, AT91C_EP_IN_SIZE);
    length -= cpt;
    while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
    pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;

    while (length) {
        // Fill the second bank
        cpt = MIN(length, AT91C_EP_IN_SIZE);
        length -= cpt;
        while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
        // Wait for the the first bank to be sent
        while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
            if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
        pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
        while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
        pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
    }
    // Wait for the end of transfer
    while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
        if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
    pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
    while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);

    return length;
}

возникает вопрос можно ли просто в тупую добавить store_int и disable_int в начале всей этой функции и set_interrupt_statу в конец, опоясов всю эту функцию, решив тем самым обе проблемы сразу? аналогично повесить на остальные функции - записи управляющей endpoint, конфигурирования.... или городить таки у каждого изменения CSR?

 

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

но... вот проверить мне тут неначем - результаты только завтра узнаем (

Изменено пользователем abit

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


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

возникает вопрос можно ли просто в тупую добавить store_int и disable_int в начале всей этой функции и set_interrupt_statу в конец, опоясов всю эту функцию, решив тем самым обе проблемы сразу?

Можно, если не смущает время запрещения прерываний.

 

На самом деле, макрос или инлайн, выполненный со всеми возможными предосторожностями - это все-таки некоторый костыль. По-хорошему, нужно в каждом конкретном случае решать, запрещать ли прерывания, дожидаться ли установки/сброса битов в CRS (а это не всегда необходимо) и т.п. Хотя оверхед костыля в любом случае небольшой.

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


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

Можно, если не смущает время запрещения прерываний.

 

На самом деле, макрос или инлайн, выполненный со всеми возможными предосторожностями - это все-таки некоторый костыль. По-хорошему, нужно в каждом конкретном случае решать, запрещать ли прерывания, дожидаться ли установки/сброса битов в CRS (а это не всегда необходимо) и т.п. Хотя оверхед костыля в любом случае небольшой.

 

Все попытки провалились что внутри процедуры.... вплоть до такого:

__disable_interrupt;
while 1 do 
{CDC.Write(&pCDC,'1',1)}

на наших компах вываливает в порт '11111.....'

на этом - '1'... и тишина :(

 

prottoss

если дело в том, о чём Вы говорили...

чем-то другим пользоваться вместо usbser.sys? и есть ли какие-то официальные признания этой ошибки? мне чтобы снять вину со своей программы... к тому же под удивление на Linux таки это заработало через CDC-ACM...

Изменено пользователем abit

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


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

Посмотри по ссылке.

http://electronix.ru/forum/index.php?showt...60&start=60

Там есть проект "рабочий" под IAR 4.22 камень AT91SAM7A3. Данные только принимаются))) можешь попробовать дописать и отправление. Пробовал на разных компах работает. На линуксе не пробовал...

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


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

prottoss если дело в том, о чём Вы говорили...
В приложенном файле сравнение дескрипторов моего устройства и загрузчика SAMBA. Отличия отметил. Но я не проверял, какое именно влияет на работоспособность на разных чипсетах.

 

не верно обозвал два разных дескриптора. Исправленный файл ниже.

__________USB__________________CDC_ACM.rar

__________USB__________________CDC_ACM.1.rar

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


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

Менял в своем проекте USB_CDC направление по BULK точкам и адреса точек все работало.

idVendor: 0x03EB (Atmel Corporation)

idProduct: 0x6124

bcdDevice: 0x0110

Из этих параметров менял только idProduct и в драйвере для девайса менял все равно все оставалось рабочим.

Интервал опроса для третьей конечной точки ставил 10 мс.

Дескриптор конфигурации CDC по "зеленому" варианту :biggrin:

 

Было такое, решилось. Посмотрите как в вашем проекте идет обращение к регистрам UDP->CSR и как рекомендует документация (там есть примеры макросов). В старых версиях Атмеловского фреймвока эти самые макросы не использовались, это и приводило к такому глюку.

 

У меня был глюк с открытием порта. Не в том месте и не в то время работал с регистром UDP->CSR и не в том месте и не в то время отправлял нулевые данные (когда девайсу приходил запрос SET_LINE_CODING все глюки начинались). Когда приходил запрос SET_LINE_CODING я сразу отправлял нудевой пакет, а затем принимал данные. Из-за этого девайс при попытке открыть порт подвешивал прогу для работы с COM портом.

Изменено пользователем shrek

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


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

Всем спасибо)

Проблема таки решена после недели мучений...

Дескрипторы и прерывания не причем...

 

Не работало только на АМД-шках, если кто столкнется с этой проблемой, скрывать решение не буду )))

 

решается так:

в файле cdc_enumerate.c

находим кусок (это не вся строчка)

UDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_ISO_IN)

и заменяем на

UDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN)

и вуаля... работает и на Intel и на AMD

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


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

А ведь стандарт USB CDC изначально определяет три точки: 2 bulk и 1 interrupt.

 

Это еще одна иллюстрация качества demo проектов.

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


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

Не работало только на АМД-шках, если кто столкнется с этой проблемой, скрывать решение не буду )))
Ну вот в AT91-загрузчике и сидит баг.

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


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

решается так:

в файле cdc_enumerate.c

находим кусок (это не вся строчка)

UDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_ISO_IN)

и заменяем на

UDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN)

и вуаля... работает и на Intel и на AMD

Это получается что Intelу по барабану?) :blink:

У меня есть вопрос...

Третья конечная точка

UDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN)
нужна для работы с RTS CTS сигналами COM порта? В работе она у меня никогда не задействовалась. Только bulk точки и контрольная точка.

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


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

решается так:

в файле cdc_enumerate.c

Видимо у вас совсем древняя версия demo. В свежих такого файла совсем нет.

 

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


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

shrek

получается интелу по барабану... кстати в спецификации usb в режиме cdc она обозначена именно как int а не изохронная, как и где она задействуется - это к теоретикам, но интелу по барабану... и не одному а всем - от первого пенька до core2quad/itanium/xeon проверял...

MrAlex

да, старая 2005-2007 года.... собстна там три версии BasicUSB 1.0, 1.1 и 1.2 были проверенны - во всех внутренности резко меняются, но эта ошибка во всех трех версиях кроется... далее (после 2007г) эта демка вошла в USBCore и там вместо всего этого появились абсолютно другие файлы и куда более запутанная структура...

Я все это описывал в этой теме...

USBcore же не компилируется в IAR 4.11, из-за разных inc/h внутри самой IAR...

а с IAR старше 4-х версий отказывается работать мой j-link cegger, который идет в комплекте всех AT91SAM7Sxxx-EK по сей день

поэтому и вышла такая неприятная ситуация...

так же эта ошибка содержится и в крайне свежей SAMBA, в чем я тоже убедился во время своего недельного эксперемента... с большой вероятностью она осталась и в USBCore, но в другом файле...

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


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

abit

да, старая 2005-2007 года.... собстна там три версии BasicUSB 1.0, 1.1 и 1.2 были проверенны - во всех внутренности резко меняются, но эта ошибка во всех трех версиях кроется... далее (после 2007г) эта демка вошла в USBCore и там вместо всего этого появились абсолютно другие файлы и куда более запутанная структура...

Я все это описывал в этой теме...

USBcore же не компилируется в IAR 4.11, из-за разных inc/h внутри самой IAR...

а с IAR старше 4-х версий отказывается работать мой j-link cegger, который идет в комплекте всех AT91SAM7Sxxx-EK по сей день

поэтому и вышла такая неприятная ситуация...

так же эта ошибка содержится и в крайне свежей SAMBA, в чем я тоже убедился во время своего недельного эксперемента... с большой вероятностью она осталась и в USBCore, но в другом файле...

 

Поэтому надо (желательно) писать все самому! Месяц другой, третий, четвертый, пятый... провозишься зато сначала будет HID USB например мышка, HID USB джойстик (аналоговый делал, еще руль делал), HID USB дигитайзер например, ну а потом можно и CDC.

Компилировал атмеловские примеры с мышкой CDC во всех примерах размер прошивки зашкаливал за 20 кбайт!!! Причем примеры атмеловские для версий IAR 5.50 и выше. Самописный максимум 3 кб. С прикручиванием экранчика 6 кб.

 

По поводу j-linkа странно... У меня с IAR ARM 4.22 j-link с seggerом нормально работает и с версией IAR ARM 5.50.1 работал и прошивался. Версия j-link 4.10f.

Изменено пользователем shrek

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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