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


Как определить тип микросхемы 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 ); }




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



Книжный магазин