# Блок PE_EXT_FIFO

Версия документа: 1.0

## Общие сведения

Назначение | Управление каналом FIFO
Модификация | 1 - только режим автоинициализации
Версия | 1.0
ID | 0x18

## Состав регистров

Номер | Название | Описание
Константы
0 | BLOCK_ID | 0x1018 | Идентификатор блока управления
1 | BLOCK_VER | 0x0100 | Версия блока управления
2 | FIFO_ID | 0x3400 | Идентификатор FIFO
3 | FIFO_NUMBER | * | Номер FIFO
4 | RESOURCE | 0x0002 | Поддерживаемые режимы работы
5 |  |  |
6 |  |  |
7 |  |  |
Командные регистры
8 | DMA_MODE | Режим работы контроллера DMA
9 | DMA_CTRL | Управление контроллером DMA
0x0A | BLOCK_CNT | Число блоков для передачи
0x0B |  |
0x0C |  |
0x0D |  |
0x0E |  |
0x0F |  |
Непосредственные регистры
0x10 | STATUS | Регистр состояния
0x11 | FLAG_CLR | Регистр сброса флагов
0x12 |  |
0x13 |  |
0x14 | PCI_ADRL | Адрес на PCI шине. Младшее слово
0x15 | PCI_ADRH | Адрес на PCI шине. Старшее слово
0x16 |  |
0x17 | LOCAL_ADR | Адрес на локальной шине
0x18 |  |
0x19 |  |
0x1A |  |
0x1B |  |

## Описание

Блок PE_EXT_FIFO предназначен для управления двунаправленным FIFO. Направление обмена устанавливается в регистре DMA_CTRL и в дескрипторе блока автоинициализации.

Алгоритм работы в режиме автоинициализации:

- Составить цепочку дескрипторов, которая описывает цепочку передаваемых блоков
- Записать 0 в регистр DMA_CTRL
- Сбросить внутреннее FIFO контроллера DMA - записать 1 в поле RESET_FIFO регистра DMA_CTRL и затем сбросить RESET_FIFO
- Задать требуемый режим работы в регистре DMA_MODE
- Записать адрес начального дескриптора в регистр PCI_ADRL
- Записать локальный адрес в регистр LOCAL_ADR
- Разрешить DMA передачу: установить бит DMA_START в регистре DMA_CTRL
- Ожидать завершения передачи блока с битом разрешения формирования флага DMA_EOT: ждать появления DMA_EOT в регистре STAUS или прерывания.
- Сбросить флаг DMA_EOT и прерывание: записать 0 в регистр FLAG_EOT. Флаг DMA_EOT должен быть обработан до формирования следующего DMA_EOT. Если установлен бит STATUS[DMA_INT_ERROR]=1, то это означает что пропущена обработка флага DMA_EOT;

Для останова DMA передачи необходимо записать 0 в регистр DMA_CTRL.

Для временной остановки работы канала DMA необходимо установить бит PAUSE в регистре DMA_CTRL, для возобновления работы достаточно сбросить бит PAUSE.

### Дескриптор блока автоинициализации

№ | Название | Описание
0 | DS0 | Дескриптор 0 - описание блока данных
1 | DS1 | Дескриптор 1 - описание блока данных
62 | DS62 | Дескриптор 62 - описание блока данных
63 | NEXT_BLOCK | Следующий блок дескрипторов

Адрес дескриптора должен быть выровнен на границу 512 байт.

### Слово описания блока данных

Байт | Название | Описание
0 | A1 | Адрес, байт 1
1 | A2 | Адрес, байт 2
2 | A3 | Адрес, байт 3
3 | - | Резерв, должен быть 0
4 | CMD | Команда дескриптора
5 | S1 | Размер, байт 1 Бит 0 определяет направление передачи: 0 - передача из HOST в ADM 1 - передача из ADM в HOST
6 | S2 | Размер, байт 2
7 | S3 | Размер, байт 3

Адрес блока должен быть выровнен на границу страницы, при этом всегда байт 0 адреса равен нулю и не представлен в регистре.
Размер передаваемого блока должен быть кратен размеру страницы, при этом байт 0 размера всегда равен нулю и не представлен в регистре.

### Слово CMD - команда дескриптора

Бит | Название | Описание
0 | JUMP_NEST_DS | 1 - переход к следующему дескриптору
1 | JUMP_NEXT_BLOCK | 1 - переход к следующему блоку
2 | JUMP_DS0 | 1 - переход к дескриптору 0
3 |  |
4 | EOT | 1 - требование сформировать флаг EOT (End-Of-Transfer)
5 |  |
6 |  |
7 |  |

