Armadilloフォーラム

LED状態の保存と復元方法

hondah

2015年7月24日 19時13分

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

Armadillo440にてLEDの状態を保存と復元方法を探しております。
cpやcatではエラーしてします。
初歩的な質問で申し訳ありませんが、ご教示いただけると助かります。

[root@Armadillo440]#cat /sys/devices/platform/leds-gpio.0/leds/green/brightness > /tmp/green_back
[root@Armadillo440]#cat /tmp/green_back > /sys/devices/platform/leds-gpio.0/leds/green/brightness
cat: Write Error: Invalid argument

LED操作で使用しているのは、下記のファイルになります。
/sys/devices/platform/leds-gpio.0/leds/*/
・brightness
・trigger
・(delay_on)
・(delay_off)

コメント

izawa

2015年7月24日 20時00分

取り敢えず試してみました。
--
% cat /sys/class/leds/red/brightness > /tmp/red
% cat /tmp/red > /sys/class/leds/red/brightness
cat: Write Error: Invalid argument
% echo `cat /tmp/red` > /sys/class/leds/red/brightness
% head /tmp/red > /sys/class/leds/red/brightness
%
--
何故でしょうね。

y.nakamura

2015年7月24日 23時26分

中村です。

最後の
> % head /tmp/red > /sys/class/leds/red/brightness
これはエラーになりました。
head: standard output: Invalid argument

ですが、これはOK。
# head -n 1 /tmp/red > /sys/class/leds/red/brightness

> 何故でしょうね。

原因は、最後のNULLバイト(0x00)。

# cat /sys/class/leds/green/brightness | hexdump
0000000 3532 0a35 0000
0000005

# echo `cat /sys/class/leds/green/brightness` | hexdump
0000000 3532 0a35
0000004

# cat /sys/class/leds/green/brightness | head | hexdump
0000000 3532 0a35 0000
0000005

# cat /sys/class/leds/green/brightness | head -n 1 | hexdump
0000000 3532 0a35
0000004

/tmp/red をviで開くと・・・
255
^@

--
なかむら

hondah

2015年7月27日 11時20分

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

izawa様、 中村様
早速の返信ありがとうございます。

2行目に変な文字コードが入っているようですね。
一行目のみ抜出、[]で囲われたところのみ抜出という形で進めたいと思います。
ありがとうございました。

今度ともよろしくお願いいたします。

at_ohsawa

2015年7月27日 14時50分

中村 様

大澤です。
少し話題から逸れますが、

>> % head /tmp/red > /sys/class/leds/red/brightness
>これはエラーになりました。
>head: standard output: Invalid argument

(後続の00のせいで)LEDの状態は変らないにせよ、ここで
headがstdoutに対してエラーするのが、気になります。

kernelとユーザーランドのバージョンを教えていただけない
でしょうか。

a440の現在の標準イメージでやってみたのですが、
リダイレクトは正常に終って(LEDの状態は変らず)、
コンソールへの出力は何もありませんでした。

- kernel : 2.6.26-at25
- userland(/etc/DISTNAME):v1.40.0 (AtmarkTechno/Armadillo-440)

y.nakamura

2015年7月27日 15時49分

中村です。

> >> % head /tmp/red > /sys/class/leds/red/brightness
> >これはエラーになりました。
> >head: standard output: Invalid argument
>
> (後続の00のせいで)LEDの状態は変らないにせよ、ここで
> headがstdoutに対してエラーするのが、気になります。
>
> kernelとユーザーランドのバージョンを教えていただけない
> でしょうか。

atmark-dist v1.31.1 (AtmarkTechno/Armadillo-440)
Linux 2.6.26-at17 [armv5tejl arch]
です。
v1.31.1はatmark-dist-20130329です。

そのときたまたま動かしていたのが、このバージョンだったためで、
ちょっと古かったですね。

> a440の現在の標準イメージでやってみたのですが、
> リダイレクトは正常に終って(LEDの状態は変らず)、
> コンソールへの出力は何もありませんでした。
>
> - kernel : 2.6.26-at25
> - userland(/etc/DISTNAME):v1.40.0 (AtmarkTechno/Armadillo-440)

A410に最新のが入っていましたので、これで試してみました。
atmark-dist v1.41.0 (AtmarkTechno/hoge) <--- hogeは440のコピーです
Linux 2.6.26-at25 [armv5tejl arch]

このバージョンだと、headでエラーメッセージは出ませんでしたが
終了コードは1です。
# head /tmp/green > /sys/class/leds/red/brightness
# echo $?
1

-n 1 を付けると・・・
# head -n 1 /tmp/green > /sys/class/leds/red/brightness
# echo $?
0

--
なかむら

at_ohsawa

2015年7月27日 19時08分

中村 様
ありがとうございます。

http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/com…
このパッチ直っていましたが、LEDのsysfsが値を返す時に無駄に取っていますね。。

catでエラーするのは、後続の00(Null)がLED classに書き込まれた時に
コールされる drivers/leds/led-class.c::led_brightness_store() のsimple_strtoulで
変換できずに、エラーが返ったようです。

アップデートの候補に載せておきます。

hondah

2015年7月27日 20時08分

いつもお世話になっております。
本田です。

headやcutを使用し、保存と復元を実現したのですが、まれにに戻せない場合がございます。
何か対応策があれば、ご教示いただけると助かります。

LEDにタイマーをセット
echo timer > /sys/devices/platform/leds-gpio.0/leds/red/trigger
echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_on
echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_off

sh aaa;sh bbb (バックアップ採取と復元作業)
実行した物を添付しておきます。

環境
atmark-dist v1.41.0
linux-2.6.26-at25

hondah

2015年7月27日 20時10分

アップロードに失敗しておりましたので、再送いたします。

> いつもお世話になっております。
> 本田です。
>
> headやcutを使用し、保存と復元を実現したのですが、まれにに戻せない場合がございます。
> 何か対応策があれば、ご教示いただけると助かります。
>
> LEDにタイマーをセット
> echo timer > /sys/devices/platform/leds-gpio.0/leds/red/trigger
> echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_on
> echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_off
>
> sh aaa;sh bbb (バックアップ採取と復元作業)
> 実行した物を添付しておきます。
>
> 環境
> atmark-dist v1.41.0
> linux-2.6.26-at25

ファイル ファイルの説明
aaa.txt
bbb.txt

hondah

2015年7月27日 20時10分

アップロードに失敗しておりましたので、再送いたします。

> いつもお世話になっております。
> 本田です。
>
> headやcutを使用し、保存と復元を実現したのですが、まれにに戻せない場合がございます。
> 何か対応策があれば、ご教示いただけると助かります。
>
> LEDにタイマーをセット
> echo timer > /sys/devices/platform/leds-gpio.0/leds/red/trigger
> echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_on
> echo 100 > /sys/devices/platform/leds-gpio.0/leds/red/delay_off
>
> sh aaa;sh bbb (バックアップ採取と復元作業)
> 実行した物を添付しておきます。
>
> 環境
> atmark-dist v1.41.0
> linux-2.6.26-at25

ファイル ファイルの説明
aaa.txt
bbb.txt

y.nakamura

2015年7月27日 21時49分

中村です。

> > headやcutを使用し、保存と復元を実現したのですが、まれにに戻せない場合がございます。
> > 何か対応策があれば、ご教示いただけると助かります。

失敗するとき /tmp/red_xxxx がどのような文字列になっているのか、
調べましたか?

--
なかむら

hondah

2015年7月28日 10時20分

お世話になっております。本田です。
連投してしまい、申し訳ございません。

大変失礼しました。timerの挙動を把握しておりませんでした。
brightnessが0を書き込むとtriggerはnoneになるのですね。

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