Всем привет!
Работаю с стартер китом с 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), не зависимо от того вставлено что либо в хост или нет... Позже это прервывание не вызываеться вообще...
Может подсобите чем нибудь, я пока в ступоре...
IgorMarx
Aug 20 2009, 15:46
Цитата(Gizma @ Aug 20 2009, 14:27)

HcInterruptStatus что там случилось, но там всегда одни нули...
А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры LPC можно читать 1 раз, особенно всякие там статусы и FIFO), а потом когда стартуете программу, удивляетесь, что она работает некорректно?
Цитата(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
IgorMarx
Aug 20 2009, 20:10
Gizma, вы понимаете, о чём речь? Внимательно прочитайте.
Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете?
Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете?
Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде.
Цитата(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;... Теперь прерывание вызываеться через равные временные промежутки, постоянно, также независимо от того висит ли что-нибудь на хосте или нет...
IgorMarx
Aug 21 2009, 05:57
Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. Особо потрясает как они сделали DMA: последние 8-9 слов приходится доталкивать в FIFO ручками по FIQ, т.к. DMA останавливается раньше, чем передаётся весь блок. Это глупо и неприятно.
Так пример не работает совсем или не понятно как работает? Должны же были протестировать материал перед публикацией.
Цитата(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 повесили свой хост!)... далее пока в процессе разбора... но пока все равно не работает*))
GetSmart
Aug 21 2009, 08:30
Цитата(IgorMarx @ Aug 21 2009, 11:57)

Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился.
А может всё-таки руки кривые?
Отловил еще пару багов, совсем мелких, и теперь УРА комраде! И хост и массорадж*))(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*((
GetSmart
Aug 21 2009, 09:40
Цитата(Gizma @ Aug 21 2009, 15:31)

fdr = FILE_Open(FILENAME_R, RDONLY); возвращает не 0!! А некое 0xFFFFFFEC, но этот if (fdr > 0), почему то считает что в его условии FALSE*((
Смею предположить, что fdr имеет знак и 0xFFFFFFEC отрицательное значение, меньшее 0.
esaulenka
Aug 21 2009, 13:21
Гм. Простите, а кто-нибудь тут спецификацию OHCI читал?
Английским же языком написано, что описание регистров смотреть надо там.
Сбросить бит в HcInterruptStatus можно только одним способом - записать туда единичку.
PS GetSmart, Вы правы: в том примере определено USB_INT32S fdr;
Цитата(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
esaulenka
Aug 21 2009, 16:11
Также хочется заметить, что
а) VICIntEnClr - ну совершенно НЕ "enable interupt"
б) в примере в OTGClkCtrl записывается совсем другое значение
в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно
г) условие в while, подозреваю, не даст желаемого результата

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

Да тут вы правы внимание не обратил, спасибо! Все проблемы решены, все работает на железе как надо!
Цитата
д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно.
Меня тоже несколько удивила такая котовасия, вопрос зачем она нужна? Ну да ладно,
Цитата
Это к слову "чипы и доки кривые".
К слову "пример кривой". Покажите мне бесплатный работоспособный код USB Host. Только чтоб он за собой половину линукса не тянул.
И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь

ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*)
aaarrr
Aug 21 2009, 19:03
Цитата(Gizma @ Aug 21 2009, 22:02)

ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*)
Ну вряд ли производитель вполне определенных кристаллов станет выкладывать идеально вылизанный пример для открытого хост-контроллера, который стоит у всех.
zltigo
Aug 21 2009, 19:12
Цитата(Gizma @ Aug 21 2009, 20:02)

Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*)
Ой, а примерчик такого счастья

Лично не встречал никогда. Все эти "примеры" пишут левой ногой, даже не ставшие притчей бангалорские программисты а вообще неведомо кто. Исключительно для работы в паркетных условиях по четрвергам. Изредка в комплекте встречаются исходники от третьих фирм, те обычно приличнее заметно.
Цитата(esaulenka @ Aug 21 2009, 18:11)

Только чтоб он за собой половину линукса не тянул.
И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь

Ой, какие у Вас иллюзии по поводу линукса

- вот уж где подавляющая часть работы с железом написана в стиле минималистичных "примеров" и залатано...
aaarrr
Aug 21 2009, 19:21
Цитата(zltigo @ Aug 21 2009, 23:12)

