Armadilloフォーラム

起動時のLED初期設定

kuriha27

2016年7月14日 20時07分

栗原と申します。
いつもお世話になっております。

armadillo-IoT-G2の電源投入後のLED動作を変更する
方法をご教授願えませんでしょうか。

LED1において、/sys/devices/platform/leds-gpio/leds/led1/triggerの
設定がdefault-onとなっていますが、noneに変更することは可能でしょうか
(echo none > led1/triggerとしても、再起動すると再びdefault-onとなってしまうため)。

また、LED2においてユーザランド起動中はON、ユーザランド起動終了後にOFFの
動作を変更することは可能でしょうか。

フォーラムに既出でしたら、申し訳ございません。
以上、よろしくお願い致します。

コメント

at_daisuke.sasaki

2016年7月14日 21時02分

佐々木大輔です。

> armadillo-IoT-G2の電源投入後のLED動作を変更する
> 方法をご教授願えませんでしょうか。

LED1/LED2の点灯は、カーネルが初期化する際に点灯の設定を行っています。
カーネルのソースコードを参照してみてください。

{linux-3.14-at}/arch/arm/mach-imx/mach-armadillo_iotg_std.c

初期化はarmadillo_iotg_std_init()にて行われています。
ledのデバイスをregister(gpio_led_register_device())する時に
以下ソース箇所の設定値に従い点灯/消灯します。

397 static struct gpio_led armadillo_iotg_std_led_pins[] = {
398         {"led1",  "default-on", IMX_GPIO_NR(3, 29), 0},
399         {"led2",  "default-on", IMX_GPIO_NR(3, 28), 0},
400         {"led3",  "default-off", EXT_GPIO_NR(2), 0},
401         {"led4",  "default-off", EXT_GPIO_NR(3), 0},
402         {"yellow", NULL,         IMX_GPIO_NR(4, 30), 0},
403 };

> また、LED2においてユーザランド起動中はON、ユーザランド起動終了後にOFFの
> 動作を変更することは可能でしょうか。

LED2の消灯は起動スクリプトの最後で行われています。
Atmark Distの以下が該当箇所になります

{Atmark Dist}/vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/init.d/rc

  1 #!/bin/sh
  2 
  3 PATH=/bin:/sbin:/usr/bin:/usr/sbin
  4 TZ=JST-9
  5 
  6 . /etc/init.d/functions
  7 
  8 STATUS_LED=led2
・・・省略・・・
 97 ###############################################################################
 98 # led off
 99 ###############################################################################
100 ledctrl $STATUS_LED off

ledctrlの実態は、以下のファイルにかかれています。
{Atmark Dist}vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/init.d/functions

このあたりを参照し、希望のLED点灯仕様にソースを修正しビルドしたイメージを用いて試してみてください。

kuriha27

2016年7月15日 10時03分

佐々木 様

いつもお世話になっております。
栗原です。

上記内容にて、LED1とLED2を制御する事が出来ました。
ありがとうございます。

3G LEDについては、armadillo-IoT-G2の場合、3g-hl8548-led
コマンドにてon、offした内容が再起動後も反映されるという
認識で宜しかったでしょうか。

armadillo電源投入後の起動中に3G LEDが一回だけ点滅するの
ですが、点滅を無くすことは可能でしょうか。

また、armadillo-IoT-G2では、3Gの状態をLEDで表示出来なく
なったという認識なのですが、設定を変更する等によりLED等で
表示することは可能でしょうか。

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

at_daisuke.sasaki

2016年7月15日 14時17分

佐々木大輔です。

> 3G LEDについては、armadillo-IoT-G2の場合、3g-hl8548-led
> コマンドにてon、offした内容が再起動後も反映されるという
> 認識で宜しかったでしょうか。

はい。
このLEDは3GモジュールのGPIOに接続され制御されているのですが、
3Gモジュール内で値が保持されており、再起動後も保持しています。

> armadillo電源投入後の起動中に3G LEDが一回だけ点滅するの
> ですが、点滅を無くすことは可能でしょうか。

