Armadilloフォーラム

UART2用IRQをrequest_irqするとInvalid argumentとなる

morimayu

2018年2月22日 16時32分

お世話になっております。森と申します。

UART2制御用のデバイスドライバ(ローダブルモジュール)の開発において、
IRQ割当てとして以下の命令を実行したところ、Invalid argument(-22)が返ってきてしまいます。
UART2用の割り込みをつかみたいと思っています。

result = request_irq(27, u_uart_intr_handler, IRQF_TRIGGER_HIGH | IRQF_SHARED, ”TEST_UART”, p_uart);
result = request_irq(27, u_uart_intr_handler, 0, ”TEST_UART”, p_uart);

どちらも同じエラーでした。

ちなみに、IRQを59で指定した場合は、Device or resource busy(-16)といったエラーが返ってきました。
そのため、p_uartは問題ないと判断しております。

恐れ入りますが、対策方法等わかりますでしょうか。

コメント

溝渕です。

> ちなみに、IRQを59で指定した場合は、Device or resource busy(-16)といったエラーが返ってきました。

UART2の割り込み番号は59で合っています。

すでに割り込みハンドラを登録済みであるため、Device or resource busy(-16)となります。

UART2を開放するためには、以下のDTSからUART2のデバイスを削除する必要があります。
arch/arm/boot/dts/armadillo_x1l.dts

森です。

result = request_irqでの登録はできるようになり、
割込みがつかめるようになったのですが、
肝心な受信の割込みが入ってきません。

arch/arm/boot/dts/armadillo_x1l.dtsの
UART2に関する情報を全てコメントアウトしたのがまずかったのでしょうか?

恐れ入りますが、削除すべき箇所をご教授いただけませんでしょうか。
それとも、受信割り込みをつかむためには、まだ他に定義が必要なのでしょうか。

ちなみに、解放せずに、IRQF_SHAREDを使用して登録も試してみましたが、
Device or resource busy(-16)でした。
こちらは共有はできないという事なのでしょうか。

以上、よろしくお願いいたします。

溝渕です。

> result = request_irqでの登録はできるようになり、
> 割込みがつかめるようになったのですが、
> 肝心な受信の割込みが入ってきません。
>
> arch/arm/boot/dts/armadillo_x1l.dtsの
> UART2に関する情報を全てコメントアウトしたのがまずかったのでしょうか?
> 恐れ入りますが、削除すべき箇所をご教授いただけませんでしょうか。

DTSからUART2を削除しなければ、標準のUARTドライバがUART2を登録してしま
います。そのため、上記対応は適切であると思います。

> それとも、受信割り込みをつかむためには、まだ他に定義が必要なのでしょうか。

作成されたUARTドライバモジュールで何をしているのかがわからないので、ピ
ンポイントでの提案ができません。標準のUARTドライバを参考に、受信周りの
設定を確認してみてください。

> ちなみに、解放せずに、IRQF_SHAREDを使用して登録も試してみましたが、
> Device or resource busy(-16)でした。
> こちらは共有はできないという事なのでしょうか。

割り込みを共有する場合は、全ての割り込みハンドラ登録時にIRQF_SHAREDを
使用する必要があります。標準のUARTドライバではIRQF_SHAREDを使用してい
ません。

森です。

何度も申し訳ありません。

標準ドライバで設定されている値をそのまま、以下のレジスタ値にセットしているのですが、
データを受信したRDRの割り込みをつかめることができません。
設定しているレジスタ
UCR1~UCR4、UFCR、USR1、USR2、UESC、UBIR、UBMR、ONEMS、UTS
(標準ドライバを動作させている状態で、レジスタ値の確認を行いました。)

TRDYENを有効に設定した場合は、割り込み自体は入ってきています。
何らかのデータを受信できれば、RDRの割り込みが入るものだと思っているのですが・・・
UCR1のRRDYENも1に設定してあります。
UART2の標準ドライバは使用せずに、IRQの登録は59で実施しています。

これらの設定以外に、必要な情報をご教授いただけますでしょうか。

溝渕です。

> これらの設定以外に、必要な情報をご教授いただけますでしょうか。

標準ドライバと同じ仕様であれば、同じレジスタ値で受信割り込みが入ること
が確認できると思います。

どこをどのように変えているのかわからないのでアドバイスし難いのですが、
例えばdma実装を削除している(consoleに設定したポートと同様の実装の)場合
は、UFCRのRXTL[5:0]に"1"を設定すると受信割り込みが入ったりしませんか?

以上、ご確認宜しくお願いいたします。

森です。

> UFCRのRXTL[5:0]に"1"を設定すると受信割り込みが入ったりしませんか?

現状も、このような設定にしているのですが、USR2のRDRは0のままです。
TRDYENを有効時にUSR値を確認すると、
USR1=0x2040,USR2=0x4008 といった値になっています。

実際にやっている事は、クロックを有効にし、UART2レジスタ値セットと、
IRQ=59に対して割り込み待ちのみです。
その他レジスタ値は、以下のように設定しています。
CCM_CCGR149=0x3
CCM_PLL_CTRL27=0x2

UCR1=0xF2D
UCR2=0x5027
UCR3=0x484
UCR4=0x4042
UFCR=0xB01
UESC=0x2B
UBIR=0x29
UBMR=0xC34
ONEMS=0x2CA4
UTS=0x60
UMCR=0x0

試しに、書込みについても確認してみましたが何も変化しませんでした。
(UTXD(0x30890040)に値を書込み)

何か、問題として考えられるものはありませんでしょうか。

溝渕です。

> 何か、問題として考えられるものはありませんでしょうか。

レジスタ値が適切であるかどうかは、標準のUARTドライバを動かしてレジスタ
をダンプしてやればわかると思います。

今更根本的な質問で申し訳ございませんが、UART2の専用ドライバを自作する
目的は何でしょうか。

自作が困難であれば、動いているドライバをベースにカスタマイズを行う方法
も考えられます。

[atde]$ drivers/tty/serial/imx.c drivers/tty/serial/imx2.c

のようにコピーを作成し、ドライバ名とDevice TreeのIDなどを変更すると別
ドライバになります。