Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.97] |
|
Страницы: (51) « Первая ... 47 48 [49] 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#721
,
|
|
|
При работе с UHCI абсолютно нет нужды использовать "нереальный" режим. Вполне можно обойтись памятью в пределах 1-го мегабайта (даже 640К), доступной в 16-битной ДОС без каких-либо дополнений. Физический адрес "нижней" памяти вычисляется как (segment<<4)+offset, надеюсь, об этом все помнят. Главное, чтобы нужные нам массивы не пересекали границу физической страницы (4 Кб). Поэтому не надо ломать голову над использованием 32-битных регистров (и сегментных тоже) - пиши, как привык.
Счетчик кадров контроллера может стоять в 0, если контроллер не запущен (остановлен). Надо сделать всю предварительную работу - проинициализировать его и запустить. |
Сообщ.
#722
,
|
|
|
zakharo отписал в ЛС
|
Сообщ.
#723
,
|
|
|
Нулевая конечная точка. В дескрипторе устройства в первых 8ми байтах (емнип, последний байт). Т. е. сперва вычитываешь первые 8 байт дескритора устройства (размер кт принять равным 8ми) и мз этих данных уже получить реальный размер кт и вычитать уже дескриптор целиком. |
Сообщ.
#724
,
|
|
|
Нулевая контрольная точка. Реальный размер пакета для нулевой контрольной точки есть в Device Descriptor и он находится в пределах первых 8 байт. Для того чтобы узнать этот размер ставишь размер нулевой контрольной точки равной 8 и запрашиваешь не весь Device Descriptor, а только 8 байт. Из них извлекаешь реальный размер нулевой контрольной точки и потом везде используешь это значение. |
Сообщ.
#725
,
|
|
|
Дескриптор устройства также не могу получить по той же проблеме - зацикливание, но уже в функции StatusIN_Transaction, хотя и на томже месте.
; Ожидать завершения операции @@Wait_OpComplete: ; Проверить номер кадра in AX,DX sub AX,[StartFrame] and AX,7FFh ;выделить младшие 11 разрядов cmp AX,500 ;ожидать не более 500 кадров ja @@TimeOut ;превышен интервал ожидания ; Проверить слово состояния cmp [dword ptr GS:ESI],1b jne @@Wait_OpComplete popad ret Что имеет смысл проверить, дабы найти ошибку? |
Сообщ.
#726
,
|
|
|
Господа, не пут(г)айте человека - у него до транзакций дело вообще не доходит, взаимодействия с устройством нет, а значит, размер 0-й КТ ни при чем. Скорее всего, проблема в неправильном задании (и/или заполнении) FrameList. Или в неправильном определении адреса порта контроллера.
Кстати, про размер 0-й КТ - если помните, по спецификации USB непронумерованное устройство может (и обязано!) принимать/передавать пакеты ТОЛЬКО по 8 байт. Больший размер пакетов возможен только после присвоения адреса. Так что это здесь пока вообще ни при чем. |
Сообщ.
#727
,
|
|
|
Цитата zakharo @ Вполне можно обойтись памятью в пределах 1-го мегабайта (даже 640К) Это не совсем так. В мире большое количество мостов без поддержки DMA операций в базовой памяти, мне такие попадались, классический пример PIIX4, там об этом сказано черным по белому в спецификации. Добавлено Цитата zakharo @ ак что это здесь пока вообще ни при чем. Это тут при том, что эту ошибку я помнил, когда разбирал когда-то пример Кулакова. Там есть еще ошибки, их вспомнить, увы, уже не могу. Добавлено Цитата zakharo @ Скорее всего, проблема в неправильном задании (и/или заполнении) FrameList. Или в неправильном определении адреса порта контроллера. Ну сейчас в спокойной обстановке посмотрел - похоже на то. Надо начинать с самого низу - смотреть дамп всех регистров. |
Сообщ.
#728
,
|
|
|
Со сбросом порта там ещё косяки могут быть.
|
Сообщ.
#729
,
|
|
|
Вчера по советам zakharo налаживал программу. Но в итоге столкнулся со следующими непонятками:
При запуске программы (определение, инициализация и запуск контроллера)кадры не бегут. Как был регистр ax 0 при чтении из порта, так и остается нулевым. Если же запустить сначала резидентный драйвер USB, то при запуске моей программы кадры отлично бегут. Но как только выгружаю резиденту все прекращается. Получается я не корректно запускаю контроллер? И вторая не понятка: Если теперь вынуть мышку из компа, то на запуке контроллера машина просто повисает. Мышь PS/2 подключена вместе с клавиатурой через разветвитель в гнездо клава/мышь. Т.е. один вход и разветвитель на два выхода для мыши и клавы. Приведу скрипт работы: mov DX,[USB_BaseAddr] mov AX,100b ;установить сигнал сброса out DX,AX ; Ожидать не менее 10 мс call Wait05s ; Снять сигнал сброса mov AX,0 out DX,AX ; Ожидать не менее 10 мс call Wait05s ; Обнулить счетчик номеров mov [USB_Device_Number],0 ; Загрузить указатель на список кадров в регистр ; адреса списка кадров mov DX,[USB_BaseAddr] add dx,4 mov ax,0 out dx,ax add DX,2 mov AX,0 out DX,AX add DX,2 mov EAX,FrameListBaseAddr out DX,EAX ; Активизировать хост-контроллер mov DX,[USB_BaseAddr] mov AX,1 out DX,AX на последней команде при отключенной мыше повисает все. Подскажите: 1) По какой возможной причине я не могу запустить контроллер пока не запущенна сторонняя программа-резидента. Что упустил? 2) КАк мышка может влиять на работу контроллера USB? и что нужно сделать дабы не было такого влияния? |
Сообщ.
#730
,
|
|
|
Цитата Krom @ Получается я не корректно запускаю контроллер? Скорее всего некорректно инициализируешь. Цитата Krom @ Мышь PS/2 Не очень понимаю какое отношение мышь PS/2 имеет к данной проблеме. Там переходник что ли стои USB<->PS/2? Если это так то всему виной такая штука как keyboard and mouse legasy support. Как это отключить написано в последней главе официальной спецификации на UHCI. Это нужно делать до сброса. Цитата Krom @ 2) КАк мышка может влиять на работу контроллера USB? и что нужно сделать дабы не было такого влияния? Описал выше. Там возникает не обрабатываемое прерывание SMI, которое душит всю систему. Добавлено Цитата Krom @ 1) По какой возможной причине я не могу запустить контроллер пока не запущенна сторонняя программа-резидента. Что упустил? Реши хотя бы проблему с мышкой и пойдем дальше. |
Сообщ.
#731
,
|
|
|
В БИОСЕ:
USB Controller Enabled USB 2.0 Controller Disabled USB Mouse Suport Disabled Про keyboard and mouse legasy support понял. Прочту. |
Сообщ.
#732
,
|
|
|
Цитата Krom @ В БИОСЕ: Все равно попробуй. |
Сообщ.
#733
,
|
|
|
shm
@For implementations in a PCI device, the legacy support register is located at offset C0-C1h, in function 2 PCI configuration space.@ по legasy regist понял, что нужно прочитать данные по смещению C0-C1 из этого регистра, но не понял каким образом. т.е мне нужно вызывать вторую функцию а потом читать данные из регистра по нужному смещению? не совсем понимаю как правильно прочитать данные |
Сообщ.
#734
,
|
|
|
Цитата Krom @ не совсем понимаю как правильно прочитать данные Это регистры конфигурационного пространства PCI. В той же книге Кулакова описается как работать c PCI. Собственно в его примерах это и используется для поиска устройств, тебе нужно просто вычитать и записать по этому адресу значения. |
Сообщ.
#735
,
|
|
|
Да, так и предполагал, но смущает упоминание о 2рой функции.
|