点滅というのは、「3g-hl8548-led on」の状態で再起動した場合に
起動中に一度LEDが消灯し、また点灯する動作を言っていると思っていますが
正しいですか?

このLEDの動作は、3GモジュールのGPIOを使用している都合上 回避できません。

3Gモジュールは、ファームウェアをロードする過程で
内部の状態を変更するのですが、この時にLEDが消灯してしまいます。
これは、Armadillo-IoT G2のシステムから制御する事ができません。

> また、armadillo-IoT-G2では、3Gの状態をLEDで表示出来なく
> なったという認識なのですが、設定を変更する等によりLED等で
> 表示することは可能でしょうか。

Armadillo-IoT G1に採用していた 3Gモジュール(MC8090)は
3Gモジュール自体にLEDを制御する機能を持っていたのですが、
Armadillo-IoT G2で採用しているHL8548はこの機能を持っていません。

従い、お客様のソフトウェアで、
- 3GモジュールのインターフェースがUpしている時:3g-hl8548-led on
- 3GモジュールのインターフェースがDownしている時:3g-hl8548-led off
などの制御をして頂く事で機能を実現していただく必要があります。

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

kuriha27

2016年7月19日 20時15分

佐々木 様

いつもお世話になっております。
栗原です。

ご返信ありがとうございます。

>このLEDの動作は、3GモジュールのGPIOを使用している都合上回避できません。
>3Gモジュールは、ファームウェアをロードする過程で
>内部の状態を変更するのですが、この時にLEDが消灯してしまいます。
>これは、Armadillo-IoT G2のシステムから制御する事ができません。

上記の件、承知致しました。

LED1(/sys/devices/platform/leds-gpio/leds/led1/trigger)の
設定をdefault-onからnoneに変更する件ですが、led1/triggerが
noneにも関わらず、電源投入時にLED1が点灯してしまいました。
(LED1は起動の途中で消灯したのですが、投入直後は点灯しました。)

電源投入直後からLED1とLED2が一度も点灯せずに、消灯状態にすることは
可能でしょうか。

以上、何度も申し訳ございませんが、よろしくお願い致します。

at_daisuke.sasaki

2016年7月19日 22時12分

佐々木大輔です。

> 電源投入直後からLED1とLED2が一度も点灯せずに、消灯状態にすることは
> 可能でしょうか。
> 以上、何度も申し訳ございませんが、よろしくお願い致します。

いえ、私が説明不足でした。。。

以下のドキュメントの「図5.2 起動ログ」の後に、
アットマークテクノからリリースしている標準イメージでの
LEDの点灯仕様について記載しています。

http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…

この仕様で記載しているように、ユーザーLED1については、
ブートローダーの時点で点灯しています。

そのため、カーネルが初期化を始める前の時点でLEDを消灯したい場合には、
ブートローダーも改造していただく必要があります。

製品のダウンロードページからダウンロードできるブートローダー (Hermit-At)の以下のコード部分が、
該当のLEDを点灯させている部分になります。