Изредка в комплекте встречаются исходники от третьих фирм, те обычно приличнее заметно.
Забавно, но USB Host Lite как раз и является продуктом третьей фирмы - www.onchiptech.com Но, видимо, специально сделан предельно убого.
Что и понятно - серьезного покупателя такими вещами привлечь невозможно, а остальные обойдутся и слегка работающим примером.
IgorMarx
Aug 24 2009, 05:49
Цитата(GetSmart @ Aug 21 2009, 12:30)

А может всё-таки руки кривые?

Ну, это Вы сумничали

Кстати, о птичках. В примерах можно часто видеть конструкции вида <regisetr>_bit.<битовое поле> = <ещё что-нибудь> (предполагается, что будет считан регистр, потом его битовое поле замененио новым значением и записано обратно в регистр). В опять - же в документации написано, что при чтении некоторых битов этого регистра можно получит неопределённые значения, но писать в эти биты единицы ни в коемь случае нельзя.
То есть, биты, не входящие в <битовое поле>, могут наделать вам неприятносте.
Цитата(Gizma @ Aug 21 2009, 22:02)

ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*)
Скорее наоборот, идеальные и вылизанные - это коммерческие продукты. Бесплатные примеры оставляют простор для творчества.
GetSmart
Aug 25 2009, 08:14
Цитата(IgorMarx @ Aug 24 2009, 11:49)

Ну, это Вы сумничали

...
То есть, биты, не входящие в <битовое поле>, могут наделать вам неприятносте.
И это всё? Бррр... Читайте внимательно документацию (мануалы), а не кривые примеры. Вы ведь на документацию жаловались. И на камень. То, что не ко всем регистрам можно применять побитовое обращение - чёрным по белому написано в мануале. Это не соответствует "плохой документации" и тем более "бажным чипам".
Лично я редко использую такие битовые обращения к регистрам. Но когда пользуюсь, то ессно знаю что это за регистр, а не тупо на всё подряд.
Ещё какие замечания есть? Давайте конструктивно их обсудим. Я уже 4 года работаю с LPC. Ощущения самые хорошие. Косяки иногда встречались, но почти всегда из-за моих же "кривых рук".
sergvks
Sep 1 2009, 18:19
На какую скорость обмена с usb-носителями можно расчитывать при использовании LPC'шного usb host ?
goodwin
Sep 18 2009, 18:17
LPC1758, 48Мгц,чтение - 215 кб/сек.
Подправил длину буфера чтения и выровнял (8192).
4 Мб файл читает за 8-10 сек.
Зависит от того, что втыкаешь...
Пользовал USB катридер и разнообразные SD карточки.
goodwin
Sep 19 2009, 10:26
С FAT_FS от Чена скорость чтения ~ 700 кб/сек (FAT16/32). С картридера (1-2 Гб SD) и с usb-свистка JetFlash 16 Гб... Размер буфера - 4096.
Цитата(IgorMarx @ Aug 21 2009, 09:57)

Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе.
Не надо обвинять NXP.
Вымойте руки и почитайте документацию внимательно. Erratы не забудьте.
alevnew
Oct 23 2009, 05:49
У меня USBHoslLite заработал сразу, как и написано, на плате от EmbeddedArtist.
Но, как выяснилось, нога PPWRD на старых ревизиях проца инвертирована.
Но пришлось помучится при попытке перевода хоста с USB2 на USB1. Но в итоге завершилось успехом:
http://electronix.ru/forum/index.php?showtopic=68666Спасибо топикстартеру (пост № 7)!!!!
argentum
Nov 9 2009, 08:19
Здравствуйте. Подскажите пожалуйста. Работаю с lpc2478.
Волею судьбы вход Vbus девайса оказался занят. Вопрос! Можно за Vbus принять любую другую ножку (естественно подведя к ней +5 от Host'a), опрашивать её программно и выставлять флаг GoodLink так же програмно?
И ещё, правильно ли я понял, что в lpc2478 USB1 может функционировать в режиме OTG и НЕ может работать в режиме чистого девайса?
Заранее благодарен за помощь.
alevnew
Nov 9 2009, 08:59
Цитата(argentum @ Nov 9 2009, 14:19)

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

Vbus можно вообще не использовать.
Вроде бы работает в режиме девайса (LPC2468), использую только D+, D- и выход на светодиод (хотя это не обязательно).
Спасибо)
Я использовал пример HostLite для портирования его на проц LPC2387. Рекомендую свзять пример HostLite для lpc17xx там ошибок меньше

) Сам мучался с примером для lpc23xx, потом взял для lpc17xx там ошибок меньше, но есть разница. Например USB в lpc2387 работает с памятью начиная с адреса 0x7FD00000 а lpc17xx с любой вроде.
HARMHARM
Nov 25 2010, 23:22
Дабы не плодить новые темы спрошу здесь.
Зачем вообще в LPC24xx в режиме host используются сигналы USB_PWRD (а-ля VBUS?), USB_OVRCR? Никаких упоминаний о функции сигналов не нашел в даташите. Можно ли без них обойтись, подобно тому, как можно обойтись без VBUS в режиме device?
Можно ли дергать USB_PPWR вручную, как SOFT_CONNECT в режиме device?
Заранее спасибо.
DpInRock
Nov 26 2010, 02:07
Эти сигналы можно использовать. Но самое главное - можно не использовать.
В даташите есть схема соединения с формирователем для ontogo.
От себя добавлю. Этот дурацкий пример USB HOST - гадство, конечно. День убил. Пришлось OHCI качать. Обработчик прерываний там неправильный. Из-за него флэшку надо втыкать не как попало, а приноравливаться.
Вот теперь примериваюсь как On-to Go без дополнительных схемных элементов сделать. Хотелось бы иногда и с PC коннектиться, а иногда и флэшку втыкать.
Дмитриос
Apr 10 2011, 16:48
Может быть зря поднимаю тему. Но у меня также проблемы с запуском 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-е основан) -- но они слишком монструозны чтобы их пилить.
yarunt
Apr 12 2011, 10:27
Цитата(Дмитриос @ Apr 10 2011, 20:48)

