Весь мозг вынес мне этот контроллер!!!

У меня следующая проблема. Мастером является FPGA.
Делаю девайс USB to SATA HDD. Драйвер хоста стандартный для Mass Storage Device.
Cypress преобразует SCSI команды в команды SATA и отправляет их в FPGA.
Из FPGA необходимо принимать пакеты с данными (сектора) по 512 байт и по завершению чтения всех секторов
принимать 20 байт ответа, но на хост ответ уходить не должен.
Никак не могу сделать корректный прием данных из FPGA и передать их драйверу на хост. Хоть убейся!!!
Если EP8 настроена на AUTOIN, то на хост приползают все пакеты из FPGA.
Реакции на INPKTEND = 0x88 - нет.
В общем так не канает.
Тогда настраиваю на прием пакетов из FPGA по EP8 в режиме MANUAL.
Код
WRITEDELAY();
EP8CFG = 0xE2; // ep8 is valid BULK IN 512 double buffered
WRITEDELAY();
EP8FIFOCFG = 0x01; // set EP8: 0x05=MANUAL, 0x09=AUTOIN
WRITEDELAY();
EP8AUTOINLENH = 0x02; // Auto-commit 512-byte packets
WRITEDELAY();
EP8AUTOINLENL = 0x00;
EP8CFG = 0xE2; // ep8 is valid BULK IN 512 double buffered
WRITEDELAY();
EP8FIFOCFG = 0x01; // set EP8: 0x05=MANUAL, 0x09=AUTOIN
WRITEDELAY();
EP8AUTOINLENH = 0x02; // Auto-commit 512-byte packets
WRITEDELAY();
EP8AUTOINLENL = 0x00;
Прием реализовал так:
Код
// для отладки читаем один сектор не зависимо от команды SCSI
sectorcount = 1;
while (sectorcount--)
{
// ждем, когда EP8 будет FULL
while( !( EP68FIFOFLGS & 0x10 ) );
// firmware commits EP8 packet
INPKTEND = 0x08;
while( !( EP68FIFOFLGS & 0x10 ) );
// skip пакет, т.к. это 20 байт ответа
INPKTEND = 0x88;
}
}
sectorcount = 1;
while (sectorcount--)
{
// ждем, когда EP8 будет FULL
while( !( EP68FIFOFLGS & 0x10 ) );
// firmware commits EP8 packet
INPKTEND = 0x08;
while( !( EP68FIFOFLGS & 0x10 ) );
// skip пакет, т.к. это 20 байт ответа
INPKTEND = 0x88;
}
}
Работает не корректно. Да вообще творится черт знает что!!!
- сектор засасывается на хост несколькими частями
- когда приходит новая SCSI команда, то продолжаю передаваться куски предыдущего сектора
- а также передаются 20 байт, которым я сделал SKIP!
Могу выложить логи USB сниффера.
Я так подозреваю, что ожидание заполнения FIFO while( !( EP68FIFOFLGS & 0x10 ) ); не так работает.
По докам, этот флаг валидный, когда FPGA установила FIFOADR = "11".
А у меня выходит, когда FPGA отправила сектор в EP8, происходит переключение снова на EP4, т.е. чтение с хоста.
Как сделать правильно?