22.14. Управление конечной точкой IN
Пакеты IN отправляются Device-контроллером по запросу IN Host-стороны. Все данные могут быть записаны ЦПУ, который подтверждает или нет заполненный банк.
22.14.1. Обзор
Первоначально необходимо настроить конечную точку.
Бит TXINI устанавливается аппаратно, когда освобождается текущий банк. Если бит TXINE установлен, это приводит к запуску прерывания. Одновременно с ним выполняется установка бита FIFOCON. Чтобы разрешить USB-контроллеру передавать данные, ЦПУ нужно записать их в FIFO и сбросить бит. Если конечная точка IN состоит из нескольких банков, то одновременно с этим происходит переход к следующему банку данных. Биты TXINI и FIFOCON автоматически обновляются аппаратными средствами, независимо от состояния следующего банка.
Бит TXINI необходимо обнулять только перед обнулением FIFOCON.
Бит RWAL всегда отражает состояние текущего банка. Данный бит равен 1, когда разрешается программная запись данных в банк, и равен 0, когда банк полон.
22.14.2. Подробное описание
ЦПУ записывает данные в соответствии со следующей последовательностью:
- Когда банк пуст, запускается прерывание конечной точки (EPINTx), но только при условии, что это прерывание разрешено (TXINE=1) и установлен бит TXINI. В зависимости от архитектуры программы, ЦПУ альтернативно может выполнить опрос бита TXINI или FIFOCON;
- ЦПУ подтверждает прерывание сбросом бита TXINI;
- ЦПУ записывает данные в текущий банк (запись в UEDATX),
- ЦПУ освобождает банк путем сброса FIFOCON, но только после записи всех данных, а именно:
- после N записей в UEDATX;
- вскоре после аппаратного сброса RWAL.
Если конечная точка использует 2 банка, то одновременно с заполнением ЦПУ одного банка Host-сторона может считывать другой банк. Затем, когда ЦПУ сбрасывает FIFOCON, очередной банк может быть уже готов (свободен), а TXINI устанавливается незамедлительно.
22.14.2.1. Функция ABORT
Потребность в функции ABORT инициируется Host-стороной и возникает в следующих ситуациях:
- (транзакция CONTROL) ZLP-данные OUT приняты на этапе IN;
- (транзакция ISOCHRONOUS IN) ZLP-данные OUT приняты конечной точкой OUT на этапе IN конечной точки IN
- ...
В такой ситуации необходимо воспользоваться битом ликвидации последнего записанного банка KILLBK, придерживаясь следующего алгоритма.
Таблица 22.1. Блок-схема функции ABORT
22.15. Изохронный режим
22.15.1. Ошибка незаполнения
Ошибка незаполнения может возникнуть на этапе IN, если Host-сторона пытается прочитать пустой банк. В этой ситуации запускается прерывание UNDERFI.
Данная ошибка может также возникнуть на этапе OUT, если Host-сторона отправляет пакет, а банки уже заполнены. Обычно ЦПУ не обладает достаточным быстродействием и пакет теряется.
Ошибка незаполнения не может возникнуть по вине ЦПУ, если последний будет выполнять чтение, только если банк готов отдавать данные (RXOUTI=1 или RWAL=1).
22.15.2. Ошибка CRC
Ошибка CRC может возникнуть на этапе OUT, если USB-контроллер примет поврежденный пакет. В такой ситуации запускается прерывание STALLEDI. Это не предотвращает запуск прерывания RXOUTI.
22.16. Ошибка переполнения
Ошибка переполнения может возникнуть в конечной точке типа CONTROL, ISOCHRONOUS, BULK или INTERRUPT на этапе OUT, если Host-сторона пытается записать в банк, размер которого слишком мал для пакета. В этой ситуации, запускается прерывание OVERFI, если таковое было разрешено прежде. Для такого пакета генерируется подтверждение NACK, а также генерируется прерывание RXOUTI (если его работа была разрешена). Банк заполнен первыми байтами пакета.
Ошибка переполнения на этапе IN не возникнет по вине ЦПУ, если последний будет записывать данные, только когда банк готов к этому (TXINI=1 или RWAL=1).
22.17. Прерывания
На следующем рисунке показаны все источники прерываний:
Рисунок 22.4. Система прерываний Device-контроллера
Все прерывания разделяются на два вида: операционные (т.е. их генерация является частью нормальной работы) и нештатные (ошибки).
Предусмотрена генерация следующих видов операционных прерываний:
- по обнаружению подачи или снятия напряжения VBUS (VBUSTI)
- UPSTREAM RESUME (UPRSMI)
- END OF RUSUME (EORSMI)
- WAKE-UP (WAKEUPI)
- END OF RESET (инициализация скорости) (EORSTI)
- START OF FRAME (SOFI, если FNCERR=0)
- по обнаружению SUSPEND после 3 мс неактивности (SUSPI)
Нештатные прерывания генерируются, когда:
- обнаруживается ошибка CRC номера посылки в пакете START OF FRAME (SOFI, FNCERR=1)
Рисунок 22.5. Система прерываний конечной точки Device-контроллера
Предусмотрена генерация следующих операционных прерываний:
- готовность к получению данных IN (EPINTx, TXINI=1)
- прием данных OUT (EPINTx, RXOUTI=1)
- прием SETUP (EPINTx, RXSTPI=1)
Нештатные прерывания:
- пакет STALL (EPINTx, STALLEDI=1)
- ошибка CRC в изохронном режиме в направлении OUT (EPINTx, STALLEDI=1)
- переполнение в изохронном режиме (EPINTx, OVERFI=1)
- незаполнение в изохронном режиме (EPINTx, UNDERFI=1)
- отправлено NAK в направлении IN (EPINTx, NAKINI=1)
- отправлено NAK в направлении OUT (EPINTx, NAKOUTI=1)
|