如何将串口设备驱动程序从Linux 2.6.21移植到2.6.36?

问题描述:

看来在这两个内核之间有一段时间,很多数据结构发生了变化,它在几个地方打破了我的驱动程序。如何将串口设备驱动程序从Linux 2.6.21移植到2.6.36?

首先,在2.6.21中,struct uart_port有一个字段“struct uart_info * info”,我在几个地方依赖它。我测试了几个地方,以确保它是非空的,如果非空,我另外测试它的子字段(struct tty_struct * tty)是否为非空,并且我使用这些来检查是否启用流控制,并且如果我们停止传输。

在2.6.36中,信息返回指针已被删除,我不确定如何获取它,或者如果我试图做的甚至有效的语义都是唯一的串行驱动程序甚至使用它似乎已经确定了如何处理它的代码,并且还将所有这些数据保存在它自己的结构中(如何才能正确地维护内核的状态)?

此外,save_and_cli()和restore_flags()丢失。我看到新的函数local_irq_save()和local_irq_restore(),我可以切换到使用这些函数,还是有任何陷阱?

最后,缺少__ioremap。看起来也许ioremap_noncache是​​替代品,但我不知道是否有任何语义差异或陷阱。我假设我不想ioremap(),因为我直接与硬件通话,但其他一些驱动似乎这样做,我不知道为什么会这样。

看看使用相同功能的树内驱动程序如何在两个版本之间发生变化通常是最佳方式。例如,ioc4_serial驱动程序使用struct uart_portinfo成员kernel 2.6.21,但已切换为使用struct uart_state *state成员kernel 2.6.36

那司机获得tty_struct有:

state = the_port->state; 
tty = state->port.tty;