.
Вот этот работает,только прошил и проверил, кварц 12мгц. Сразу тоже не работал, давно было точно не помню, наверно нужно делитель шины усб выставить.
UNKNOWN
Apr 26 2011, 09:47
Доброго времени суток!
Помогите решить проблему, я использую для 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);
}
}
yurmala
Sep 29 2011, 11:20
Приветствую! А у меня другая проблема.
Объединил UsbHostLite с FATFS.
Чтение проходит на ура. подключаю USB, монтирую диск, читаю список файлов, открываю файл и успешно читаю из него.
Идет подвисание при попытке записи/удаления файла
Зависает в функции MS_BulkSend на строчке
Код
rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);
в режиме ожидания Host_WDHWait();
С чем может быть связан подобный висяк?
yurmala
Sep 30 2011, 07:06
Я вообщем в тупике. Не пойму куда смотреть.
чтение 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
Oct 3 2011, 09:11
Товарищи дорогие! Прошу помощи. Так и не могу побороть функцию записи 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 )....
У кого-то есть реально работающая подобная связка (именно ЗАПИСЬ)?
Блин, все выходные убил на эту хрень (казалось бы)...
Olga83
Apr 23 2012, 10:37
Хм, у меня полностью аналогичная ситуация. Как то решили проблему?
yurmala
Nov 6 2012, 04: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.
SyncLair
Nov 6 2012, 18:42
Цитата(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
yurmala
Nov 7 2012, 07:29
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;
}
SyncLair
Nov 7 2012, 12:52
Цитата(yurmala @ Nov 7 2012, 11:29)

Поэтому функция disk_write у меня стала выглядить так:
Код
memcpy((void*)UserBuffer, buff, MS_BlkSize * count);
Так точно ) у меня также )
GetSmart
Jul 29 2014, 23:33
Убил пару дней на поиск грабли в стоге сена NXP USB host lite. SCSI трансферы более 8 КБ полностью весили юсб-стек. Если допустим флэшка FAT16 с размером кластера 16 КБ или выше. Оказалось реализация OHCI в LPC176x имеет ограничение на размер блока одного Transfer Descriptor. Как раз 8 КБ. В мануале на процессор об этом ни слова. Корректный код, учитывающий эту особенность нашёлся в nxpUSBlib v0.98. Но, как варинт, в хост лайте можно в цикле разбивать длинный Host_ProcessTD(EDBulkIn,...) на 8 КБ или менее (последнюю) транзакции.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.