🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1591閲覧

デバイスドライバ組み込み modprobeでエラー

Gammodler

総合スコア9

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/10/16 09:01

zynq7000(ARM Coatex9)、petalinux2016.2です。
開発環境はHyper-V、CentOS-7です。

ドライバmydevを開発中ですが、
modprobe mydev.ko;
でErrorが発生します。
Error箇所を下記に示します:

static int mydev_probe(struct platform_device *pdev)
{
struct resource r_irq; / Interrupt resources */
struct resource r_mem; / IO mem resources */
struct device *dev = &pdev->dev;
struct mydev_local *lp = NULL;

int rc = 0; dev_info(dev, "Device Tree Probing\n"); /* Get iospace for the device */ r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!r_mem) {

→ dev_err(dev, "invalid address\n");
return -ENODEV;
}

・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・

→のErrorです。

mydev_probeの関係個所は以下です:
static struct platform_driver mydev_driver = {
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = mydev_of_match,
},
.probe = mydev_probe,
.remove = mydev_remove,
};

pdevがもたらすErrorであると思いますが、組み込みの際、先に呼ばれる
mydev_init()中で以下のようにして取得しています:

pdev取得に関しては
http://nbisco.hatenablog.com/entry/2017/01/08/150837
を参考にさせていただいています。
platform_device_register_simple
を利用する方法です。

static int __init mydev_init(void)
{
int ret;

printk("<1>Hello module world.\n"); static struct resource foomatic_resources[] = { { .start = BASEADDRESS, .end = REMAP_SIZE, .flags = IORESOURCE_MEM, .name = "io-memory" }, { .start = 20, ←妥当性を理解していない .end = 20, ←妥当性を理解していない .flags = IORESOURCE_IRQ, .name = "irq", } }; pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources,0); if (pdev == NULL){ printk("Adding platform device pdev\"%x\" failed\n", pdev); kfree(pdev);

return -ENODEV; }
else{
printk("Adding platform device pdev"%x" successfull\n", pdev);
}

return platform_driver_register(&mydev_driver);

}

この段階で-ENODEV Errorが出ることはありません。
それからfoomatic_resourcesもNULL値ではありません。
しかし
pdev->dev
に正しい値が入っていないのだと思います。

このような処理に
platform_device_register_simple
が妥当であるかはわかりません。

Linux素人、最も定石的な手法、および具体的なCodeをお示しいただけると助かります。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/10/16 09:02

エラー・メッセージを省略翻訳せず、そのままコピペで提示してください
guest

回答2

0

nomuken様
解決しました。
ばかばかしい間違いをしていました。
.endの値を幅で設定していました。
これを訂正して
my_probe()内
mydev mydev.0: Device Tree Probing
mydev mydev.0: mydev at 0x43c00000 mapped to 0xe09c0000, irq=20
が表示されました。
本件は解決しています。
しかし確保された領域がとてつもなく大きいようなのが気になります。
ありがとうございました。

投稿2019/10/16 13:32

Gammodler

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

platform_device_register_simple関数呼び出し時の第4引数に第3引数の要素数を指定する必要があります。

現状は0を指定しているため第3引数にfoomatic_resourcesを指定しても無視されています。
ARRAY_SIZE(foomatic_resources)を指定しておくのがベターだと思います。

投稿2019/10/16 10:32

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gammodler

2019/10/16 13:03

nomuken様 前回に引き続き回答ありがとうございます。 ARRAY_SIZE(foomatic_resources)には2が入りました。 この状態で pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources, ARRAY_SIZE(foomatic_resources)); を実行したところ、failedが表示され、このCommandの実行に失敗しているようです。 以下LOGです: ---------------------------------------------------------------- <1>Hello module world. platform ilcdev.0: failed to claim resource 0 ARRAY_SIZE(foomatic_resources) 2 Adding platform device pdev"fffffff0" successfull ---------------------------------------------------------------- source: printk("<1>Hello module world.\n"); static struct resource foomatic_resources[] = { { .start = BASEADDRESS, .end = REMAP_SIZE, .flags = IORESOURCE_MEM, .name = "io-memory" }, { .start = 20, .end = 20, .flags = IORESOURCE_IRQ, .name = "irq", } }; pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources, ARRAY_SIZE(foomatic_resources)); printk("ARRAY_SIZE(foomatic_resources) %x\n", ARRAY_SIZE(foomatic_resources)); if (pdev == NULL) { printk("Adding platform device pdev\"%x\" failed\n", pdev); kfree(pdev); return -ENODEV; } else{ printk("Adding platform device pdev\"%x\" successfull\n", pdev); } return platform_driver_register(&ilcdev_driver); ---------------------------------------------------------------------- platform ilcdev.0: failed to claim resource 0 を表示するprintk文はありません。 foomatic_resourcesの設定に誤りがある可能性はありますか?。 BASEADDRESS = 0x43c00000 REMAP_SIZE = 0x10000 です。 pdev == NULLではないことによるsuccessは当てにならない感じです。 一歩前進ではあるのですが、この後の static int mydev_probe(struct platform_device *pdev) を実行してくれません。 ご指摘事項があればお願いいたします。
nomuken

2019/10/16 13:59

解決できてよかったです。ソースコードについてもう一点指摘しておきますと platform_device_register_simple関数の戻り値でエラー判定を > if (pdev == NULL) { とするのは誤りです。 if (IS_ERR(pdev)) { と書くべきです。この式が真のときはpdevはポインタではないのでkfree(pdev);も実施してはいけません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問