发现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就能真正打印出来啊
我现在跑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│ }
是不是就是这个原因? 有可能,可以改一下试试 或者用uart1 改用uart1,果然就可以正常运行下去了
页:
[1]