COM порт - помогите разобраться с инициализацией
От: Аноним  
Дата: 20.11.07 20:13
Оценка:
Здравствуйте!

Мне нужно инициализировать COM-порт, в режиме работы без прерываний, для вывода отладочной информации.
Вроде бы все делаю в соответсвии с мануалом, но отчего-то не работает
Пробовал ставить задержки в разных местах, играться с флагами — ничего не помогает.
UART — 16550.
Подскажите, что здесь не так?


#define UART_RX        0    /* In:  Receive buffer (DLAB=0) */
#define UART_TX        0    /* Out: Transmit buffer (DLAB=0) */
#define UART_DLL    0    /* Out: Divisor Latch Low (DLAB=1) */
#define UART_TRG    0    /* (LCR=BF) FCTR bit 7 selects Rx or Tx
* In: Fifo count
* Out: Fifo custom trigger levels
* XR16C85x only */

#define UART_LSR_THRE    0x20    /* Transmit-hold-register empty */

#define UART_TRG    0    /* (LCR=BF) FCTR bit 7 selects Rx or Tx
#define UART_DLL    0    /* Out: Divisor Latch Low (DLAB=1) */
#define UART_DLM    1    /* Out: Divisor Latch High (DLAB=1) */
#define UART_IER    1    /* Out: Interrupt Enable Register */
#define UART_FCTR    1    /* (LCR=BF) Feature Control Register
* XR16C85x only */

#define UART_IIR    2    /* In:  Interrupt ID Register */
#define UART_FCR    2    /* Out: FIFO Control Register */
#define UART_EFR    2    /* I/O: Extended Features Register */
/* (DLAB=1, 16C660 only) */

#define UART_LCR    3    /* Out: Line Control Register */
#define UART_MCR    4    /* Out: Modem Control Register */
#define UART_LSR    5    /* In:  Line Status Register */
#define UART_MSR    6    /* In:  Modem Status Register */
#define UART_SCR    7    /* I/O: Scratch Register */

    
    portAddr = 0x3f8; // Адрес COM1

    // Инициализация
    __outbyte(portAddr + UART_IER , 0);   /* Turn off interrupts */
    __outbyte(portAddr + UART_LCR , 0x80);  // SET DLAB ON 
    // baud rate = 9600 (divisor 0x0c)
    __outbyte(portAddr + UART_DLL , 0x0C);  // Set Baud rate - Divisor Latch Low Byte 
    __outbyte(portAddr + UART_DLM , 0x00);  // Set Baud rate - Divisor Latch High Byte 
    __outbyte(portAddr + UART_LCR , 0x03);  // 8 Bits, No Parity, 1 Stop Bit 
    __outbyte(portAddr + UART_FCR , 0xC7);  // FIFO enabled, 14 bytes in FIFO
    __outbyte(portAddr + UART_MCR , 0x0B);  // Turn on DTR, RTS, and OUT2
    
    // Проверяем статус
    DbgPrint("LSR=0x%02X\r\n", __inbyte(portAddr + UART_LSR)); // Здесь выводится 0xFF
    
    // Пытаемся что-нибудь вывести
    while (!(__inbyte(portAddr+UART_LSR) & UART_LSR_THRE)) {}
    __outbyte(portAddr+UART_TX, 0x40); // ничего не выводится
Re: COM порт - помогите разобраться с инициализацией
От: Аноним  
Дата: 20.11.07 23:30
Оценка:
Сорри за оверквотинг.

Данный код НЕ работает на UART, встроенном в мою материнку (P5B-E)
но РАБОТАЕТ для платы PCI-to-COM. Такая вот странность. Отчего — пока непонятно.
Re: COM порт - помогите разобраться с инициализацией
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.12.07 23:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!


А>Мне нужно инициализировать COM-порт, в режиме работы без прерываний, для вывода отладочной информации.

А>Вроде бы все делаю в соответсвии с мануалом, но отчего-то не работает :(
А>Пробовал ставить задержки в разных местах, играться с флагами — ничего не помогает.
А>UART — 16550.
А>Подскажите, что здесь не так?

Лезть в код облом, но могу подсказать, что драйверы для свободных ОС (Linux, *BSD) открыто можно утащить и почитать, при этом как найти ошибки, так и сделать поправки для реально встреченного железа.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.