2013-08-18 70 views
7

我正在爲Olinuxino(一個基於ARM9的平臺)2.6.35內核的修改版本工作。我試圖修改電源管理驅動程序(特定體系結構部分)。從內核空間關閉(嵌入)linux

該處理器是飛思卡爾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'並查看哪些系統調用被執行。 –

回答

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

這工作很好。我希望有一個解決方案不涉及調用用戶空間,但我想有很多用戶空間的東西需要完成......只是一個細節:shutdown_argv應該是const char * const *或[]。 – pcarranzav

+0

@pcarranzav:啊,是的,修正了這個錯字,謝謝。 – caf

+0

我已經使用kernel_halt()在我的嵌入式powerpc上執行此操作,並且它似乎經過了init 0進程。你覺得我錯過了什麼嗎? –