WinCE驅動開發問題精華集錦-1
摘自:
http://hi.baidu.com/mcu%5Fspaces/blog/item/12662a088108f9d563d9867b.html近日越來越發現知識的匱乏,所以需要好好努力才可以.
加油,加油!
精華集錦1__內容如下
1、在應用程序中,如何向修改本機的ip 地址等網絡參數,并使之立即生效? 網絡設置保存在注冊表中,位置[HKEY_LOCAL_MACHINE\Comm\網卡名稱\Parms\TcpIp],例如常見的CS8900網卡設置:
[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms\TcpIp]
"EnableDHCP"=dword:0
"DefaultGateway"="192.168.0.1"
"DNS"="111.111.111.111"
"UseZeroBroadcast"=dword:0
"IpAddress"="192.168.0.2"
"Subnetmask"="255.255.255.0"
設置之后要生效有兩種辦法:一種熱啟動,調用KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL),熱啟動時間很短暫;另外一種調用DevieceIoControl API,傳遞IOCTL=IOCTL_NDIS_REBIND_ADAPTER。
2、如何向控制面板中那樣,修改系統聲音的音量
調用API waveOutSetVolume(HWAVEOUT, dwVolume ),一般參數1為0。在[HKEY_CURRENT_USER\ControlPanel\Volume]下是系統聲音的注冊表設置。
3、在應用程序中如何實現jpg、gif圖片的顯示 有幾種辦法:
1)、在MSDN中搜索標題為“Windows CE .NET Technical Frequently Asked Questions”的文檔,其中有一個問題“How can I display JPEG, GIF, and other graphics files?”,下面就是答案。
2)、如果安裝了Windows CE 5.0,一個例子源碼位于WINCE500\PUBLIC\GDIEX\SDK\SAMPLES\SIMPLE。
3)、用IWebBrowser組件實現。
4、 在應用程序中如何實現系統待機
void GwesPowerOffSystem(void);
5、 在WINCE中如何得到網卡MAC地址 事實證明,獲得物理網卡的MAC地址并沒有被統一成一個API或者IOCTL,如果網卡驅動程序沒有提供接口的話只能直接訪問寄存器獲得。讀者可以參考目錄WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETCARD里的一些驅動源碼。
6、Windows XP Embedded 和Windows CE有何區別
簡單地說Windows XP Embedded采用Windows XP內核,只能運行在x86處理器上,優點是能夠運行PC上現有的應用軟件,缺點是授權費太高,標價¥900元;Windows CE采用Windows CE內核,能夠運行在多種處理器上,如x86、ARM、SHX、MIPS等,優點是授權費低,最低Core版標價¥30元。缺點是需要單獨開發應用軟件、定制內核,甚至開發BSP、Driver。
7、 wince下只是把調制解調器的驅動掛接在了com1,如何將器驅動掛接在com2上? 1)、在HLM\drivers\buildin\com2\unimodem下復制和com1一樣的數據
2)、在HLM\ExtModems\HayesCompat下改寫Port為COM2:,再改寫FriendlyName為"Hayes Compatible 在 COM2:"。
8、如何定制自己的外殼 1)、先開發一個外殼軟件,假設名稱為MyShell.exe
2)、刪除注冊表[HKEY_LOCAL_MACHINE\init]下如下一行:
"Launch50"="explorer.exe"
3)、在注冊表[HKEY_LOCAL_MACHINE\init]下添加如下一行:
"Launch50"="MyShell.exe"
上述的“LaunchXX”中的XX為序列數,內核依據這個序列數按由小到大的順序來分別執行所有子鍵列出的應用程序,具體數值應該為多少請參考幫助文檔的說明。
如果原來的內核中添加了標準外殼(standard shell)組件,或者添加了其它組件而這些組件需要依賴標準外殼,那么在PB中是無法刪除標準外殼組件的,解決辦法一是保留explorer.exe在內核中,二是刪除依賴標準外殼的組件。
9、我原來的工程是x86版本的,編譯選項只有x86,我如何能夠編譯ARM版本的 兩種辦法:
1)、用EVC新建一個工程的時候,建議復選“CPUs”列表,這樣發生了這種事情也能夠輕易通過選擇“WCE Configuration”工具欄中的CPU列表來編譯不同CPU版本的軟件
2)、如果打開工程后CPU列表中只有x86,而此時已經安裝了ARM版本的SDK,那么單擊EVC菜單“build”-“configurations”,然后單擊“add”按鈕來添加CPU。
10、通常情況下WINCE采用串口1作為調試時輸出信息用途,要正式出產品前如何去掉串口1的調試功能,正常情況下串口1只有在編譯debug版本的內核時才在BootLoader中初始化串口1用于輸出信息,而編譯release版本會跳過此代碼。而有些BSP設計成沒有宏定義,也就是說無論什么版本都會在BootLoader中初始化串口1,這樣造成WINCE啟動后串口1無法被應用程序使用。對于這種情況只能在BootLoader源碼中刪除初始化代碼,如OEMInitDebugSerial。
11、基于wince的應用程序能建成console project么? 不能
12、ARM系統外擴一片512K RAM,驅動程序經過映射可以使用這一段RAM。1、應用系統如何使用這一段RAM?要加一層驅動嗎?2、如果要將這一段RAM當作RAM盤存儲系統,該如何作呢?應該要加文件系統吧,如何加呢? 解答這個問題前,先要說一下WINCE的地址映射機制。對于包含MMU(存儲器管理單元)的處理器來說,如ARM和x86,WINCE要求OEM在定制內核的時候填寫一個虛擬地址與物理地址映射關系的表,稱為OEMAddressTable,在這個表中定義了所有物理設備的起始物理地址,對應的起始虛擬地址,地址空間大小,RAM就包括在其中(如果是x86平臺還要求RAM起始虛擬地址從0x80000000開始)。如果有多片RAM,應該在OEMAddressTable中將它們定義在一起,使之地址連續。對于非OEM的開發者來說,他們拿到的是定制好的內核,不能做任何修改,如果在產品中外擴一片RAM,只能通過API函數通知操作系統增加一條虛擬地址與物理地址映射關系表項。相關API函數有兩個,分別是CreateStaticMapping和VirtualCopy。它們的相同之處是都用于建立物理地址和虛擬地址的映射關系。它們的不同之處是CreateStaticMapping映射的虛擬地址范圍在0xC400 0000 到 0xE000 0000之間,這個范圍只能由內核訪問,一般用于ISR訪問,因為ISR只能訪問靜態映射的虛擬地址空間,不能用VirtualCopy。VirtualCopy通常和VirtualAlloc配合使用,映射的虛擬地址空間在0x8000 0000以下,一般用于驅動程序和應用程序訪問。
1)、應用程序要訪問這片RAM,和驅動程序訪問方法一樣,調用VirtualAlloc和VirtualCopy。
2)、可以做一個流驅動程序專門用于讀寫這片RAM,這樣所有應用程序就可以通過調用流驅動接口函數來訪問,非要加文件系統也是可行的,通過修改注冊表就可以做到,但是麻煩一些。
13、我怎么能在PB左邊的定制平臺加進我的驅動呢? 兩種辦法:
1)、在platform.bib或者project.bib的MODULES部分添加一條語句,例如:
MyDriver.dll C:\Driver\MyDriver.dll NK SH
這樣編譯內核的時候就會把你的驅動DLL文件添加到內核中,如果有注冊表需要設置,在platform.reg或者project.reg中添加注冊表內容。
2)、通過制作.cec文件來添加驅動,制作.cec文件的優點是只需制作一次,以后就可以通過將.cec文件導入到PB的Catalog中,象PB自帶的feature一樣通過菜單“Add to OS Design”添加到左邊的內核工程中。
14、 WINCE有沒有相對路徑概念?如果沒有如何得到當前模塊的路徑?
1) 、WINCE沒有相對路徑概念,只有絕對路徑,所以凡是涉及到路徑均為絕對路徑。
2)、調用API GetModuleFileName,傳遞一個模塊的實例句柄就能夠得到模塊的絕對路徑。
15、 怎樣讓 POCKET WORD打開*.dat格式(里面都是數據)的文件? 兩種辦法:
1)、調用API ShellExecuteEx,在結構體SHELLEXECUTEINFO中添加.dat文件的路徑。
2)、調用API CreateProcess,在第二個參數中設置.dat文件的路徑。
16、 x86 Rom Boot Loader真的可以實現嗎?它確實能代替BIOS啟動計算機? Rom Boot 被設計存放在Flash/EEPROM中,也就是原來BIOS的位置,這樣當上電后CPU到固定地址執行代碼,也就是執行了Rom Boot的代碼,它對整個硬件系統進行初始化和檢測,并且支持通過網卡從遠程機器上下載nk.bin或者從本地IDE/ATA 硬盤的活動分區中尋找nk.bin文件加載。Rom Boot的優點就是引導并且加載速度快,而且它自身完成了所有的操作,這樣就不用BIOS、MSDOS,更不用Loadcepc了。
17、 對于x86 Rom Boot Loader,如何Build得到Romboot.rom? 1)、在PB中打開一個內核工程(x86的)
2)、單擊PB菜單“Build”-“Open Build Release Directory”
30 、用cd命令進入 %_WINCEROOT%\Platform\Geode\Romboot 4、build
18、如何設置、更改顯示分辨率
能否設置、更改顯示分辨率由顯示驅動程序決定,而沒有統一的標準。例如CEPC,在啟動的時候可以通過設置loadcepc.exe的參數 /L來決定WINCE啟動后的顯示分辨率,這是由于顯示驅動“VGA Linear Framebuffer”支持,而Geode可以通過在定制內核時修改注冊表項來決定WINCE啟動后的顯示分辨率。
19、 幾個硬件使用同一個IRQ,那么發生中斷的時候系統怎么判斷到底是哪一個硬件發生的中斷呢?ISR里面又應該怎么控制呢? Windows CE支持多個設備中斷共享一個IRQ,當一個共享IRQ發生時,CE內核的異常處理程序檢測設備特定的寄存器,因為大多數設備都有一個單獨的寄存器用于表示設備的活動狀態,所以通過遍歷共享這個IRQ的所有設備的寄存器就可以判斷哪個設備發生中斷。nk.exe加載一個giisr.dll,這個.dll是微軟提供的,它其實是第一個可安裝ISR。默認CE內核就是調用這個dll來檢測寄存器狀態的,當然OEM可以編寫自己的.dll。
CE內部有一個ISR鏈,也就是可安裝ISR。因為CE允許OEM添加自己的ISR處理程序,所以ISR被設計成一個鏈表。排在前面的ISR比后面的ISR優先處理中斷,如果當前ISR能夠處理當前中斷,那就返回中斷ID由IST處理或者返回SYSINTR_NOP,如果當前ISR不能夠處理當前中斷,那就返回SYSINTR_CHAIN讓下一個ISR處理。
20、請問在wince中如何在內核中增加一個與\windows同級的目錄? 在platform.dat或者project.dat中添加語句。例如要創建根目錄下子目錄Program Files,語句如下:
root:-Directory("Program Files")
posted on 2009-07-16 15:34
Sandy 閱讀(526)
評論(0) 編輯 收藏 引用 所屬分類:
Windows Mobile