yymusic 发表于 2008-1-23 13:32:04

skyeye中的44b0x uart驱动错误

最近一直在搞用skyeye模拟44b0x跑uclinux,发现一些问题,在arm板上跑的好好的,可到skyeye上就有些问题。其中uart有个问题,就是输入的字符不会回显,要uclinux主动打印信息时,才会打点出来。查看skyeye的44b0x驱动发现,有些问题。
1、当从uart收到字符时,只更新了UFSTAT中的Rx FIFO Count而没有更新UTRSTAT中的Receive buffer data ready位。
2、关于Tx中断就更奇怪了,Tx中断有下面两种情况:
   1)、0 = Pulse (Interrupt is requested the instant Tx buffer becomes empty)
   2)、1 = Level (Interrupt is requested while Tx buffer is empty)

说白了,都是针对Tx FIFO 为空的情况下发interrupt的,可skyeye里。
            while ((count = ((*pUfstat & 0xf0) >> 4)) > 0 && (*pUcon & 0xc) != 0x0) { /* handling TX FIFO */
        if (pUfifo->txcnt > 0) {
          pUfifo->txcnt -= 1;
          break;
        }
                                       
        if (*pUfstat & 0x200) count++;
        tmp_count = skyeye_uart_write(read_uart0 ? 0 : 1, &pUfifo->tx, count, NULL);
        if (tmp_count <= 0) break;
                                       
        count -= tmp_count;
                                       
        *pUfstat &= ~0x2f0;
        if (count > 0) {
          *pUfstat |= (count << 4);
          memmove(&pUfifo->tx, &pUfifo->tx, (size_t)count);
        } else {
          pUfifo->txcnt = 64;
        }
        /* Transmit Mode: Interrupt request or polling mode */
                                       
        if ((*pUcon & 0xc) == 0x4) {
          s3c44b0x_set_interrupt(read_uart0 ? INT_UTXD0 : INT_UTXD1);
        }
             }

其中first就用Tx FIFO中的数据个数做条件,那FIFO个数为0时,根本就不会进去,也就更不会发empty中断了啊!也更没有分上面的两种情况分别发中断。
希望skyeye越来越完整,稳定。

[ 本帖最后由 yymusic 于 2008-1-23 13:41 编辑 ]

ksh 发表于 2008-1-26 20:14:18

You are right. Most of simulation probably only support interrupt mode of uart.

AnthonyLee 发表于 2008-1-31 04:38:26

回复 #1 yymusic 的帖子

I will check it once I'm free, thanks.

yymusic 发表于 2008-1-31 14:58:38

呵呵,tks!
页: [1]
查看完整版本: skyeye中的44b0x uart驱动错误