|
Пытаясь запустить UsbHostLite для LPC2468 с nxp.com |
|
|
|
Aug 20 2009, 10:27
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Всем привет! Работаю с стартер китом с lpc2468... В апноуте на UsbHostLite пишут что *Загрузите этот пример на нашу борду и наслаждайтесь?*... Но как он может заработать если там даже не настроены порты USB? Даже в USBClkCtrl какой то бред пытаються записать... Лопачу под себя Поставил 1ый порт хостом, и настроил по мануалу USBClkCtrl... USBClkCtrl = 0x0000001A; OTGStCtrl |= 0x00000003; Ноst_Init(); проходит... в самом конце разрешают прерывание для USB, VICIntEnable = (1 << 22)... Через небольшое время не зависимо от того вставлено что либо в разъем хоста(да и вообще в любой usb порт) или нет срабатывает это прерывание, но функция обработчик( Host_Isr() ) толком ничего не делает, т.к. Host_Isr спрашивает у HcInterruptStatus что там случилось, но там всегда одни нули... Далее в функции Host_EnumDev(), навечно заваливаюсь в while (!HOST_RhscIntr); HOST_RhscIntr должна изменяться в Host_Isr, но из-за вечной нулевости HcInterruptStatus этого никак не сделать... Также еще раз отмечу прерывание для Host_Isr вызываеться только один раз через некоторое время после VICIntEnable = (1 << 22), не зависимо от того вставлено что либо в хост или нет... Позже это прервывание не вызываеться вообще...
Может подсобите чем нибудь, я пока в ступоре...
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 42)
|
Aug 20 2009, 15:46
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(Gizma @ Aug 20 2009, 14:27)  HcInterruptStatus что там случилось, но там всегда одни нули... А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры LPC можно читать 1 раз, особенно всякие там статусы и FIFO), а потом когда стартуете программу, удивляетесь, что она работает некорректно?
|
|
|
|
|
Aug 20 2009, 18:48
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Цитата(IgorMarx @ Aug 20 2009, 19:46)  А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры LPC можно читать 1 раз, особенно всякие там статусы и FIFO), а потом когда стартуете программу, удивляетесь, что она работает некорректно? Смотрю JTAGом... в Keile, MT-Linkом, пошагово... Indicates the status on various events that cause hardware interrupts by setting the appropriate bits. это говорит даташит про HcInterruptStatus... походу хоть зачитайся*)) Вопрос в том почему генериться прерывание по USB, когда по идеи ничего не происходит? думаю это и есть причина нулёвости HcInterruptStatus
|
|
|
|
|
Aug 20 2009, 20:10
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Gizma, вы понимаете, о чём речь? Внимательно прочитайте.
Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете?
Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете?
Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде.
|
|
|
|
|
Aug 20 2009, 20:52
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Цитата(IgorMarx @ Aug 21 2009, 00:10)  Gizma, вы понимаете, о чём речь? Внимательно прочитайте.
Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете?
Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете?
Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде. Я все прекрасно понимаю! Все что вы сказали естественно и понятно... 1. Я не нашел в мануале, что регистр HcInterruptStatus одноразовый для чтения... 2. Смотрел без JTAGа до куда добираеться программа, ровно до того же места... Кое что еще нашел, когда Host_Isr, принимает нулевой HcInterruptStatus, он заверщает прерывание простым return;, добавил для корректности VICVectAddr = 0; перед return;... Теперь прерывание вызываеться через равные временные промежутки, постоянно, также независимо от того висит ли что-нибудь на хосте или нет...
Сообщение отредактировал Gizma - Aug 20 2009, 21:15
|
|
|
|
|
Aug 21 2009, 07:38
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Цитата(IgorMarx @ Aug 21 2009, 09:57)  Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. Особо потрясает как они сделали DMA: последние 8-9 слов приходится доталкивать в FIFO ручками по FIQ, т.к. DMA останавливается раньше, чем передаётся весь блок. Это глупо и неприятно.
Так пример не работает совсем или не понятно как работает? Должны же были протестировать материал перед публикацией. не работает вообще*) до тех мест которые я описал*)))... если бы работало я бы довольный вписал то что мне нужно и шли они все лесом*))... ибо сразу видно пример дико кривой и учиться по нему не особо приятно... Скажу больше он сразу даже не скомпилиться! ибо есть 2 ошибки в названии дефайнов! благо они находяться за 2 секунды... немного продвинулся попробовал поставить OTGStCtrl |= 0x00000001; да бы 1 порт стал не просто host, а host (OTG)(ну тут вопросы ко мне, ибо мог бы и сразу сам догадаться), получилось! теперь в злосчастном HcInterruptStatus все по мануалу и как доктор nxp прописал... далее пришлось ставить адрес HcRhPortStatus для первого порта(О чудо, я наконец то узнал на какой порт nxp повесили свой хост!)... далее пока в процессе разбора... но пока все равно не работает*))
Сообщение отредактировал Gizma - Aug 21 2009, 07:44
|
|
|
|
|
Aug 21 2009, 09:31
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Отловил еще пару багов, совсем мелких, и теперь УРА комраде! И хост и массорадж*))(masstorage) и даже файловая система иниться, и флешечка огоньком замигала*) но.... Это финальный код где содержимое одно файлика плавно кочует в другой... Цитата fdr = FILE_Open(FILENAME_R, RDONLY); if (fdr > 0) { fdw = FILE_Open(FILENAME_W, RDWR); if (fdw > 0) { PRINT_Log("Copying from %s to %s...\n", FILENAME_R, FILENAME_W); do { bytes_read = FILE_Read(fdr, UserBuffer, MAX_BUFFER_SIZE); FILE_Write(fdw, UserBuffer, bytes_read); } while (bytes_read); FILE_Close(fdw); } else { PRINT_Log("Could not open file %s\n", FILENAME_W); return; } FILE_Close(fdr); PRINT_Log("Copy completed\n"); } else { PRINT_Log("Could not open file %s\n", FILENAME_R); return; } } fdr = FILE_Open(FILENAME_R, RDONLY); возвращает не 0!! А некое 0xFFFFFFEC, но этот if (fdr > 0), почему то считает что в его условии FALSE*((
Сообщение отредактировал Gizma - Aug 21 2009, 09:35
|
|
|
|
|
Aug 21 2009, 14:27
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Цитата(esaulenka @ Aug 21 2009, 17:21)  Гм. Простите, а кто-нибудь тут спецификацию OHCI читал? Английским же языком написано, что описание регистров смотреть надо там.
Сбросить бит в HcInterruptStatus можно только одним способом - записать туда единичку.
PS GetSmart, Вы правы: в том примере определено USB_INT32S fdr; Да.... я уже и сам заметил что fdr знаковое, просто как то не сразу не подумал, что в этом месте от отрицательности есть какой либо смысл... Сейчас полностью разобрался и все запустил, когда смотришь JTAGом все работает правильно файл открываеться, читаеться, и записываеться... но когда просто запускаешь чип, ничего не происходит... также если просто запустить JTAG Runoм с начала до конца... Обнаружил что во время инициализации хоста... Цитата void Host_Init (void) { USB_INT32U pinsel; USB_INT32U pinmode;
PCONP |= 0x80000000;
VICIntEnClr = (1 << 22); /* Enable the USB interrupt source */ OTGClkCtrl = 0x0000001B; /* Enable USB host clock */ OTGStCtrl |= 0x00000001; while ((OTGClkSt & 0x0000001B) == 0) { ; } /* P0[12] = USB_PPWR2 01 */ /* P0[13] = USB_UP_LED2 01 */ /* P0[14] = USB_CONNECT2 10 */ pinsel = PINSEL0; pinsel &= 0xC0FFFFFF; pinsel |= 0x15000000; PINSEL0 = pinsel;
итд... Если эту строчку проходит JTAGом по шагово то все ок! А если Runом то прога навсегда вываливаеться в стартап в эту строчку... Цитата Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
|
|
|
|
|
Aug 21 2009, 16:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Также хочется заметить, что а) VICIntEnClr - ну совершенно НЕ "enable interupt" б) в примере в OTGClkCtrl записывается совсем другое значение в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно г) условие в while, подозреваю, не даст желаемого результата  д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно. Это к слову "чипы и доки кривые". К слову "пример кривой". Покажите мне бесплатный работоспособный код USB Host. Только чтоб он за собой половину линукса не тянул. И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Aug 21 2009, 18:02
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 3-09-08
Пользователь №: 39 972

