QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1794|回复: 3

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

[复制链接]
发表于 2008-8-7 21:32:33 | 显示全部楼层 |阅读模式
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
比用uart1  printk能提前一点打印出来,用uart1 当console
的时候等很张时间才打印出东西,没搞清楚原因
难道使用不同的串口linux初始化的时机还不一样吗??
是不是register_console以后printk就能真正打印出来啊
发表于 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│ }

是不是就是这个原因?
回复

使用道具 举报

 楼主| 发表于 2008-8-26 20:21:27 | 显示全部楼层
有可能,可以改一下试试 或者用uart1
回复

使用道具 举报

发表于 2008-8-27 10:14:51 | 显示全部楼层
改用uart1,果然就可以正常运行下去了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 08:23 , Processed in 0.043592 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表