3

これらの2つのカーネルの間で、多くのデータ構造が変更されたようで、いくつかの場所でドライバーが壊れています。

まず、2.6.21では、structuart_portに「structuart_info* info」というフィールドがあり、これをいくつかの場所で信頼していました。いくつかの場所をテストして、それがnullでないことを確認し、nullでない場合は、サブフィールド(struct tty_struct * tty)がnullでないかどうかをさらにテストし、これらを使用してフロー制御が有効になっているかどうかを確認します。送信を停止します。

2.6.36では、情報バックポインターが削除され、それを取得する方法がわかりません。または、これを使用する唯一のシリアルドライバーが表示されるため、実行しようとしていることのセマンティクスがさらに有効かどうかがわかりません。それを処理するコードをifdefし、さらにこのすべてのデータを独自の構造で保持します(カーネルで状態を正しく維持するためにどのように機能しますか)???

さらに、save_and_cli()とrestore_flags()がありません。新しい関数local_irq_save()とlocal_irq_restore()が表示されますが、それらの使用に切り替えることはできますか、それとも何か落とし穴がありますか?

最後に、__ioremapがありません。おそらくioremap_noncacheが代わりになっているように見えますが、セマンティックの違いや落とし穴があるかどうかはわかりません。私はハードウェアと直接話しているのでioremap()は必要ないと思いますが、他のいくつかのドライバーはそうしているようで、なぜそれが機能するのかわかりません。

4

1 に答える 1

2

通常、同じ機能を使用するツリー内ドライバーが 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 に答える