duzhig 发表于 2008-8-7 21:32:33

发现skyeye模拟arm的at91rm200的问题,有几个bug

dbgu的模拟没有模拟发送中断,也没有模拟pdc传输所以在linux
编译的时候高版本的内核要禁止串口的pdc,关于发送中断可以添加
照usart1的模拟在写IER的时候开启中断

case US_IER:
                //io.uart0.ier = data;
                io.uart.imr |= (data & 0x000f3fff);
                if (io.uart.imr) {
                        io.ipr |= AT91RM92_ID_US(i);
                        at91rm92_update_int (state);
                }

case DBGU_IER:
                io.dbgu.imr |= (data & 0x000f3fff);
                if (io.dbgu.imr) {
                        io.ipr |= AT91RM92_ID_SYS;
                        at91rm92_update_int (state);
                }
                break;
另外在
        case DBGU_THR:
                io.dbgu.thr = data;


                char c = data;
                skyeye_uart_write(-1, &c, 1, NULL);
               
                io.dbgu.sr |= 0x2; /* set TXRDY bit */
                io.dbgu.sr |= 0x20; /* set TXEMPTY bit */

                break;
中                io.dbgu.sr |= 0x20; /* set TXEMPTY bit */应该为                io.dbgu.sr |= 0x200; /* set TXEMPTY bit */


TXEMPTY位的偏移搞错了0X20是overrun,

还有9200的linux起来以后bash里不能使用方向键,打出来的是ABCD
原因是在io_do_cycle里检查串口输入的时候由于方向键发送3个字节
造成虚拟的linux接收了第一个字节进中断后马上又来了后面的字节
io_do_cycle每个机器指令前都要执行
所以linux只能收到最后一个字节
解决方法目前还没找到好的办法检查io.ipr好像不行
linux向AIC_EOICR里写的也没什么参考价值
现在我用一个比较笨的办法就是发一个字节后延时100个指令
再发后面的,在linux2.6.23和2.6.26下好像可以工作
发现linux中断处理指令30条左右就可以搞定还是效率比较高的

现在发现用dbgu当console可以了,发现用dbgu当console
比用uart1printk能提前一点打印出来,用uart1 当console
的时候等很张时间才打印出东西,没搞清楚原因
难道使用不同的串口linux初始化的时机还不一样吗??
是不是register_console以后printk就能真正打印出来啊

thomascatlee 发表于 2008-8-26 16:05:54

我现在跑2.6.20和2.6.25都是跑到Uncompressing Linux...就没有反应了,gdb跟踪发现死在printstr()的flush()里面
61│ static inline void flush(void)
62│ {
63│ #ifdef UART_OFFSET
64│         void __iomem *sys = (void __iomem *) UART_OFFSET;       /* physical address */
65│
66│         /* wait for transmission to complete */
67├>      while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXEMPTY))
68│               barrier();
69│ #endif
70│ }

是不是就是这个原因?

duzhig 发表于 2008-8-26 20:21:27

有可能,可以改一下试试 或者用uart1

thomascatlee 发表于 2008-8-27 10:14:51

改用uart1,果然就可以正常运行下去了
页: [1]
查看完整版本: 发现skyeye模拟arm的at91rm200的问题,有几个bug