🎄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

解決済

1回答

2347閲覧

Zynq-700(ARM)割り込みがかからない

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/18 07:55

編集2019/10/18 09:02
コード static int __init mydev_init(void) { int ret; printk("<1>Hello module world.\n"); printk("<1>Module parameters were (0x%08x) and \"%s\"\n", myint, mystr); static struct resource foomatic_resources[] = { { .start = 0x43c00000, .end = 0x43c0ffff, .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(&mydev_driver); } pdevは問題なく取得できました。 次に呼ばれるprobe機能を以下に示します: // mydev構造体 struct mydev_local { int irq; unsigned long mem_start; unsigned long mem_end; void __iomem *base_addr; }; // 割り込みHandler static irqreturn_t mydev_irq(int irq, void *lp) { printk("mydev interrupt\n"); return IRQ_HANDLED; } // modprobe mydev.koで呼ばれるModule 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; } lp = (struct mydev_local *) kmalloc(sizeof(struct mydev_local), GFP_KERNEL); if (!lp) { dev_err(dev, "Cound not allocate mydev device\n"); return -ENOMEM; } dev_set_drvdata(dev, lp); lp->mem_start = r_mem->start; lp->mem_end = r_mem->end; if (!request_mem_region(lp->mem_start, lp->mem_end - lp->mem_start + 1, DRIVER_NAME)) { dev_err(dev, "Couldn't lock memory region at %p\n", (void *)lp->mem_start); rc = -EBUSY; goto error1; } lp->base_addr = ioremap(lp->mem_start, lp->mem_end - lp->mem_start + 1); if (!lp->base_addr) { dev_err(dev, "mydev: Could not allocate iomem\n"); rc = -EIO; goto error2; } /* Get IRQ for the device */ r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (!r_irq) { dev_info(dev, "no IRQ found\n"); dev_info(dev, "mydev at 0x%08x mapped to 0x%08x\n", (unsigned int __force)lp->mem_start, (unsigned int __force)lp->base_addr); return 0; } lp->irq = r_irq->start; rc = request_irq(lp->irq, &mydev_irq, 0, DRIVER_NAME, lp); if (rc) { dev_err(dev, "testmodule: Could not allocate interrupt %d.\n", lp->irq); goto error3; } dev_info(dev,"mydev at 0x%08x mapped to 0x%08x, irq=%d\n", (unsigned int __force)lp->mem_start, (unsigned int __force)lp->base_addr, lp->irq); return 0; error3: free_irq(lp->irq, lp); error2: release_mem_region(lp->mem_start, lp->mem_end - lp->mem_start + 1); error1: kfree(lp); dev_set_drvdata(dev, NULL); return rc; } ```Zynq-700(ARM)割り込みがかからない Hardware : Microzed 開発環境 :Hyper-V+CentOS7 開発用OS :petalinux2016.2 です。 割り込みがかからず苦慮しております。 独自手法で開始してしまったためgpioも使用していません。 mydevはPIO、およびそれ以外の制御事項を含みます。 gpioに備わる割り込み要求intrは自作し、Zynqのinterrupt Fabric端子に入力しています。事実上gpioと同じと思います。 割り込み以外の機能は問題なく動作しています。 Xilinx社が配布しているドライバ用Templateをベースに開発を進めています。 以下その手順です: まず”元”になるPointer:pdevをinit 関数で取得します: これを実行させると、どのError表示も行われませんが、割り込みはかかりません。 割り込み要求はmydevのintr Portに10Hzの繰り返し波形、あるいはボタンによるLevel信号を印加することで、結果を確認しています。 オシロスコープで波形は確認済です。 他のPin入出力は良好に動作しているので、ここが問題とは考えにくいです。 Target側 cat /proc/interrupts の結果です。 18: 7179 1714 GIC 29 Edge twd 20: 0 0 GIC 38 Level mydev 21: 43 0 GIC 39 Level f8007100.adc 全く受かっていないようです。 Level割り込みになっているようなので、終了処理をしないと次が受かりません。 しかしゼロですからそれもないでしょう。 lp->irq=20の理由が分かりません。 Xynq-7000ではPL割り込みは61番以降なのです。 これは明らかに範囲外です。 しかしXilinxのCommunityで差し支えないような記述を見たこともあります。 関知する必要はないのでしょうか。 =20の出どころを探ってみました。 以下はdevice-treeのpl.dtsi Fileの内容です: / { amba_pl: amba_pl { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; ranges ; my_ip_0: my_ip@43c00000 { compatible = "xlnx,my-ip-189.2"; interrupt-parent = <&intc>; interrupts = <0 29 4>; reg = <0x43c00000 0x10000>; xlnx,s00-axi-my-ip-addr-width = <0x4>; xlnx,s00-axi-my-ip-data-width = <0x20>; }; }; }; この中に"20"は見当たりません。 petalinuxの場合*.dtb Fileはimage.ubに繰り込まれているので、特段の操作は不要と明記されていたように思います。しかし念のため起動用sdcardにsystem.dtbを格納してあります。参照の状況を見るため、下記を実行してみたのですが root@mydev:/sys/firmware/devicetree/base# cat compatible 何も表示されませんでした。 今回のケースではdevice-treeは参照されていなような感じがします。 "20"の出どころは謎です。 petalinuxの処理系がAssignしたのだから関知する必要はない、ということでしたら助かるのですが。 PLからの割り込みは61番以降という原則にこだわりがあったので lp->irq=20 → 61 に強引に書き換えてみました。これはxparameters.hで指定されている数値です。 cat /proc/interrupts の結果は 61: 0 0 zynq-gpio 38 Edge mydev でNGでした。ただI/F(?)がGICからzynq-gpioに、さらにLevel→Edgeに変更されています。本来は望ましい形です。 さらに割り込みPortに関しては謎がある、との指摘もありました。 http://www.tokudenkairo.co.jp/cosmoz/diary1609.html これに従い1本の割り込みをvivado上でxconcatを利用して候補となる16本全部に入力もしてみたですが、これもNGでした。 以上質問者があとできることはI/FがGICとなっているので、これに対応することです。 最低限Maskを開いてEnableにする、Level割り込みなので割り込みの都度Ackを返すなどは必須ではないかと思います。 この段階になると記述方法が分かりません。 わかりやすいサンプルあるいは直接的なCoding例などをご教示願えると助かります。 あるいはまったく別のところに原因がある、との指摘があればお願いいたします。

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

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

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

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

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

y_waiwai

2019/10/18 07:59

これではコードが見れないので、質問を編集し、<code>ボタン、出てきた’’’の枠の中にコードを貼り付けてください
guest

回答1

0

ベストアンサー

外していたらすみません。(外している可能性は高いかまたは、別のもっと難しい原因がある気もしますが)

lp->irq=20の理由が分かりません。
Xynq-7000ではPL割り込みは61番以降なのです。

質問者さんは、先のご質問 「teratail#217597 - バイスドライバ組み込み modprobeでエラー」で、pdev取得について次の記事、
Linuxにおけるplatform device APIについて」を参考にした、と書かれていましたが、そこでの記事はIRQの指定について以下のようになっています。

.start = 20, .end = 20, .flags = IORESOURCE_IRQ, .name = "irq",

現に今の質問者さんのコードでも foomatic_resourcesの定義時のコードは20のままです。
IORESOURCE_IRQ用に使うresource構造体メンバー.start, .endは、お使いのZynq-700用に適切な値にセットする必要はありませんか。

投稿2019/10/18 15:29

dodox86

総合スコア9256

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

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

Gammodler

2019/10/19 05:44

dodox86様 回答ありがとうございます。 ご指摘の通りでした。 .startに設定した20がそのままlp_irqに出てきていただけのことと判明しました。 あらためて https://lwn.net/Articles/448499/ を見ますと、 static struct resource foomatic_resources[] = { { .start = 0x10000000, .end = 0x10001000, .flags = IORESOURCE_MEM, .name = "io-memory" }, { .start = 20, .end = 20, .flags = IORESOURCE_IRQ, .name = "irq", } }; static struct platform_device my_foomatic = { .name = "foomatic", .resource = foomatic_resources, .num_resources = ARRAY_SIZE(foomatic_resources), }; These declarations describe a "foomatic" device with a one-page MMIO region starting at 0x10000000 and using IRQ 20. The device is made known to the system with: と明記されていました。この定義の中で IORESOURCE_MEM、IORESOURCE_IRQだけが予約語、残りは自由に設定可、あるいは設定しなければならない数値のようです。 20という数値を追いかけながら気が付かない、不明を恥じるばかりです。 これで割り込みはIRQ、CPUとのI/FもGIC経由ではなく直結ということが確定しました。 修正しましたが割り込みはかかりません。 また新たな追及が始まります。しかし範囲は狭まりました。 ありがとうございました。
dodox86

2019/10/19 05:52 編集

そうでしたか、解決して良かったです。私自身はlinuxのデバイスドライバーのコードは長い間触れていなく、ターゲットがARMマシンと言うことでIRQ/割り込み周りの設定の自信が無かったので、そこだけ直しても別の問題がすぐ発現して解決しないかと思いました。
dodox86

2019/10/19 05:54

あ、いえ、割り込みが上がらないという問題は依然として存在したのですね。(<解決したわけではない)失礼しました。がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問