Перейти к содержанию
    

Трабла с приемом данных в режиме Slave FIFO на чипе Cypress FX2LP

Всем привет!

Весь мозг вынес мне этот контроллер!!! :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, т.е. чтение с хоста.

 

Как сделать правильно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понедельник день тяжелый, я понимаю...

 

Наверно трудно будет с лёту вкурить, что я изложил, поэтому сформулирю вопрос так:

1. В EP8IN приходит первый пакет данных.

2. Перед передачей его хосту необходимо в начало пакета добавить заголовок.

3. Затем в хост передать заголовок+данные.

 

Как реализовать такой алгоритм в режиме ручного управления fifo?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...