|
Цитата а) VICIntEnClr - ну совершенно НЕ "enable interupt" Я тоже это сразу заметил, наверное ошибка в комметариях... Ведь прерывание все равно включаеться в конце функции... А в начале отключаеться пока не проиниться хост, решение разумное! Цитата б) в примере в OTGClkCtrl записывается совсем другое значение Да! Но оригинальное значение, являеться по мануалу на LPC2468 несколько некорректным! Что этим хотел сделать автор я не понял*) Цитата в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно г) условие в while, подозреваю, не даст желаемого результата  Да тут вы правы внимание не обратил, спасибо! Все проблемы решены, все работает на железе как надо! Цитата д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно. Меня тоже несколько удивила такая котовасия, вопрос зачем она нужна? Ну да ладно, Цитата Это к слову "чипы и доки кривые". К слову "пример кривой". Покажите мне бесплатный работоспособный код USB Host. Только чтоб он за собой половину линукса не тянул. И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь  ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*)
Сообщение отредактировал Gizma - Aug 21 2009, 18:07
|
|
|
|
|
Aug 21 2009, 19:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Gizma @ Aug 21 2009, 20:02)  Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*) Ой, а примерчик такого счастья  Лично не встречал никогда. Все эти "примеры" пишут левой ногой, даже не ставшие притчей бангалорские программисты а вообще неведомо кто. Исключительно для работы в паркетных условиях по четрвергам. Изредка в комплекте встречаются исходники от третьих фирм, те обычно приличнее заметно. Цитата(esaulenka @ Aug 21 2009, 18:11)  Только чтоб он за собой половину линукса не тянул. И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь  Ой, какие у Вас иллюзии по поводу линукса  - вот уж где подавляющая часть работы с железом написана в стиле минималистичных "примеров" и залатано...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2009, 05:49
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(GetSmart @ Aug 21 2009, 12:30)  А может всё-таки руки кривые?  Ну, это Вы сумничали  Кстати, о птичках. В примерах можно часто видеть конструкции вида <regisetr>_bit.<битовое поле> = <ещё что-нибудь> (предполагается, что будет считан регистр, потом его битовое поле замененио новым значением и записано обратно в регистр). В опять - же в документации написано, что при чтении некоторых битов этого регистра можно получит неопределённые значения, но писать в эти биты единицы ни в коемь случае нельзя. То есть, биты, не входящие в <битовое поле>, могут наделать вам неприятносте.
|
|
|
|
|
Aug 25 2009, 07:37
|

Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 6-06-06
Из: Москва
Пользователь №: 17 793

