Armadilloフォーラム

Armadillo-840 PWM出力の設定について

m.hayashi

2015年11月13日 10時35分

お世話になります。林と申します。
はじめて投稿させていただきます。

Armadillo-840の液晶モデル開発セットを使用しています。

PWM出力を行いたいのですが
カーネルコンフィグレーションの設定方法と
周期、デューティ比の設定に使用するファイルについて
教えていただけないでしょうか?

840の製品マニュアルでは最大3ポートをPWMとして使用可能とありましたが
設定方法がわかりませんでした。

使用したいのは
CON8 拡張インターフェース2(Dコネクタ)の
ピン番号
42 TRU0TO0
44 TRU0TO1
です。

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

コメント

> 840の製品マニュアルでは最大3ポートをPWMとして使用可能とありましたが
> 設定方法がわかりませんでした。
>
> 使用したいのは
> CON8 拡張インターフェース2(Dコネクタ)の
> ピン番号
> 42 TRU0TO0
> 44 TRU0TO1
> です。

添付のパッチを使用すれば、PWM設定を以下の手順で行えます。

1. パッチの適用
linux-3.4-at16に対して添付のパッチを以下の手順で適用します。

[ATDE5]$ cd ~/linux-3.4-at16
[ATDE5]$ patch -p1 < linux-3.4-at16-support-led-pwm.patch
patching file arch/arm/mach-shmobile/Kconfig.armadillo800
patching file arch/arm/mach-shmobile/board-armadillo840.c
[ATDE5]$

2. カーネルコンフィギュレーションの変更
PWMを使用するにあたり、以下のカーネルコンフィギュレーションを行います。

Linux/arm 3.4-at16 Kernel Configuration
    System Type  --->
            CON7 extension board (Custom)  --->
                 ( ) LCD
                 (X) Custom    /* Custom を選択します */
        Armadillo-840 System Configuration  --->
            [*] use TPU0 Output0 [PORT23]          /* 有効化します */
            [*] use TPU0 Output1 [PORT21]          /* 有効化します */
            [ ] use TPU0 Output2 [PORT202]         /* 無効化します */
            [ ]   PWM: Generic PWM based Backlight /* 無効化します */
            [ ] use TPU0 Output3 [PORT180]         /* 無効化します */
    Device Drivers  --->
        [*] LED Support  --->
            <*>   PWM driven LED Support   /* 有効化します */

3. 周波数の設定
添付のパッチでは、ビルドタイム時にのみ周波数設定が可能です。
(Armadillo上から周波数の変更はできず固定設定となります。)

添付のパッチでは、以下の値に設定しています。
- TPU0TO0: 30.0kHz
- TPU0TO1: 50.0kHz

周波数は以下のソースでpwm_period_nsを変更することにより設定可能です。
pwm_period_nsの設定値はナノ秒単位の周期です。

■ arch/arm/mach-shmobile/board-armadillo840.c の1351〜1368行目

