3

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

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

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

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

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

4

1 回答 1

2

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

该驱动程序获得tty_struct

state = the_port->state;
tty = state->port.tty;
于 2012-07-25T03:54:06.317 回答