|
Цитата(Gizma @ Aug 21 2009, 22:02)  ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*) Скорее наоборот, идеальные и вылизанные - это коммерческие продукты. Бесплатные примеры оставляют простор для творчества.
--------------------
wbw shahr
|
|
|
|
|
Aug 25 2009, 08:14
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(IgorMarx @ Aug 24 2009, 11:49)  Ну, это Вы сумничали  ... То есть, биты, не входящие в <битовое поле>, могут наделать вам неприятносте. И это всё? Бррр... Читайте внимательно документацию (мануалы), а не кривые примеры. Вы ведь на документацию жаловались. И на камень. То, что не ко всем регистрам можно применять побитовое обращение - чёрным по белому написано в мануале. Это не соответствует "плохой документации" и тем более "бажным чипам". Лично я редко использую такие битовые обращения к регистрам. Но когда пользуюсь, то ессно знаю что это за регистр, а не тупо на всё подряд. Ещё какие замечания есть? Давайте конструктивно их обсудим. Я уже 4 года работаю с LPC. Ощущения самые хорошие. Косяки иногда встречались, но почти всегда из-за моих же "кривых рук".
Сообщение отредактировал GetSmart - Aug 25 2009, 08:17
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 23 2009, 05:49
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 17-05-07
Пользователь №: 27 775

|
У меня USBHoslLite заработал сразу, как и написано, на плате от EmbeddedArtist. Но, как выяснилось, нога PPWRD на старых ревизиях проца инвертирована. Но пришлось помучится при попытке перевода хоста с USB2 на USB1. Но в итоге завершилось успехом: http://electronix.ru/forum/index.php?showtopic=68666Спасибо топикстартеру (пост № 7)!!!!
Сообщение отредактировал alevnew - Oct 23 2009, 05:52
|
|
|
|
|
Nov 9 2009, 08:59
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 17-05-07
Пользователь №: 27 775

