DiMonstr 0 4 сентября, 2010 Опубликовано 4 сентября, 2010 · Жалоба Всем привет! Весь мозг вынес мне этот контроллер!!! :smile3046: У меня следующая проблема. Мастером является 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; Прием реализовал так: // для отладки читаем один сектор не зависимо от команды SCSI 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, т.е. чтение с хоста. Как сделать правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 6 сентября, 2010 Опубликовано 6 сентября, 2010 · Жалоба Понедельник день тяжелый, я понимаю... Наверно трудно будет с лёту вкурить, что я изложил, поэтому сформулирю вопрос так: 1. В EP8IN приходит первый пакет данных. 2. Перед передачей его хосту необходимо в начало пакета добавить заголовок. 3. Затем в хост передать заголовок+данные. Как реализовать такой алгоритм в режиме ручного управления fifo? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться