USB, OHCI. Кто умеет c ним камасутриться?
Ковыряю (адаптирую) чужие исходники для работы с очень сомастийным USB
устройством. На всех машинах с OHCI оно работает направильно.
(на машинах с uhci работает другой код, он работает правильно)
Ткните, пожалуйста, носом в то место, где я делаю неправильно.
Последовательность действий:
================
if(ohci_int_get(HCCPControl,HCInterruptRouting) == HCInterruptRouting)
{
ohci_int_set(HCCPCommandStatus,HCOwnershipChangeRequest);
delay_ms(100);
}
ohci_int_set(HCCPInterruptDisable, 0xFFFFFFFF);
//обнуляем весь control
ohci_int_unset(HCCPControl,0xFFFFFFFF);
ohci_int_set(HCCPCommandStatus,HCReset);
delay_ms(100);
//перевод контроллера в Operational:
ohci_int_unset(HCCPControl, HCFunctionalStateResume);
// _!!!!!!!!!!!!!!!!_
delay_ms(100);
if (ohci_int_get(HCCPControl, HCFunctionalStateSuspend) ==
HCFunctionalStateOper)
{
// установим адрес буфера для приема данных
ohci_int_set(HCMPHCCA, far_to_long(m_pHCCA));
}
ohci_hc_poweron();
if (ohci_int_get(HCCPControl, HCFunctionalStateSuspend) !=
HCFunctionalStateOper)
{
return FALSE;
}
return TRUE;
===============
в месте помеченном как _!!!!!!!!!!!!!!!!_ контроллер начинает гадить память по
адресу 0х00000080
ps: Посмотрел usb-ohci.c и usb-ohci.h - вроде бы там та же последовательность
действий.
pps: Функция ohci_int_unset сбрасывает те биты указанного регистра, которые в
параметре установлены в 1.
. С уважением, Hикита.