|
Цитата(argentum @ Nov 9 2009, 14:19)  Здравствуйте. Подскажите пожалуйста. Работаю с lpc2478. Волею судьбы вход Vbus девайса оказался занят. Вопрос! Можно за Vbus принять любую другую ножку (естественно подведя к ней +5 от Host'a), опрашивать её программно и выставлять флаг GoodLink так же програмно? И ещё, правильно ли я понял, что в lpc2478 USB1 может функционировать в режиме OTG и НЕ может работать в режиме чистого девайса? Заранее благодарен за помощь. Vbus можно вообще не использовать. Вроде бы работает в режиме девайса (LPC2468), использую только D+, D- и выход на светодиод (хотя это не обязательно).
|
|
|
|
|
Nov 9 2009, 11:15
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 26-04-09
Из: Москва
Пользователь №: 48 283

|
Цитата(alevnew @ Nov 9 2009, 11:59)  Vbus можно вообще не использовать. Вроде бы работает в режиме девайса (LPC2468), использую только D+, D- и выход на светодиод (хотя это не обязательно). Спасибо)
|
|
|
|
|
Nov 11 2009, 08:39
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055

|
Я использовал пример HostLite для портирования его на проц LPC2387. Рекомендую свзять пример HostLite для lpc17xx там ошибок меньше  ) Сам мучался с примером для lpc23xx, потом взял для lpc17xx там ошибок меньше, но есть разница. Например USB в lpc2387 работает с памятью начиная с адреса 0x7FD00000 а lpc17xx с любой вроде.
|
|
|
|
|
Apr 10 2011, 16:48
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 22-04-10
Пользователь №: 56 826

|
Может быть зря поднимаю тему. Но у меня также проблемы с запуском UsbHostLite на LPC2478. 1. Может кто-нибудь поделиться работающими исходниками этого Lite-а? 2. Или посоветуйте пожалуйста ещё какую-нибудь более-менее работоспособную OpenSource-ную реализацию USB host + FAT16 3. Поиск подобных проектов почти ничего не дал, неужели сообщество ничего не написало? или у меня одного не идёт UsbHostLite 4. Например? Есть ли реализация UsbHost под FATFS от мистера Чанга? В результате разных экспериментов что я обнаружил дополнительно по теме: 1. Совсем недавно UsbHostLite для LPC2478 был доработан вышла версия 1,00 2. Сравнение через SVN даёт то что исходные коды UsbHostLite для LPC2478 и для 1768 за исключением наличия ДВУХ USB ооочень похожи и идентичны 3. Работа же UsbHostLite под LPC1768 идёт отлично как по маслу что ещё 4. менял тактовую частоту процессора 48....57,6...72 МГц -- без эффекта 5. Смена флешек результата не даёт 6. тестировал LPC2478 как в корпусе BGA так и SOT 7. При работе без отладчика -- проходит процедуру втыкания флешки но первая же функция в процедуре енумерации не проходит 8 При установке брякпоинта в обработчике прерывании и прохождении программы в пошаговом режиме процедура энумерации проходит лишь на половину Знаю что есть реализации работы с openHCI в Linux, BSD и u-boot(я понял что он тоже на Linux-е основан) -- но они слишком монструозны чтобы их пилить.
Сообщение отредактировал IgorKossak - Apr 11 2011, 07:11
|
|
|
|
|
Apr 12 2011, 10:27
|

Местный
  
Группа: Участник
Сообщений: 215
Регистрация: 13-12-06
Из: fghgfh
Пользователь №: 23 476

|
Цитата(Дмитриос @ Apr 10 2011, 20:48)  . Вот этот работает,только прошил и проверил, кварц 12мгц. Сразу тоже не работал, давно было точно не помню, наверно нужно делитель шины усб выставить.
Сообщение отредактировал IgorKossak - Apr 12 2011, 11:26
Причина редактирования: Бездумное цитирование
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
Apr 26 2011, 09:47
|
Группа: Новичок
Сообщений: 1
Регистрация: 26-08-08
Пользователь №: 39 827