Если ни один из битов JUMP_* не установлен, то канал DMA завершает работу.

Установленный бит JUMP_NEXT_BLOCK означает, что следующее слово содержит адрес блока дескрипторов.

### NEXT_BLOCK - Следующий блок дескрипторов

Байт | Название | Описание
0 | A1 | Адрес, байт 1
1 | A2 | Адрес, байт 2
2 | A3 | Адрес, байт 3
3 | - | Резерв, должен быть 0
4 | SIG | Сигнатура 0x4953
5
6 | CRC | Контрольная сумма
7

## Описание регистров блока PE_EXT_FIFO

### Регистр BLOCK_ID

Бит | Название | Описание
11..0 | ID | Идентификатор блока управления
15..12 | MOD | Номер модификации блока управления

### Регистр BLOCK_VER

Бит | Название | Описание
7..0 | V0 | Поле V0
15..8 | V1 | Поле М1

Номер версии записывается в виде: V1.V0

### Регистр FIFO_ID

Бит | Название | Описание
11..0 | SIZE | Размер FIFO
15..12 | TYPE | Направление передачи 1 - FIFO работает на чтение 2 - FIFO работает на запись

Регистр FIFOx_ID предназначен для идентификации канала FIFO, x - номер FIFO. Значение 0 означает отсутствие FIFO.
Поле SIZE показывает размер FIFO в 32-х разрядных словах.

### Регистр FIFO_NUMBER

Бит | Название | Описание
15..0 | SIZE | Размер FIFO

Регистр FIFO_NUMBER содержит порядковый номер FIFO внутри прошивки.

### Регистр RESOURCE

Бит | Название | Описание
0 | NON_SG_MODE | 1 - поддержка работы без автоинициализации
1 | SG_MODE | 1 - поддержка работы в режиме автоинициализации
2 | CNT_MODE | 1 - поддержка счётчика блоков
15..3 | - |

Регистр RESOURCE содержит информацию о поддерживаемых режимах работы

### Регистр DMA_MODE

Бит | Название | Описание
0 | SG_MODE | 1 - работа в режиме автоинициализации, 0 - без автоинициализации
1 | DEMAND_MODE | 1 - работа по запросам
2 | DIRECT | 1 - передача ADM->HOST, 0 - передача HOST->ADM
3 |  |
4 |  |
5 | DMA_INT_ENABLE | 1 - разрешение формирования прерываний по флагу EOT
15..6 | - |

### Регистр DMA_CTRL

Бит | Название | Описание
0 | DMA_START | 1 - запуск канала DMA
1 | DMA_STOP | не используется
2 |  |
3 | PAUSE | 1 - приостановка обмена
4 | RESET_FIFO | 1 - сброс внутреннего FIFO канала DMA
5 |  |
15..6 | - |

### Регистр BLOCK_CNT

Бит | Название | Описание
31..0 | CNT | Число блоков для передачи

Регистр определяет число блоков размером 4 килобайта, которые будут переданы по каналу DMA. Значение 0 означает передачу бесконечного числа блоков.

В данной модификации не используется.

### Регистр STATUS

Бит | Название | Описание
3..0 | DMA_STATUS | Резерв
4 | DMA_EOT | 1 - завершение однократного DMA или блока с разрешённым прерыванием в цепочечном режиме
5 | DMA_SG_EOT | 1 - завершение DMA в режиме автоинициализации
6 | DMA_INT_ERROR | 1 - пропуск блока
7 | INT_REQ | 1 - запрос прерывания
8 | DSC_CORRECT | 1 - блок дескрипторов правильный
9 |  |
10 |  |
11 |  |
15..12 | SIG | Сигнатура, установлено значение 0x0A

###

### Регистр FLAG_CLR

Бит | Название | Описание
3..0 | - | Не используются
4 | DMA_EOT | 1 - сброс STATUS[DMA_EOT]
15..5 | - | Не используются

Запись в регистр приводит к сбросу флага EOT в регистре STATUS. Требуется только одна запись.

### Регистры PCI_ADRL, PCI_ADRH

Бит | Название | Описание
31..0 | - | адрес

Регистры PCI_ADRL, PCI_ADRH содержат адрес блока на шине PCI. Регистр PCI_ADRL содержит младшее слово 64-х разрядного адреса, регистр PCI_ADRH содержит старшее слово 64-х разрядного адреса. В настоящее время регистр PCI_ADRH не используется.

### Регистр LOCAL_ADR

Бит | Название | Описание
31..0 | ADR | Адрес на локальной шине

Регистр определяет адрес на локальной шине к которому будут формироваться запросы на передачу данных.

### Список версий

1.0 | 14.05.2009 | Базовая версия