{hermit-at-v3}/src/target/armadillo-iotg-std/boot.S

     47         /*********************************************************************
     48          * LED_ON (GREEN & RED)
     49          *********************************************************************/
     50         ldr     r0, =0x43fac000 /* r0 = IOMUXC_BASE */
     51         mov     r2, #0x05
     52         str     r2, [r0, #0x78] /* MUX_CTL_PAD_NFALE */
     53         str     r2, [r0, #0x7c] /* MUX_CTL_PAD_NFCLE */
     54         ldr     r1, =GPIO3_BASE_ADDR
     55         ldr     r2, [r1, #0x04]
     56         orr     r2, r2, #0x30000000
     57         str     r2, [r1, #0x04]
     58         ldr     r2, [r1, #0x00]
     59         orr     r2, r2, #0x30000000
     60         str     r2, [r1, #0x00]

この中で59行目を以下のように変更すると、LEDを消灯する事ができます。

     59         orr     r2, r2, #0x00000000

Bit29がユーザーLED1、Bit28がユーザーLED2に割あたっています。
LEDは、このレジスタを1に設定する事で点灯するので、0に設定する事で消灯させる事ができます。

以上です。

kuriha27

2016年7月20日 12時34分

佐々木 様

いつもお世話になっております。
栗原です。

>Bit29がユーザーLED1、Bit28がユーザーLED2に割あたっています。
>LEDは、このレジスタを1に設定する事で点灯するので、0に設定する事で消灯させる事ができます。

上記内容により、ブートローダ時にLED1、LED2が消灯することを
確認しました(コンソールに hermit> が表示されている状態)。

しかし、bootを実行するとLED1は消灯のままなのですが、LED2が一度点灯し
再び消灯します(コンソールにて、hermit> bootを実行した状態)。

/sys/devices/platform/leds-gpio/leds/led2/triggerは、noneの状態です。

お手数ですが、boot実行時にLED2が点灯しないように変更する方法を
ご教授願えませんでしょうか。

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

at_daisuke.sasaki

2016年7月20日 13時06分

佐々木大輔です。

> しかし、bootを実行するとLED1は消灯のままなのですが、LED2が一度点灯し
> 再び消灯します(コンソールにて、hermit> bootを実行した状態)。

度々、すみません。
昨日bootloaderのソースコードを改めて読んでみて「tftbdl」と「tdtpboot」の時に
LED2が点灯するのは認識していたのですが、boot時は逃していました。

ATDE上でhermitのソースコードに対し、以下のコマンドを実行してみてください。

atmark@atde5:~/hermit-at-v3$ find src/target -type f | xargs grep LED_RED

LED_RED(=ユーザーLED2)に関連しそうなソースとして以下のよう部分がリストされます。

src/target/armadillo-box-ws1/board.c:    if (leds & LED_RED) {
src/target/armadillo3x0/board.c:    if (leds & LED_RED) {
src/target/core/loader.c:    led_off(LED_RED);
src/target/armadillo4x0/board.c:    if (leds & LED_RED) {
src/target/armadillo-iotg-std/board.c:    if (leds & LED_RED) {
src/target/suzaku/board.c:    if (leds & LED_RED)
src/target/suzaku/board.c:    if (leds & LED_RED)
src/target/armadillo2x0/board.c:    if (leds & LED_RED) {
src/target/armadillo2x0/board.h:#define LED_RED_ON()    ((!get_board_id()) \
src/target/armadillo2x0/board.h:#define LED_RED_OFF()   ((!get_board_id()) \
src/target/command/tftpboot.c:        led_on(LED_RED);
src/target/command/tftpboot.c:            led_off(LED_RED);
src/target/command/tftpdl.c:        led_on(LED_RED);
src/target/command/tftpdl.c:            led_off(LED_RED);
src/target/command/tftpdl.c:        led_off(LED_RED);
src/target/command/linux.c:    led_on(LED_RED);
src/target/armadillo8x0/board.c:    if (leds & LED_RED)
src/target/armadillo8x0/board.c:    if (leds & LED_RED)
src/target/armadillo8x0/board-armadillo840.c:    if (leds & LED_RED)
src/target/armadillo8x0/board-armadillo840.c:    if (leds & LED_RED)

ご使用のArmadilloはArmadillo-IoT G2なので
target以下の別のプロダクト(armadillo-box-ws1/armadillo-3x0/4x0/2x0/suzakuなど)は無視していただいて、
今回LEDはを光らせているのは、src/target/command以下のソース達です。

問題となっているのは、
src/target/command/linux.c: led_on(LED_RED);
の部分です。
※bootを実行した時の関数の中で実行されています。

tftpbootやtftptlの時もLEDを消灯したいのであれば、

src/target/command/tftpboot.c: led_on(LED_RED);

src/target/command/tftpdl.c: led_on(LED_RED);

削除してください。

以上です。

kuriha27

2016年7月21日 16時47分

いつもお世話になっております。
栗原です。

上記内容にて、電源投入後にLED1およびLED2の消灯が継続することを
確認出来ました。

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