|
Доброго времени суток! Помогите решить проблему, я использую для LPC17xx USBHostLite, всё работает, но вот непонятно, почему скорость записи на USB флешку вариируется от 200 до 350 кБайт/сек, хотя комп пишет на неё со скоростью 3 МБайта/сек. Для контроля работы хоста дёргаю отдельной ножкой контроллера, и смотрю осциллографом. Наблюдается следующая картина: где-то после 7-10 пакетов (передача буферов по 4096 байт происходит по 8 мс) идёт очень длинное ожидание - около 120 мс. Т.е. ~7-мь пакетов без существенной задержки, потом задержка ~120 мс, и так далее. Вот код где я смотрю задержки на осциллографе: в функции Host_ProcessTD перед ожиданием ответа от флехи Host_WDHWait() дёргаю ножкой проца, и в функции MS_BulkSend на втором вызове функции Host_ProcessTD иногда происходит задержка ~100 мс. Как увеличить скорость и откуда такие задержки? CODE rt_int32_t MS_BulkSend ( rt_uint32_t block_number, volatile rt_uint8_t *user_buffer, rt_uint16_t num_blocks) { rt_int32_t rc;
Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_OUT, SCSI_CMD_WRITE_10, 10);
rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE); if (rc == OK) { Host_DelayMS(20); rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks); if (rc == OK) { rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE); if (rc == OK) { if (TDBuffer[12] != 0) { rc = ERR_MS_CMD_FAILED; } } } } return (rc); }
rt_int32_t Host_ProcessTD (volatile HCED *ed, volatile rt_uint32_t token, volatile rt_uint8_t *buffer, rt_uint32_t buffer_len) { volatile rt_uint32_t td_toggle;
if (ed == EDCtrl) { if (token == TD_SETUP) { td_toggle = TD_TOGGLE_0; } else { td_toggle = TD_TOGGLE_1; } } else { td_toggle = 0; } TDHead->Control = (TD_ROUNDING | token | TD_DELAY_INT(0) | td_toggle | TD_CC); TDTail->Control = 0; TDHead->CurrBufPtr = (rt_uint32_t) buffer; TDTail->CurrBufPtr = 0; TDHead->Next = (rt_uint32_t) TDTail; TDTail->Next = 0; TDHead->BufEnd = (rt_uint32_t)(buffer + (buffer_len - 1)); TDTail->BufEnd = 0;
ed->HeadTd = (rt_uint32_t)TDHead | ((ed->HeadTd) & 0x00000002); ed->TailTd = (rt_uint32_t)TDTail; ed->Next = 0;
if (ed == EDCtrl) { LPC_USB->HcControlHeadED = (rt_uint32_t)ed; LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF; LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_CLE; } else { LPC_USB->HcBulkHeadED = (rt_uint32_t)ed; LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF; LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_BLE; }
if (DebugValue) LPC_GPIO0->FIOSET = 1<<11; else LPC_GPIO0->FIOCLR = 1<<11; DebugValue = !DebugValue; Host_WDHWait();
// if (!(TDHead->Control & 0xF0000000)) { if (!HOST_TDControlStatus) { return (OK); } else { return (ERR_TD_FAIL); } }
Сообщение отредактировал IgorKossak - Apr 26 2011, 09:50
Причина редактирования: [codebox] !!!
--------------------
ZeeXor
|
|
|
|
|
Sep 29 2011, 11:20
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
Приветствую! А у меня другая проблема. Объединил UsbHostLite с FATFS. Чтение проходит на ура. подключаю USB, монтирую диск, читаю список файлов, открываю файл и успешно читаю из него. Идет подвисание при попытке записи/удаления файла Зависает в функции MS_BulkSend на строчке Код rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks); в режиме ожидания Host_WDHWait(); С чем может быть связан подобный висяк?
|
|
|
|
|
Sep 30 2011, 07:06
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
Я вообщем в тупике. Не пойму куда смотреть. чтение FATFS с USB работает четко, а на записи - висяк. Вот функция disk_write Код DRESULT disk_write(BYTE drv, /* Physical drive number (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { DRESULT res; int result;
(void) result;
if (usb_status & STA_NOINIT) { return RES_NOTRDY; } else { if ( MS_BulkSend( sector, count, (volatile USB_INT08U*) buff ) == OK ) { res = RES_OK; } else { res = RES_ERROR; } } return res; } Вот мой тестовый код: Код int main(void) { BYTE file_deviceID[1]; UINT cnt;
if ((disk_initialize(0)) == FR_OK) // { if ((f_mount(0, &fatfs[0])) == FR_OK) { if ((f_open(&file1, "DEVICE1.TXT", FA_CREATE_ALWAYS | FA_WRITE)) == FR_OK) { cnt = 1; file_deviceID[0] = 'Y'; f_write(&file1,&file_deviceID,cnt,&cnt); f_close(&file1); // <---------------------- ТУТ ЗАВИСАНИЕ на Host_WDHWait() } f_mount(0, NULL); } }
return 0; } модули usbhost_lpc2468.c и usbhost_ms.c взяты из проекта USBHostLite (полностью рабочего. в котором все работает с MSREAD.TXT и MSWRITE.TXT) Буду рад хоть какой-нибудь подсказке, идее...Заранее большое спасибо.
Сообщение отредактировал yurmala - Sep 30 2011, 07:32
|
|
|
|
|
Oct 3 2011, 09:11
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
Товарищи дорогие! Прошу помощи. Так и не могу побороть функцию записи FAT в связки LPC2468 + USBHostLite + FAT FS (Chan's) (см. выше). Задал подобный вопрос на сахаре. Подобное наблюдается не только у меня. Если пошагово дойти от моей команды f_write вложено по функциям до зависания, то получается следующее вложение: Код 1) f_write(&file1,&file_deviceID,cnt,&cnt); 2) fp->sclust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ 3) cs = get_fat(fs, ncl); /* Get the cluster status */ 4) case FS_FAT16 : if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)))) break; ... 5) if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) /* Write back dirty window if needed */ 6) if ( MS_BulkSend( sector, count, (volatile USB_INT08U*) buff ) == OK ).... У кого-то есть реально работающая подобная связка (именно ЗАПИСЬ)? Блин, все выходные убил на эту хрень (казалось бы)...
|
|
|
|
|
Apr 23 2012, 10:37
|
Группа: Новичок
Сообщений: 1
Регистрация: 23-04-12
Пользователь №: 71 517

