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