該評測板可用于評測SAM9G45的雙外部總線架構的性能優勢。它帶有兩個獨立的128 MB的第二代雙倍數據速率DRAM (DDR2)存儲器組,每個存儲器組連接一個外部總線接口。板上閃存包括2 GB的NAND閃存和32 Mb (2Mb x 16)的閃存,可用于存儲應用數據,或在系統啟動時存儲已上載到DDR2存儲器中的固件信息。
板上外設則包括一個高速(HS) USB主/設備端口、第二個HS USB主端口、一個以太網10/100接口、兩個高速SDCard/SDIO/MMC插槽、一個帶電阻式觸摸屏和背光照明功能的24位彩色WQVGA LCD TFT顯示器、復合視頻輸出、相機接口以及一個備份電池。
SAM9G45評測板具有雙啟動功能,支持Linux? 和 Microsoft? Windows?CE,并帶有預先編程的演示程序,展示在Linux 和 WinCE系統下的基本編程功能。愛特梅爾并為這兩種操作系統提供免費的完整的板級支持包(BSP)。
Linux支持
愛特梅爾在其AT91SAM Linux門戶網站www.linux4sam.org上免費提供Linux v2.6.27操作系統,這個Linux軟件包備有完整的Linux v2.6.27內核、用于AT91SAM9G45評測工具包的Linux補丁、設備驅動程序、預建演示程序和基于開放嵌入式(Open Embedded)構建環境的?ngstrom 工具。AT91SAM Linux入門網站是面向廣泛且不斷擴大之社群的網關,為愛特梅爾全部基于ARM9?的嵌入式32位微處理器系列提供Linux自我支持。
Windows CE支持
支持Windows嵌入式BSP的AT91SAM9G45工具包功能齊全,為工程師提供了在愛特梅爾基于ARM9之產品中部署微軟嵌入式技術所需的一切工具。該產品可從網站下載。此外還有廣泛的文檔提供,包括一個使用就緒(ready-to-run)的演示程序,用于解釋如何使用和定制BSP源代碼以及如何基于Windows BSP進行應用構建。
世界范圍的廣泛第三方生態系統
領先的第三方嵌入式軟件供應商可以提供大量中間件、開發工具和RTOS,支持SAM9G45作為愛特梅爾AT91SAM微控制器世界范圍生態系統的一部分,這些公司包括:
Mentor Graphics 公司
Mentor Graphics公司嵌入式系統部門總經理Glenn Perry表示:“我們與愛特梅爾建立了長期穩固的合作關系,客戶能夠使用我們的Nucleus RTOS 和 Nucleus Graphics用戶界面,來實現最佳的性能。通過采用SAM9G45電路板和Mentor Graphics開發工具及軟件IP,嵌入式開發人員無需通過硬件加速,便可以在最短時間內為其設備創建先進的2D和3D圖形用戶界面。”
Micrium公司
Micrium 公司副總裁Christian Legare表示:“SAM9G45是第一款帶有真正的EHCI兼容USB高速控制器的嵌入式微處理器。為了實現軟件可移植性,英特爾針對高速USB主控制器硬件的實現方案,定義了寄存器級接口和存儲器數據結構的EHCI標準。我們的高速USB控制器驅動程序和USB堆棧也有一個類似的嵌入式硬件,能夠以PC級速度運行。Micrium的中間件和功能強大的基于ARM9處理器非常適合那些尋求占用較少資源的實時操作系統(RTOS),而不需要大容量存儲器和高性能操作系統的替代方案的客戶!
QNX公司
QNX軟件系統公司業務聯盟經理Kroy Chang-Zeviar 表示:“在QNX開發者社群門戶網站Foundry27.com上,QNX專為愛特梅爾基于ARM 9之處理器而開發的板級支持包已成為最受歡迎的下載產品之一。愛特梅爾的SAM9G45-EK整合了硬實時性能、2D/3D加速圖形、Flash Lite HMI和QNX? Neutrino?操作系統的超級可靠性等優勢,可為自動化系統、HVAC控制、媒體設備及其它任務關鍵性應用的原型構建與設計提供理想的快捷方式。”
Fluffy Spider Technologies公司
Fluffy Spider Technologies公司首席執行官Robi Karp評論道:“愛特梅爾的SAM9G45 eMPU為智能設備制造商和應用開發商提供了一個功能豐富的高成本效益平臺。通過支持SAM9G45,我們的FancyPants多媒體和圖形引擎可幫助OEM廠商實現硅片增值,并利用專業的、引人注目的富媒體(media-rich)用戶界面實現產品的差異化!
Timesys 公司
Timesys公司業務發展副總裁Charlie Ashton表示:“我們的軟件開發框架LinuxLink一直廣為利用愛特梅爾處理器設計基于Linux的嵌入式產品的客戶所采納。我們針對最新推出的AT91SAM9G45處理器和參考板而開發的LinuxLink訂閱服務,可提供預先匯編的起始點,助力愛特梅爾客戶快速啟動Linux產品開發。這項訂閱服務是通過Linux內核和根文件系統而定制化,幫助客戶在其產品中采用Linux,然后進行最終的系統集成。有了LinuxLink,SAM9G45客戶能夠以更低的開發成本更快地將產品推向市場。此外,Timesys在客戶開發的每個階段均提供專業工程技術支持!
Adeneo Embedded公司
Adeneo Embedded 公司首席執行官Yannick Chammings表示:“Adeneo Embedded為OEM廠商提供Windows Embedded CE的培訓、系統開發支持和BSP維護,使他們基于SAM9G45之設計能繼續保持優勢。Adeneo Embedded和愛特梅爾正聯手在美國和歐洲進行針對AT91SAM9 系列的Windows Embedded CE培訓。這個為期一周的培訓基于標準微軟課程,將幫助參與人員掌握帶有Windows Embedded BSP的AT91SAM9評測工具包的使用方法,以及定制和開發應用的專業能力。”
]]>“VeriChip”的芯片假如能獲得更大的軟件支持 , 提供更多“以人為本”的也許 , 即使基于“人體芯片”爭吵的暴風眼 , 或許也不致“幾年游說 , 僅2000人植入”的結果 。 “芯片的性能除了取決于芯片本身 , 也取決于軟件對它的支持 。 ” 飛思卡爾的開源研發經理楊欣欣說 。
拋開人體載體這一敏感話題 , IC嵌入式軟件開發如今已經應用到許多領域中 , 包含航空航天事業中的載人飛船;銀行中的一些服務設備;汽車中的車載信息娛樂系統或是家庭家電設備等 。 這意味著客戶對于IC嵌入式軟件開發的復雜性要求日益提高 , IC嵌入式軟件開發工程師扮演著越來越重要的角色 。
入職專業匹配度要高 軟性技能需團隊意識強
米萊iT科技網
大多企業將應聘標準設定在電腦/電子通信/自動控制專業本科以上學歷 , 部分民營/私營稍有降低標準 , 為?茖W歷 。 依據公司開發項目的需求IC嵌入軟件開發工程師還需要精通UcOS、VxWorks、WinCE、Linux等通用產品其中一項或多項開發平臺 。 鑒于Linux源代碼的開放化 , 使開發者能依據自己的需要進行裁剪 , 受到了開發者和企業的青睞 。 “精通Linux嵌入式操做系統”會是非常好的面試敲門磚 , “打擊面”廣 , 卻過于大眾化 。
對于工做經驗的要求 , 19%的企業要求至少一年相關工做經驗 , 42%的企業要求擁有三年及以上 , 尤其是在金融風險還未徹底消退的形勢下 , 企業招聘仍堅持保守政策 , 尤其是高端稀缺型人才 , 只有3%的企業愿意將機會留給應屆畢業生(以上是以2009年12月4日51job關鍵字“嵌入式軟件開發工程師”的統計結果) 。
在這些嵌入式操做系統中封裝了越來越多的功能 , 除了對任務的切換、調度、通信、同步、互斥、中斷管理、時鐘管理等 , 還可進一步封裝內存管理、網絡通訊協議、文件管理等功能 , 這些功能可以依據需要進行裁減 。 面對大量高技術難度的工做內容 , 幾乎所有的企業都要求應聘者具有高責任心和高團隊合做意識的軟性技能 。 除此之外 , 對于不善言辭的IT 男 , “善于溝通”這個技能可以獲得面試附加分 。
需求穩步攀升中放量 薪資一線城市待遇豐厚 www.mylove21.cn
據前程無憂數據庫顯示 , 嵌入式軟件開發人才的需求量由6月份上升23個點 , 達759個每日網上職位發表數 , 8月與11月成為該行業的兩個增長最為迅速的節點 。 VDC統計顯示嵌入式軟件的應用部分最大的兩個市場是消費類和電信/數據應用 , 兩者的營業額相加占有將近半壁江山 。 時值年關將近 , 嵌入式軟件開發人才可有針對性的尋覓新東家 , 為自己的職業發展生涯放手一搏 。
薪資方面 , 依據前程無憂薪酬數據顯示 , 中國北京的本行業平均年薪超過中國深圳和中國上海等沿海城市 , 中國上海稍有落后 , 但都逼近了9萬年薪的水平 , 中國深圳的行業平均年薪超過8萬 。 二線城市的薪資則被“腰斬” , 一般維持在4.3―4.8萬的水平 , 但隨著不少國際頂尖半導體公司選擇入住二線城市的技術開發區 , 我們有理由相信 , 二線城市薪資發展擁有較大的上升空間 。
]]>
在這里我假設你的PC上面什么工具都沒有,也沒錢買。那么你就去微軟的網站上面注冊,然后就可以下載WinCE6.0和VS2005的評估版了,下載后安裝,然后將你的WinCE6.0升級到WinCE6.0 R2,具體步驟參見我以前的Blog:如何安裝WinCE6.0。最后還要從微軟的網站上下載ActiveSync并安裝。
現在,我認為你已經完成了WinCE6.0 R2的安裝,你就可以打開VS2005創建一個WinCE的工程,在選擇BSP的時候請選擇”Device Emulator: ARMV4I”,在選擇模板的時候請選擇”PDA Device”,然后選擇”Mobile Handled”,完成后默認是Debug模式,切換成Release模式然后編譯,編譯成功以后,需要配置模擬器并最終將編譯好的WinCE下載到模擬器中運行,具體步驟參見我以前的Blog:WinCE Emulator使用介紹。
首先介紹模擬器上WinCE的配置:
1. 當WinCE在模擬器中運行以后,選擇Start->Settings->Control Panel,如圖:
2. 在彈出的控制面板對話框中選擇Network and Dail-up Connections,然后雙擊Make New Connection,在連接類型中選擇Direct Connection,如圖:
3. 選擇Next,然后選擇Serial Over DMA,如圖:
4. 最后選擇Finish就創建了一個新的連接。創建完成后,重新回到控制面板界面選擇PC Connection,在彈出界面中選擇Change,然后選擇剛剛添加的My Connection,如圖:
5. 完成后點擊OK按鈕,然后關閉控制面板,現在模擬器設備已經配置好了。
下面介紹ActiveSync的配置:
1. 安裝ActiveSync并運行,在菜單中選擇File,然后選擇Connect Settings,按照下圖進行設置:
2. 設置完成后選擇OK,在VS2005環境中選擇Tools,然后選擇Device Emulator Manager,會彈出一個應用界面,點擊界面上的refresh按鈕刷新,如圖:
3. 選擇當前的仿真設備,并又擊選擇Cradle,此時會看到ActiveSync進行連接,如圖:
在連接成功以后,就可以在ActiveSync中訪問模擬器上運行的WinCE中的文件了,此時基于模擬器的應用調試環境已經基本建立起來。
下面創建個應用程序調試一下:
1. 首先要做的就是基于先前創建的WinCE工程,導出SDK,具體步驟不介紹了,在導出SDK并安裝以后,就可以基于導出的SDK來創建一個應用程序。重新打開一個VS2005,然后新建一個項目,具體如圖:
2. 輸入名稱以后,就Next,在選擇平臺SDK的時候,可以只選擇自己訂制的WinCE的SDK,這里我訂制的WinCE的SDK叫EmulatorSDK,如圖:
3. 然后選擇Next,可以選擇單文檔,多文檔,基于對話框,你隨便吧,最后點完成。下面就和以前在PC上面編寫VC程序一樣了,簡單點,添加個按鈕,然后彈出一個MessageBox來,在完成以后,就可以編譯并調試了,按F5就可以。如果程序編譯沒有錯誤,就會被下載到模擬器上面運行,這個過程需要等一會,然后你就會在你的模擬器上面看到你剛剛編寫的應用程序了,如圖:
如果你的應用程序是Debug模式,那你可以在你的應用程序中設置斷點,程序執行到后會停下來,然后可以單步跟蹤,都沒有問題。
不知道前面說明白了沒有,總之,只要安裝了VS2005和WinCE6.0 R2之后就可以完全在PC上的模擬器上面調試WinCE內核和應用程序,可以自己定制內核,導出自己的SDK,并用自己的SDK來編應用程序和調試
]]>以下內容含腳本,或可能導致頁面不正常的代碼 |
---|
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行. |
硬件配置如下:
1,CPU:三星S3C6410處理器,ARM1176JZF-S內核,667MHz系統頻率穩定工作;
2,Flash Memory:256MB Nand Flash,可定制128M-2G容量;
3,SDRAM:128M Bytes mDDR內存,運行速133MHz,可以升級到256M Bytes DDR內存;
4,時鐘晶振:12MHz系統外部時鐘源;32.768KHz的RTC時鐘源;27MHz的TV Encoder時鐘源;48MHz的USB OTG時鐘源;
5,核心板接口:采用320針1.27間距,板子尺寸約68mm×42mm;
6,電源:采用獨立1.2V和3.3V電源芯片提供核心板各路電源。
7,Norflash:1M Bytes NorFlash,采用29LV800DB芯片,可以用來啟動系統,支持USB下載;
8,8位撥碼開關,用來配置系統啟動方式;
9,4路UART接口:可通過2個8位撥碼開關選擇輸出TTL電平或RS-232電平;
10,紅外接口,支持IrDA1.1協議,可以無線地向支持IrDA的設備無線連接來實現信息資源的共享;
11,CF卡接口,支持CF3.0規格CF卡;
12,IDE接口,支持掛接硬盤;
13,USB HOST,支持USB1.1協議;
14,USB OTG,支持USB 2.0協議;
15,JTAG接口,標準20 pin JTAG接口;
16,9個用戶按鍵,功能上、下、左、右、確定、取消和返回等(用戶也可自定義其功能);
17,復位按鍵,采用專用的復位芯片;
18,指示燈:4個用戶LED指示燈; 2個電源指示燈;
19,SD/MMC接口:兩個高速SD/MMC接口,其中一個可支持8位模式?梢詫崿FSD Memory功能和SDIO功能;作為SD Memory最大可以支持8GB容量;
20,攝像頭接口:支持ITU-R BT 601/656 8位模式,可以和我公司130萬像素攝像頭連接使用;
21,LCD接口:一個50針LCD、觸摸屏插針接口,方便連接我公司各種類型的LCD模塊相連接;
22,AC97音頻接口:包括一路音頻輸出、一路音頻輸入和一路麥克風輸入;板上帶有兩個1W喇叭;
23,10/100Mbps以太網接口:采用集成隔離變壓器的RJ45接口;
24,視頻輸出接口:一路TV Out接口、一路S-Video接口;
25,2路高速SPI接口;
26,1路I2C接口;
27,擴展接口,引出數據、部分地址總線,部分控制總線、I/O信號線、AD信號線。
The Windows CE NDIS implementation does not support direct memory access (DMA). Do not use the NdisSetupDmaTransfer, NdisCompleteDmaTransfer, NdisMRegisterDmaChannel, NdisMDeregisterDmaChannel, NdisMAllocateMapRegisters, NdisMFreeMapRegisters, NdisMReadDmaCounter, and NdisGetSharedDataAlignment functions.
Use the NdisMAllocateSharedMemory and NdisMFreeSharedMemory functions for PCI bus master DMA transfers.
具體如何實現DMA呢?
在microsoft windows CE device driver kit中有一節是:Implementing DMA for NDIS Miniport Drivers
專門提到了這個問題,當前ce還沒有自己的DMA機制,然而開發人員可以在他們自己的小端口卡驅動程序中實現相同的功能,但是寫的太簡單了
Implementing DMA for NDIS Miniport Drivers
DMA is important for efficient networking because it enables the layers in
the networking architecture to share data without first copying that data
two categories of DMA: slave DMA and busmaster DMAB
Slave DMA
Slave DMA is appropriate for OEMs because it requires a block of memory that
is pre-allocated in the device memory map of the Windows CE–based platform.
Miniport drivers can map that block of physical memory to the driver’virtual
memory space, and then use the VirtualAlloc and VirtualCopy functions to move
data in and out of that space
busmaster DMA
To receive data, the driver allocates a shared memory block, transfers the
data to buffers within that block, and uses NDIS functions to indicate that a
packet has arrived. To send data, the driver uses the LockPages and
UnlockPages functions to map the virtual memory to device memory, informs the
NIC of the addresses of the data, and instructs the NIC to send the data.
This method can be faster for larger data block sizes.
后來發MAIL給一位曾經遇到此問題的朋友,回復如下:
事實上在使用DMA是的關鍵是得到一個連續的物理地址空間,然后將該空間的物理地址放入DMA控制器的源地址或者目的地址寄存器中(根據你使用DMA的方向決定);
然后等待DMA中斷;
由于DMA使用的是物理地址但是在wince中只能使用虛擬地址,所以在DMA中斷產生之后如需分析數據請使用虛擬地址;
特別提示參考一下的文章:
DMA的使用
1、 芯片DMA的使用要點:
AK3224芯片的DMA使用中,RAM的地址作為DMA傳輸的目標地址、源地址,必須要4字節對齊。而且DMA的操作長度以內的RAM地址,必須連續。
不過在使用中發現:Nandflash驅動中RAM地址作為目標地址時,只需要2字節對齊。RAM地址作為源地址可不需對齊。(其他情況需要逐一驗證)
2、 wince中的DMA使用:
根據DMA一次操作的RAM地址必須連續的特性,在驅動DMA使用時,我們需要確保虛擬地址映射的物理地址是連續的。有3個途徑:
1:數據區地址是由應用層或者其他進程、線程傳入的,驅動并不知道其虛擬地址對應的物理地址是否一直連續。
由于wince的內存申請,是以4K字節為一個頁,一段數據的內存申請可能跨越多個頁。因此,只要數據區長度大于1字節,就有可能其物理地址是跨越的、不連續的。為了確保DMA操作,我們必須查詢這段數據區在RAM上的物理分布。
首先,得到數據區所在的虛擬頁: VirPageStart = (ULONG)pSourceBuffer & 0xFFFFF000;
其次,得到數據區在頁內的偏移地址 :offset = (ULONG)pSourceBuffer & 0x0FFF;
計算數據區是否跨越頁段
if(offset + NumberOfBytes > 4096)
PageSize = WCE_UNIFORM_SIZE - offset; //整個數據跨越此頁,則DMA傳輸需要分多個部分,一次一個頁段的傳
else
PageSize = NumberOfBytes; //數據區沒有跨越頁
由得到的頁地址,查詢映射的物理地址。
if(!LockPages((LPVOID)VirPageStart, 4096, &TransAddr, LOCKFLAG_READ))
{
//異常處理
}
UnlockPages((LPVOID)VirPageStart, 4096);
得到了映射的物理地址TransAddr后,根據RAM是目標地址還是源地址,做進一步的處理。
假設一個數據區作為DMA源地址,大小為9K。在虛擬地址首頁的偏移為4K。那么它必然跨越3個頁段。
首先查詢第一頁的物理地址發送,第一個頁的2K數據。然后查詢第二頁的物理地址,發送4K數據。最后查詢第三頁的物理地址,發送3K數據。
2:數據區的申請可以使用AllocPhysMem函數申請。
LPVOID AllocPhysMem(
DWORD cbSize, 參數1:數據區大小
DWORD fdwProtect, 參數2:保護標記
DWORD dwAlignmentMask, 參數3:0(default system)
DWORD dwFlags, 參數4:0(Reserved for future use)
PULONG pPhysicalAddress 參數5:得到數據區對應的物理地址
);
AllocPhysMem函數返回值為指向申請后的虛擬地址指針。
如:pSerialHead->RxBufferInfo.RxCharBuffer = //alloc physical memory
AllocPhysMem(pSerialHead->RxBufferInfo.Length + 16, PAGE_READWRITE, 0, 0, &RX_PhyAddr);
由于此函數必定申請到一片連續的物理地址,因此pSerialHead->RxBufferInfo.RxCharBuffer的使用不再需要查詢是否跨越多個頁段。
但是,AllocPhysMem函數申請的物理地址可能會跨越多個RAM CHIP。因此,在使用1片以上RAM芯片的系統中,依然需要查詢是否跨越CHIP。
AllocPhysMem函數使用后,需要使用FreePhysMem函數進行釋放。
3:數據區可以在系統config.bib文件中,預先定義好一片連續、不跨越CHIP的RAM空間。
如下,系統保留了虛擬地址0x80024000開始,大小為0x3000的一段RAM。
SER_DMA 80024000 00003000 RESERVED
那么驅動DMA使用中,不再需要對這段內存,進行任何的查詢動作。我們只需要在進程空間中做映射即可。
pSerialHead->RxBufferInfo.RxCharBuffer = VirtualAlloc(0, RX_PhySize, MEM_RESERVE, PAGE_NOACCESS);
if (pSerialHead->RxBufferInfo.RxCharBuffer == NULL)
{
DEBUGMSG(ZONE_ERROR, (TEXT("COM_Init:: VirtualAlloc failed!\r\n")));
return(NULL);
}
else
{
if (!VirtualCopy((PVOID)pSerialHead->RxBufferInfo.RxCharBuffer, (PVOID)(RX_PhyAddr),
RX_PhySize, (PAGE_READWRITE | PAGE_NOCACHE)))
{
DEBUGMSG(ZONE_ERROR, (TEXT("COM_Init:: VirtualCopy failed!\r\n")));
return(NULL);
}
}
上面這段程序中,先使用函數VirtualAlloc,在進程空間中申請一段保留的虛擬地址空間。然后使用VirtualCopy,把需要使用的物理地址空間,映射到已經申請好的虛擬地址上。使用完畢,必須使用函數VirtualFree進行釋放。
LPVOID VirtualAlloc(
LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect
);
BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
BOOL VirtualFree(
LPVOID lpAddress,
DWORD dwSize,
DWORD dwFreeType
);
1. 更改project.bib文件,添加應用程序,這里以Hello, world為例如下:
hello.exe d:\WINCE600\OSDesigns\Emulator\Emulator\RelDir\DeviceEmulator_ARMV4I_Release\hello.exe NK S
2. 為該應用程序創建一個快捷方式文件,可以新建一個*.txt文件,然后在里面添加:18#\windows\hello.exe,其中18表示后面的字符數,然后關閉該txt文件,重命名為hello.lnk,并將該文件拷貝到WinCE工程的release目錄下面。
3. 更改project.bib文件,包含hello.lnk文件,如下:
hello.lnk d:\WINCE600\OSDesigns\Emulator\Emulator\RelDir\DeviceEmulator_ARMV4I_Release\hello.lnk NK SH
4. 打開project.dat文件,將hello.lnk重新定位到\Windows\Programs目錄下面,如下:
Directory("\Windows\Programs"):-File("HELLO.lnk", "\Windows\hello.lnk")
5. 將project.dat和project.bib拷貝到工程的release目錄下面,然后Makimge就可以了。
最后運行WinCE的時候,應該可以看到應用程序已經被添加到StartMenu的Programs中了,如圖:
通過這個例子可以看出,BIB中包含的文件在Makeimg以后,都會放在WinCE系統的\Windows目錄下面,而我們可以通過更改DAT文件來將他們重定向到另一個文件夾中。通過這種方式可以添加程序到Programs中,但是如果想改StartMenu本身,就需要更改源代碼了,在\WINCE600\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR\stmenu.cpp下面。
1. 添加多種語言:
創建一個WinCE工程,然后在”Solution Explorer”中右擊工程,選擇”Properties”,會彈出一個對話框。在左側的列表中選擇”Local”,在右側選擇所要支持的語言,這里我選擇了French,Japanese,Chinese(PRC)和English四種語言。在”Default Locale:”中選擇系統的默認語言,這里選擇的是英語。如圖:
2. 添加MUI組件
在”Catalog Item View”中選擇支持MUI的組件,選擇”Core OS”->”CEBASE”->”International”->”Multilingual User Interface(MUI)”,如圖:
在上面選擇了French,Japanese,English和Chinese四種語言,如果要想WinCE能夠正確顯示,還要選擇相應的字體。在這里只需為Chinese和Japanese添加字體。選擇”Core OS”->”CEBASE”->”International”->”Locale Specify Support”->”Chinese(Simplified)”->”Fonts”->”SimSun & NSimSun”->”SimSun & NSimSun”來添加中文字體,同樣的方法在”Locale Specify Support”下找到”Japanese”然后添加日語字體。
3. 編譯MUI工程
重新編譯工程。編譯成功后,打開工程的release目錄,調用createmui命令來創建多種語言的資源文件,每種語言對應一個LCID,可以在WinCE的幫助文檔中查到,如下:
English:0409
Chinese(PRC):0804
French:040C
Japanese:0411
命令如下:
createmui 0409,0804,040C,0411
運行成功后會生成一個MultiUI.bib文件,打開該文件,拷貝所有內容到common.bib文件的末尾。MutiUI.bib文件中可能包含k.coredll.dll.xxx,在common.bib文件中刪除所有的k.coredll.dll.xxx項。
最后重新Makeimg就可以了。
4. 運行測試
下載并運行WinCE,可以看到默認的語言是英文的。選擇”start”->”setting”->”Control Panel”彈出控制面板,然后選擇”Regional Settings”,再選擇”User Interface Language”,選擇要切換的語言,比如Chinese(PRC),如圖:
重新啟動目標板,如果你用WinCE模擬器的話,在菜單中選擇File,然后選擇Reset,選擇Soft來重新啟動。重起以后,界面就會變成中文的WinCE系統了。
]]>下面來介紹一下具體步驟:
1. 選擇支持WinCE遠程桌面的組件:
在WinCE的工程中選擇”Core OS”->”CEBASE”->”Core OS Services”->”Debugging Tools”->”Remote Display Application”,如下圖:
在這里建議同時添加telnet組件,在”Core OS”->”CEBASE”->”Communication Services and Networking”->”Servers”->”Telnet Server”。由于目標板可能沒有任何輸入輸出設備,所以添加Telnet組件可以在系統啟動以后,登陸Telnet來執行命令。
2. 配置遠程桌面主機IP地址:
打開WinCE工程的注冊表文件project.reg,然后添加下面的內容。
[HKEY_LOCAL_MACHINE\SOFTWARE\CERDISP]
"Hostname"="192.168.0.88"
其中Hostname為PC機的IP地址,也可以是計算機名。
還可以同時添加Telnet注冊表配置,如下:
[HKEY_LOCAL_MACHINE\COMM\TELNETD]
"IsEnabled "=dword:1
"UseAuthentication"=dword:0
該配置實現了無需身份驗證,直接登錄Telnet的功能。
3. 重新編譯,下載運行WinCE:
由于添加了新的WinCE組件,需要重新編譯WinCE工程。編譯成功后,可以下載到目標板上面運行。
4. 啟動PC端遠程桌面程序:
WinCE在目標板運行以后,首先在\WINCE600\Public\Common\Oak\Bin\I386目錄下找到cerhost.exe,然后運行。運行后選擇File,然后選擇Connect,在彈出的對話框中輸入目標板的IP地址,然后點擊OK等待連接。
5. 啟動目標板遠程桌面程序:
首先通過Telnet登錄目標板,然后再命令行中輸入如下命令:
Cerdisp –c
這時,就可以在PC上的cerhost界面中看到目標板WinCE的桌面了,而且可以通過鼠標鍵盤進行操作,如圖:
其實很簡單,要注意的是首先運行PC端的cerhost,它應該是Server。然后運行目標板上的Cerdisp,這個應該是Client
]]>觸摸屏信息同鼠標信息,不過只有WM_LBUTTONDOWN,WM_LBUTTONUP, WM_MOUSEMOVE 三種。
二,捕捉函數
BOOL GetMouseMovePoints (PPOINT pptBuf, UINT nBufPoints,
UINT *pnPointsRetrieved);
三,實例
PenTrac.h
#define dim(x) (sizeof(x) / sizeof(x[0]))
struct decodeUINT { // Structure associates
UINT Code; // messages
// with a function.
LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM);
};
struct decodeCMD { // Structure associates
UINT Code; // menu IDs with a
LRESULT (*Fxn)(HWND, WORD, HWND, WORD); // function.
};
HWND InitInstance (HINSTANCE, LPWSTR, int);
int TermInstance (HINSTANCE, int);
LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT DoPaintMain (HWND, UINT, WPARAM, LPARAM);
LRESULT DoMouseMain (HWND, UINT, WPARAM, LPARAM);
LRESULT DoDestroyMain (HWND, UINT, WPARAM, LPARAM);
PenTrac.cpp
#include <windows.h> // For all that Windows stuff
#include "pentrac.h" // Program-specific stuff
const TCHAR szAppName[] = TEXT ("PenTrac");
HINSTANCE hInst; // Program instance handle
const struct decodeUINT MainMessages[] = {
WM_LBUTTONDOWN, DoMouseMain,
WM_MOUSEMOVE, DoMouseMain,
WM_DESTROY, DoDestroyMain,
};
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow) {
MSG msg;
int rc = 0;
HWND hwndMain;
hwndMain = InitInstance (hInstance, lpCmdLine, nCmdShow);
if (hwndMain == 0)
return 0x10;
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return TermInstance (hInstance, msg.wParam);
}
HWND InitInstance (HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow) {
WNDCLASS wc;
HWND hWnd;
#if defined(WIN32_PLATFORM_PSPC)
hWnd = FindWindow (szAppName, NULL);
if (hWnd) {
SetForegroundWindow ((HWND)(((DWORD)hWnd) | 0x01));
return 0;
}
#endif
hInst = hInstance;
wc.style = 0; // Window style
wc.lpfnWndProc = MainWndProc; // Callback function
wc.cbClsExtra = 0; // Extra class data
wc.cbWndExtra = 0; // Extra window data
wc.hInstance = hInstance; // Owner handle
wc.hIcon = NULL, // Application icon
wc.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL; // Menu name
wc.lpszClassName = szAppName; // Window class name
if (RegisterClass (&wc) == 0) return 0;
hWnd = CreateWindowEx (WS_EX_NODRAG, szAppName, TEXT ("PenTrac"),
WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!IsWindow (hWnd)) return 0;
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
return hWnd;
}
int TermInstance (HINSTANCE hInstance, int nDefRC) {
return nDefRC;
}
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
INT i;
for (i = 0; i < dim(MainMessages); i++) {
if (wMsg == MainMessages[i].Code)
return (*MainMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
}
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
LRESULT DoMouseMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
POINT pt[64];
POINT ptM;
UINT i, uPoints = 0;
HDC hdc;
ptM.x = LOWORD (lParam);
ptM.y = HIWORD (lParam);
hdc = GetDC (hWnd);
if (wMsg == WM_MOUSEMOVE) {
if (wParam & MK_SHIFT)
GetMouseMovePoints (pt, 64, &uPoints);
for (i = 0; i < uPoints; i++) {
pt[i].x /= 4; // Convert move pts to screen coords
pt[i].y /= 4;
MapWindowPoints (HWND_DESKTOP, hWnd, &pt[i], 1);
SetPixel (hdc, pt[i].x, pt[i].y, RGB (255, 0, 0));
SetPixel (hdc, pt[i].x+1, pt[i].y, RGB (255, 0, 0));
SetPixel (hdc, pt[i].x, pt[i].y+1, RGB (255, 0, 0));
SetPixel (hdc, pt[i].x+1, pt[i].y+1, RGB (255, 0, 0));
}
}
SetPixel (hdc, ptM.x, ptM.y, RGB (0, 0, 0));
SetPixel (hdc, ptM.x+1, ptM.y, RGB (0, 0, 0));
SetPixel (hdc, ptM.x, ptM.y+1, RGB (0, 0, 0));
SetPixel (hdc, ptM.x+1, ptM.y+1, RGB (0, 0, 0));
ReleaseDC (hWnd, hdc);
Sleep(25);
return 0;
}
LRESULT DoDestroyMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
PostQuitMessage (0);
return 0;
}]]>
SD Card Driver on ADS Summary
SD是Secure Digital Card卡的簡稱,直譯成漢語就是“安全數字卡”,是由日本松下公司、東芝公司和美國SANDISK公司共同開發研制的全新的存儲卡產品。SD存儲卡是一個完全開放的標準(系統),多用于MP3、數碼攝像機、數碼相機、電子圖書、AV器材等等,尤其是被廣泛應用在超薄數碼相機上。SD卡在外形上同Multimedia Card卡保持一致,大小尺寸比MMC卡略厚,容量也大很多。并且兼容MMC卡接口規范。不由讓人們懷疑SD卡是MMC升級版。另外,SD卡為9引腳,目的是通過把傳輸方式由串行變成并行,以提高傳輸速度。它的讀寫速度比MMC卡要快一些,同時,安全性也更高。SD卡最大的特點就是通過加密功能,可以保證數據資料的安全保密。它還具備版權保護技術,所采用的版權保護技術是DVD中使用的CPRM技術(可刻錄介質內容保護)。 規格 1.精巧而且超薄 SD記憶卡的尺寸只有24毫米x 32毫米 x 2.1毫米。作為“橋梁媒體”的重要特征,它精致小巧,方便您在不同設備上使用。兼容SD記憶卡的設備可以采用解碼器軟件來播放音樂、影像短片以及更多其他類型的內容,無需像CD播放機或DVD播放機那樣采用驅動裝置。從而使設備的外形更加精巧,同時也賦予了產品設計者發揮自由創意的全新空間。由于消除了播放音樂時的跳音現象,提高了播放的穩定性。 2.大容量栽體 目前,SD記憶卡已經具備各種容量可供選擇,同時,2GB、4GB和8GB的SDHC也出現了。 3.高速數據傳輸 為了提供快速響應和容易處理數字內容,SD記憶卡可以用每秒10MB的速率寫入和讀取數據。當其能夠用于遠程通信終端,直接下載內容時,記憶卡的高速傳送能力將可使存取時間和通信成本降至最低,同時可減輕網絡壓力。 4.擁有版權保護功能 先進的數碼技術使高保真音樂和其他高質量內容的錄制成為現實。日新月異的數碼技術,借助因特網,實現了全球范圍的信息快速共享。這一進步也帶來了對原版內容的大量復制,因此,作為21世紀的一種切實可行的記憶載體就必須具備高水平的版權保護技術,這樣才能保護大量高質的數碼數據。SD記憶卡可以自由復制各種數碼數據,并采用獨特的內置CPRM技術保存和轉移版權所有的內容,這也是建立一個全新的音樂及其他商業媒體的發布體系的關鍵所在。 硬件結構 SDIO卡 SDIO(輸入/輸出)卡是一種擴展帶SD卡插孔設備之功能的接口。正在開發各種SDIO卡,如相機、Bluetooth 、GPS和802.11b等。 如果編寫以上設備的驅動,當然前提是有一個合格的SD Host Controller。如同編寫USB STORAGE/HID設備的驅動一樣,需要USB HCD支持。MX31的ADS支持基于SDIO的LP1070 SDIO WLAN Card(在Wince 5.0的SD卡驅動模型里,這種驅動稱為client driver)。了解SD card
主要特點:
(參看附錄中SD卡和其他卡的一個對比表)
基本思想就是在Nand Flash等固態存儲器中保存這個變量 實現方法有很多種,如果你使用的是EBoot,EBoot的例子中會有一個BOOT_CFG的結構體,默認保存EBoot參數的,這個參數保存在固態存儲器上,可以參考WINCE500\PLATFORM\SMDK2410\SRC\BOOTLOADER\EBOOT\main.c 這樣解決了保存變量的問題,但是如何在Bootloader與操作系統間傳遞參數呢, 同樣對于2410的例子,OEMPlatformInit里面會有一個BSP_ARGS的結構體,用來在EBoot與WinCE之間傳遞參數,這塊區域是SDRAM的區域,一般是保留出來作為參數傳遞的,WinCE不會覆蓋這塊區域,這個結構體在EBoot中被填充,所以,可以將參數放在BOOT_CFG中,然后EBoot初始化時從Nand中讀出來,放到BSP_ARGS,以達到傳遞給WinCE的目的。 但是這樣只是解決了讀取的問題,這個參數在CE中的修改還是不會被保存。 這種默認的方法最一般的用途就是來控制KITL,這種單向參數傳遞的 如果需要雙向傳遞或保存,最簡單的方法就是在WinCE驅動中添加一個IOCTL,比如FMD的IOCTL,用來讀寫這塊參數區域 這樣子,應用程序也就可以訪問這塊參數了。 如果不使用EBoot的默認方式,就直接規定一個或幾個Nand區域,讀寫方案同上,以達到多個應用的參數分開保存的目的,比如BT MAC在Block2, WIFI MAC在Block3, 其他參數在Block4。這樣做可以將經常讀寫的參數和不經常讀寫的參數分開,以免經常讀寫的塊損壞,而破壞其他的功能 |