Главная » Ассемблер, Железо » Структуры данных хост-контроллера

0

Описание используемых хост-контроллером шины USB 1.1 структур данных содержится в спецификации Universal Host Controller Interface Design Guide [91].

Список кадров

Список кадров (Frame List) представляет собой массив, который состоит из 1024 указателей кадров по 32 разряда и занимает 4 Кбайт оперативной памяти. Начальный адрес списка хранится в регистре базового адреса списка кадров FLBASEADD (он должен быть выровнен на границу 4 Кбайт).

Рис. 8.3. Структура элемента списка кадров

Структура элемента списка кадров показана на рис. 8.3. Разряды элемента списка имеют следующее назначение:

•     бит 0 (Т) — признак «пустого» кадра (0 — указатель кадра является достоверным и содержит адрес заголовка очереди или дескриптора передачи, 1 — указатель не является достоверным и не должен обрабатываться);

•     бит 1 (Q) — тип структуры данных, адрес которой содержится в указателе кадра (0 — дескриптор передачи, 1 — заголовок очереди);

•        биты 2 и 3 зарезервированы и должны иметь значение 0;

•        биты 4-31 (FLP) — биты 4-31 указателя кадра.

Указатель кадра (Frame List Pointer) содержит линейный (абсолютный) 32-разрядный адрес области памяти, по которому размещен объект данных списка кадров — заголовок очереди или дескриптор передачи.

Адрес объекта данных должен быть выровнен по границе 16 байт; младшие 4 разряда адреса всегда равны нулю.

Дескриптор передачи

Дескриптор передачи (Transfer Descriptor, сокращенно — TD) описывает параметры транзакции, запрашиваемой клиентом USB. Начало дескриптора должно быть выровнено на границу в 16 байт.

Рис. 8.4. Структура дескриптора передачи

Несмотря на то, что USB может выполнять передачи четырех различных типов, все дескрипторы имеют одинаковую структуру, изображенную на рис. 8.4. Каждый дескриптор передачи занимает 32 байта памяти и состоит из двух частей: младшие четыре 32-разрядных слова занимает область данных хост-контроллера, старшие четыре слова — область данных программного обеспечения:

•     двойное слово 0 (байты 00-03h) — указатель на следующий элемент списка дескрипторов;

•     двойное слово 1 (байты 04-07h) — слово управления и состояния дескриптора передачи;

•         двойное слово 2 (байты 08-0Bh) — маркер дескриптора передачи;

•         двойное слово 4 (байты OC-OFh) — указатель на буфер данных;

•     слова 5-8 зарезервированы для использования программным обеспечением.

Область данных программного обеспечения хост-контроллером не обрабатывается и на его функционирование никак не влияет.

Рис. 8.5. Структура указателя на следующий элемент списка дескрипторов

Указатель на следующий элемент списка дескрипторов имеет структуру, изображенную на рис. 8.5:

•    бит О (Т) — признак последнего элемента списка (0 — указатель содержит адрес следующего элемента списка, 1 — данный элемент является последним в списке, и поле указателя не должно обрабатываться контроллером);

•    бит 1 (Q) — тип структуры данных, адрес которой содержится в указателе (0 — дескриптор передачи, 1 — заголовок очереди);

•    бит 2 (Vf) — порядок обработки очередей (0 — в ширину, 1 — в глубину);

•    бит 3 зарезервирован и должен содержать значение 0;

•    биты 4-31 (LP) — биты 4-31 указателя на следующий элемент списка дескрипторов (младшие четыре разряда указателя содержат нули).

Следует уделить особое внимание биту 2, задающему порядок обработки очередей дескрипторов: если этот бит имеет значение 0, то после завершения обработки данного дескриптора контроллер переключится на следующую очередь (обработка списка в ширину), а если бит 2 установлен в 1 — будет обрабатываться следующая транзакция в текущей очереди (обработка списка в глубину).

Рис. 8.6. Структура слова управления и состояния дескриптора передачи

Структура слова управления и состояния дескриптора передачи показана на рис. 8.6. Разряды слова имеют следующее назначение:

•    биты 0-10 (ActLen) — объем данных, переданный в результате транзакции (значение данного поля на единицу меньше количества переданных байтов);

•    биты 11-15 зарезервированы и должны содержать нули;

•    бит 16 зарезервирован и должен иметь значение 0;

•    бит 17 — признак обнаружения ошибки в принимаемой последовательности битов (данный разряд устанавливается в 1, если в принятой последовательности подряд следует более шести единиц);

•    бит 18 — признак обнаружения ошибки тайм-аута или ошибки CRC (устанавливается в 1, если устройство не отвечает на запрос

или при выполнении транзакции обнаружено несовпадение контрольной суммы);

•    бит 19 — признак отказа от транзакции (устанавливается в 1, если контроллер получил сигнал «NAK» при выполнении транзакции);

•    бит 20 — признак обнаружения перекрестных помех (устанавливается в 1, если контроллер зафиксировал возникновение перекрестных помех при выполнении транзакции);

•    бит 21 — признак ошибки в буфере данных (устанавливается в 1 при переполнении буфера в процессе приема или опустошении буфера в процессе передачи данных);

•    бит 22 — признак сбоя при выполнении транзакции (устанавливается в 1 при обнаружении серьезной ошибки в процессе выполнения транзакции; при установке этого бита контроллер одновременно сбрасывает бит 23);

