Как определить тип микросхемы UART - часть 3
// считываем регистр расширения in_scr = inp( 0x3ff - 0x100 * port );
// сохранилось ли записанное число? if( in_scr != 0x5A ) {
// если нет, значит, регистр расширения отсутствует и, // следовательно, тип микросхемы - UART 8250
// восстанавливаем значение регистра расширения outp( 0x3ff - 0x100 * port, save_scr ); return( UART_8250 ); }
// записываем в регистр расширения другое число - 0xA5 outp( 0x3ff - 0x100 * port, 0xA5 );
// считываем регистр расширения in_scr = inp( 0x3ff - 0x100 * port );
// восстанавливаем значение регистра расширения outp( 0x3ff - 0x100 * port, save_scr );
// сохранилось ли записанное число? if( in_scr != 0xA5 )
// если нет, регистр расширения отсутствует и, // следовательно, тип микросхемы - UART 8250 return( UART_8250 );
// в противном случае регистр расширения есть и надо выполнить // дальнейшее тестирование для определения типа UART return( 0 ); }
/** *.Name is_UART_FIFO *.Title Определяет тип UART. * *.Descr Эта функция определяет тип микросхемы, * используемой данным последовательным асинхронным * адаптером (UART). * *.Proto int is_UART_FIFO( int port ); * *.Params int port - номер асинхронного адаптера: * 0 - COM1, 1 - COM2 * *.Return для UART 164550 - возвращает константу UART_16450, * для UART 16550 - возвращает константу UART_16550, * для UART 16550A - возвращает константу UART_16550A * *.Sample tst_uart.c **/ int is_UART_FIFO( int port ) {
int save_iir, in_iir;
// сохраняем значение регистра определения прерывания save_iir = inp( 0x3fa - 0x100 * port );
// разрешаем использование FIFO outp( 0x3fa - 0x100 * port, 0x1 );
// читаем значение регистра определения прерывания in_iir = inp( 0x3fa - 0x100 * port );
// восстанавливаем значение регистра определения прерывания outp( 0x3fa - 0x100 * port, 0x0 );
// если бит D6 содержит единицу, значит, мы имеем UART 16550A if(( in_iir & 0x40 ) == 1 ) return( UART_16550A );
// если бит D7 содержит единицу, значит, мы имеем UART 16550 if(( in_iir & 0x80 ) == 1 ) return( UART_16550 );
// если биты D7 и D6 содержат нули, значит, мы имеем UART 16450 // (буфер FIFO отсутствует) return( UART_16450 ); }