BeagleBoneのオンボードLED制御

BeagleBoneでLED4つ実装している。それぞれの名称はusr0、usr1、usr2、usr3だ。
LEDはトリガー(trigger)によって制御されている。
下記のフォルダにそれぞれLEDの制御フォルダがある
/sys/class/leds/
しかし、本体は/sys/devices/platform/leds-gpio/leds
に指しているシンボリックリンクだ
beaglebone::usr0 -> ../../devices/platform/leds-gpio/leds/beaglebone::usr0
beaglebone::usr1 -> ../../devices/platform/leds-gpio/leds/beaglebone::usr1
beaglebone::usr2 -> ../../devices/platform/leds-gpio/leds/beaglebone::usr2
beaglebone::usr3 -> ../../devices/platform/leds-gpio/leds/beaglebone::usr3
それぞれのLED制御フォルダに下記にファイルがある:
1,brightness
説明:値が0なら消灯、値が1なら点灯となる。
例:echo 1 > brightness

2,device -> ../../../leds-gpio
説明:特に使い道なし
 
3,max_brightness
説明:(TBD)

4,power
説明:(TBD)

5、subsystem -> ../../../../../class/leds
説明:特に使い道なし

6,trigger
説明:LED制御トリガー
トリガーはnone mmc0 timer heartbeat backlight gpio default-on7種類だ。
設定するため、viで編集するのではなく、echo で変更する
例:$ echo none > trigger
有効中の設定は四角カッコで囲っている
例:
$ cat trigger
[none] mmc0 timer heartbeat backlight gpio default-on

none:未設定

mmc0:SDカードスロット(SDカードにアクセスした場合LED点灯)

timer:LEDのon,offタイマー設定
$ echo timer > trigger
この設定を有効にした場合、delay_offとdelay_onファイルが作成される。
delay_off:消灯間隔(ms)
delay_on:点灯間隔(ms)
例:点灯5秒消灯1秒のパターン
$ echo 5000 > delay_on
$ echo 1000 > delay_off
設定しない場合デフォルトはどちらも500msとなっている。

heartbeat:生存監視

backlight:(TBD)

gpio:(TBD)

default-on:(TBD)

7,uevent
説明:(TBD)
デフォルトで付属のAngstromLinuxでは下記の動作となっている。

usr0:heartbeat
usr1:mmc(つまりSDカードアクセス)
usr2:未使用
usr3:未使用

LEDテストスクリプトを作成した:testled.sh

#!/bin/sh
led="/sys/class/leds/beaglebone::"

get_led_state () {
usr0_trigger=`cat ${led}usr0/trigger | sed -e "s/^.*\[\(.*\)\].*$/\1/"`
usr1_trigger=`cat ${led}usr1/trigger | sed -e "s/^.*\[\(.*\)\].*$/\1/"`
usr2_trigger=`cat ${led}usr2/trigger | sed -e "s/^.*\[\(.*\)\].*$/\1/"`
usr3_trigger=`cat ${led}usr3/trigger | sed -e "s/^.*\[\(.*\)\].*$/\1/"`
usr0_brightness=`cat ${led}usr0/brightness`
usr1_brightness=`cat ${led}usr1/brightness`
usr2_brightness=`cat ${led}usr2/brightness`
usr3_brightness=`cat ${led}usr3/brightness`
echo "USR0 LED state ($usr0_brightness) [$usr0_trigger]"
echo "USR1 LED state ($usr1_brightness) [$usr1_trigger]"
echo "USR2 LED state ($usr2_brightness) [$usr2_trigger]"
echo "USR3 LED state ($usr3_brightness) [$usr3_trigger]"
}

get_led_state
save0t="$usr0_trigger"
save0b="$usr0_brightness"
save1t="$usr1_trigger"
save1b="$usr1_brightness"
save2t="$usr2_trigger"
save2b="$usr2_brightness"
save3t="$usr3_trigger"
save3b="$usr3_brightness"

echo "Turning LEDs on for 3 seconds..."
echo "none" > ${led}usr0/trigger
echo "none" > ${led}usr1/trigger
echo "none" > ${led}usr2/trigger
echo "none" > ${led}usr3/trigger
echo "1" > ${led}usr0/brightness
echo "1" > ${led}usr1/brightness
echo "1" > ${led}usr2/brightness
echo "1" > ${led}usr3/brightness
get_led_state
sleep 3

echo "Turning USR0 LED off for 3 seconds..."
echo "0" > ${led}usr0/brightness
get_led_state
sleep 3

echo "Turning USR1 LED off for 3 seconds..."
echo "0" > ${led}usr1/brightness
get_led_state
sleep 3

echo "Turning USR2 LED off for 3 seconds..."
echo "0" > ${led}usr2/brightness
get_led_state
sleep 3

echo "Turning USR3 LED off for 3 seconds..."
echo "0" > ${led}usr3/brightness
get_led_state
sleep 3

echo "Restoring LEDs to their original state..."
echo "$save0b" > ${led}usr0/brightness
echo "$save1b" > ${led}usr1/brightness
echo "$save2b" > ${led}usr2/brightness
echo "$save3b" > ${led}usr3/brightness
echo "$save0t" > ${led}usr0/trigger
echo "$save1t" > ${led}usr1/trigger
echo "$save2t" > ${led}usr2/trigger
echo "$save3t" > ${led}usr3/trigger
get_led_state

BeagleBoneのSDに最新のOSイメージを入れる

http://www.beagleboard.org/angstrom-mirror/www.angstrom-distribution.org/demo/beaglebone/
から最新のAngstrom-Cloud9-・・・.img.gzをダウンロードする。
SDカードに書きこむ
$ zcat ・・・.img.gz | sudo dd of=/dev/sdc bs=8M
再度、BeagleBoneに挿し戻して起動を確認する。
rootユーザのパスワードを変更する
passwd root

ユーザを作成
useradd user01
passwd user01
opkgを使ったオンラインソフトのバージョンアップが可能だが、
安定性、信頼性が落ちる可能性があり、最悪起動できなくなる可能性もあるので、
バックアップしてから行ったほうが良いでしょう。
(実際私のほうはドライバがLoadできなくなり、起動できなくなった・・・)
opkg update
opkg upgrade 2>&1 | tee /var/log/opkgupgrade.log

PlayStationVita の主な部品リスト

Sony CXD5315GG – Quad-core processor with two Samsung K4P2G324EC 256 MB Mobile DDR2-S4 SDRAM Memory die (512MB total memory)
Toshiba THGBM3G5D1FBAIE - Multichip Memory Package – Memory and Memory Controller
Marvell 88W878S-BKB2 - Avastar WLAN/Bluetooth/FM Single-Chip System-on-Chip
Fujitsu MB44C026A – Possible Multichannel Switching Controller
Sony 1144KM427 – suspected AKM Magnetic Compass
Wolfson Micro WM1803E – Audio Codec
Qualcomm MDM6200 – Gobi Single-mode Modem
Qualcom PM8028 – Power Management IC
Toshiba TY890A111222KA - Mobile SDR SDRAM Memory
Kionix KXTC9 - Three-axis MEMS accelerometer
Avago ACPM-7868 - GSM Power Amplifier
Avago ACPM-5005 - W-CDMA Band V Power Amplifier Module
Avago ACPM-5001 - W-CDMA Band I Power Amplifier Module
Avago ACPM-5002 - W-CDMA Band II Power Amplifier Module
Avago ACPM-5008 - W-CDMA Band VIII Power Amplifier Module
EPCOS B7429 - SAW Duplexer
Sony CXM3555ER - SP10T Antenna Switch Module
Atmel MXT224 – 224-Channel Touchscreen Sensor
STMicroelectronics 32P10SOD
STMicroelectronics 3GA51H - Gyroscope

GDBでSegmentation Faultの原因を突き止める

 Linuxのプログラムをデバッグするとき、一番困ることはあの有名の「Segmentation Fault」ですね。
プログラムが膨大でマルチプロセス等を使っていたら、どこで問題を起こしているのかすらわからないです。
 本編はLinuxのCore Dump機能で問題発生行を特定する方法を紹介します。
 まず、前提としてはSegmentation Faultは再現できること。(当たり前ですよね)
 下記のプログラムを例とします。
#include<stdio.h>
#include<string.h>

#define DATA "TEST"

char            mngfile[2][50];

int main()
{
  memset( mngfile, '\0', sizeof(mngfile) );

  GetMngFile(mngfile);

  return 0;
}

