DpInRock 0 26 ноября, 2010 Опубликовано 26 ноября, 2010 · Жалоба Эти сигналы можно использовать. Но самое главное - можно не использовать. В даташите есть схема соединения с формирователем для ontogo. От себя добавлю. Этот дурацкий пример USB HOST - гадство, конечно. День убил. Пришлось OHCI качать. Обработчик прерываний там неправильный. Из-за него флэшку надо втыкать не как попало, а приноравливаться. Вот теперь примериваюсь как On-to Go без дополнительных схемных элементов сделать. Хотелось бы иногда и с PC коннектиться, а иногда и флэшку втыкать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lgpl 0 10 апреля, 2011 Опубликовано 10 апреля, 2011 (изменено) · Жалоба Может быть зря поднимаю тему. Но у меня также проблемы с запуском UsbHostLite на LPC2478. :crying: 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-е основан) -- но они слишком монструозны чтобы их пилить. Изменено 11 апреля, 2011 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yarunt 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 (изменено) · Жалоба . Вот этот работает,только прошил и проверил, кварц 12мгц. Сразу тоже не работал, давно было точно не помню, наверно нужно делитель шины усб выставить. USBHostLite.101.zip Изменено 12 апреля, 2011 пользователем IgorKossak Бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LOGIN 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 (изменено) · Жалоба Доброго времени суток! Помогите решить проблему, я использую для LPC17xx USBHostLite, всё работает, но вот непонятно, почему скорость записи на USB флешку вариируется от 200 до 350 кБайт/сек, хотя комп пишет на неё со скоростью 3 МБайта/сек. Для контроля работы хоста дёргаю отдельной ножкой контроллера, и смотрю осциллографом. Наблюдается следующая картина: где-то после 7-10 пакетов (передача буферов по 4096 байт происходит по 8 мс) идёт очень длинное ожидание - около 120 мс. Т.е. ~7-мь пакетов без существенной задержки, потом задержка ~120 мс, и так далее. Вот код где я смотрю задержки на осциллографе: в функции Host_ProcessTD перед ожиданием ответа от флехи Host_WDHWait() дёргаю ножкой проца, и в функции MS_BulkSend на втором вызове функции Host_ProcessTD иногда происходит задержка ~100 мс. Как увеличить скорость и откуда такие задержки? 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); } } Изменено 26 апреля, 2011 пользователем IgorKossak [codebox] !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба Приветствую! А у меня другая проблема. Объединил UsbHostLite с FATFS. Чтение проходит на ура. подключаю USB, монтирую диск, читаю список файлов, открываю файл и успешно читаю из него. Идет подвисание при попытке записи/удаления файла Зависает в функции MS_BulkSend на строчке rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks); в режиме ожидания Host_WDHWait(); С чем может быть связан подобный висяк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 30 сентября, 2011 Опубликовано 30 сентября, 2011 (изменено) · Жалоба Я вообщем в тупике. Не пойму куда смотреть. чтение 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) Буду рад хоть какой-нибудь подсказке, идее...Заранее большое спасибо. Изменено 30 сентября, 2011 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 3 октября, 2011 Опубликовано 3 октября, 2011 · Жалоба Товарищи дорогие! Прошу помощи. Так и не могу побороть функцию записи 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 0 23 апреля, 2012 Опубликовано 23 апреля, 2012 · Жалоба Хм, у меня полностью аналогичная ситуация. Как то решили проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 6 ноября, 2012 Опубликовано 6 ноября, 2012 · Жалоба Тут есть полезная информация: 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 0 6 ноября, 2012 Опубликовано 6 ноября, 2012 · Жалоба Тут есть полезная информация: 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 0 7 ноября, 2012 Опубликовано 7 ноября, 2012 (изменено) · Жалоба 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; } Изменено 7 ноября, 2012 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SyncLair 0 7 ноября, 2012 Опубликовано 7 ноября, 2012 · Жалоба Поэтому функция disk_write у меня стала выглядить так: memcpy((void*)UserBuffer, buff, MS_BlkSize * count); Так точно ) у меня также ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 июля, 2014 Опубликовано 29 июля, 2014 · Жалоба Убил пару дней на поиск грабли в стоге сена NXP USB host lite. SCSI трансферы более 8 КБ полностью весили юсб-стек. Если допустим флэшка FAT16 с размером кластера 16 КБ или выше. Оказалось реализация OHCI в LPC176x имеет ограничение на размер блока одного Transfer Descriptor. Как раз 8 КБ. В мануале на процессор об этом ни слова. Корректный код, учитывающий эту особенность нашёлся в nxpUSBlib v0.98. Но, как варинт, в хост лайте можно в цикле разбивать длинный Host_ProcessTD(EDBulkIn,...) на 8 КБ или менее (последнюю) транзакции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться