Драйвер последовательного канала должен принимать данные не по прерыванию, а просто вычитывать из буфера FIFO через к-то время.
За основу взял devc-serdebug и Запускаю отдельную нить для чтения, чтение имитирую вводом символа 0x31
void *tti_poll( void *area )
{
DEV_USART *dev = area;
unsigned c, ret;
timer_t tid;
struct itimerspec irq_time;
while(1)
{
delay(10);
c=0x31;
ret = tti( &dev->tty, c);
if ( ret && (dev->tty.flags & EVENT_QUEUED) == 0)
{
dev_lock(&ttyctrl);
ttyctrl.event_queue[ttyctrl.num_events++] = &dev->tty;
atomic_set(&dev->tty.flags, EVENT_QUEUED);
dev_unlock(&ttyctrl);
timer_create(CLOCK_REALTIME, &ttyctrl.event, &tid);
irq_time.it_value.tv_sec=0;
irq_time.it_value.tv_nsec=1000;
irq_time.it_interval.tv_sec=0;
irq_time.it_interval.tv_nsec=0;
timer_settime(tid, 0, &irq_time, NULL);
timer_delete( tid);
}
printf("tti_poll cnt=%d\n", dev->tty.ibuf.cnt );
}
}
Символы начинают поступать в буфер, пока он не заполнится ( слежу за счетчиком ). Прикладная программа может вычитать буфер ( например #cat /dev/sertest выводит на экран "111111... ", но после этого вывод останавливается, сброс счетчика буфера , его повторное наполнение и непрерывный вывод на экран единичек не происходит.
Аналогично с прикладной программой: read() выполняет чтение однократно и получает столько символов, сколько накопилось в буфере. Повторный read() блокируется.
В похожих темах говорится, что драйвер должен сообщить верхнему уровню io-char о поступлении символов в буфер ввода с помощью
return &ttyctrl.event , там же рекомендовалось использовать для отправки этого события таймер...
Но у меня не работает.
ret = tti( &dev->tty, c); возвращает всегда +1 ( в HELP говорится о коде возврата 0 или -1 ).
Пож. подскажите: что я делаю не так? Спасибо.