QA@IT

zynq割り込み処理(Petalinux)

2499 PV

Petalinuxで割り込み

MicroZedの割り込みが入らなくて苦労しております。
SDKで開発する場合のサンプル例はXilinx社などから豊富に示されていますが、(Peta)Linuxでは参考にする例を発見できませんでした。

Handlerアドレスの取得
static int __init mydev_init(void)
{
int ret = 0;
・・・・・・・
ret = register_chrdev(DEV_MAJOR, DRIVER_NAME, &my_fops);
linuxAddr = (u32 *)ioremap_nocache(BASEADDRESS, sizeof(unsigned long));
・・・・・・・
ret = request_irq(irqID, intHandler, IRQF_DISABLED, DRIVER_NAME, dev_id);
if (ret) printk("intHandler failed ret %x\n", ret);
else printk("intHandler inserted successfully intHandler %x\n", intHandler);
・・・・・・・
}
で取得しています。これはsuccessfulでした。
それに先立ち
static int irqID = XPS_IRQ_INT_ID; // 31U(IRQ from FPGA fabric) in xparameters_ps.h
としています。Vivadoが出力するxparameters(_ps).hもPrivate Peripehralではこれ以外に該当するものがないようなので良しとしています。Zynqの割り込みPortのところにも31という数値が表示されるので妥当と考えました。

このように設定してボタンでHard割り込みを発生させ、Handlerのところで待ちかまえます。

ハンドラー
static irqreturn_t
intHandler(int irqID, void *dev_id, struct pt_regs *regs)
{
printk("Interrupt Event !!\n");
return IRQ_HANDLED;
}

ところがInterrupt Event !!は表示されません。

原因には二つの可能性があります。
1.Hardware
2.software
両者を識別する方法が分かりません。Zynqが割り込み要求を受け付けたというStatusを得る手段があればいいのですが。
しかし今回割り込みが入らない原因は2にあると思っています。ZynqにはほかにもPresetが必要なRegisterがいくつかあると考えられます。。
以前使用していたPowerPCではHandlerの冒頭でintraStatusにRegisterを退避、終了時にRecoverするなどの手続きが必要でした。
今回最も問題なのはPowerPCはdefaultで割り込みEnableであったと記憶していまが、調べた範囲ではARMはdisableらしいです。
この辺りのRegisterとLinux上から設定する方法についてご示唆いただけると助かります。

初歩的すぎかつ無精な質問でもうしわけありませんよろしくお願いいたします。

ウォッチ

この質問への回答やコメントをメールでお知らせします。