|
Хм, у меня полностью аналогичная ситуация. Как то решили проблему?
|
|
|
|
|
Nov 6 2012, 04:10
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
Тут есть полезная информация: http://www.keil.com/forum/20503/А именно : 1) the file name must be capital letters 2) the buffer should be placed on the USB RAM. LPC23xx/24xx families have this restriction on DMA by USB controller.
|
|
|
|
|
Nov 6 2012, 18:42
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(yurmala @ Nov 6 2012, 08:10)  Тут есть полезная информация: http://www.keil.com/forum/20503/А именно : 1) the file name must be capital letters 2) the buffer should be placed on the USB RAM. LPC23xx/24xx families have this restriction on DMA by USB controller. 1.Возмите пример HostLite+FatFs+CMSIS у меня с сайта.FatFs -- никаких ограничений, можно писать даже не только в корневую директорию работает даже с русскими буквами если codepage у вас правильная 2. Драйвер написан у меня так что второе ограничение тоже убрано. 3. Подходит к контроллеру и LPC17xx и к LPC2468
--------------------
|
|
|
|
|
Nov 7 2012, 07:29
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
SyncLair, я уже разобрался. Потому и дал полезную информацию для остальных, на будущее. Внимательно нужно быть с передаваемым буфером. Он должен находится в USB RAM. Поэтому функция disk_write у меня стала выглядить так: Код DRESULT disk_write(BYTE drv, /* Physical drive number (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { if (usb_status & STA_NOINIT) return RES_NOTRDY; memcpy((void*)UserBuffer, buff, MS_BlkSize * count);
if ( MS_BulkSend( sector, count, UserBuffer) == OK ) return RES_OK; else return RES_ERROR;
}
Сообщение отредактировал yurmala - Nov 7 2012, 10:59
|
|
|
|
|
Nov 7 2012, 12:52
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(yurmala @ Nov 7 2012, 11:29)  Поэтому функция disk_write у меня стала выглядить так: Код memcpy((void*)UserBuffer, buff, MS_BlkSize * count); Так точно ) у меня также )
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|