Программирование модемов


COM-порт и номера IRQ - часть 3


// если соответствующая переменная BIOS содержит // нулевое значение считаем, что порт отсутствует

else printf("\n COM%d - отсутствует", port + 1); }

// проверяем все зарезервированные базовые адреса // последовательных портов - 3F8h, 2F8h, 3E8h, 2E8h.

printf("\n\n Тестируем зарезервированные адреса для регистров COM портов:\n\n");

for( port = 0; port < 4; port++ ) {

int port_address[] = { 0x3F8, 0x2F8, 0x3E8, 0x2E8 };

// определяем адрес порта port

adr = port_address[port];

printf(" COM-порт с базовым адресом %Xh %s\n", adr, ( test_com( adr ) == 0 )? "отсутствует": "обнаружен"); } } // TEST_COM.C

#include "sysp_com.h"

/** *.Name test_com * *.Title Определяет наличие последовательного порта. * *.Descr Эта функция определяет наличие последовательного * асинхронного порта по заданному базовому адресу. * *.Proto int test_com( unsigned base_adr ); * *.Params unsigned base_adr - базовый адрес предполагаемого * асинхронного адаптера. * *.Return Если порт не установлен, возвращается 1, * если порт отсутствует, то возвращается 0. * *.Sample test_com.c **/

int test_com( unsigned base_adr ) {

unsigned save_reg;

// определяем наличие асинхронного порта по заданному базовому // адресу путем записи с последующим чтением и сравнением // содержимого управляющего регистра

// сохраняем содержимое управляющего регистра

save_reg = inp( base_adr + LCR_N );

// производим запись с последующим сравнением числа 0xA5 // в управляющий регистр

outp( base_adr + LCR_N, 0xA5 ); if( 0xA5 != inp( base_adr + LCR_N ) ) return( 0 );

// производим запись с последующим сравнением числа 0x5A // в управляющий регистр

outp( base_adr + LCR_N, 0x5A ); if( 0x5A != inp( base_adr + LCR_N ) ) return( 0 );

// восстанавливаем содержимое управляющего регистра

outp( base_adr + LCR_N, save_reg );

return( 1 ); }




Начало  Назад  Вперед