реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Пытаясь запустить UsbHostLite для LPC2468 с nxp.com
Gizma
сообщение Aug 20 2009, 10:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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), не зависимо от того вставлено что либо в хост или нет... Позже это прервывание не вызываеться вообще...

Может подсобите чем нибудь, я пока в ступоре...
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Aug 20 2009, 15:46
Сообщение #2


Участник
*

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



Цитата(Gizma @ Aug 20 2009, 14:27) *
HcInterruptStatus что там случилось, но там всегда одни нули...


А откуда это известно? Отладчиком смотрели? А может у Вас как раз та самая ситуация, когда вы останавливаетесь отладчиком, смотрите статус - регистры, которые можно читать только один раз (многие регистры LPC можно читать 1 раз, особенно всякие там статусы и FIFO), а потом когда стартуете программу, удивляетесь, что она работает некорректно?
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 20 2009, 18:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Aug 20 2009, 20:10
Сообщение #4


Участник
*

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



Gizma, вы понимаете, о чём речь? Внимательно прочитайте.

Чем бы Вы не смотрели, в любом случае JTAG будет читать периферию ядром. Это значит, что если Вы в отладчике используете окно watch или каким-либо иным образом смотрите текущее состояние регистров, то вы их читаете, понимаете?

Хорошо, приведу пример. Я пользуюсь ИАРом, у меня открыто окно просмотра регистров MCI (интерфейс SD карт) отлаживаемого чипа LPC2888. Вот останавливаемся в прерываниях по брейку. В окошке регистров MCI видны регистры FIFO. Вы понимаете, что всё, труба? FIFO считано, если я продолжу выполнение программы, то, во-первых, этих данных программа никогда не увидит, и, во-вторых, в статус регистре сбросится бит, что в FIFO есть данные. И я, как Вы, буду удивляться, какого хрена прерывание, когда данных нет. Понимаете?

Не знаю кто там в IAR придумал вывести FIFO на вкладку регистров MCI, но там народ определённо не парится насчёт удобства работы в их среде.
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 20 2009, 20:52
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Aug 21 2009, 05:57
Сообщение #6


Участник
*

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



Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился. Особо потрясает как они сделали DMA: последние 8-9 слов приходится доталкивать в FIFO ручками по FIQ, т.к. DMA останавливается раньше, чем передаётся весь блок. Это глупо и неприятно.

Так пример не работает совсем или не понятно как работает? Должны же были протестировать материал перед публикацией.
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 21 2009, 07:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 08:30
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(IgorMarx @ Aug 21 2009, 11:57) *
Понятно. Вообще-то у NXP исключительно плохая документация и очень бажные чипы сами по себе. Я с этим LPC2888 изрядно помучился.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 21 2009, 09:31
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 21 2009, 09:40
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Gizma @ Aug 21 2009, 15:31) *
fdr = FILE_Open(FILENAME_R, RDONLY); возвращает не 0!! А некое 0xFFFFFFEC, но этот if (fdr > 0), почему то считает что в его условии FALSE*((

Смею предположить, что fdr имеет знак и 0xFFFFFFEC отрицательное значение, меньшее 0.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 21 2009, 13:21
Сообщение #11


Профессионал
*****

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



Гм. Простите, а кто-нибудь тут спецификацию OHCI читал?
Английским же языком написано, что описание регистров смотреть надо там.


Сбросить бит в HcInterruptStatus можно только одним способом - записать туда единичку.


PS GetSmart, Вы правы: в том примере определено USB_INT32S fdr;

Сообщение отредактировал esaulenka - Aug 21 2009, 13:28


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 21 2009, 14:27
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 21 2009, 16:11
Сообщение #13


Профессионал
*****

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



Также хочется заметить, что
а) VICIntEnClr - ну совершенно НЕ "enable interupt"
б) в примере в OTGClkCtrl записывается совсем другое значение
в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно
г) условие в while, подозреваю, не даст желаемого результата smile.gif
д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно.

Это к слову "чипы и доки кривые".

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Gizma
сообщение Aug 21 2009, 18:02
Сообщение #14


Участник
*

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



Цитата
а) VICIntEnClr - ну совершенно НЕ "enable interupt"


Я тоже это сразу заметил, наверное ошибка в комметариях... Ведь прерывание все равно включаеться в конце функции... А в начале отключаеться пока не проиниться хост, решение разумное!

Цитата
б) в примере в OTGClkCtrl записывается совсем другое значение


Да! Но оригинальное значение, являеться по мануалу на LPC2468 несколько некорректным! Что этим хотел сделать автор я не понял*)

Цитата
в) обращаться к OTGStCtrl ДО того, как включится clock, неразумно
г) условие в while, подозреваю, не даст желаемого результата smile.gif


Да тут вы правы внимание не обратил, спасибо! Все проблемы решены, все работает на железе как надо!

Цитата
д) к PINSELx товарищ Ravikanth обращается как-то совсем... странно.


Меня тоже несколько удивила такая котовасия, вопрос зачем она нужна? Ну да ладно,

Цитата
Это к слову "чипы и доки кривые".

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


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

Сообщение отредактировал Gizma - Aug 21 2009, 18:07
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 21 2009, 19:03
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Ну вряд ли производитель вполне определенных кристаллов станет выкладывать идеально вылизанный пример для открытого хост-контроллера, который стоит у всех.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016