static struct led_pwm pwm_leds[] = {
#if IS_ENABLED(CONFIG_LEDS_PWM)
#if IS_ENABLED(CONFIG_ARMADILLO840_TPU0TO0_PORT23)
        {
                .name = "TPU0TO0.LED",
                .pwm_id = RMOB_TPU_PWM_ID(0, 0),
                .max_brightness = 255,
                .pwm_period_ns = 33333, /* 30kHz */
        },
#endif
#if IS_ENABLED(CONFIG_ARMADILLO840_TPU0TO1_PORT21)
        {
                .name = "TPU0TO1.LED",
                .pwm_id = RMOB_TPU_PWM_ID(0, 1),
                .max_brightness = 255,
                .pwm_period_ns = 20000, /* 50kHz */
        },
#endif

4. ビルド
上記手順を完了後、ビルドを行います。
ビルド方法は、以下を参照して下さい。

Armadillo-840 製品マニュアル
「第11章 ビルド手順」
http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_man…

その後、作成されたイメージでArmadillo-840を起動してください。

5. デューティ比の設定方法
各TPUチャネルのデューティ比を変更するためのファイルは以下となります。
- TPU0TO0: /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness
- TPU0TO1: /sys/devices/platform/leds_pwm.0/leds/TPU0TO1.LED/brightness

まず、brightness へ max_brightness の値 (デューティ比 0:100 電圧 0V) を設定します。
この操作を行わないと、デューティ比を変更することができません。

[armadillo840]# cat /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/max_brightness
255
[armadillo840]# echo 255 > /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness

デューティ比を 50:50 に設定する例は以下のとおりです。

[armadillo840]# echo 127 > /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness
ファイル ファイルの説明
linux-3.4-at16-support-led-pwm.patch PWM対応パッチ

林です。回答ありがとうございます。

TPU0TO0、TPU0TO1の周波数、デューティ比の設定をすることができました。

> 2. カーネルコンフィギュレーションの変更
> PWMを使用するにあたり、以下のカーネルコンフィギュレーションを行います。
>

CON7 extension board (Custom) の設定は
Armadillo-840 System Configuration --->
の下にありました。

> CON7 extension board (Custom) の設定は
> Armadillo-840 System Configuration --->
> の下にありました。
ご指摘のとおりです。失礼いたしました。

訂正させていただきますと、
> 2. カーネルコンフィギュレーションの変更
は、以下のとおりです。

Linux/arm 3.4-at16 Kernel Configuration
    System Type  --->
        Armadillo-840 System Configuration  --->
            CON7 extension board (Custom)  --->
                 ( ) LCD
                 (X) Custom    /* Custom を選択します */
            ・・・省略・・・
            [*] use TPU0 Output0 [PORT23]          /* 有効化します */
            [*] use TPU0 Output1 [PORT21]          /* 有効化します */
            [ ] use TPU0 Output2 [PORT202]         /* 無効化します */
            [ ]   PWM: Generic PWM based Backlight /* 無効化します */
            [ ] use TPU0 Output3 [PORT180]         /* 無効化します */
    Device Drivers  --->
        [*] LED Support  --->
            <*>   PWM driven LED Support   /* 有効化します */

林です。

Qtのアプリを作成しておりまして、今までLCD側に画面表示を行っていたのですが
上記のPWMの設定を行ったあと、LCD側に表示されなくなってしまいました。

アプリ自体は動いているようなので、HDMIモニタを接続してみたところ
QT_QPA_EGLFS_DISPLAY=1 で起動 ⇒ HDMI側に表示されている
QT_QPA_EGLFS_DISPLAY=0 で起動 ⇒ アプリは起動しているがHDMIにもLCDにも表示されず?

LCD側に表示を行うにはどうしたらよいでしょうか?

> LCD側に表示を行うにはどうしたらよいでしょうか?
カーネルコンフィギュレーションにおいて、以下の手順は不要です。申し訳ありません。

Linux/arm 3.4-at16 Kernel Configuration
    System Type  --->
            CON7 extension board (Custom)  --->
                 ( ) LCD
                 (X) Custom    /* Custom を選択します */

"CON7 extension board"は、デフォルト値である"LCD"を選択してください。

再度訂正させていただきますと、カーネルコンフィギュレーションは以下のとおりです。

Linux/arm 3.4-at16 Kernel Configuration
    System Type  --->
        Armadillo-840 System Configuration  --->
            CON7 extension board (Custom)  --->
                 (X) LCD       /* LCDを選択します(デフォルト) */
                 ( ) Custom
            ・・・省略・・・
            [*] use TPU0 Output0 [PORT23]          /* 有効化します */
            [*] use TPU0 Output1 [PORT21]          /* 有効化します */
            -*- use TPU0 Output2 [PORT202]         /* 有効(デフォルト) */
            -*-   PWM: Generic PWM based Backlight /* 有効(デフォルト) */
            [ ] use TPU0 Output3 [PORT180]         /* 無効化します */
    Device Drivers  --->
        [*] LED Support  --->
            <*>   PWM driven LED Support   /* 有効化します */

"use TPU0 Output2"と"PWM: Generic PWM based Backlight"は、
"CON7 extension board"を"LCD"に設定することで、有効に固定されます。

混乱させてしまい、申し訳ありませんでした。

林です。回答ありがとうございます。

"CON7 extension board"を"LCD"に設定して
/sys/devices/platform/leds_pwm.0/leds/TPU0TO2.LED/brightness の値を確認したら
0だったので 255 に変更したら、LCDへの画面表示が見えました。

林です。

LCDの明るさ設定なのですが
/sys/devices/platform/leds_pwm.0/leds/TPU0TO2.LED/brightness
はArmadillo起動時に 0 になるのですね。

PWM使用の設定前は明るさの設定は特に行っていなかったのですが
この値を任意の値に設定しておくことは可能でしょうか?

・Armadillo起動時に設定を行うようにする
・自作アプリの起動時に設定を行うようにする
などはできると思うのですが
Armadillo起動時の値をあらかじめ設定しておく方法が何かあれば教えてください。

よろしくお願いします。

> LCDの明るさ設定なのですが
> /sys/devices/platform/leds_pwm.0/leds/TPU0TO2.LED/brightness
> はArmadillo起動時に 0 になるのですね。

先日添付しましたPWM対応パッチがLCDのPWMバックライトに対応しておりませんでした。
以下のとおりに修正していただけますでしょうか。

■ arch/arm/mach-shmobile/board-armadillo840.c 1369行目
・修正前

#if IS_ENABLED(CONFIG_ARMADILLO840_TPU0TO2_PORT202)

・修正後(改行されて表示されますが、1行で入力して下さい)

#if IS_ENABLED(CONFIG_ARMADILLO840_TPU0TO2_PORT202) && !IS_ENABLED(CONFIG_ARMADILLO840_TPU0TO2_PORT202_DEVICE_PWM_BACKLIGHT)

上記の修正により、Armadillo起動時のLCDバックライトは255で、
sysfsはこれまでどおり、
- /sys/class/backlight/pwm-backlight.0/brightness
を使用できます。

また、上記の修正を適用済みのパッチを添付いたします。

ファイル ファイルの説明
linux-3.4-at16-support-led-pwm_v2.patch PWM対応パッチ(PWMバックライト対応)

林です。

ご指示のとおり
arch/arm/mach-shmobile/board-armadillo840.c
への修正を行い、Armadillo起動時のLCDバックライトが255となるのを確認できました。

ありがとうございました。

林です。
お世話になっております。

拡張ボード01をはずした状態だと
/sys/devices/platform/leds_pwm.0/ 
以下が存在せず、PWM制御が出来ないのですがどうしたらよいでしょうか?

前回の質問時は Armadillo-840 拡張ボード01(Cコネクタ用)を取り付けた状態で使用していたのですが
今回、内製の拡張基板を取り付けて使用するため、拡張ボード01は外して使用します。

内製基板がない状態で同じイメージを使って確認してみました。
①Armadillo-840 + 拡張ボード01 → PWMのデバイスファイルがある
②Armadillo-840 単体         → PWMのデバイスファイルがない

拡張ボード01を外していますが、
カーネルコンフィグレーションなどの設定は特に変えず、そのまま使っているのですが
変更が必要なところがあれば教えてください。

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

お世話になっております。
林です。

カーネルコンフィグレーションの設定を下記のように変更しました。

> Linux/arm 3.4-at16 Kernel Configuration
>     System Type  --->
>         Armadillo-840 System Configuration  --->
>             CON7 extension board (Custom)  --->
>                  ( ) LCD      
>                  (X) Custom
 

PWMのデバイスファイルが見れるようになり
/sys/devices/platform/leds_pwm.0/
TPU0TO0.LED
TPU0TO1.LED
の操作はできるようになりました。

しかし、新たな問題が発生しています。

TPU0TO0.LEDのbrightnessに値を書き込むと
/sys/class/gpio/gpio34のvalueが0になってしまうという現象が発生しています。

こちらでの確認内容なのですが
現在、gpio31、gpio32、gpio33、gpio34 を出力設定で使用しており
上記4つのdirectionにoutを書込み、valueを1に変更したあと

#echo 255 > /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness

を行うと gpio34 のvalueが0になってしまいます。
その後 value を1にしても0に戻ってしまいます。
gpio31、gpio32、gpio33のvalueは変化しません。

再起動するまで、その状態は継続します。

/sys/devices/platform/leds_pwm.0/leds/TPU0TO1.LED/brightness
では書込みを行っても、gpio34の出力値が変化することはありませんでした。

この原因は何でしょうか?

解決方法はありますでしょうか?

※環境
ATDE5:v20151026
ブートローダー (Hermit-At):v3.8.0
Linuxカーネル:v3.4-at16
ユーザーランド (Atmark Dist):v20151026
ルートファイルシステム: Debian GNU/Linux 7(wheezy) v20130704

at_yuma.arakawa

2016年1月26日 18時29分

返答が遅くなってしまい、すみません。
 

> 現在、gpio31、gpio32、gpio33、gpio34 を出力設定で使用しており
> 上記4つのdirectionにoutを書込み、valueを1に変更したあと
>
> #echo 255 > /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness
>
> を行うと gpio34 のvalueが0になってしまいます。
> その後 value を1にしても0に戻ってしまいます。
> gpio31、gpio32、gpio33のvalueは変化しません。
当方で試してみたのですが、
再現させることができませんでした。
 

当方での確認手順は以下のとおりなのですが、
手順に差異などありますか?

1. カーネルのビルド
以下のコメントで添付したパッチをLinux 3.4-at16に適用
- https://users.atmark-techno.com/comment/2579#comment-2579

以下のコンフィギュレーションでカーネルをビルド

Linux/arm 3.4-at16 Kernel Configuration
    System Type  --->
        Armadillo-840 System Configuration  --->
            CON7 extension board (Custom)  --->
                 ( ) LCD
                 (X) Custom  /* 1/14にコメントをいただいた通り、Customを選択しました */
            ・・・省略・・・
            [*] use TPU0 Output0 [PORT23]          /* 有効化します */
            [*] use TPU0 Output1 [PORT21]          /* 有効化します */
            -*- use TPU0 Output2 [PORT202]         /* 有効(デフォルト) */
            -*-   PWM: Generic PWM based Backlight /* 有効(デフォルト) */
            [ ] use TPU0 Output3 [PORT180]         /* 無効化します */
    Device Drivers  --->
        [*] LED Support  --->
            <*>   PWM driven LED Support   /* 有効化します */

 

2. ビルドし、出来上がったカーネルを使用して以下の手順を実行

[root@armadillo840-0 (ttySC2) ~]# echo out > /sys/class/gpio/gpio31/direction
[root@armadillo840-0 (ttySC2) ~]# echo out > /sys/class/gpio/gpio32/direction
[root@armadillo840-0 (ttySC2) ~]# echo out > /sys/class/gpio/gpio33/direction
[root@armadillo840-0 (ttySC2) ~]# echo out > /sys/class/gpio/gpio34/direction
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio31/direction
out
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio32/direction
out
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio33/direction
out
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio34/direction
out
[root@armadillo840-0 (ttySC2) ~]# echo 1 > /sys/class/gpio/gpio31/value
[root@armadillo840-0 (ttySC2) ~]# echo 1 > /sys/class/gpio/gpio32/value
[root@armadillo840-0 (ttySC2) ~]# echo 1 > /sys/class/gpio/gpio33/value
[root@armadillo840-0 (ttySC2) ~]# echo 1 > /sys/class/gpio/gpio34/value
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio31/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio32/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio33/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio34/value
1
[root@armadillo840-0 (ttySC2) ~]# echo 255 > /sys/devices/platform/leds_pwm.0/leds/TPU0TO0.LED/brightness
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio31/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio32/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio33/value
1
[root@armadillo840-0 (ttySC2) ~]# cat /sys/class/gpio/gpio34/value
1
[root@armadillo840-0 (ttySC2) ~]#