C 无法在UART4中执行软件重置

C 无法在UART4中执行软件重置,c,linux-device-driver,embedded-linux,uart,C,Linux Device Driver,Embedded Linux,Uart,我的omap4460已加载linux内核3.4。我已使用echo-n omap_uart.3>/sys/bus/platform/drivers/omap_uart/unbind从uart4实例中解除了驱动程序的绑定 我使用简单的struct file\u操作编写了一个新的驱动程序 现在,在pad配置之后,当我进行软件重置并等待其完成时,循环不会退出循环 l = ioread32(io_map + 0x54); printk(KERN_ALERT "SYSC value before =

我的omap4460已加载linux内核3.4。我已使用
echo-n omap_uart.3>/sys/bus/platform/drivers/omap_uart/unbind从uart4实例中解除了驱动程序的绑定

我使用简单的
struct file\u操作编写了一个新的驱动程序

现在,在pad配置之后,当我进行软件重置并等待其完成时,循环不会退出循环

l = ioread32(io_map + 0x54);
    printk(KERN_ALERT "SYSC value before = %x\n", l);
    iowrite32(0x2,io_map + 0x54);
    l = ioread32(io_map + 0x54);
    printk(KERN_ALERT "SYSC value after = %x\n", l);
    readval = ioread32(io_map + 0x58);
    printk(KERN_ALERT "SYSS read value = %x\n", readval);
    while((readval & 0x1)== 0);
    printk(KERN_ALERT "software reset completed\n");
io_map是从呼叫中获得的地址

io_map = ioremap(UART4_BASE,UART_SIZE);
其中,UART_大小为0x83,UART4_基为0x4806eooo。
第一个和第二个printk语句给出相同的值0。

好吧,我对内核模块没有经验,但在我看来,你似乎在给readval赋值,然后永远循环它。“readval”在这个循环中应该如何改变?@benjaminamurer-我猜中断处理程序会改变它吗?问题。需要volatile?@BenjaminMurer:设置SYSC寄存器的第一位将立即将SYSS寄存器的第0位设置为1。但是,即使在编辑之后,结果也是一样的。@MartinJames:我应该在哪里设置volatile?即使我跳过软件重置写入DLL的值,LCR寄存器也不会反映出来。在某个地方寄存器正在更新。