Перейти к содержанию
    

Пытаясь запустить UsbHostLite для LPC2468 с nxp.com

Эти сигналы можно использовать. Но самое главное - можно не использовать.

В даташите есть схема соединения с формирователем для ontogo.

 

От себя добавлю. Этот дурацкий пример USB HOST - гадство, конечно. День убил. Пришлось OHCI качать. Обработчик прерываний там неправильный. Из-за него флэшку надо втыкать не как попало, а приноравливаться.

Вот теперь примериваюсь как On-to Go без дополнительных схемных элементов сделать. Хотелось бы иногда и с PC коннектиться, а иногда и флэшку втыкать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть зря поднимаю тему. Но у меня также проблемы с запуском 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-е основан) -- но они слишком монструозны чтобы их пилить.

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.

 

 

Вот этот работает,только прошил и проверил, кварц 12мгц. Сразу тоже не работал, давно было точно не помню, наверно нужно делитель шины усб выставить.

USBHostLite.101.zip

post-23476-1302603914_thumb.jpg

Изменено пользователем IgorKossak
Бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

Помогите решить проблему, я использую для 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);
   }
}

Изменено пользователем IgorKossak
[codebox] !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую! А у меня другая проблема.

Объединил UsbHostLite с FATFS.

Чтение проходит на ура. подключаю USB, монтирую диск, читаю список файлов, открываю файл и успешно читаю из него.

Идет подвисание при попытке записи/удаления файла

Зависает в функции MS_BulkSend на строчке

        rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);

в режиме ожидания Host_WDHWait();

 

С чем может быть связан подобный висяк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вообщем в тупике. Не пойму куда смотреть.

чтение 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Товарищи дорогие! Прошу помощи. Так и не могу побороть функцию записи 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 )....

У кого-то есть реально работающая подобная связка (именно ЗАПИСЬ)?

Блин, все выходные убил на эту хрень (казалось бы)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут есть полезная информация:

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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут есть полезная информация:

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому функция disk_write у меня стала выглядить так:

 

    
    memcpy((void*)UserBuffer, buff, MS_BlkSize * count);

 

Так точно ) у меня также )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убил пару дней на поиск грабли в стоге сена NXP USB host lite. SCSI трансферы более 8 КБ полностью весили юсб-стек. Если допустим флэшка FAT16 с размером кластера 16 КБ или выше. Оказалось реализация OHCI в LPC176x имеет ограничение на размер блока одного Transfer Descriptor. Как раз 8 КБ. В мануале на процессор об этом ни слова. Корректный код, учитывающий эту особенность нашёлся в nxpUSBlib v0.98. Но, как варинт, в хост лайте можно в цикле разбивать длинный Host_ProcessTD(EDBulkIn,...) на 8 КБ или менее (последнюю) транзакции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...