#include <nitro/spi.h>
u32 PM_GetLEDPattern( PMLEDPattern* patternBuf );
u32 PM_GetLEDPatternAsync( PMLEDStatus* patternBuf, PMCallback callback, void* arg );
| patternBuf | 取得するLEDパターンの値を格納するバッファ |
| callback | コマンドが終了したときに呼ばれるコールバック |
| arg | コールバックを呼ぶ際の引数 |
PM_RESULT_SUCCESS ならばコマンドの実行が成功した(同期関数の場合)か、コマンドをARM7に送信することに成功した(非同期関数の場合)ことを表します。
PM_RESULT_BUSY ならば、 SPI が他の処理に占有されており処理できなかったことを示します。
本体のLEDの状態を取得します。
patternBuf は PMLEDPattern 列挙型の値を格納するバッファで、NULLでないときにLEDの状態を示す値が入ります。以下のうちのいずれかとなります。
patternBuf に格納される値 |
LED の状態 |
|---|---|
PM_LED_PATTERN_ON |
点灯しています。 |
PM_LED_PATTERN_BLINK_LOW |
高速点滅しています。 |
PM_LED_PATTERN_BLINK_HIGH |
低速点滅しています。 |
PM_LED_PATTERN_BLINK1 |
1フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK2 |
2フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK3 |
3フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK4 |
4フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK5 |
5フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK6 |
8フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK8 |
8フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_BLINK10 |
10フレームごとに点灯と消灯を繰り返します。 |
PM_LED_PATTERN_PATTERN1 |
予め用意されたパターンで点滅しています。 |
PM_LED_PATTERN_PATTERN2 |
予め用意されたパターンで点滅しています。 |
PM_LED_PATTERN_PATTERN3 |
予め用意されたパターンで点滅しています。 |
( 「高速点滅」「低速点滅」はハードウェアで実装された点滅機能です。「高速」といっても実際は一定フレームごとに点灯と消灯を繰り返すソフトウェアによる点滅よりも遅くなります。)
この関数はARM7に該当動作を行うコマンドをPXIで送り、それを受け取ったARM7側がPMICを操作することで実行されます。従って関数を呼び出して即時に動作されるわけではありません。動作の終了まで待つ同期型の関数と、コマンドをARM7に送るだけの非同期型の関数が用意されていますので動作目的に合わせて使用してください。(関数名にAsync がついているものが非同期関数です。)
非同期関数を呼び出した場合、ARM7側での処理が終了したときに指定のコールバック
callback が呼び出されます。コールバックの型 PMCallback は
typedef void ( *PMCallback )( u32 result, void* arg );
で定義されます。このコールバックは PXI 割り込みハンドラの中から呼び出されます。
コールバックの引数は、第一引数 result がコマンドの結果を表します。これは
PM_RESULT_SUCCESS または PM_RESULT_ERROR となります。第二引数は arg を返します。
割込みハンドラからこの関数を使用することは可能です。割込みハンドラ以外の割込み禁止状態でこの関数を使用することは出来ません。
PM_RESULT_BUSY について
SPI はPM以外にも様々な処理で使用されています。そのようなときに本関数を呼び出すと、ARM7
までコマンドを送り、そこで BUSY という判定が行われ、処理は行われずに ARM9
へ PM_RESULT_BUSY が通知されます。また他の PM 処理を行っている最中に本関数を呼び出すと、ARM9 側でそれを判断し PM_RESULT_BUSY を返します。(この場合は ARM7 への通知を行う前に判断します。)
従って、確実に本関数を成功させようとすれば、次のように成功するまでループするようにしてください。(引数が間違っているというようなミスは考慮していません。)
(例)
while( PM_GetLEDPattern( ... ) != PM_RESULT_SUCCESS )
{
}
2009/06/03 PM_Init() についての記述を削除 (OS_Init() が必須となったため)
2008/12/05 割込み禁止状態での使用に関する注意を追記
2008/08/23 PM_RESULT_ERROR をやめて PM_RESULT_BUSY について言及
2005/07/07 返り値 PM_RESULT_ERRORについて言及した
2005/06/02 コールバックの呼び元を明記した
2004/08/26 初版