Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Вроде как заработало! 23.09.03 12:01 Число просмотров: 1581
Автор: amirul <Serge> Статус: The Elderman
|
> > Если ты его не проинициализируешь - оно работать > вообще не > > будет :-) > > А как это ФИФО инициализировать? > Старые ДОСовские проги спокойно работают на 16550А, и даже > не "догадываются" про наличие ФИФО. Они-то это ФИФО не > инициализируют. > Может же моя програмка поступать так же? Запросто. Когда я говорил, что фифо не будет работать я имел в виду ИМЕННО фифо. То есть порт будет работать как старый 16450 (или как его так, у которого фифо вообще нет).
> Спасибо большое за подсказку. А то я во всяких МАНах и > ФАКах ковырялся - ничего об этом не было, видимо старые > были, еще про 16450. В некоторых ошибки были - не было В 16450 это точно так же сделано. Вообще большую часть инфы о работе порта я почерпнул из чтения сырцов виндового дривера.
> указано, что нужно OUT2 установить, чтобы прерывания шли. > Один вопрос остался - как узнать, что это именно 16550А, Вот как это делается в виндовом дривере:
#define SERIAL_IIR_FIFOS_ENABLED 0xc0
DISABLE_ALL_INTERRUPTS(Extension->Controller);
WRITE_MODEM_CONTROL(
Extension->Controller,
(UCHAR)SERIAL_MCR_OUT2
);
//
// See if this is a 16550. We do this by writing to
// what would be the fifo control register with a bit
// pattern that tells the device to enable fifo's.
// We then read the iterrupt Id register to see if the
// bit pattern is present that identifies the 16550.
//
WRITE_FIFO_CONTROL(
Extension->Controller,
SERIAL_FCR_ENABLE
);
regContents = READ_INTERRUPT_ID_REG(Extension->Controller);
if (regContents & SERIAL_IIR_FIFOS_ENABLED) {
// ФИФО присутствует, это 16550(А)
}
---
> как установить длину очереди или запретить очередь, как Очередь запрещена по умолчанию. Если ее не включать - будет работать только RBR (receive buffer register - можно считать однобайтной очередью). Включается в FCR (FIFO control register). Но кроме того придется выставлять еще highwater (порог срабатывания прерывания) и т.д..
> после закидывания байта в передатчик понять, что туда еще > один влезет (в очереди еще есть место)? Если работаешь на прерываниях, то тебе придет прерывание, когда он освободится. Если же предпочитаешь поллить, читай LSR (line status register) там два бита THRE (transmit holding register empty) и TEMPT (transmitter empty). THRE ставится в 1, когда очередной байт из буфера ушел в передатчик (но передатчик может еще работать), а TEMPT - когда передатчик не работает.
|
|
|