•    бит 23 — признак активного дескриптора (устанавливается в 1 программным обеспечением при включении дескриптора в очередь и сбрасывается хост-контроллером после завершения связанной с данным дескриптором транзакции или после обнаружения фатальной ошибки при ее выполнении);

•    бит 24 (ЮС) — управление сигналом прерывания, генерируемым по завершении кадра, в котором выполнялась обработка данного дескриптора (0 — прерывание не требуется, 1 — подать сигнал прерывания);

•    бит 25 (I0S) — признак дескриптора изохронной передачи (устанавливается в 1 для дескриптора изохронной передачи и в 0 для дескрипторов других типов);

•    бит 26 (LS) — тип устройства (имеет значение 0, если целевое устройство является полноскоростным, и 1 — если устройство низкоскоростное);

•    биты 27-28 (С_Егг) — счетчик ошибок (ООЬ — нет лимита ошибок, 01b — допускается одна ошибка, 10Ь — допускаются две ошибка, lib — допускаются три ошибки). Счетчик ошибок работает на вычитание: его значение уменьшается на единицу после каждой неудачной попытки выполнения транзакции (сигнал «NAK» ошибкой не является и на значение счетчика не влияет). После исчерпания лимита ошибок транзакция становится неактивной, и устанавливается признак сбоя (бит 22);

•    бит 29 (SPD) — разрешение приема укороченного пакета данных (О — прием запрещен, 1 — разрешен). Если данный разряд установлен и длина принимаемого пакета меньше заданной, дескриптор передачи становится неактивным, заголовок очереди не изменяется и (по окончании кадра) устанавливается бит USBINT в регистре состояния и вырабатывается прерывание (если оно разрешено);

•    биты 30-31 зарезервированы и должны содержать нули.

Биты 16-23 совместно образуют поле состояния процесса выполнения команды (Status Field), которое перезаписывается хост-контроллером после завершения транзакции. Кроме того, после транзакции хост может записывать информацию в поле ActLen и декрементиро- вать счетчик ошибок. Остальные поля заполняются программным обеспечением в процессе создания дескриптора и в дальнейшем не изменяются.

Рис. 8.7. Структура маркера дескриптора передачи

Маркер дескриптора передачи (TD Token) содержит заголовок пакета, который передается в стартовом маркере USB. Структура маркера показана на рис. 8.7. Разряды слова маркера имеют следующее назначение:

•    биты 0-7 (PID) — идентификатор пакета (2Dh — SETUP, 69h — IN, Elh – OUT);

•    биты 8-14 — адрес устройства;

•    биты 15-18 (EndPt) — номер конечной точки;

•    бит 19 (D) — переключатель синхронизации данных (0 — DATA0, 1 – DATA1);

•    бит 20 зарезервирован и должен содержать значение 0;

•    биты 21-31 (MaxLen) — объем передаваемых данных в байтах минус единица (000h — 1 байт,…, 4FFh — 1280 байт; 7FFh – пустой пакет (пакет нулевой длины); значения 500h-7FEh считаются недопустимыми).

Указатель на буфер данных содержит 32-разрядный адрес буфера, предназначенного для приема или передачи данных. Объем буфера должен быть не меньше, чем максимальный объем передаваемых

данных, закодированный в поле MaxLen маркера дескриптора передачи.

Заголовок очереди

Заголовок очереди (Queue Head, сокращенно QH) — это специальная структура данных, предназначенная для создания очередей, используемых при передачах типов Control, Bulk и Interrupt.

Рис. 8.8. Структура заголовка очереди

Структура заголовка очереди показана на рис. 8.8. Заголовок очереди состоит из двух 32-разрядных слов:

•     двойное слово 0 (байты 00-03h) — указатель на следующий элемент «горизонтального» списка;

•     двойное слово 1 (байты 04-08h) — указатель на первый элемент очереди.

Заголовок очереди должен быть выровнен на границу 16 байт.

Указатель на следующий заголовок очереди имеет структуру, изображенную на рис. 8.9:

[1]бит 0 (Т) — признак последнего заголовка в списке (0 — указатель содержит адрес следующего заголовка, 1 — данный элемент является последним в «горизонтальном» списке и поле указателя не должно обрабатываться контроллером);

•     бит 1 (Q) — тип структуры данных, адрес которой содержится в указателе (0 — дескриптор передачи, 1 — заголовок очереди);

•     биты 2-3 зарезервированы и должны содержать нули;

биты 4-31 (QHLP) — биты 4-31 указателя иа следующий элемент «горизонтального» списка (младшие четыре разряда указателя содержат нули).

Рис. 8.9. Структура указателя на следующий заголовок очереди

Указатель на первый элемент очереди дескрипторов передачи имеет структуру, изображенную на рис. 8.10:

•     бит 0 (Т) — признак последнего элемента очереди (0 — указатель содержит адрес следующего элемента, 1 — данный элемент является последним в очереди, и поле указателя не должно обрабатываться контроллером);

•     бит 1 (Q) — тип структуры данных, адрес которой содержится в указателе (0 — дескриптор передачи, 1 — заголовок очереди);

•         биты 2-3 зарезервированы и должны содержать нули;

•     биты 4-31 (QHLP) — биты 4-31 указателя на следующий элемент очереди (младшие четыре разряда указателя содержат нули).

Рис. 8.10. Структура указателя на первый элемент очереди дескрипторов передачи

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии