Порт PS/2

Процессорная система «DE2-70 Media Computer» включает два PS/2 порта, которые могут быть соединены со стандартными клавиатурой и мышью. Каждый порт содержит 256 байтный FIFO буфер, который хранит данные, получаемые из PS/2 устройства. Программный интерфейс PS/2 порта состоит из двух регистров, как показано на рис. 3.27.

Рис. 3.27 – Регистры РS/2 порта

Регистр данных можно считывать и записывать. Если в считанном из регистра данных слове 15-ый бит (RVALID) равен 1, то это означает, что данные в буфере чтения FIFO присутствовали. Следовательно, они могут быть взяты из младших восьми разрядов считанного из регистра данных слова. В это же время, считанное из поля RAVAIL значение, будет отображать число оставшихся в буфере FIFO символов, с учетом только что прочитанного. Каждый раз после чтения символа из буфера FIFO, поле RAVAIL автоматически уменьшается на единицу. Запись в регистр данных может быть использована для отправки команды, представленной в младшем байте, в PS/2 устройство.

Регистр управления может быть использован для разрешения прерываний процессора от PS/2 порта, посредством установки поля RE в 1. Когда это поле установлено, PS/2 порт будет формировать запрос прерывания, если RAVAIL больше 0. Об этой ситуации будет сигнализировать разряд RI, который будет установлен в 1. Этот разряд может быть очищен посредством чтения из PS/2 порта. Бит CE в регистре управления используется для указания ошибки, если она возникает при отправке команды в PS/2 устройство.

Фрагмент программы на языке С, в котором используется PS/2 порт, приведён в листинге 19. Программа читает содержимое регистра данных, затем выделяет бит RVALID и, если он установлен, то сохраняет данные. В противном случае ожидает установки этого бита. Последние три байта данных, полученных от PS/2 порта, сохраняются в переменных byte1, byte2, byte3. Рассмотренный фрагмент является составной частью большей программы Media, входящей в приложение Altera Monitor Program.

Листинг 19. Фрагмент программы, в котором используется PS/2 порт

volatile int *PS2_ptr = (int *) 0x10000100; //базовый адрес PS/2 порта

int PS2_data, RVALID;

char byte1=0, byte2=0, byte3=0;

PS2_data = *(PS2_ptr); //читаем содержимое регистра данных PS/2 порта

RVALID = PS2_data & 0x8000; //извлекаем бит RVALID

if (RVALID) //если в буфере имеются новые данные

{

/*Сохраняем последние 3 байта данных*/

byte1 = byte2;

byte2 = byte3;

byte3 = PS2_data & 0xFF;

}



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: