1888638_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1888638_ja-JP

1888638_ja-JP

i.MX8 PWM割り込み

親愛なるコミュニティの皆様!

i.MX8mpでPWM割り込みが使えるかどうか、質問したいのですが。カスタムドライバーを作成し、PWM出力がダウン(FALLING_EDGE)したときに通知を受け取りたかったのです。それを達成することは可能ですか、それとも意図的ではありませんか?

DTB で

// imx8mp.dtsi
pwm1: pwm@30660000 {
	compatible = "fsl,imx8mp-pwm", "fsl,imx27-pwm";
	reg = <0x30660000 0x10000>;
	interrupts = ;
	clocks = <&clk IMX8MP_CLK_PWM1_ROOT>,
		 <&clk IMX8MP_CLK_PWM1_ROOT>;
	clock-names = "ipg", "per";
	#pwm-cells = <3>;
	status = "disabled";
};

// imx8mp-my-device.dts
cam_trigger: cam-trigger {
	compatible = "company,cam-trigger";
	pwms = <&pwm1 0 8333333 0>;
	interrupts = ;
	status = "okay";
};

&iomuxc {
	pinctrl-names = "default";

	pinctrl_pwm1: pwm1grp {
		fsl,pins = <
			MX8MP_IOMUXC_GPIO1_IO01__PWM1_OUT	0x116
		>;
	};
};

&pwm1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pwm1>;
	status = "okay";
};

エントリーです。そこで、この割り込みに devm_request_irq で登録し、 /proc/interruptで確認したところ、登録が成功したことを確認しました。(立ち下がりエッジが欲しくても、何かだけを使っていました。しかし、割り込みは起こりませんでした。

さらに詳しく分析した結果、i.MX8には PWMIR レジスタがありますが、 pwm-imx27 ドライバーには処理がないことがわかりました。それが理由なんでしょうね...。

さて、質問は次のとおりです。

  • 私の意味は本当ですか?
    • このようなメカニズムをドライバーに実装するのはどれほど難しいですか。
      • DSによると、 キャプチャ ーだけで十分であるべきです
  • では、 GIC_SPI 81 とはどういう意味なのでしょうか?それは「楽しみのため」だけにあるということですか?
  • 割り込みが発生したときに通知を受ける別の方法はありますか?
    • 出力ピンを他の入力GPIOにルーティングするなどのHW変更はできません

ご意見をいただきありがとうございます。
アンディ

i.MX 8ファミリ | i.MX 8QuadMax (8QM) | 8QuadPlusi.MX 8M | i.MX 8M Mini | i.MX 8M NanoRe: i.MX8 PWM割り込み

では、自分でお答えします。割り込みを機能させるために私が行わなければならなかった変更は次のとおりです。

#define MX3_PWMIR			0x08    /* PWM Interrupt Register */

#define MX3_PWMIR_CIE	BIT(2)
#define MX3_PWMIR_RIE	BIT(1)
#define MX3_PWMIR_FIE	BIT(0)

struct pwm_imx27_chip {
...
	int irq;

if (state->enabled) {
	cr |= MX3_PWMCR_EN;
	/* enable interrupts */
	writel(MX3_PWMIR_CIE | MX3_PWMIR_RIE, imx->mmio_base + MX3_PWMIR);
	} else {
	/* disable interrupts */
	writel(0, imx->mmio_base + MX3_PWMIR);
}


static irqreturn_t imx_pwm_interrupt(int irq, void *data)
{
	struct pwm_imx27_chip *imx = data;
	unsigned long flags;
	u32 pwmsr;

	spin_lock_irqsave(&imx->lock, flags);

	pwmsr = readl(imx->mmio_base + MX3_PWMSR);

	/* handle flags separately, while multiple of them could happen */
	if (pwmsr && (~MX3_PWMSR_CMP)) pwmsr |= MX3_PWMSR_CMP;
	if (pwmsr && (~MX3_PWMSR_ROV)) pwmsr |= MX3_PWMSR_ROV;

	/* ack interrupt flags */
	writel(pwmsr, imx->mmio_base + MX3_PWMSR);
	
	spin_unlock_irqrestore(&imx->lock, flags);

	return IRQ_HANDLED;
}

// probe...
	imx->irq = platform_get_irq(pdev, 0);
	if (imx->irq < 0) {
		dev_err(&pdev->dev, "Failed to get IRQ\n");
		return imx->irq;
	}

	ret = devm_request_irq(&pdev->dev, imx->irq, imx_pwm_interrupt, IRQF_TRIGGER_HIGH,
			       pdev->name, imx);
	if (ret < 0) {
		dev_err(&pdev->dev, "Failed to request IRQ\n");
		return ret;
	}

もしかしたら、他の誰かの助けにもなるかもしれません。

よろしく
アンディ

Re: i.MX8 PWM割り込み

こんにちは、

PWMx_PWMIRレジスタは、比較割り込み、ロールオーバー割り込み、およびFIFOエンプティ割り込みのみをサポートします。

それは:)知っています。しかし、次に「割り込みの比較」の通知を有効にするにはどうすればよいですか?これは、CIE ビットをレジスタに設定する必要があるということですPWMx_PWMIR81行目の割り込みは自動的に呼び出されますか?CMPビットはいつ、どのようにクリアされますか?

よろしく
アンディ

Re: i.MX8 PWM割り込み

Hello,

PWMx_PWMIRレジスタは、比較割り込み、ロールオーバー割り込み、およびFIFOエンプティ割り込みのみをサポートします。


GPIOの場合、ハードウェアの変更を行う必要があります。


よろしくお願いいたします。

Salas.

Re: i.MX8 PWM割り込み

Hello @Manuel_Salas 

IRQ 81は累積割り込みラインです。ロールオーバー割り込みライン、比較割り込みライン、PWM1のFIFO水位交差割り込みラインのOR。

はい、しかし、 PWMIR レジスタの処理がなくても動作すると確信していますか?それとも、何か違う方法で行われたビットを読んでいるのでしょうか?

任意のGPIOにPWM信号を取得できます

HWを変更せずにそれを行うにはどうすればよいですか?ピンがGPIOではなくPWMとして配線された MX8MP_IOMUXC_GPIO1_IO01__PWM1_OUT に設定されている場合でも、GPIO割り込みに登録する方法はありますか。では、内部で何らかの形で処理されるということですか?はいの場合、その方法の例を書いていただけますか?

ありがとうございます
アンディ

Re: i.MX8 PWM割り込み

Hello @andrej_valek 


IRQ 81は累積割り込みラインです。ロールオーバー割り込みライン、比較割り込みライン、PWM1のFIFO水位交差割り込みラインのOR。


たぶん、あなたのユースケースでは、任意のGPIOにPWM信号を取得し、Falling Edgeを設定して中断を取得できるかもしれません。


最高のreagrds、

Salas.

Tags (1)
No ratings
Version history
Last update:
‎01-05-2026 10:14 AM
Updated by: