Страниц: 1 [2]
  Печать  
Автор Тема: devc-ser8250 отложеные прерывания  (Прочитано 17827 раз)
sysenter
Участник
*
Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #15 : Сентября 09, 2008, 05:47:49 pm »

Встречал такой экземпляр плат посл. портов, у которой работала передача одного байта, а передача нескольких байтов через некоторое время затыкалась (и под Виндой тоже). Причем остальные экземпляры этой модели работали без проблем.
Записан
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #16 : Ноября 05, 2011, 09:48:42 pm »

Для 6.2.1 в свое время был выпущен
<a href="http://www.qnx.com/download/feature.html?programid=8589" target="_new">Experimental fix for the 8250 serial driver</a>

Fixes a workaround for buggy 16xxx FIFOs so that a  timeout doesn't take 10-13 seconds

Только недавно сталкнулся с такой же проблемой. Саунд карта воспроизводит звук по пакетам принимаемым по RS-232 если очень интенсивно давить на кнопки драйвер 8250 с легкостью можно подвесить. Причем сцуко вешает сразу все ком порты. Демонизация и вызов отдельного процесса драйвера для каждого ком порта не помогла:( Пока выкрутился буферизацией вывода: складываю всё в очередь, а потом в отдельном потоке разгребаю с задержкой по 400мс каждая посылка но это не очень хорошо - звук бывает запаздывает. Перепробовал все варианты описанные в этой теме кроме "Experimental fix for the 8250" - нету валидной лицензии на QNX 6.3. Если у кого есть патчик пришлите пожалуйста на pavel_net собака mail точка ru .
Если с того времени появились ещё какие-нибудь варианты решения - рассмотрю.
Записан
aluv
Sr. Member
****
Offline Offline

Сообщений: 301


Просмотр профиля
« Ответ #17 : Ноября 07, 2011, 03:04:50 pm »

Подозреваю проблема в том, что UART на одном прерывании с аудио картой. Это должно лечиться через BIOS Setup.
Записан
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #18 : Ноября 13, 2011, 12:30:14 pm »

Подозреваю проблема в том, что UART на одном прерывании с аудио картой. Это должно лечиться через BIOS Setup.
По-моему современные компьютеры должны уметь делить прерывание между устройствами. Пробовал ставить ручное распределение ресурсов, устанавливал отдельные прерывания для обоих ком портов - не помогло:((((
Записан
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #19 : Февраля 16, 2012, 06:12:31 pm »

Долго промудоховшись с ком портом написал свой драйверочек.
Возможно кому-то будет полезно.

Код:
#include <stdlib.h>
#include <stdio.h>

#include <stdint.h>
#include <sys/neutrino.h>
#include <hw/inout.h>
#include <unistd.h>

#define PORT1 0x2e8  /* Port Address Goes Here */
#define INTVECT 0x03 /* Com Port's IRQ here (Must also change PIC setting) */

// Defines Serial Ports Base Address
// COM1 0x3F8                       
// COM2 0x2F8        
// COM3 0x3E8        
// COM4 0x2E8        

int bufferin = 0;
int bufferout = 0;
uint8_t ch;
uint8_t buffer[1025];

const struct sigevent* IrqHandler(void *name, int s)
{
static struct sigevent event;
    int c;
event.sigev_notify = SIGEV_INTR;

do
{
c = in8(PORT1 + 5);
    if (c & 1)
    {
    buffer[bufferin] = in8(PORT1);
bufferin++;
if (bufferin == 1024)
{
bufferin = 0;
}
}
}
    while (c & 1);
    out8(0x20,0x20);

return &event;
}

int main(int argc, char *argv[])
{
int c;
int EppIntId;
int oldport1isr;

if (ThreadCtl(_NTO_TCTL_IO, 0) == -1)
{
perror("Can`t set io prio");
return EXIT_FAILURE;
}
if (setprio(0, 60) == -1)
{
perror("Can`t set prio");
return EXIT_FAILURE;
}
InterruptDisable();
out8(PORT1 + 1 , 0);        /* Turn off interrupts - Port1 */


oldport1isr = InterruptAttach (INTVECT, IrqHandler, NULL, 0, _NTO_INTR_FLAGS_TRK_MSK);
if (oldport1isr == -1)
{
perror("InterruptAttach"); /*exit(EXIT_FAILURE);*/
}
out8(PORT1 + 3 , 0x80);  /* SET DLAB ON */
out8(PORT1 + 0 , 0x0C);  /* Set Baud rate - Divisor Latch Low Byte */
      /* Default 0x03 =  38,400 BPS */
      /*         0x01 = 115,200 BPS */
      /*         0x02 =  57,600 BPS */
      /*         0x06 =  19,200 BPS */
      /*         0x0C =   9,600 BPS */
      /*         0x18 =   4,800 BPS */
      /*         0x30 =   2,400 BPS */
out8(PORT1 + 1 , 0x00);  /* Set Baud rate - Divisor Latch High Byte */
out8(PORT1 + 3 , 0x03);  /* 8 Bits, No Parity, 2 Stop Bit */
out8(PORT1 + 2 , 0xC7);  /* FIFO Control Register */
out8(PORT1 + 4 , 0x0B);  /* Turn on DTR, RTS, and OUT2 */

out8(0x21,(in8(0x21) & 0xF7));  /* Set Programmable Interrupt Controller */
/* COM1 (IRQ4) - 0xEF  */
/* COM2 (IRQ3) - 0xF7  */
/* COM3 (IRQ4) - 0xEF  */
/* COM4 (IRQ3) - 0xF7  */

out8(PORT1 + 1 , 0x01);  /* Interrupt when data received */

InterruptEnable();

while (1)
{
static char once = 0;

InterruptWait (0, NULL);

    if (bufferin != bufferout)
    {
      ch = buffer[bufferout];
bufferout++;
if (bufferout == 1024)
{
bufferout = 0;
}
printf("0x%x bufferin = %d \n", ch, bufferin);
}       
}
//Эти строчки никогда не будут выполнены, служат чтобы показать как закрыть COM порт
//out8(PORT1 + 1 , 0);       /* Turn off interrupts - Port1 */
  //out8(0x21,(in8(0x21) | 0x8));  /* MASK IRQ using PIC */
/* COM1 (IRQ4) - 0x10  */
/* COM2 (IRQ3) - 0x08  */
/* COM3 (IRQ4) - 0x10  */
/* COM4 (IRQ3) - 0x08  */
// Disconnect the ISR handler
//InterruptDetach (oldport1isr);

return EXIT_SUCCESS;

}
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в: