親愛なるコミュニティの皆様!
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";
}; は
さらに詳しく分析した結果、i.MX8には PWMIR レジスタがありますが、 pwm-imx27 ドライバーには処理がないことがわかりました。それが理由なんでしょうね...。
さて、質問は次のとおりです。
ご意見をいただきありがとうございます。
アンディ
では、自分でお答えします。割り込みを機能させるために私が行わなければならなかった変更は次のとおりです。
#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;
}もしかしたら、他の誰かの助けにもなるかもしれません。
よろしく
アンディ
こんにちは、
PWMx_PWMIRレジスタは、比較割り込み、ロールオーバー割り込み、およびFIFOエンプティ割り込みのみをサポートします。
それは:)知っています。しかし、次に「割り込みの比較」の通知を有効にするにはどうすればよいですか?これは、CIE ビットをレジスタに設定する必要があるということですPWMx_PWMIR81行目の割り込みは自動的に呼び出されますか?CMPビットはいつ、どのようにクリアされますか?
よろしく
アンディ
Hello,
PWMx_PWMIRレジスタは、比較割り込み、ロールオーバー割り込み、およびFIFOエンプティ割り込みのみをサポートします。
GPIOの場合、ハードウェアの変更を行う必要があります。
よろしくお願いいたします。
Salas.
Hello @Manuel_Salas
IRQ 81は累積割り込みラインです。ロールオーバー割り込みライン、比較割り込みライン、PWM1のFIFO水位交差割り込みラインのOR。
はい、しかし、 PWMIR レジスタの処理がなくても動作すると確信していますか?それとも、何か違う方法で行われたビットを読んでいるのでしょうか?
任意のGPIOにPWM信号を取得できます
HWを変更せずにそれを行うにはどうすればよいですか?ピンがGPIOではなくPWMとして配線された MX8MP_IOMUXC_GPIO1_IO01__PWM1_OUT に設定されている場合でも、GPIO割り込みに登録する方法はありますか。では、内部で何らかの形で処理されるということですか?はいの場合、その方法の例を書いていただけますか?
ありがとうございます
アンディ
Hello @andrej_valek
IRQ 81は累積割り込みラインです。ロールオーバー割り込みライン、比較割り込みライン、PWM1のFIFO水位交差割り込みラインのOR。
たぶん、あなたのユースケースでは、任意のGPIOにPWM信号を取得し、Falling Edgeを設定して中断を取得できるかもしれません。
最高のreagrds、
Salas.