文章在描述時基於以下環境:
硬體平台: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...