int GetMngFile( mngfile )
  char            mngfile[2][50];
{
  int i=0;
  char    file[128];
  for(i=0;i<999;i++)
  {
    memset( file, '\0', sizeof(file) );

    strcpy(file,"abc");
    sprintf(mngfile[i],"%s_%s",file,DATA);
    printf("%d,%s\n",i,mngfile[i]);
  }
  return 0;
}
 次に、コンパイルオプションに「-g」を付けてコンパイルします。
  gcc test2.c -g -o test2
 多くのLinuxではデフォルトCoreDump機能を無効にしてあるため、有効にします。
  ulimit -c unlimited (生成するCoreのサイズを制限しない)
 プログラムを実行してみます。
  ./test2
  セグメンテーション違反です (core dumped)
 この時、カレントディレクトリで「core.11504」のようなファイルが生成されます。

 このCoreをGDBでデバッグしてみましょう。
  gdb ./test2 core.11504

  ・・・
  Core was generated by `./test2'. 
  (test2がCoreを吐いている)
  Program terminated with signal 11, Segmentation fault.
  (シグナル11でプログラムが終了され、セグメンテーション違反発生)
  Reading symbols from /lib/tls/libc.so.6...done.
  Loaded symbols for /lib/tls/libc.so.6
  Reading symbols from /lib/ld-linux.so.2...done.
  Loaded symbols for /lib/ld-linux.so.2
  #0  0x0058668b in _IO_default_xsputn_internal () from /lib/tls/libc.so.6 
  (最終実行ステップはlibc.so.6ライブラリの_IO_default_xsputn_internal()関数内にある)
(gdb)bt  (BackTraceしてみます。)
#0  0x0058668b in _IO_default_xsputn_internal () from /lib/tls/libc.so.6
#1  0x005645fa in vfprintf () from /lib/tls/libc.so.6
#2  0x0057c71b in vsprintf () from /lib/tls/libc.so.6
#3  0x0056995b in sprintf () from /lib/tls/libc.so.6
#4  0x080484ce in GetMngFile (mngfile=0x8049740) at test2.c:27
#5  0x08048441 in main () at test2.c:12
わたしのソースにのみ興味があるので、先頭にあるStack Frame番号の詳細をみます。
(gdb) frame 4
#4  0x080484ce in GetMngFile (mngfile=0x8049740) at test2.c:27
27          sprintf(mngfile[i],"%s_%s",file,DATA);

これでソースの27行目のsprintfで問題があることを判明しました。
このソースをよく見ると、配列mngfileの定義数を超えたメモリー領域のデータ改ざんのあったので、
これで問題判明です。

知ってる人は知っているSQLPLUSの小技

1、put_lineの空白問題
set serveroutput on
exec dbms_output.put_line('   abc');
頭の空白を表示したいなら「format wrapped」オプションを使えばOK
set serveroutput on format wrapped
exec dbms_output.put_line('   abc');
2、空行エラー
このSQL文をコピーして実行してみてください。
select deptno, empno, ename
from emp

where empno = '7788';
すると、空行があるため下記のようにエラーになる
SQL> select deptno, empno, ename
  2  from emp
  3
SQL> where empno = '7788';
SP2-0734: unknown command beginning "where empn..." - rest of line ignored.
解決策として下記のコマンドを使う
SET SQLBLANKLINES ON
3、
こんな経験ないでしょうか?
SQL文を打ってる最中にカラム名が忘れて、
今まで打ったSQL文を消してカラム名を探す・・・
この場合「#」を利用すればOK
SQL> select
  2  #desc test
 Name                   Null?    Type
 ---------------------- -------- ------------
 ID                              NUMBER
 NAME                            VARCHAR2(30)

  2  name from test;

no rows selected
4、HTML出力
8iよりHTML出力が可能となった
set markup html on spool on
spool /tmp/test.html
select * from v$database;
spool off
5、前回SQL文の部分置換

SQL> select 'abc' from dual;

'AB
---
abc

SQL> c/'abc'/sysdate
  1* select sysdate from dual
SQL> /

SYSDATE
---------
25-MAY-10
6、前回SQL文の条件追加
SQL> select sysdate from dual;

SYSDATE
---------
25-MAY-10

SQL> a  where 1=2
  1* select sysdate from dual where 1=2
SQL> /

no rows selected
注意:コマンド「a」の後にスペース2個が必要です!!

Oracle 11g のアンインストール

[oracle@CentOS53 ~]$ /u01/oracle/app/product/11.2.0/dbhome_1/deinstall/deinstall
Checking for required files and bootstrapping ...
Please wait ...
Location of logs /tmp/deinstall2010-05-24_11-13-21-午前/logs/

############ ORACLE DEINSTALL & DECONFIG TOOL START ############


######################## CHECK OPERATION START ########################
インストールの構成確認の開始


Oracleホームの場所が存在するかどうかを確認しています /u01/oracle/app/product/11.2.0/dbhome                                                                             _1
選択された削除対象のOracleホームのタイプ: SIDB
選択された削除対象のOracleベース: /u01/oracle/app
中央インベントリの場所が存在するかどうかを確認しています /u01/oracle/oraInventory

インストールの構成確認の終了


ネットワーク構成チェック構成START

ネットワーク構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/logs/                                                                             netdc_check3056000027903696288.log

構成解除するすべての単一インスタンス・リスナーを指定してください[LISTENER1,LISTENER]:

ネットワーク構成チェック構成END

データベース・チェック構成START

データベース構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/logs/                                                                             databasedc_check2296607471997779796.log

値のリストを入力として指定する場合、セパレータとしてカンマを使用してください

このOracleホームで構成されているデータベース名のリストを指定してください [o11g2]:

###### データベース'o11g2' ######

単一インスタンス・データベース
データベースの診断先の場所: /u01/oracle/app/diag/rdbms/o11g2
データベースによって使用される記憶域タイプ: FS
データベース・ファイルの場所: /u01/oracle/app/oradata/o11g2,/u01/oracle/app/flash_recovery                                                                             _area/o11g2
フラッシュ・リカバリ領域の場所: /u01/oracle/app/flash_recovery_area/O11G2
データベースのspfileの場所: /u01/oracle/app/product/11.2.0/dbhome_1/dbs/spfileo11g2.ora

データベースo11g2の詳細は自動的に検出されました。o11g2データベースの詳細を変更しますか。 [                                                                             n]: y


###### データベース'o11g2' ######

このデータベース(1.単一インスタンス・データベース|2.Oracle Restart対応のデータベース)のタ                                                                              イプを指定してください [1]:
データベースの診断先の場所を指定してください [/u01/oracle/app/diag/rdbms/o11g2]:
データベースASM|FSによって使用される記憶域タイプを指定してください [FS]:

共有ファイルシステムにデータベース・ファイルが存在する場合、ディレクトリのリストを指定して                                                                             ください。'o11g2'サブディレクトリが見つかった場合、これが削除されます。見つからなかった場                                                                              合、指定したディレクトリが削除されます。また、フルパスを使用してデータベース・ファイルのリ                                                                             ストを指定できます [/u01/oracle/app/oradata/o11g2,/u01/oracle/app/flash_recovery_area/o11g                                                                             2]:

フラッシュ・リカバリ領域がファイルシステムで構成されている場合、これを指定してください。'o                                                                             11g2'サブディレクトリが見つかった場合、これが削除されます。 [/u01/oracle/app/flash_recover                                                                             y_area/O11G2]:

データベースのspfileの場所を指定してください [/u01/oracle/app/product/11.2.0/dbhome_1/dbs/                                                                             spfileo11g2.ora]:

データベース・チェック構成END

Enterprise Manager Configuration Assistant START

EMCA構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/logs/emcadc_c                                                                             heck.log

データベースo11g2の構成を確認しています
Enterprise Manager Configuration Assistant END
Oracle Configuration Manager check START
OCM check log file location : /tmp/deinstall2010-05-24_11-13-21-午前/logs//ocm_check9696.l                                                                             og
Oracle Configuration Manager check END

######################### CHECK OPERATION END #########################


####################### CHECK OPERATION SUMMARY #######################
選択された削除対象のOracleホーム: /u01/oracle/app/product/11.2.0/dbhome_1
Oracleホームが登録されているインベントリの場所: /u01/oracle/oraInventory
次の単一インスタンス・リスナーが構成解除されます: LISTENER1,LISTENER
次のデータベースが構成解除対象として選択されました: o11g2
一意のデータベース名: o11g2
使用済記憶域: FS
次のデータベースのEnterprise Managerの構成を更新しますか: o11g2
更新するEnterprise Manager ASMターゲットはありません
移行するEnterprise Managerのリスナー・ターゲットはありません
Checking the config status for CCR
Oracle Home exists with CCR directory, but CCR is not configured
CCR check is finished
続行しますか (y - はい、n - いいえ)[n]: y
このセッションのログは/tmp/deinstall2010-05-24_11-13-21-午前/logs/deinstall_deconfig2010-0                                                                             5-24_11-15-05-AM.outに書き込まれます
このセッションのすべてのエラー・メッセージは/tmp/deinstall2010-05-24_11-13-21-午前/logs/de                                                                             install_deconfig2010-05-24_11-15-05-AM.errに書き込まれます

######################## CLEAN OPERATION START ########################

Enterprise Manager Configuration Assistant START

EMCA構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/logs/emcadc_c                                                                             lean.log

データベースo11g2のEnterprise Manager Database Controlの構成の更新

Enterprise Manager ASMターゲットを更新しています(ある場合)
Enterprise Managerのリスナー・ターゲットを更新しています(ある場合)
Enterprise Manager Configuration Assistant END
データベース構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/
logs/databasedc_clean2778161591155929234.log
データベース・クリーンアップ構成START o11g2
この操作には数分かかります。
データベース・クリーンアップ構成END o11g2

ネットワーク構成クリーニング構成START

ネットワーク構成解除トレース・ファイルの場所: /tmp/deinstall2010-05-24_11-13-21-午前/
logs/netdc_clean2539645679609291858.log

単一インスタンス・リスナーの構成解除: LISTENER1,LISTENER

リスナーの構成解除: LISTENER1
    リスナーを停止しています: LISTENER1
    リスナーの停止に成功しました。
    リスナーを削除しています: LISTENER1
    リスナーは正常に削除されました。
リスナーは正常に構成解除されました。

リスナーの構成解除: LISTENER
    リスナーを停止しています: LISTENER
    警告: リスナーの停止に失敗しました。 リスナーが実行されていない可能性があります。
    リスナーを削除しています: LISTENER
    リスナーは正常に削除されました。
リスナーは正常に構成解除されました。

ネーミング・メソッド構成ファイルの構成解除中です...
ネーミング・メソッド構成ファイルが正常に構成解除されました。

ローカル・ネット・サービス名構成ファイルの構成解除中です...
ローカル・ネット・サービス名構成ファイルが正常に構成解除されました。

バックアップ・ファイルの構成解除中です...
バックアップ・ファイルが正常に構成解除されました。

ネットワーク構成が正常にクリーンアップされました。

ネットワーク構成クリーニング構成END

Oracle Configuration Manager clean START
OCM clean log file location : /tmp/deinstall2010-05-24_11-13-21-午前/logs/
/ocm_clean9696.log
Oracle Configuration Manager clean END
Oracle Universal Installerクリーンアップの開始

Oracleホーム'/u01/oracle/app/product/11.2.0/dbhome_1'をローカル・ノードの中央インベントリからデタッチします : 終了

ローカル・ノードのディレクトリ'/u01/oracle/app/product/11.2.0/dbhome_1'を削除します : 終了

ローカル・ノードのディレクトリ'/u01/oracle/oraInventory'を削除します : 終了

ローカル・ノード上でOracleベース・ディレクトリ'/u01/oracle/app'は削除されません。ディレクトリは空ではありません。

Oracle Universal Installerのクリーンアップが成功しました。

Oracle Universal Installerクリーンアップの終了


Oracleインストール・クリーンアップの開始

インストールのクリーンアップ操作により、ノードCentOS53の一時ディレクトリ/tmp/installを削除しています

Oracleインストール・クリーンアップの終了


######################### CLEAN OPERATION END #########################


####################### CLEAN OPERATION SUMMARY #######################
データベースo11g2のEnterprise Managerの構成を更新しました
次のデータベース・インスタンスが正常に構成解除されました: o11g2
次の単一インスタンス・リスナーが正常に構成解除されました: LISTENER1,LISTENER
Cleaning the config for CCR
As CCR is not configured, so skipping the cleaning of CCR configuration
CCR clean is finished
Oracleホーム'/u01/oracle/app/product/11.2.0/dbhome_1'がローカル・ノードの中央インベントリから正常にデタッチされました。
ローカル・ノードのディレクトリ'/u01/oracle/app/product/11.2.0/dbhome_1'が正常に削除されました。
ローカル・ノードのディレクトリ'/u01/oracle/oraInventory'が正常に削除されました。
Oracle Universal Installerのクリーンアップが成功しました。


セッション終了時にノード'CentOS53'でrootとして'rm -rf /etc/oraInst.loc'を実行します。

Oracleインストールにより、一時ディレクトリが正常にクリーンアップされました。
#######################################################################


############# ORACLE DEINSTALL & DECONFIG TOOL END #############