2016-08-31 11 views
0

私はカーネル開発において新しいです。 GeodeベースのPC/104ボード上で動作するLubuntu 12.04(uname -r == 3.2.0-107-generic)があります。 CPUはPAEをサポートしていないので、12.04は私がいる場所です。 2つのSC2681 DUARTがあるI/Oボードがあります。彼らはポート0x100と0x110に敬意を表し、両方ともIRQ 15を使用します。2つのSC2681 DUARTのためのカーネルドライバを設定してください

私はsccnxp driver from a newer kernel (3.10)をコピーして、このカーネルで動作するように修正しました。

platform_device_register(&sc2681_0); 
if ((ret = platform_driver_register(&sccnxp_uart_driver))) 
{ 
platform_device_unregister(&sc2681_0); 
return -EINVAL; 
} 
return 0; 

をし、含まれてい__exit:ドライバは2つのUARTを処理するように設定されて

platform_driver_unregister(&sccnxp_uart_driver); 
platform_device_unregister(&sc2681_0); 

static struct resource sc2681_0_resources[] = { 
     DEFINE_RES_IO(0x100, 0x10), 
     DEFINE_RES_IRQ(15), 
    }; 

static struct sccnxp_pdata sc2681_0_info = { 
     .frequency  = 3686400, 
    }; 

static struct platform_device sc2681_0 = { 
    .name  = "sc2681", 
    .id  = -1, 
    .resource = sc2681_0_resources, 
    .num_resources = ARRAY_SIZE(sc2681_0_resources), 
    .dev = { 
     .platform_data = &sc2681_0_info, 
    }, 
}; 

は私も含まれてい__initを追加しました:ここに私の初期化データであります。/dev/ttySC0と/ dev/ttySC1がロードされて作成されます。このロードをポート0x110の2番目のDUARTにするにはどうすればよいですか?

+0

あなたはボードが何であるかの手がかりを与えませんでした(いくつかの技術仕様、URL)。デバイスツリー(ARM)またはACPI(x86)をサポートするために、デバイスツリー(ARM)を簡単に更新する方法があります。既存のカーネルソースの上に行ったコミットを見るのもいいでしょう(1. linux-stableからlinux-3.2.yをクローンしました)2.修正されていないドライバをプッシュしました。 。 – 0andriy

+0

こんにちは@AndyShevchenko読書に感謝します。デュアールは私が共有できないカスタムボードに搭載されています。私はカーネルを構築したいと思っていますが、私はそれについての経験はまだありません。今はsccnxpをモジュールとしてビルドし、 'insmod'をロードしました。その部分は働いていますが、最初のデュアートのためだけです。私の質問は、ドライバが2つの異なるIOポートにデバイスの2つのコピーをロードするようにリソースとplatform_deviceを設定する方法に関するものです。 – leetibbett

+0

**あなたが行った** GPLコードの変更を**共有する必要があります。しかし、エンジニアの言葉を話しましょう。 **すべて**を共有する必要はなく、UARTドライバに関連する部分だけを共有することができます。 – 0andriy

答えて

0

次の読者が情報を必要とする場合に備えて、自分の質問に答えるつもりです。答えは、ドライバがすでにそれをサポートしている場合にのみ可能であるということです。

4.8からカスタマイズしたカーネルをビルドしましたが、それは多くの時間とディスクスペースを必要とし、その答えではありませんでした。カーネルをビルドしてインストールするサイクルが長いので、私はロード可能なモジュールで作業しました。 x86デバイスツリーに関連する最近の有益なリソースが見つかりませんでした。レガシーボードはACPIをサポートしていません。要するに、2つの別々のチップのためにドライバを2回ロードするようにドライバを構成する方法はありませんでした。

カーネルのソースコードがすべてあるので、答えはどこかにあるはずだと思いました。私は必要なもの(sb1250-duart.c)と同様の機能を持つ別のシリアルドライバを見つけ、それを例として使用しました。私はプローブ機能を変更して、複数のチップを構成データから予期して構成しました。私の元々の思考の欠陥は、init中に2つの別々のプラットフォームデバイスを登録しようとしていましたが、解決の間、init中に単一のプラットフォームデバイスを登録し、プローブ機能に複数のUARTドライバ(およびポート)を登録しました。

私はGPLコメントにもお答えしたいと思います。 GNU's GPL FAQは、あなたが変更したバージョンを公開しない限り、あなたが変更されたバージョンをリリースする必要はないと具体的に述べています。これは純粋に社内プロジェクトです。しかし、この経験の後、変更内容を共有したいので、社内およびプラットフォーム固有のビットを削除した後、このドライバが複数のDUARTをサポートするようにパッチを適用します。

関連する問題