原理:在應用程式中直接把控制電源的埠置低。這個原理可以用在其他需要直接訪問物理記憶體的地方。
wince5.0
平台測試通過,其他平台沒驗證。
第一步:
這一步可以包含
s3c2440a_ioport.h
標頭檔案代替。
定義結構:
typedef struct s3c2440a_ioport_reg, *ps3c2440a_ioport_reg;
定義io
#define s3c2440a_base_reg_pa_ioport(0x56000000)//
實體地址
第二步:
虛擬位址與實體地址動態對映。
開始動態對映:
volatile s3c2440a_ioport_reg *v_piopregs;
v_piopregs = (volatile s3c2440a_ioport_reg *)virtualalloc(0, sizeof(s3c2440a_ioport_reg), mem_reserve, page_noaccess);
virtualcopy((pvoid)v_piopregs, (pvoid)(s3c2440a_base_reg_pa_ioport >> 8), sizeof(s3c2440a_ioport_reg), page_physical|page_readwrite|page_nocache ); 使用
virtualalloc
,virtualcopy
兩個函式,需要包含下面兩個標頭檔案:
#include
#include
"pkfuncs.h"
第三步:控制
io關機
做完上面的工作後,
v_piopregs
指標已經對映到埠的實體地址上了。直接控制其關閉系統電源。注:
gpg11
埠控制系統總電源。
v_piopregs->gpgdat &= ~(0x1<<11);
gpg11
是硬體平台電源控制埠。後來我把這個功能放在
setsystempowerstate( null, power_state_off, power_force )
函式中實現了,這樣操作起來穩定安全。改天再寫個
blog
說明setsystempowerstate( null, power_state_off, power_force )
實現關機的方法,謝謝關注……
wince 記憶體對映
gpio暫存器的讀寫方法。不過我看了還是很多疑惑,為什麼在記憶體對映表裡面這樣定義 dcd 0x91600000,0x56000000,1 i o port register 而在s2410.h中又會這樣 define iop base 0xb1600000 0x56000000 明明定義了是0x9...
傳遞動態記憶體
當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...
傳遞動態記憶體
當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c c 程式設計,你必須靜下心來好好苦一番。現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人...