【问题标题】:How do I port a serial port device driver from Linux 2.6.21 to 2.6.36?如何将串口设备驱动程序从 Linux 2.6.21 移植到 2.6.36?
【发布时间】:2012-07-24 18:15:01
【问题描述】:

这两个内核之间似乎有一段时间改变了很多数据结构,并且在几个地方破坏了我的驱动程序。

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

在 2.6.36 中,信息返回指针已被删除,我不确定如何处理它,或者我尝试做的语义是否仍然有效,因为它是唯一的串行驱动程序,甚至使用它似乎已经 ifdef'ed 了处理它的代码,并且另外将所有这些数据保存在它自己的结构中(它是如何工作的,甚至可以正确地维护内核的状态)???

此外,缺少 save_and_cli() 和 restore_flags()。我看到了新的函数 local_irq_save() 和 local_irq_restore(),我可以切换到使用它们吗,还是有什么陷阱?

最后,__ioremap 不见了。看起来可能 ioremap_noncache 是替代品,但我再次不确定是否存在任何语义差异或陷阱。我假设我不想要 ioremap(),因为我直接与硬件对话,但其他一些驱动程序似乎这样做,我不知道为什么会这样。

【问题讨论】:

    标签: linux-kernel serial-port device-driver


    【解决方案1】:

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

    该驱动程序通过以下方式获取tty_struct

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2023-03-21
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多