嵌入式Linux實現關機斷電

2021-06-19 19:08:57 字數 2568 閱讀 9579

文章在描述時基於以下環境:

硬體平台:micro 2440;

軟體:linux 2.6.32;

在執行linux

系統的pc

上,我們可以使用

poweroff/halt

等命令進行關機,但是在嵌入式

linux

系統上想要通過執行這些命令,實現關機操作,就需要軟硬體相互配合才能達成。

首先,硬體在設計時需要有電源管理模組,能接收來自主晶元的訊號並切斷整個系統的電源,在具體的實現中,可以使用

gpio

來給電源管理模組送出訊號。為什麼要用

gpio

呢?有沒有其它的方法?答案是:有!但是,使用

gpio

最簡單。如下圖所示:

在需要關機時,在合適的時間點由主晶元通過

gpio

送出訊號給電源管理模組,電源管理模組在接收到關機訊號後,將整個系統的電源切斷即可,在具體的實現中,「電源管理模組」可以是純粹的硬體電路,也可以是乙個微控制器,如

8051

微控制器等。

那麼怎麼來確定這個合適的「時間點」呢?這個就是軟體的任務了,在軟體方面,需要修改

poweroff & halt這兩個系統呼叫的具體實現,說白了也很簡單,在

poweroff/halt系統呼叫執行完的時刻就是我們需要的「時間點」,所以我們要做的就是在系統呼叫的最後新增控制

gpio的**。

下面貼出**簡略的說明一下,

poweroff/halt這兩個系統呼叫最終會落在

kernel2.6.x/kernel/sys.c檔案的函式

syscall_define4(...)中,如下

:360 syscall_define4(reboot,

int, magic1,

int, magic2, unsigned int

, cmd,

361 void __user *

, arg)

362 

415     buffer[sizeof(buffer)

- 1]='

\0';

416 

417     kernel_restart(buffer)

;418     break;

419 

420 #ifdef config_kexec

421 case linux_reboot_cmd_kexec:

422 

ret = kernel_kexec();

423 

break;

424 #endif

425 

426 #ifdef config_hibernation

427 case linux_reboot_cmd_sw_suspend:

428 

ret = hibernate();

429 

break;

430 #endif

431 

432 default:

433 ret =

-einval;

434 break;

435 }

436 unlock_kernel();

437 return ret;

438 }

在這個函式中有乙個

switch(cmd)

語句,poweroff/halt

系統呼叫最終會執行到 

linux_reboot_cmd_halt

這個分支,如

398-402

行所示,在這個

case

分支中,明眼人很快就會發現

kernel_halt()

這個函式是核心。

kernel_halt()

的實現在同乙個檔案中:

321 /**

322 * kernel_halt - halt the system

323 *

324 * shutdown everything and perform a clean system halt.

325 *

/326 void kernel_halt(void)

327 

328行,為核心關閉做準備並關閉裝置。

329行,關閉系統裝置。

330行,系統已經掛起,此時列印「

system halted.」

通知使用者。

331行,machine_halt()

,machine

級別的掛其,讓我們看看其實現,在

arch/arm/kernel/process.c中:

193 void machine_halt(void)

194 

看到了吧,這個函式並沒有真正的實現,而我們前面說到的「時間點」,就是**執行到這裡的時刻,所以,我們只要在這個函式中控制

gpio

即可配合硬體實現關機操作。

#include

void kernel_halt(void)

Tinyxml的嵌入式Linux實現

這兩天專案需要在嵌入式linux系統上實現tinyxml解析簡單的xml檔案,於是在網上查詢並收集了一點資料,現在補充完善!版本 tinyxml 2 6 2.zip 首先修改 makefile檔案 1 將 cxx g 改為 cxx arm linux g cc arm linux gcc ld ar...

嵌入式linux實現vnc功能

現在有乙個想法準備在嵌入式裝置和pc之間通過網路實現一種類似遠端桌面的功能,在pc端可以看到嵌入式裝置顯示的內容,並且可以使用滑鼠和鍵盤操作嵌入式裝置的程式。檢視了網路上的一些資料後,準備使用vnc功能來實現,在嵌入式裝置端啟動vncserver,在pc端啟動vncclient,建立連線後能實現需要...

嵌入式 linux 編譯

第二次換了編譯環境編譯時又提示 make 3 drivers video console vgacon.o 錯誤 1 在網上搜尋結果 根據資訊的大概意思是關於vga的支援問題,在這裡我直接把關於vga的配置選項去掉不選,即 在執行 make menuconfig 配置時 不選vga 驅動。devic...