Gizma 0 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба Всем привет! Работаю с стартер китом с 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 0 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба HcInterruptStatus что там случилось, но там всегда одни нули... А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры LPC можно читать 1 раз, особенно всякие там статусы и FIFO), а потом когда стартуете программу, удивляетесь, что она работает некорректно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры 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 0 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба Gizma, вы понимаете, о чём речь? Внимательно прочитайте. Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете? Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете? Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 20 августа, 2009 Опубликовано 20 августа, 2009 (изменено) · Жалоба Gizma, вы понимаете, о чём речь? Внимательно прочитайте. Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете? Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете? Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде. Я все прекрасно понимаю! Все что вы сказали естественно и понятно... 1. Я не нашел в мануале, что регистр HcInterruptStatus одноразовый для чтения... 2. Смотрел без JTAGа до куда добираеться программа, ровно до того же места... Кое что еще нашел, когда Host_Isr, принимает нулевой HcInterruptStatus, он заверщает прерывание простым return;, добавил для корректности VICVectAddr = 0; перед return;... Теперь прерывание вызываеться через равные временные промежутки, постоянно, также независимо от того висит ли что-нибудь на хосте или нет... Изменено 20 августа, 2009 пользователем Gizma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorMarx 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. Особо потрясает как они сделали DMA: последние 8-9 слов приходится доталкивать в FIFO ручками по FIQ, т.к. DMA останавливается раньше, чем передаётся весь блок. Это глупо и неприятно. Так пример не работает совсем или не понятно как работает? Должны же были протестировать материал перед публикацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 21 августа, 2009 Опубликовано 21 августа, 2009 (изменено) · Жалоба Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. Особо потрясает как они сделали DMA: последние 8-9 слов приходится доталкивать в FIFO ручками по FIQ, т.к. DMA останавливается раньше, чем передаётся весь блок. Это глупо и неприятно. Так пример не работает совсем или не понятно как работает? Должны же были протестировать материал перед публикацией. не работает вообще*) до тех мест которые я описал*)))... если бы работало я бы довольный вписал то что мне нужно и шли они все лесом*))... ибо сразу видно пример дико кривой и учиться по нему не особо приятно... Скажу больше он сразу даже не скомпилиться! ибо есть 2 ошибки в названии дефайнов! благо они находяться за 2 секунды... немного продвинулся попробовал поставить OTGStCtrl |= 0x00000001; да бы 1 порт стал не просто host, а host (OTG)(ну тут вопросы ко мне, ибо мог бы и сразу сам догадаться), получилось! теперь в злосчастном HcInterruptStatus все по мануалу и как доктор nxp прописал... далее пришлось ставить адрес HcRhPortStatus для первого порта(О чудо, я наконец то узнал на какой порт nxp повесили свой хост!)... далее пока в процессе разбора... но пока все равно не работает*)) Изменено 21 августа, 2009 пользователем Gizma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. А может всё-таки руки кривые? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 21 августа, 2009 Опубликовано 21 августа, 2009 (изменено) · Жалоба Отловил еще пару багов, совсем мелких, и теперь УРА комраде! И хост и массорадж*))(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*(( Изменено 21 августа, 2009 пользователем Gizma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба fdr = FILE_Open(FILENAME_R, RDONLY); возвращает не 0!! А некое 0xFFFFFFEC, но этот if (fdr > 0), почему то считает что в его условии FALSE*(( Смею предположить, что fdr имеет знак и 0xFFFFFFEC отрицательное значение, меньшее 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 21 августа, 2009 Опубликовано 21 августа, 2009 (изменено) · Жалоба Гм. Простите, а кто-нибудь тут спецификацию OHCI читал? Английским же языком написано, что описание регистров смотреть надо там. Сбросить бит в HcInterruptStatus можно только одним способом - записать туда единичку. PS GetSmart, Вы правы: в том примере определено USB_INT32S fdr; Изменено 21 августа, 2009 пользователем esaulenka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Гм. Простите, а кто-нибудь тут спецификацию 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 7 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Также хочется заметить, что а) VICIntEnClr - ну совершенно НЕ "enable interupt" б) в примере в OTGClkCtrl записывается совсем другое значение в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно г) условие в while, подозреваю, не даст желаемого результата :) д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно. Это к слову "чипы и доки кривые". К слову "пример кривой". Покажите мне бесплатный работоспособный код USB Host. Только чтоб он за собой половину линукса не тянул. И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gizma 0 21 августа, 2009 Опубликовано 21 августа, 2009 (изменено) · Жалоба а) VICIntEnClr - ну совершенно НЕ "enable interupt" Я тоже это сразу заметил, наверное ошибка в комметариях... Ведь прерывание все равно включаеться в конце функции... А в начале отключаеться пока не проиниться хост, решение разумное! б) в примере в OTGClkCtrl записывается совсем другое значение Да! Но оригинальное значение, являеться по мануалу на LPC2468 несколько некорректным! Что этим хотел сделать автор я не понял*) в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно г) условие в while, подозреваю, не даст желаемого результата :) Да тут вы правы внимание не обратил, спасибо! Все проблемы решены, все работает на железе как надо! д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно. Меня тоже несколько удивила такая котовасия, вопрос зачем она нужна? Ну да ладно, Это к слову "чипы и доки кривые". К слову "пример кривой". Покажите мне бесплатный работоспособный код USB Host. Только чтоб он за собой половину линукса не тянул. И чтобы не было десятков комментариев "TODO", "FIXME", "BUG?!?", я их пугаюсь :) ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*) Изменено 21 августа, 2009 пользователем Gizma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба ну тут вы правы*) Просто раз уж ПРОИЗВОДИТЕЛЬ выкладывает пример, то он по моему разумению, должен идеальным и вылизанным до нельзя*) Ну вряд ли производитель вполне определенных кристаллов станет выкладывать идеально вылизанный пример для открытого хост-контроллера, который стоит у всех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться