|
USB Device на AT91SAM7, Насколько сложно и что нужно |
|
|
|
 |
Ответов
(1 - 62)
|
Jun 5 2006, 14:38
|

Частый гость
 
Группа: Свой
Сообщений: 144
Регистрация: 5-08-05
Пользователь №: 7 382

|
Добрый день,
Я собираюсь изготовить устройство на контроллере AT91SAM7S32 с использованием порта USB, в связи с применением последнего у меня возник ряд вопросов, на которые очень прошу вас ответить.
1. Есть ли где-нибудь полное описание USB 1.0 на русском языке, т.к. если например с RS-232 в абсолютно ясно то USB является для многих "черным ящиком", непонятно как работает устройство, как работает компьютер. www.usb.org книга Агурова...
2. Насколько сложно написать ПО для контроллера и ПК человеку который владеет C++ но едва знает AT91SAM7 и вообще не знает USB. Сколько приблизительно займет это времени?
Взять пример BasicUSB и интегрировать код в свою прошивку - забыть о усб 3. Какие готовые програмные модули мне понадобятся? Где их взять? выше
4. Как сделать так чтобы контроллер питался от шины USB? Меня смущает тот факт, что контроллер будет работоспособен приблизительно через 0.8 сек. после того как устройство уже будт воткнуто в порт. Нет ли проблемы в том, что питание на контроллере появится после появления сигналов D+ D- на выводах.
проблемы нет , шина питания -> LVDO -> МК . помнить, что от шнурка не желательно брать больше 200мА.
удачи...
Спасибо
--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее? Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
|
|
|
|
|
Jun 5 2006, 14:41
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(Eduard_k @ Jun 5 2006, 18:07)  Я собираюсь изготовить устройство на контроллере AT91SAM7S32 с использованием порта USB, в связи с применением последнего у меня возник ряд вопросов, на которые очень прошу вас ответить. Вы имеете в виду AT91SAM7S321? Ибо в AT91SAM7S32 USB-порта нет, и делать на нем USB-устройство -- плохая идея  2. По времени у меня заняло около 2-х дней при нулевом уровне знаний и опыта работы с USB. С использованием BasicUSB, конечно http://www.at91.com/package_patch_driver/a...sam7s64_iar.zip4. Я пользовался простейшей схемой http://www.olimex.com/dev/images/sam7-h64-sch.gifПроблем нет. Питание появляется, подтягивает D+ к 3.3В и система начинает опознавать (и то не сразу, а с какой-то паузой, по-моему в Windows).
--------------------
شامل
|
|
|
|
|
Jun 12 2006, 06:09
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
1. pull-up резистор нужен для опознования подключения устройства. Присутсвие только его на разъеме, даже без остальных элементов активизирует хост на опрос порта (винда скажет, что нашла неизвестное устройство) Если питание идет через USB, этот резистор коммутировать не надо. (питание подаетъся одновременно с сигналами) Если питание внешнее или смешанное, резистор нужно отключать/подключать, чтобы заставить хост заново опросить девайс. Подробнее можно посмотреть в документации на микросхемы FTDI, там это буквально на пальцах показано. 2.В принципе можно, но зачем? Пара резисторов и конденсаторов, ничего не стоит, зато даст уверенность, что схема работает корректно и от фазы Луны не зависит  (все кроме pull-up относится к согласованию и помехоподавлению)
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 13 2006, 06:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
По Агурову соглашусь, какой-то он путанный, по сравнению с книжкой по COM портам просто отдыхает. Купил а теперь жалею. Другое дело, чем вам так не нравиться BasicUSB? Нормальный пример для быстрого старта - запустили, а потом смотрим,что можно добавить/убрать.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 13 2006, 08:59
|

Частый гость
 
Группа: Свой
Сообщений: 144
Регистрация: 5-08-05
Пользователь №: 7 382

|
Цитата(beer_warrior @ Jun 13 2006, 10:48)  По Агурову соглашусь, какой-то он путанный, по сравнению с книжкой по COM портам просто отдыхает. Купил а теперь жалею. Другое дело, чем вам так не нравиться BasicUSB? Нормальный пример для быстрого старта - запустили, а потом смотрим,что можно добавить/убрать. )) Афтору не нравицца 1. Пуллинг, а не прерывания. 2. Всё же CDC устройство и не собственное, Собственно эндпоинт в 64 байта ограничивает скорость передачи... В конце концов можно и самому драйвер усб написать и фирмварь. Но ещё раз поворю, для быстрой замены RS232 на УСБ вы не найдёте более оптимального БЫСТРОГО решения .
--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее? Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
|
|
|
|
|
Jun 16 2006, 12:24
|
Группа: Новичок
Сообщений: 5
Регистрация: 9-06-06
Пользователь №: 17 939

|
Цитата(beer_warrior @ Jun 13 2006, 10:48)  Другое дело, чем вам так не нравиться BasicUSB? Нормальный пример для быстрого старта - запустили, а потом смотрим,что можно добавить/убрать. Как изменить этот пример, чтобы можно было передавать свои данные в микроконтроллер и управлять им ?
Сообщение отредактировал Lomalkin - Jun 16 2006, 12:25
|
|
|
|
|
Jun 16 2006, 13:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Как изменить этот пример, чтобы можно было передавать свои данные в микроконтроллер и управлять им ? Хороший вопрос  1.Выбрасываем все лишнее(USART, DBGU). 2.Находим в файле main такой код Код if (pCDC.IsConfigured(&pCDC)) { #ifndef USART_COM // Loop length = pCDC.Read(&pCDC, data, MSG_SIZE); pCDC.Write(&pCDC, data, length); .... Подставляем туда данные которые хотим передавать/принимать. 3.Таким же образом поступаем с РС кодом 4.Наслаждаемся 5.Разбираемся с прерываниями и переписываем код для работы с ними.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 16 2006, 15:19
|
Группа: Новичок
Сообщений: 5
Регистрация: 9-06-06
Пользователь №: 17 939

|
Цитата(beer_warrior @ Jun 16 2006, 17:26)  5.Разбираемся с прерываниями и переписываем код для работы с ними. А вот с этого места пожалуйста подробнее... Переделал я этот примерчик для моргания светодиодами, частота должна меняться пакетом данных с компа. Однако если вставляю этот код-моргалку непосредственно в функцию main() USB-примера, прога зависает прямо в микроконтроллере и связь обрывается. Появилась гипотеза, что прерывания могут помочь, но я никогда с ними не работал. Можете привести пример минимального кода для запуска/остановки с PC моргания светодиодом с использованием прерываний ?
Сообщение отредактировал Lomalkin - Jun 16 2006, 15:26
|
|
|
|
|
Jun 16 2006, 18:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Если честно, time critical задач с использованием USB у меня еще не было, поэтому USB прерывания не трогал. Удовлетворяюсь пока поллингом. Но помигать светодиодами можно и с ним  Код char data; while(1); { if (pCDC.IsConfigured(&pCDC)) { length = pCDC.Read(&pCDC, data,1); if(!length) continue; // если ошибка if(data == 1) { LED_ON(); } else LED_OFF(); data = 0xff; //подтверждаем pCDC.Write(&pCDC, data, 1); }} Это безусловный примитив, лучше разработать нормальную систему команд. Также, первым делом, стоит написать обработчик системного таймера(PIT) и помигиать светодиодами по нему(http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/at91sam7s64_Atmel_interrupt_20051029.zip), командой разрешая или запрещая мигание. И последнее - этот код (ARM и PC) крайне чувствителен к размеру пакета - если не соответствует аргументу length, девайс зависает намертво. Поэтому, если в пакете присутсвуют данные отличные от DWORD, устанавливаейте выравнивание.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 16 2006, 22:31
|
Группа: Новичок
Сообщений: 5
Регистрация: 9-06-06
Пользователь №: 17 939

|
Цитата(beer_warrior @ Jun 16 2006, 22:33)  Это безусловный примитив Спасибо. На данный момент мой код выглядит почти один в один как и ваш Пока для моей задачи этого достаточно, но всё же видимо прийдется позже разобраться и с прерываниями.
Сообщение отредактировал Lomalkin - Jun 16 2006, 22:32
|
|
|
|
|
Aug 20 2006, 18:09
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
У меня такая платка: http://olimex.com/dev/sam7-h64.htmlПодключаю usb-шнурком: пишет надено "atm6124.Sys ATMEL AT91xxxxx Test Board" Исправляю #define USART_COM на //#define USART_COM Запускаю ram-debug под IAR Запускаю BasicUSB_6124.exe Если платка не подключена - пишет что не подключена ок Если подключена, но не запущена программа на ней, то выполняет две попытки записи и пишет что не отвечает, ок Однако же когда запускаю программу на платке - пишет что ошибка записи... Что может быть?
--------------------
|
|
|
|
|
Sep 4 2006, 08:31
|
Группа: Новичок
Сообщений: 7
Регистрация: 6-08-06
Пользователь №: 19 356

|
Цитата(Lomalkin @ Jun 17 2006, 01:31)  ... Спасибо. На данный момент мой код выглядит почти один в один как и ваш Пока для моей задачи этого достаточно, но всё же видимо прийдется позже разобраться и с прерываниями. Писал недавно для себя класс для USB обмена через прерывания. Проблема сразу возникла с зависаниями контроллера. Обмен идет пару сек, а потом зависание. Решил просто - непосредственно в обработчике прерывания отключаю в именно AIC прерываение по USB. А main-е, когда необходимо читать с порта что-нить - включаю.
Сообщение отредактировал EugeneB - Sep 4 2006, 08:32
|
|
|
|
|
Sep 5 2006, 05:36
|
Частый гость
 
Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305

|
Цитата(AVR @ Sep 5 2006, 00:00)  Извините за назойливость, но очень хотелось бы понять почему невозможно открыть com-порт, который появляется при подключении sam7s64 с драйвером usbser.sys к USB Причем ни гипер-терминал и никакая другая программа не хочет его открывать... Чем он может быть забит сразу после появления?... Я вот только так и пользуюсь "самом". Открылось всё сразу. Вы уверены в правильности запуска USB_Basic на контроллере ??? Кстати, если подключать дебаггер (Wiggler), то обмена нет, только после заливки во флешь и запуска....Вот только с прерываниями никак не получается. Пробовал и SOFINT, и ENDBUSRES, и RESUME - ну никак...
|
|
|
|
|
Sep 5 2006, 12:56
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(nameless @ Sep 5 2006, 09:36)  Я вот только так и пользуюсь "самом". Открылось всё сразу. Вы уверены в правильности запуска USB_Basic на контроллере ??? Кстати, если подключать дебаггер (Wiggler), то обмена нет, только после заливки во флешь и запуска....Вот только с прерываниями никак не получается. Пробовал и SOFINT, и ENDBUSRES, и RESUME - ну никак... Спасибо, по всей видимости проблема именно в этом, ведь я то wiggler'ом ram-debug использовал... Ведь необходимо, чтобы устройство отвечало при самом его подключении к USB...
--------------------
|
|
|
|
|
Nov 5 2006, 00:28
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Подскажите, пожалуйста, как отлаживать драйвер, если при обращении к некоторым его функциям возникают BSOD? У меня появляется такая ошибка KERNEL_MODE_EXCEPTION_NOT_HANDLED, пишет что Цитата If exception code 0x80000003 occurs, this indicates that a hard-coded breakpoint or assertion was hit, but the system was started with the /NODEBUG switch. This problem should rarely occur. If it occurs repeatedly, make sure a kernel debugger is connected and the system is started with the /DEBUG switch. Если запускаю WinXP с ключем /DEBUG - просто виснет... Можно ли настроить так, чтобы при исключениях или ошибках не вешалось вообще всё? Например, обработчик функции WriteFile или ReadFile работает до тех пор пока не дойдет до BuildBulkTransfer, но как выяснить причину ошибки - непонятно...
--------------------
|
|
|
|
|
Nov 5 2006, 07:21
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(AVR @ Nov 5 2006, 03:28)  Подскажите, пожалуйста, как отлаживать драйвер, если при обращении к некоторым его функциям возникают BSOD? У меня появляется такая ошибка KERNEL_MODE_EXCEPTION_NOT_HANDLED, пишет что Цитата If exception code 0x80000003 occurs, this indicates that a hard-coded breakpoint or assertion was hit, but the system was started with the /NODEBUG switch. This problem should rarely occur. If it occurs repeatedly, make sure a kernel debugger is connected and the system is started with the /DEBUG switch. Если запускаю WinXP с ключем /DEBUG - просто виснет... Можно ли настроить так, чтобы при исключениях или ошибках не вешалось вообще всё? Например, обработчик функции WriteFile или ReadFile работает до тех пор пока не дойдет до BuildBulkTransfer, но как выяснить причину ошибки - непонятно... Как избавиться от синих экранов -- не знаю, но помню когда я отлаживал USB-драйвер для SAM7, словил кучу синих экранов, пока не исправил Код PipeIn.Initialize(m_Lower, 82, 64); PipeOut.Initialize(m_Lower, 1, 64); // заменил на PipeIn.Initialize(m_Lower, 0x82, 64); PipeOut.Initialize(m_Lower, 0x01, 64); Там похоже Wizard и я не поняли друг друга  А потом вроде проблем не было. Я делал драйвер визардом, и копировал потом Bulk-обмен из примера. И все.
--------------------
شامل
|
|
|
|
|
Nov 5 2006, 17:31
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404

|
Цитата(AVR @ Nov 5 2006, 03:28)  Подскажите, пожалуйста, как отлаживать драйвер, если при обращении к некоторым его функциям возникают BSOD? У меня появляется такая ошибка KERNEL_MODE_EXCEPTION_NOT_HANDLED, пишет что Цитата If exception code 0x80000003 occurs, this indicates that a hard-coded breakpoint or assertion was hit, but the system was started with the /NODEBUG switch. This problem should rarely occur. If it occurs repeatedly, make sure a kernel debugger is connected and the system is started with the /DEBUG switch. Если запускаю WinXP с ключем /DEBUG - просто виснет... Можно ли настроить так, чтобы при исключениях или ошибках не вешалось вообще всё? Например, обработчик функции WriteFile или ReadFile работает до тех пор пока не дойдет до BuildBulkTransfer, но как выяснить причину ошибки - непонятно... Ну, во-первых, синие экраны отключить нельзя, на то они и синие экраны. Значит уже что-то произошло с чем система никак не может справится (сбой общей защиты и тп). А отладка ядра (с ключём /DEBUG ) это не совсем то что в вижуал студии отладка. При этом нужно 2 машины, соединеённые по COM порту (в вин 2000 было только так) и если что повиснет на отлаживаемой то можно оттрапить на другой и посмотреть в каком месте. Посмотрите поподробнее в DDK Using Microsoft Debugger (WinDbg, KD). Если включить посмертный dump то можно с помощью этих утилит посмотреть в каком месте драйвера произошел exception. Также неплохая программка была Марка Руссиновича LiveKD которая позволяля гулять по ядру на самой машине но только когда система не екнулась =) А так, кстати, неплохая у него и книга про внутреннее устройство виндоус, хоть там про написание драйверов ничего нет, но общее представление даёт неполохое.
|
|
|
|
|
Nov 6 2006, 16:40
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(sff @ Nov 5 2006, 20:31)  Ну, во-первых, синие экраны отключить нельзя, на то они и синие экраны. В хелпе к WinDbg написано: Цитата If a kernel debugger is attached and active, the system causes a break so the debugger can be used to investigate the crash. If no debugger is attached, a blue text screen appears with information about the error. This screen is called a blue screen, a bug check screen, or a Stop screen. т.е., насколько я понял, если запущен отладчик, то вместо синего экрана должно что-то появиться в окне отладчика. Я пробовал запустить локальный kernel debug и соединился по TCP с другого компьютера, однако по-прежнему просто виснет намертво и ничего не пишется ни на локальном компьютере, ни на удаленном... Может чего не так делаю?...  Или в программе драйвера нужно как-то обрабатывать исключительные ситуации?
--------------------
|
|
|
|
|
Nov 6 2006, 19:06
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404

|
Цитата(AVR @ Nov 6 2006, 19:40)  Цитата(sff @ Nov 5 2006, 20:31)  Ну, во-первых, синие экраны отключить нельзя, на то они и синие экраны. В хелпе к WinDbg написано: Цитата If a kernel debugger is attached and active, the system causes a break so the debugger can be used to investigate the crash. If no debugger is attached, a blue text screen appears with information about the error. This screen is called a blue screen, a bug check screen, or a Stop screen. т.е., насколько я понял, если запущен отладчик, то вместо синего экрана должно что-то появиться в окне отладчика. Я пробовал запустить локальный kernel debug и соединился по TCP с другого компьютера, однако по-прежнему просто виснет намертво и ничего не пишется ни на локальном компьютере, ни на удаленном... Может чего не так делаю?...  Или в программе драйвера нужно как-то обрабатывать исключительные ситуации? Ну отладку я подразумевал как логическое продолжение BSOD =) А вот про TCP поподробнее.. Это в WinXP появилось? У меня просто DDK от 2000 Я делал так, соединял 2 компа нуль-модемным и отлаживаемый грузил с /DEBUG /debugport=com1 Хотел щас проделать тоже самое на XP но так как DDK от 2000 не получилось =( После того как распознал что на таргет машине XP вывалился.
|
|
|
|
|
Nov 6 2006, 19:44
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(sff @ Nov 6 2006, 22:06)  А вот про TCP поподробнее.. Это в WinXP появилось? Скорее всего ничего не появилось, а я что-то недопонял. Я имел ввиду в WinDbg установил TCP соединение... Наверное это совсем не то что нужно... PS В хелпе на DriverWorks наткнулся на следующее: Цитата The KException class translates a Structured Exception (SE) raised by the kernel into a C++ exception. This allows to treat a SE as a C++ exception to catch both kernel-raised and user-defined exceptions. Это, случайно, не для того чтобы не доводить дело до синего экрана?.. Чтобы это использовать требуется файл CppExcpt.lib, однако найти его нигде так и не удалось...
--------------------
|
|
|
|
|
Nov 7 2006, 07:28
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404

|
Скачал я WinXP DDK и оказывается кое-что всё-таки добавили  Появилась возможность отладки по IEEE1394 и USB2.0 с волшебным девайсом. Опишу соединение по COM порту 1. На таргет машине в C:\boot.ini добавляю запуск системы с опциями /DEBUG /debugport=com1 (допустим копирую первую системы и вставляю на следущую строчку добавляя данную конструкцию). Будте осторожны если повредить этот файл то может система вообще не загрузится 2. Соединяются хост и таргет машины нуль-модемным кабелем 3. Запуская на хост машине WinDbg. File-> Kernel Debug... Выбираю вкладку COM, пишу соответствующий COM порт, задаю baudrate 19200 (именно такой используется по дефолту, его можно изменить задав опцию /baudrate=xxxxxx в boot.ini на таргет машине). И ставлю галочку reconnect. Ok. 4. Запускаю хост машину, выбрав из списка конфигурацию с отладкой. Грузится будет дольше, даже гораздо дольше и когда-то напишет что-то наподовие Код Windows XP Kernel Version 2600 UP Free x86 compatible Built by: 2600.xpsp_sp2_gdr.050301-1519 Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055a420 Ну и после загрузки или во время можно попытаться скормить заведомо глючный драйвер и вот что появится: Код *** Fatal System Error: 0x000000d1 (0x00000000,0x00000002,0x00000001,0xF9C6B67D)
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred. Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
********************************************************************* * Symbols can not be loaded because symbol path is not initialized. * * * * The Symbol Path can be set by: * * using the _NT_SYMBOL_PATH environment variable. * * using the -y <symbol_path> argument when starting the debugger. * * using .sympath and .sympath+ * ********************************************************************* *** ERROR: Module load completed but symbols could not be loaded for ntdll.dll *** ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe - ******************************************************************************* * * * Bugcheck Analysis * * * *******************************************************************************
Use !analyze -v to get detailed debugging information.
BugCheck D1, {0, 2, 1, f9c6b67d}
ANALYSIS: Kernel with unknown size. Will force reload symbols with known size. ANALYSIS: Force reload command: .reload /f ntoskrnl.exe=FFFFFFFF804D7000,213F80,42250FF9 ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
***** Kernel symbols are WRONG. Please fix symbols to do analysis.
*** ERROR: Symbol file could not be found. Defaulted to export symbols for NDIS.sys - *** ERROR: Module load completed but symbols could not be loaded for mssmbios.sys *** ERROR: Module load completed but symbols could not be loaded for DP83815.SYS Probably caused by : DP83815.SYS ( DP83815+267d )
Followup: MachineOwner ---------
nt!DbgBreakPointWithStatus+0x4: 804e3592 cc int 3 Для более подробной информации можно набрать !analyze -v Код kd> !analyze -v ******************************************************************************* * * * Bugcheck Analysis * * * *******************************************************************************
DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) An attempt was made to access a pageable (or completely invalid) address at an interrupt request level (IRQL) that is too high. This is usually caused by drivers using improper addresses. If kernel debugger is available get stack backtrace. Arguments: Arg1: 00000000, memory referenced Arg2: 00000002, IRQL Arg3: 00000001, value 0 = read operation, 1 = write operation Arg4: f9c6b67d, address which referenced memory
Debugging Details: ------------------
ANALYSIS: Kernel with unknown size. Will force reload symbols with known size. ANALYSIS: Force reload command: .reload /f ntoskrnl.exe=FFFFFFFF804D7000,213F80,42250FF9 ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
***** Kernel symbols are WRONG. Please fix symbols to do analysis.
MODULE_NAME: DP83815
FAULTING_MODULE: 804d7000 nt
DEBUG_FLR_IMAGE_TIMESTAMP: 4096c0df
WRITE_ADDRESS: unable to get nt!MmSpecialPoolStart unable to get nt!MmSpecialPoolEnd unable to get nt!MmPoolCodeStart unable to get nt!MmPoolCodeEnd 00000000
CURRENT_IRQL: 2
FAULTING_IP: DP83815+267d f9c6b67d f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
DEFAULT_BUCKET_ID: WRONG_SYMBOLS
BUGCHECK_STR: 0xD1
LAST_CONTROL_TRANSFER: from 80532d2e to 804e3592
STACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. f9ce49e4 80532d2e 00000003 00000000 f9c6b67d nt!DbgBreakPointWithStatus+0x4 f9ce4dc4 804e187f 0000000a 00000000 00000002 nt!KeDeregisterBugCheckReasonCallback+0x6c7 f9ce4e64 f972cfca 00000000 819e8000 00000000 nt!Kei386EoiHelper+0x2823 f9ce4e88 804dc4fd 819e82b8 819e8290 eb370870 NDIS!NdisMSetTimer+0x90 f9ce4fa4 804dc378 0d839080 00000000 ffdff000 nt!KeSetTimer+0x113 f9ce4fd0 804dbbd4 80559280 00000000 000008d7 nt!KeWaitForMutexObject+0x1d8 f9ce4ff4 804db89e f9d188a0 00000000 00000000 nt!KiDispatchInterrupt+0x360 00000000 00000000 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x2a
STACK_COMMAND: .bugcheck; kb
FOLLOWUP_IP: DP83815+267d f9c6b67d f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
FOLLOWUP_NAME: MachineOwner
IMAGE_NAME: DP83815.SYS
SYMBOL_NAME: DP83815+267d
BUCKET_ID: WRONG_SYMBOLS
Followup: MachineOwner --------- Тут у меня ещё пути не все верно поставлены вот и ругается. Как видно уже намного больше полезной инфы нежели в BSOD'е Подробнее про отладку можно прочитать kernel_debugging_tutorial.doc из состава Debugging Tools for Windows Цитата(AVR @ Nov 6 2006, 22:44)  В хелпе на DriverWorks наткнулся на следующее: Цитата The KException class translates a Structured Exception (SE) raised by the kernel into a C++ exception. This allows to treat a SE as a C++ exception to catch both kernel-raised and user-defined exceptions. Это, случайно, не для того чтобы не доводить дело до синего экрана?.. Чтобы это использовать требуется файл CppExcpt.lib, однако найти его нигде так и не удалось...  Ну, скажем, лишь в некоторых случаях которые вам хорошо известны. Например при взаимодействием с пользователем, которые в вызове ioctl указал кривые адреса и их нужно поймать ACCESS_VIOLATION. Ну и другого типа. А ловить всё подряд чтобы их не было это не лучшая затея. Так как могут быть исключеия для вас не предназначенные и они обрабатываются уровнем выше Ну с DriverStudio я возился совсем чуть-чуть... и меня он не сильно впечатлил. Так что с этим помочь не могу. Советую хоть посмотреть несколько глав про IRQL в MSDN или в книге Руссиновича. Многие сомнения на тему bsod и их появление пропадут.
|
|
|
|
|
Nov 13 2006, 09:47
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Добрый день! Тоже начал разбираться с SAM7 и USB, полный новичек, книга Агурова есть, но какая-то она... хм... Хочу сделать вот что - джойстик на большое количество осей и кнопок, плюс к этому вывод из компьютера наружу, ну там светодиодами управлять и т.д. Для начала взял пример из FreeRTOS, там джойстик на три оси, ну и попытался добавить еще одну ось, но видимо, я пока совсем не понимаю, как устроены дескрипторы, ничего в общем не получилось.... Направьте, пожалуйста, где понятно описан обмен между хостом и устройством, а то никак не въеду. Да, вот еще вопрос какой. Поставил IAR, который до 32 кб, виглер есть, а вот как прицепить виглер к ИАРу? И вообще, как правильно отлаживаться - во флеш или все-таки в RAM? по размеру вроде и в RAM влезает, но не понятно, что надо править в файлах проекта. Да, плата - SAM7-P256 от Olimex. Заранее спасибо!
|
|
|
|
|
Nov 13 2006, 17:57
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(Kitsok @ Nov 13 2006, 12:47)  Направьте, пожалуйста, где понятно описан обмен между хостом и устройством, а то никак не въеду. Как мне показалось, тут http://www.mqp.com/ums_3.htm довольно понятно всё описано (возможно потому что всё очень сжато, без воды). Цитата(Kitsok @ Nov 13 2006, 12:47)  Поставил IAR, который до 32 кб, виглер есть, а вот как прицепить виглер к ИАРу? В самом начале установки IARа есть пункт "install drivers", открыть папку Macraigor и установить содержимое. Если нет такого пункта, то нужное можно скачать тут: http://www.macraigor.com/downloads/ocd_dbgr.exe
--------------------
|
|
|
|
|
Nov 13 2006, 22:12
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Спасибо за наводку, через виглер напрямую не получилось, зато получилось через H-JTAG. Правда, все равно - бесполезно, т.к. тайминги уезжают и винда отрубает USB-устройство. Сейчас впоролся - вроде и осознание процесса пришло, а все равно, не получается. Итак, беру демо-проект из FreeRTOS с джойстиком на три оси. Дескриптор репорта там выглядит следующим образом: Код const portCHAR pxReportDescriptor[] = { 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ 0x09, 0x04, /* USAGE (Joystick) */ 0xa1, 0x01, /* COLLECTION (Application) */ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ 0x09, 0x01, /* USAGE (Pointer) */ 0xa1, 0x00, /* COLLECTION (Physical) */ 0x09, 0x30, /* USAGE (X) */ 0x09, 0x31, /* USAGE (Y) */ 0x09, 0x32, /* USAGE (Z) */ // 0x09, 0x33, /* USAGE (T) */ 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ 0x75, 0x08, /* REPORT_SIZE (8) */ // 0x95, 0x04, /* REPORT_COUNT (4) */ 0x95, 0x03, /* REPORT_COUNT (3) */ 0x81, 0x02, /* INPUT (Data,Var,Abs) */ 0xc0, /* END_COLLECTION */ 0xc0 /* END_COLLECTION */ }; То, что закоментарено - мое, т.е. я добавил 0x09, 0x33 и подправил REPORT_COUNT. Плюс к этому подправлено вот что: Код /* Endpoint 1 descriptor */ 0x07, /* bLength */ 0x05, /* bDescriptorType */ 0x81, /* bEndpointAddress, Endpoint 01 - IN */ 0x03, /* bmAttributes INT */ //0x04, 0x00, /* wMaxPacketSize: 4 bytes (x, y, z, t) */ 0x03, 0x00, /* wMaxPacketSize: 3 bytes (x, y, z) */ 0x0A /* bInterval т.е. я по наитию расширил максимальный размер пакета. Плюс к этому в функции, которая собственно шлет данные, добавил посылку еще одной оси: Код /* Write our sample data to the fifo. */ AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = x; AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = y; AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = z; //AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = t; В итоге, судя по обмену, винду вроде все устраивает, но устройство не отвечает на BULK_OR_INTERRUPT TRANSFER, после чего винда его отваливает через какое-то время.... Где еще копать - не пойму.. Помогите, люди добрые
|
|
|
|
|
Nov 13 2006, 22:49
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Чудны дела темных сил электричества. В общем, в подозрениях на глюки с размером дескриптора репорта (в оригинале - 30 байт, после изменений - 32), я добавил еще одну ось, подправил соответствующим образом размеры и вывод в шину. Трафик на шине я смотрю при помощи SnoopyPro. Так вот если я смотрю на трафик, то трафика не видно, и устройство в девайс-менеджере висит с ошибкой. Если выключаю снупи, то все работает как задумано И че теперь делать-то?  Пробовал USBTrace, но мне нужно захватить процедуру инициализации, а он при рестарте девайса выключает захват.
|
|
|
|
|
Nov 13 2006, 22:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Цитата(Kitsok @ Nov 14 2006, 01:49)  Чудны дела темных сил электричества. В общем, в подозрениях на глюки с размером дескриптора репорта (в оригинале - 30 байт, после изменений - 32), я добавил еще одну ось, подправил соответствующим образом размеры и вывод в шину. ... И че теперь делать-то?  Пробовал USBTrace, но мне нужно захватить процедуру инициализации, а он при рестарте девайса выключает захват. Очень похоже на грабли, на которые я наступал. Если размер дескриптора кратен макс размеру пакета для нулевой конечной точки, то надо посылать замыкающий пакет нулевой длинны. Пример, который переделывал я, этого не делал и я убил на это много времени. Вот http://electronix.ru/forum/index.php?showtopic=22614&hl=
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Nov 14 2006, 07:03
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(Dron_Gus @ Nov 14 2006, 01:57)  Да, видимо, так и есть... А вот еще вопрос. Допустим, мне надо через EP1 передать больше 8 байт, поскольку я вроде как в Full Speed, то максимум - 64 байта. А вот какой размер FIFO в SAM7S256? В даташите написано Цитата The maximum number of bytes to write is fixed by the Max Packet Size in the Standard Endpoint Descriptor. It can not be more than the physical memory size associated to the endpoint. Refer to the Universal Serial Bus Specification, Rev. 2.0 for more information. Получается, что размер FIFO - 64 байта? А что за physical memory size associated?
|
|
|
|
|
Nov 14 2006, 08:17
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(Kitsok @ Nov 14 2006, 10:03)  Получается, что размер FIFO - 64 байта? А что за physical memory size associated? А FIFO, это что такое по-твоему? ;)
|
|
|
|
|
Nov 14 2006, 12:01
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(Tahoe @ Nov 14 2006, 11:17)  А FIFO, это что такое по-твоему?  Насколько я понял, FIFO - это вполне себе аппаратный кусок UDP, и соответственно, влиять на его размер я не могу. Так? Вот еще вопрос. Пытаюсь разобрать дескриптор репорта некого устройства. DT в этом не помогает ну ни разу. Пытаюсь в ручном режиме добавить запись, ввожу 15 (base 16), а получается 0x55.... Есть какие-нибудь тулы повменяемей?
|
|
|
|
|
Nov 15 2006, 06:59
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(Dron_Gus @ Nov 15 2006, 01:33)  В доке на AT91SAM7S раздел USB Device Port с этого начинается. Первая конечная точка 8 байт. Если надо 64, то либо 8 пакетов, либо другую EP используйте. Все-таки, нулевая, а не первая. Первая - 64 байта. Вчера поставил выстраданный Report Descriptor и пихаю без проверок и остановок 16 байт подряд, все доходит. Спасибо всем, разобрался.
|
|
|
|
|
Jul 22 2007, 19:46
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Помогите пожалуйста передать данные на комп или, кажите куда мне копать, если ли такие готовые проги для PC или надо разбираться и писать самому. вот код Код uint32_t A[ARRAY_SIZE]; ..... AT91F_USB_Open(); // Init USB device // Wait for the end of enumeration for(i=0;i<ARRAY_SIZE;i++) { while (!pCDC.IsConfigured(&pCDC)); pCDC.Write(&pCDC, (const char *)&A[i], 4); } на стороне компа это все надо получить и сохранить в текстовый файл, или что то вроде того сейчас пытался прошить пример AT91SAM7S256-BasicUSART_USB-IAR4_30A-1_21 и загрузить BasicUSB_6124.exe но с драйвером atm6124.Inf пишет нет устройства, а со вторым atm6124ser.inf, который как раз и эмулирует виртуальный ком порт вообще сразу вылетает. Форум я почитал тут в принципе много на эту тему, но многие сами пишут драйвер, что мне не по силам.
|
|
|
|
|
Jul 23 2007, 07:15
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(Handler @ Jul 22 2007, 23:46)  Форум я почитал тут в принципе много на эту тему, но многие сами пишут драйвер, что мне не по силам. Можно прикинуться девайсом, под который уже есть написаные дрова. Я сделал прикид под FTDI и спокойно работаю через ft2xx.dll
|
|
|
|
|
Aug 11 2007, 15:18
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
А как реализовать обработку UDP через прерывания? Сделал как в примере USBWorkframe, который вместе с новым ИАРом еще (5.10) вместе идет. Пишу вот так: Код // Настраиваем вызов прерываний AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_UDP, USB_INTERRUPT_PRIORITY, 0, USB_InterruptHandler); // Включаем прерывание AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP);
// На какие прерывания реагировать AT91C_BASE_UDP->UDP_IER |= AT91C_UDP_ENDBUSRES | AT91C_UDP_EPINT0; Ничего не работает. Винда ждет свой таймаут и говорит, что неизвестное устройство. А когда пишу вот так, то все работает Код int main() { ................. .................
USB_Open(&usb); USB_SetPullUp(1);
while(1) { USB_InterruptHandler(); } } Что не так с прерываниями? Вот реализация самой функции USB_InterruptHandler: Код // Функция для обработки прерываний USB контроллера void USB_InterruptHandler() { // Считываем значение регистра статуса преривания AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR; // Маски прерываний, которые нужно удалить AT91_REG CSR = 0;
// Обрабатываем все прерывания while(1) { // Маски прерываний, которые нужно удалить CSR = 0;
// Если завершился сброс USB контроллера if (ISR & AT91C_UDP_ENDBUSRES) { // Очищаем маску этого прерывания CSR |= AT91C_UDP_ENDBUSRES; // Reset all endpoints AT91C_BASE_UDP->UDP_RSTEP = (unsigned int)-1; AT91C_BASE_UDP->UDP_RSTEP = 0; // Enable the function AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; // Включаем EndPoint 0 и устанавливаем режим // передачи данных Control AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL; } // Прерывание от EndPoint 0 // Several signals can generate this interrupt. // The reason can be found by reading UDP_CSR[0]: // RXSETUP set to 1 // RX_DATA_BK0 set to 1 // RX_DATA_BK1 set to 1 // TXCOMP set to 1 // STALLSENT set to 1 else if (ISR & AT91C_UDP_EPINT0) { // Очищаем маску этого прерывания CSR |= AT91C_UDP_EPINT0; // Если хост отправил Setup пакет и он доступен // в FIFO буфере EndPoint'а 0, то if((AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP)) { // Отвечаем на запрос от хоста USB_RequestHandler(); } }
// Очищаем маску всех обработанных прерываний if(CSR) { AT91C_BASE_UDP->UDP_ICR = CSR; }
// Если больше не обработали никаких прерываний, то if(CSR == 0) { // Все прерывания обработаны break; } // Опять считываем значение регистра статуса преривания AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR; } } P.S. Если чего, то код в функции USB_InterruptHandler не зависает: пробовал нажимать break во время выполнения - вылетал в бесконечный цикл, который в main().
Сообщение отредактировал Pasha 111 - Aug 11 2007, 15:19
|
|
|
|
|
Aug 20 2007, 13:38
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(Pasha 111 @ Aug 11 2007, 19:18)  Вот реализация самой функции USB_InterruptHandler: Код // Функция для обработки прерываний USB контроллера void USB_InterruptHandler() { // Считываем значение регистра статуса преривания AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR; // Маски прерываний, которые нужно удалить AT91_REG CSR = 0;
// Обрабатываем все прерывания while(1) { <skipped> // Отвечаем на запрос от хоста USB_RequestHandler();
<skipped> Я что-то не понял. Вы в обработчик прерывания воткнули while(1)????? Да еще и по прерыванию от USB что-то через USB шлете? Хм...
|
|
|
|
|
Aug 27 2007, 07:27
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424

|
To Pasha_111: Не могли бы Вы послать USBWorkframe на Ctrl_Shift@ngs.ru Заранее спасибо. А то в моей версии такого нет, а качать ради одного примера - не хотца
|
|
|
|
|
Aug 29 2007, 12:44
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
Artem, выслал Dron_Gus, вставка #include <intrinsics.h> и вызов __enable_interrupt(); не помогли  Kitsok, while(1) сделан на случай, кодга во время обработки одного прерывания успевает прийти второе, т.е. какбы за один вызов функции сразу несколько прерываний можно обработать. 2All, возникла такая проблема: в проекте BasicUSB почему-то не передаются пакеты, длина которых кратна 64. В программе под Windows вызывается WriteFile(), которая говорит, что записала 0 байт, если длина посылаемых данных ей казана равной 64 или кратной (128, 256..). Никто с этим не сталкивался? Уже 2 недели пытаюсь разобраться, ужас. Контроллер при этом, естественно, ничего не получает. Стоит указать 63 или 65 байт - всё ОК! Не может быть глюк в самом atm6124.sys?
|
|
|
|
|
Aug 30 2007, 14:05
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(brag @ Aug 25 2007, 20:59)  хи алл! Мне тож пришлось связатся с усб..скачал доку,почитал,немного понял..но слабо. пробовал перелопатить BasicUSB,но не пошло..я через прерывания делал,чет не получилось.. Потом взял фреймворк,тоже перелопатил.вроде запустилось,но дело доходит до запроса 9(SET CONFIGURATION) и чет оси не нравится.(FreeBSD) пишет INVAL. Что посоветываете? надо,чтоб жыло на прерываниях и занимало не более 4кб. кристал AT91SAM7S64... Спасибо По прерываниям работает пример из FreeRTOS, посмотрите на него. И доку почитайте еще раза три, до полного просветления. Цитата(Pasha 111 @ Aug 29 2007, 16:44)  Artem, выслал Dron_Gus, вставка #include <intrinsics.h> и вызов __enable_interrupt(); не помогли  Kitsok, while(1) сделан на случай, кодга во время обработки одного прерывания успевает прийти второе, т.е. какбы за один вызов функции сразу несколько прерываний можно обработать. 2All, возникла такая проблема: в проекте BasicUSB почему-то не передаются пакеты, длина которых кратна 64. В программе под Windows вызывается WriteFile(), которая говорит, что записала 0 байт, если длина посылаемых данных ей казана равной 64 или кратной (128, 256..). Никто с этим не сталкивался? Уже 2 недели пытаюсь разобраться, ужас. Контроллер при этом, естественно, ничего не получает. Стоит указать 63 или 65 байт - всё ОК! Не может быть глюк в самом atm6124.sys? Про while(1) в обработчике - ну не знаю, по-моему вы недооцениваете скорость обработки прерываний. Что касается записи пакетов, кратных размеру конечной точки, то см. выше в этой ветке. После такого нужно посылать пустой пакет.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|