реклама на сайте
подробности

 
 
> Драйвер usbser, Разбирательство с версиями
mr.smart
сообщение Jan 6 2011, 14:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 2-10-10
Пользователь №: 59 884



Доброго всем Нового Года и Привет!
Для AT91SAM7S256 написал небольшую программу общения с платой через hyper terminal с задействованием CDC. В данном проекте используется usbser.sys.
Проблема в том, что программа работает некорректно в Windows XP SP3 (зависает при попытке отправить пакет хосту), в то время как в Windows 7 все работает как надо. Подозрение падает на usbser.sys. Плюс я слышал, что для XP данный драйвер немного непопулярен из-за своей кособокости, поэтому люди, работающие в ХР, меняют стандартный usbser на аналог из Win2000.

Вопросы: Сталкивались ли вы с проблемами Вашего usbser.sys и если да, то как вы их решали?
Например у меня возникли трудности с удалением драйвера. После удаления или изменения usbser.sys система сразу же его восстанавливает. Удалил все его бэкапы из папки WINDOWS, а система все-равно откуда-то его восстанавливает... Хотя вроде через безопасный режим я заменял его на другие юсбсеры которые нашел в интернетах (не знаю для какой ОС они), эффект с зависанием программы остается.

Ну и было бы идеально если бы кто-нибудь скинул мне файлик юсбсера для Вин2000 или любой, с которым он успешно работает в ХР. Буду благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mr.smart
сообщение Jan 6 2011, 16:47
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 2-10-10
Пользователь №: 59 884



Спасибо за файлик, поставил его... Ничего не изменилось... Блин, теперь даже не знаю куда смотреть.
Может быть хоть у Вас будет идея почему данный код работает на одной машине и не работает на другой (usbser, как мы выяснили тут не при чем...)

Вот моя функция передачи данных хосту:
Код
static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
    AT91PS_UDP pUdp = pCdc->pUdp;
    
    // проверяем, готов ли юсб к передаче
    if (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) {
      return 0;
    }
    pUdp->UDP_FDR[AT91C_EP_IN] = 0x73; // хотим передать символ "t"
    pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY; // готовы отправлять
    while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ); // ждем пока нам не вернут TXCOMP
    pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP); // обнуляем TXCOMP
}


Первое использование этой функции происходит нормально. При повторном ее использовании не приходит бит TXCOMP, и программа не выходит из цикла.
В программе я никак не настраивал и вообще не использовал блок управления прерываниями AIC. Может ли проблема быть в этом?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.2901 секунд с 7
ELECTRONIX ©2004-2016