2013-08-18 24 views
7

私は、ARM9ベースのプラットフォームであるOlinuxinoの2.6.35カーネルの修正版で作業しています。私は電源管理ドライバ(アーキテクチャ固有の部分)を変更しようとしています。カーネルスペースからLinuxをシャットダウン(埋め込み)

プロセッサーは、Freescale i.MX23です。このプロセッサには、パワーマネジメントドライバによって処理される割り込みをトリガするPSWITCHと呼ばれる「特別な」ピンがあります。 スイッチを押すと、システムはスタンバイ状態になります。これはドライバーでpm_suspend(PM_SUSPEND_STANDBY)を呼び出して行います。

私のハードウェアの設定では、代わりにシステムをシャットダウンしたいと考えています。 私の質問は次の通りです:

カーネルスペースプロセスがクリーンシステムの停止/電源切断を引き起こすための好ましい方法は何ですか?

そこにはちょっとした機能があると思いますが、これまでのところ見つけられませんでした。

私のカーネルコード(私が作業しているファイルはarch/arm/mach-mx23/pm.cです)はgithub.com/spairal/linux-for-lobsterですが、私の質問には一般的なLinuxカーネルのアプローチが必要です。

+0

'init 0'で' strace'を実行して、実行されているsyscallを確認できます。 –

答えて

9

最も一般の方法は、ユーザ空間のヘルパーとしてshutdownを呼び出すためにあなたのドライバーのために次のようになります。

static const char * const shutdown_argv[] = 
    { "/sbin/shutdown", "-h", "-P", "now", NULL }; 

call_usermodehelper(shutdown_argv[0], shutdown_argv, NULL, UMH_NO_WAIT); 

(あなたがインストールさ/sbin/shutdownバイナリを持っていると仮定)。これにより、ユーザースペースがきれいにシャットダウンされ、ファイルシステムがアンマウントされ、カーネルのシャットダウンと電源切断が要求されます。

しかし、これよりも優れている可能性があります。たとえば、ディスクファイルシステムに読み取り/書き込みがマウントされていないことを保証できれば、kernel_power_off()関数を呼び出すようにカーネルスレッドに指示することができます割り込みコンテキストから)。

+0

それは美しく動作します。私はuserspaceを呼び出すことを含まない解決策があることを期待していましたが、多くのユーザスペースが必要です。ちょっとした詳細:shutdown_argvはconst char * const *または[]でなければなりません。 – pcarranzav

+0

@pcarranzav:ああはい、そのタイプミスを修正しました。ありがとうございました。 – caf

+0

私は組み込みのpowerpcでこれを実行するためにkernel_halt()を使用しましたが、init 0プロセスを経由しているようです。私は何かを逃したと思いますか? –

関連する問題