版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、TI OMAPL處理器介紹 曾經(jīng),會單片機的工程師牛得一塌糊涂。想十年前一個會單片機的工程師幾乎就是嵌入式工程師的代名詞。若干年前,ARM開始暫露頭角,看到單片機工程師的牛氣,ARM工程師笑了。而從包括合眾達在內(nèi)的中國DSP三巨頭開始在中國推廣DSP時,所有開始使用DSP的工程師笑了。他們有理由笑,他們有資格笑。因為在那時,DSP就代表著高高在上,收入高、職位高、聲譽高,典型的三高。而經(jīng)過若干年的推廣,DSP已經(jīng)脫下了神的外衣,走下了神壇。會DSP的人越來越多。但隨著DSP開發(fā)者的日漸增多,DSP的娘嫁人(TI)發(fā)現(xiàn),純DSP血統(tǒng)的姑娘們越來越難嫁了。時代的青年對于姑娘的要求已經(jīng)不再在能做一手
2、漂亮而高效的女紅(計算)。人們希望娶到家的姑娘是出得廳堂,進得廚房,能歌而善舞。大戶人家的公子希望媳婦兒如DSP般賢良淑德,又像ARM般千妖百媚。2005年TI推出了DaVinci技術(shù),這一血統(tǒng)的姑娘既賢良淑德又千嬌百媚。ARM926 + 64x+在世界各地的選美比賽中,DaVinci小姐一路過關(guān)斬將,一屆又一屆地當選為世界小姐。但后來人們發(fā)現(xiàn),所有的評委都是對AV比較感興趣的。一時間,AV門事件波及全球。在人民大眾強大的呼聲里,OMAPL小姐,姍姍來遲。 ARM+674x(定浮點DSP)。她是如此的大方美麗,如此的平易近人,她是無冕的后冠。接下來的幾天,我會繼續(xù)介續(xù)OMAPL處理器家族。在我
3、做完基本介紹之后,我的同事even會講述如何實現(xiàn)ARM+DSP的通信。1 器件功能組成名詞解釋:OMAPL = Oh My Application Processor Low-power edition. (Blacksword獨家解釋)OMAPL處理器內(nèi)部構(gòu)成:介紹OMAPL內(nèi)部構(gòu)成之前,我們先來回顧一下TI的DSP功能結(jié)構(gòu)。下圖是TMS320C6748的blockdiagram從圖上可以看出DSP器件其實本質(zhì)上就是一個DSP運算核心,通過Switch Fabric/EDMA連接了一堆片上外設(shè)而已。至于核心那部分,我們大部分只是DSP器件的使用者,而不是設(shè)計者,不需要花過多的精力去深究。我們
4、以前講DSP的開發(fā):就硬件而言即將需要用到的片內(nèi)外設(shè)引出來而已,把片外的外設(shè)連接到總線上而已;而做硬件,我個人認為都無所謂是否DSP工程師,因為DSP也好、ARM也好、X86也好,考驗工程師的都是指定的板子硬件線路連接正確性,能不能在指定面積上布完,電路會否出現(xiàn)局部過熱,電磁兼容性好否,高速接口線長線寬是否合理等,而這一切不會因是否DSP而有任何的不同。個人認就DSP而言,軟件的開發(fā),才是真正的DSP開發(fā)。而就軟件而言,即設(shè)置好SwitchFabric以便能夠選中指定的外設(shè),然后讀取指定外設(shè)上的數(shù)據(jù),將這此處理好的數(shù)據(jù)再寫到其它指定的外設(shè)上而已。從這一點上講,開發(fā)DSP本身并非高高在上的神話。
5、大部分所謂的DSP高手,其實嚴格來講應(yīng)該說是數(shù)學高手,邏輯高手,他們小小的一點手段,就可以讓算法效率提高很多。真正的高手,只有實在在算法沒什么可以摳的,才會使用匯編。那我們不管高手不高手的,總之其實要會寫一個簡單的DSP程序,做基本的處理,大家都覺得比較容易的。在第0講中,我們提到TI從2005年推出了DaVinci系列平臺。但很多人用了后,心里有著說不出的委屈,尤其是少部分因為DaVinci而被減員下來的。這部分人看到了OMAP-L,覺得OMAP-L這個平臺非?!坝H切”,“親切”得讓他們牙癢癢。怎么看怎么像DaVinci。且放下“親切”的問題不談,我們先來看看DaVinci的表妹OMAP-L
6、到底長得什么樣。蓋頭掀開,OMAP-L的臉蛋身材如下圖(圖為OMAP-L138):與表姐DaVinci相好過的人,一定能看出來。表姐表妹的區(qū)別僅在于一個胸大(在VICP),一個秀氣(DSP為定浮點)但我更希望大家將目光從胸部移開,這樣才有助于我們從整體上認識DaVinci與OMAP-L這對姐妹花。請大家看看OMAP-L138與TMS320C6748(代表了傳統(tǒng)DSP)之間的聯(lián)系與區(qū)別。你一定會很容易就發(fā)現(xiàn):共同點就是同樣是處理器核心通過Switch連接到各種不同的片上外設(shè)。而最大的不同點就是OMAP-L片內(nèi)有兩個處理器核心,一個ARM 一個DSP。你要是問一下有經(jīng)驗的DSP開發(fā)工程師,開發(fā)DS
7、P難不難,你會得到什么答案?同樣你可以問一下有經(jīng)驗的ARM開發(fā)工程,開發(fā)ARM難不難,你會得到什么答案?很多公司在很多項目中已經(jīng)同時使用ARM和DSP,那怎么將ARM和DSP混搭出來的DaVinci/OMAP-L怎么就有很多人覺得不好用呢?其實這個問題誠然有TI的原因,但與我們本身的用法也有很大的關(guān)系。覺得他不好用、不美是很正常的。不信:你去問一下有經(jīng)驗的DSP工程師,ARM開發(fā)容易否?很多早期開發(fā)DaVinci的公司,一個像樣的ARM工程師都拿不出來,然后就在那里叫嚷TI提供的東西不全,DaVinci的架構(gòu)不好,到今天他們也還在說OMAP-L架構(gòu)不好,就是看著OMAP-L看著像DaVinci
8、。我們承認對于你的應(yīng)用TI提供的軟件可能相當不全。但這正在DaVinci的魅力所在,畢竟DaVinci提供的不是山寨貨,而是提供給大家實現(xiàn)無限創(chuàng)意的能力。那么在基本組件方面,TI會致力于提供給大家符合Linux標準的各種驅(qū)動及軟件中間件。有了標準的保證,你會發(fā)現(xiàn)如GUI或是RTP/RTSP等更上一個層次的軟件組件上,你根本就不缺軟件,因為大量的開源項目都是你的項目。我曾經(jīng)有一個移植Gnash(Linux下的Flash播放器)的慘痛教訓,在TI DaVinci平臺僅花了幾天時間,所有軟件就移植成功。D1以下的基本上能達到15FPS。但在另一個廠商所謂完善的平臺,確認有對于某幾個特定應(yīng)用的完整方案
9、,幾乎可以直接將代碼用于量產(chǎn)。但當客戶需要Flash時,找到了我。我遇到的第一個問題是該平臺提供的C語言庫是不完整的,不得已我給客戶重新移植了C語言庫以及編譯器。我們都知道在嵌入式產(chǎn)品上要顯示就通常會用到Framebuffer。我的第二個問題,就是Gnash要用到SDL,SDL最輕量的backend就是framebuffer。但我無比痛苦的發(fā)現(xiàn),該平臺上的framebuffer的驅(qū)動并不標準.做了無數(shù)的修改之后,終于將Gnash在客戶的平臺上運行起來,新的問題是該平臺提供的那些完整解決方案,不能運行在新的C庫上,然后是非常痛苦的改“解決方案”中程序的過程,總共浪費了好幾個月。因此,我們認為TI
10、的平臺還是比較容易使用的,關(guān)鍵是你得讓合適的人干合適的事情。后面我們會分析這個架構(gòu),并講述基本的開發(fā)流程。下面我們看一下OMAP-L處理器家族都有哪些成員及旁系。OMAPL處理器家族成員:型 號主頻(MHz)PWMDMACPURAML1L2封裝McASPMcBSPMMC/SDTimer(64bit)uPPPRU其它OMAPL137375, 456332ch EDMAARM9, 674xSDRAM64K256K256BGA3 11GP, 1GP/WD UART, USB, LCD, I2C, HPI, eCAP, EMAC, SATAOMAPL138375, 45622 32ch EDMAARM
11、9, 674xSDRAM, DDR/264K256K361 NFBGA1223GP, 1GP/WD12UART, USB, LCD, I2C, HPI, eCAP, EMAC, SATAOMAPL旁系之ARM成員:AM1808 OMAPL138的無DSP版本AM1806 AM1808的無EMAC及SATA版本AM1707 OMAPL137的無DSP版本OMAPL旁系之DSP成員:TMS320C6748 OMAPL138的不帶ARM版本TMS320C6746 TMS320C6748閹EMAC及SATA后的版本TMS320C6742 閹得就更多了TMS320C6747 OMAPL138的閹DSP版
12、本暫時講到這里,稍候繼續(xù)2 SCR Switch Central Resource介紹關(guān)于ARM的核心,由于我們不再介紹,它不會因為披上了TI的外衣就不是ARM關(guān)于DSP的核心本身,我們也不再介紹,畢竟,這里我們不是要講如何做算法的優(yōu)化。因此流水線與指令集,都不在考慮之內(nèi)。就一個應(yīng)用而言,最主要的就是各種外設(shè)的使用。而對外設(shè)的使用而言,最重要的就是這堆玩意兒是怎么連接到CPU上的。如我們在OMAP-L處理器介紹 1中所講,在OMAP-L處理器上,外設(shè)與CPU們是通過SCR連接在一起的。好,廢話少說。上圖先!圖1 OMAP-L138 Switched Central Resource看到這個圖,
13、肯定很多人與我最開始的感覺一樣,什么亂七八糟的呀。里面的SCR還好說,肯定是Switch Central Resource但BR是什么呢?TI沒有給出縮略語說明,但在SPRUGM7D那篇名為OMAP-L138 Application Processor System Referrence Guide第4.1節(jié),也就是上面這個圖的上面一段文字里列到"The switch fabric is composed of multiple switched central resources (SCRs) and multiple bridges"。顯然這里的 BR就是BRidge的
14、意思。這樣這個圖的作用,就顯然了,就是說數(shù)據(jù)可以從哪里到哪里。而在這個算是器里面有能力決定哪個使用哪個SCR或BR的核心為ARM, DSP, EDMA以及PRU.講到這可能已經(jīng)有很多朋友在罵我羅嗦了?!澳敲吹降自撛趺礇Q定哪個SCR甚至哪一個BR被使用才能訪問到一個外設(shè), 比如說串口?你要不說清楚,今天別想走!”(腹黑中)“我們TI,把所有的這些掛在SCR上的外設(shè),統(tǒng)一進行了編址?每個設(shè)備都對應(yīng)在特定的地址上,比如說串口0, 0x01c4 2000 0x01c4 2034分別對應(yīng)著串口寄存器RDRMDR。客戶只需要大CPU上訪問0x01c4 2000就可以訪問相應(yīng)串口寄存器,對應(yīng)的SCR及BR會
15、自動選上” (想知道我們TI是怎么設(shè)計器件,嘿嘿嘿!)被忽悠了半天看這個圖,比較不爽!(權(quán)當消遣了,學習一下芯片的實現(xiàn)原理)對于我們要用好器件上的外設(shè)而言,比較實惠的還是memoryMap。 下圖為OMAPL138器件的MemoryMap(摘自O(shè)mapL138的datasheet).圖2 OMAPL138 MemoryMap從數(shù)據(jù)表我們可以看出如果要從DSP訪問DSPL2RAM,只要在DSP代碼里訪問0x0080,0000到0x0083,ffff有的人可能要問題,要是我候通過ARM訪問呢,那我們往下翻MemoryMap這個表(如下圖)圖3 OMAPL138 MemoryMap Continue
16、d只需要在ARM里訪問物理地址0x1180,00000x1183,ffff (當然是指物理地址,而不是操作系統(tǒng)內(nèi)核地址或是用戶空間地址)。前面說了各個處理器怎么看外設(shè),盡管圖一中也能看出ARM與DSP關(guān)系的一點端倪,但估計還有很多人在疑惑ARM與DSP這小兩口怎么是什么關(guān)系。(廢話,你都說是小兩口了)。我們總結(jié)一下圖1及圖2,3所涉及到的MemoryMap表的的內(nèi)容,我們就不難看現(xiàn),其實ARM與DSP之間的關(guān)系就是如圖4這樣圖4 站在民政局的角度打量ARM與DSP的關(guān)系。今天我們知道了ARM及DSP怎么通過SCR訪問的外設(shè),也知ARM與DSP是怎么XXOO的。關(guān)于ARM與DSP XXOO的詳細
17、介紹,我們在下一講介紹。敬請期待。3 以SEED-DIM138/1808-Kit上的LED燈D1為例講述如何進行相關(guān)開發(fā)(一)本文檔的使用許可證:本文檔遵循GPLv2發(fā)布,因此任何人引用或修改本文檔均需要在發(fā)起引用的文章的顯要位置(開頭或結(jié)束處)原樣引入本段文字(互聯(lián)網(wǎng)及電子文檔為斜體藍色,)及所引用版本的下一段的文檔編輯人員的列表及工作內(nèi)容。適用器件:操作適用于基于TI OMAP-Lx8 C6748 AM18xx處理器的SEED-DIM138/1808-kit,方法適用于TI Sitara、DaVinci、OMAP、Integra、C67xx等系列的絕大多數(shù)處理器。 原理適用于所有嵌入式處理
18、器上的產(chǎn)品開發(fā)。嵌入式的開發(fā)與PC程序不同,通常需要與定制的開發(fā)板或是產(chǎn)品打交道,這就意味著與PC那樣的標準架構(gòu)不同,所有的東西你不能依靠猜來進行。因此我們的工作要從實際硬件出發(fā)。那么本文中我們將以SEED-DIM138/1808-Kit上的LED燈D1為例講述如何進行相關(guān)開發(fā),也就是嵌入式的軟件開發(fā)人員如何從軟件的角度看硬件。一、看原理圖看原理圖,是為一款嵌入式產(chǎn)品開發(fā)軟件(純應(yīng)用層軟件工程師除外)的必備技能之一。具體如何看原理圖,今天我們不在這里講述。我們看SEED-DIM138底板的原理圖,知道燈D1是連接到GP613的,所圖1所示。圖1 SEED-DIM138-Kit套件中底板用戶LE
19、D原理圖由這個圖可以看出要想讓燈2發(fā)光,必須置GP6_13為高電平。二、查相關(guān)器件手冊,了解如何進行配置從軟件工程師的角度,所有的外設(shè)都是通過地址來進行訪問或配置的。查一下TI的芯片手冊,我們發(fā)現(xiàn)Datasheet SPRS586x中第3章是Device Overview,其中會有一節(jié)講述Pin Assignments,那么在這邊手冊中是3.7節(jié)。如圖 2 所示的 R 行 17 列是GP613 所在的引腳,該引腳是一個 GP613 及PRU0_R3031等功能的一個復(fù)用引腳。(我們知道提供的產(chǎn)品功能都比較強大,因此引腳的復(fù)用程度都比較大)。因此我們首先要解決的是軟件的管腳復(fù)用問題。我們發(fā)現(xiàn)芯片
20、手冊SPRS586x中的第3.7節(jié)是講述Pin Multiplexing Control的。"Device level pin multiplexing is controlled by registers PINMUX0 - PINMUX19 in the SYSCFG module."根據(jù)這句話,我們可以在文檔里搜索PINMUX或SYSCFG的其它章節(jié),發(fā)現(xiàn)本文檔中并無進一步詳細信息。因此我們需要進一步看文檔 SPRUGM7x ,也就是 OMAP-L138 Applications Processor System Reference Guide這篇文檔。 SPRUGM
21、7x的第11章是專門講述SYSCFG(System ConFiG)。其子節(jié)11.5.10是詳細講述PINMUX的。我們在里面找到關(guān)于GP613的配置說明如圖3所示。意思是說PINMUX13寄存器的11_8位設(shè)為8h即可以令該引腳工作為GPIO的GP613. 那么從軟件工程師的角度就是需要知道PINMUX13寄存器的地址。而同樣這11.5節(jié)的剛開始就是重點介紹SYSCFG寄存器的,在這節(jié)的表里面我們發(fā)瑞PINMUX13寄存器對應(yīng)的地址為01c1 4154h. 現(xiàn)在這個引腳已經(jīng)是GPIO了。 然后我們就應(yīng)該讀具體外設(shè)的手冊,那么本外設(shè)為GPIO,從TI網(wǎng)站OMAPL138 產(chǎn)品信息頁 面查找并 下
22、載到 GPIO 的用戶手冊 SPRUF18x TMS320C674x/OMAP-L1x Processor General-Purpose Input/Output ,根據(jù)這篇文檔我們知道要使用這個GPIO引腳我們需要將該GPIO引腳的具體功能設(shè)為輸出,并向該引腳輸出高電平,燈D1才會亮。而GP6對應(yīng)的輸入還是輸出是由DIR67寄存器的GP6P13位也是本寄存的比特13控制的。而且,寫0表示輸出。而往該引腳輸出高電平可以通過OUT_DATA67的GP6P13即比特13完成。 因此現(xiàn)在的情況是我們需要知道DIR67及OUT_DATA67的地址。而文檔SPRUF18x給出的GPIO寄存器地址對DI
23、R67及OUT_DATA67的分配如圖 表7 GPIO寄存的偏移地址分配表 而這里的值是相對值,需要對照芯片的SPRS586x SPRS586x關(guān)于Memory Map的分配,發(fā)現(xiàn)GPIO地址起始為01e2 6000h. 表8 OMAPL1x8器件的Memory Map總結(jié)一下,看文檔的順序,Datasheet->System Reference Guide->專項手冊。 這也是看TI文檔的基本套路。總結(jié)一下,點亮SEED-DIM138/1808-Kit上燈D1的工作流程為:1 設(shè)PINMUX13_11_8 為08h2 設(shè)GPIO DIR67的GP613位為0,配置管腳為輸出3 設(shè)
24、GPIO OUT_DATA67的GP6P13位為1下幾節(jié)我們將實際通過操作CCS而不編程、裸機程序、Linux程序三種手段來以上面介紹的方法來實際點亮這個燈。三、CCS下簡單幾步操作點亮燈1打開CCS(3.3.82或更新版本,CCSv4.x或后續(xù)其它CCS產(chǎn)品), 具體仿真器的配置情況,這里我們不再描述。推薦使用XDS560系列仿真器,如我們合眾達的SEED-XDS560Plus因為它確實能讓你非常暢地完成我下面要進行的操作。打開CCS后,選擇連接器件的ARM端(DIM138/1808適用)或是DSP端(DIM138/6748適用)。注:需要用到相應(yīng)的GEL文件。在View菜單里選擇Expre
25、ssions,這是一個我們通過CCS調(diào)試程序時監(jiān)測變量的一個窗口。如圖3所示。點擊其中的”Add new expresion”并輸入*0x01c14154作為Expression,然后在Value處入0x8<<8。然后再分別加入: Expression: *0x01e26088 Value: 0xfffffff&(0x1<<13) Expression: *0x01e2608c Value: 0x0|(0x1<<13) 最后輸入完的CCS Expressions窗口如圖4所示。 到這一步為止,你會發(fā)現(xiàn)板子上的LED D1已經(jīng)亮了。當然在CCS下還可以
26、使用Memory窗口來完成同樣的工作。但我個人覺得Expressions窗口最好用。四、裸機編程的方法點亮LED D1程序代碼如下:引用:#define PINMUX_BASE _ADDR 0x01c14120#define PINMUX_4_LED_D1 13#define PINMUX_START_BIT_4_LED_D1 8#define PINMUX_SET_4_LED_D1 0x8#define GPIO_BASE_ADDR 0x01e26000#define GP_BANK_LED1_D1 6#define GP_PIN_4_LED1_D1 13typedef enum PIN_O
27、UTPUT, PIN_INPUT gpio_DIR;typedef struct ledStructunsigned char pinmuxGroup;unsigned char pinmuxStartBit;unsigned char pinmuxSet;unsigned char gpioBank;unsigned char gpioPin;bool state; / On or Off;bool pinmux(unsigned short pinMuxGroupNum, unsigned shortpinMuxStartBit, unsigned char pinMuxCmd)unsig
28、ned int *pinmux = (unsigned int*)( PINMUX_BASE _ADDR +pinMuxGroupNum *4);*pinmux = (*pinmux & (0xf << pinMuxStartBit) | (pinMuxCmd <<pinMuxStartBit);if(*pinmux & (0xf << pinMuxStartBit ) != (pinMuxCmd <<pinMuxStartBit)return false;elsereturn true;bool gpioSetDir(unsig
29、ned short gpioBank, unsigned chargpioBankPinNum, gpio_DIR gpioDir )unsigned int *gpioGroup = (unsigned int*) (GPIO_BASE_ADDR +(gpioBank/2)*4 );*gpioGroup = ( *gpioGroup & (0x1<( gpioDir << gpioBankPinNum);if ( *gpioGroup & (0x1<<<gpioBankPinNum)return false;elsereturn true;
30、bool led_init(ledStruct led)if (!pinmux(led.pinmuxGroup, led.pinmuxStartBit, led.pinmuxSet )return false;if (!gpioSetDir(led.gpioBank, led.gpioPin, PIN_OUTPUT)return false;return true;bool led_on(ledStruct led)/TODO: Left for you to implement this function;bool led_off(ledStruct led)/TODO: Left for
31、you to implement this function;!int!main(int!*argc,!char!*argv)! /TODO:!Code!to!turn!on!and!swich!off!the!LED!is!left!for!you.!請自行建立 CCS 工程編譯本程序,或使用 arm-linux-gcc 來編譯本代碼。區(qū)別是ccs 編譯出來的程序可以通過 CCS 來下載執(zhí)行,arm-linux-gcc 編譯出來的版本,可能需要 uboot或是其它手段才能裝載執(zhí)行。不過 TI 未來推出的 CCS 版本應(yīng)該會支持 arm-linux-gcc 編譯出來的代碼(我已經(jīng)在測試版本 C
32、CS 中見到這一功能)。!五、Linux下,訪問 LED(D1)Linux下,地址空間分為三種,分別是用戶空間:應(yīng)用程序代碼所能直接訪問的地址空間;內(nèi)核空間:操作系統(tǒng)內(nèi)核及驅(qū)動程序所能直接訪問的地址空間;物理空間:器件及系統(tǒng)上各種實際的物理地址空間。從前面的介紹我們知道,從嵌入式開發(fā)工程師的角度,各種外設(shè)是需要通過物理地址來進行訪問的,因此說代碼需要跟物理地址發(fā)生關(guān)系。 而按照 Linux 對地址空間的三種劃分,應(yīng)用程序甚至驅(qū)動程序都是不能直接訪問的。那么怎么樣才能訪問物理地址空間呢?Linux 的做法是通過幾個橋梁函數(shù)架設(shè)了驅(qū)動程序訪問物理地址及應(yīng)用程序訪問物理地址的橋梁。這些函數(shù)分別是:
33、ioremap 函數(shù)家族及 remap_pfn_range 函數(shù)家族。最后形成的關(guān)系如圖 5所示。注意:這兩個函數(shù)家族均需要在內(nèi)核空間執(zhí)行,只是執(zhí)行后,內(nèi)核空間及用戶空間便可以通過相應(yīng)的指針來映身到指定的物理地址上,從而實現(xiàn)對物理空間訪問。從前面的介紹我們知道,從嵌入式開發(fā)工程師的角度,各種外設(shè)是需要通過物理地址來進行訪問的,因此說代碼需要跟物理地址發(fā)生關(guān)系。 而按照 Linux 對地址空間的三種劃分,應(yīng)用程序甚至驅(qū)動程序都是不能直接訪問的。那么怎么樣才能訪問物理地址空間呢?Linux 的做法是通過幾個橋梁函數(shù)架設(shè)了驅(qū)動程序訪問物理地址及應(yīng)用程序訪問物理地址的橋梁。這些函數(shù)分別是: iorem
34、ap 函數(shù)家族及 remap_pfn_range 函數(shù)家族。最后形成的關(guān)系如圖 5所示。注意:這兩個函數(shù)家族均需要在內(nèi)核空間執(zhí)行,只是執(zhí)行后,內(nèi)核空間及用戶空間便可以通過相應(yīng)的指針來映身到指定的物理地址上,從而實現(xiàn)對物理空間訪問。對于單個寄存器,還可以使用 phys_to_virt 函數(shù)來獲得物理地址對應(yīng)的內(nèi)核空間地址,但對于連續(xù)空間的訪問不建議使用這種方法。因為這不能保證你獲得一個連續(xù)的內(nèi)核空間地址區(qū),甚至當你用指針進行操作時,有可能出現(xiàn)內(nèi)存越界。比如說,內(nèi)核中地址及是連續(xù)的兩個地址,a 和 b 為連續(xù)的兩個物理地址,如果你用 phys_to_virt 得到 a 對應(yīng)的虛擬地址 A,當你需要
35、訪問 b 時,你會很自然的使用指針 A+1 也就是來訪問。但這里不幸地是事先已經(jīng)被對應(yīng)用到物理地址了,而對 X 的野蠻操作引發(fā)的災(zāi)難,沒有人知道。而內(nèi)核空間與用戶空間要拷貝數(shù)據(jù),有函數(shù) copy_from_user 及copy_to_user 可用。那么僅剩下的問題就是如何寫一個字符型的設(shè)備驅(qū)動程序,以及如何在應(yīng)用程序里訪問驅(qū)動程序。關(guān)于如果寫字符型設(shè)備驅(qū)動程序,這里我就不在綴述,幾乎每一本講述Linux 驅(qū)動程序的書中都有長篇大論的闡述。(我會在后續(xù)給出一個實作的代碼,有需要的可以給我寫郵件,但由于近階段一直較忙,白天忙工作,晚上有時要加班,還要給孩子講故事,這個實作代碼可能會比較晚才給出來
36、。寫本文時一夜未眠,請見諒。)4 用常規(guī)的CCS開發(fā)方式建立一個完整的LED項目大家好,我是Even,北京合眾達電子的產(chǎn)品FAE。對于OMAP-L138這個平臺我也是剛接觸不久,略懂皮毛。有說的不對的地方還請大家多多指教,一起學習。之前David已經(jīng)為大家介紹了CCSV4的使用方法和調(diào)試技巧。并通過閱讀相關(guān)DATASHEET實現(xiàn)用配置寄存器的方式點亮板卡上的LED燈。下面我將用常規(guī)的CCS開發(fā)方式建立一個完整的LED項目。對于開發(fā)的認識,軟件工程師和硬件工程師會有不同的看法。硬件工程師樂于用直接控制硬件的方式來實現(xiàn)系統(tǒng)的功能,如控制相關(guān)寄存器的值。這樣做的好處是節(jié)省系統(tǒng)資源,運行速度快,但需要
37、對各種硬件的寄存器有相當?shù)牧私狻H秉c是遇到大型系統(tǒng)構(gòu)建時會有些力不從心。軟件工程師更樂于基于操作系統(tǒng)進行開發(fā),通過系統(tǒng)調(diào)用的方式控制硬件。好處是可以盡量少的接觸底層硬件,專心軟件的設(shè)計。缺點是如果遇到驅(qū)動不完善或者有BUG的情況下,就會有些束手無策。精通軟硬件是每個嵌入式工程師的最高追求,不過由于專業(yè)不同就會有所偏好,找到一個適合自身的開發(fā)模式還是十分必要的。之前說了不少閑話,現(xiàn)在我們言歸正題。OMAP-L138是一個雙核的芯片,無論是ARM核還是DSP核,都有相當數(shù)量的寄存器需要配置,如果從頭開始逐一定義和設(shè)置,需要消耗大量的時間,但這又是不得不做的事。慶幸的是TI的第三方已經(jīng)為我們寫好芯片
38、的寄存器定義,并把初始化和功能實現(xiàn)通過C函數(shù)的方式集成起來,這樣我們只需要調(diào)用相關(guān)的函數(shù),就可以實現(xiàn)對指定外設(shè)初始化工作和使用。這些文件的集合體被稱作BSL(Board Support Library)。它大大減少了開發(fā)初期的工作量,注釋也全面,容易理解。下面通過調(diào)用BSL的方式,建立一個ARM端點亮LED的項目,void main()#if NO_GELEVMOMAPL138_init(); /初始化芯片,PLL等EVMOMAPL138_initRAM(); /初始化RAM,DDREVMOMAPL138_enableDsp(); /使能DSP#endifUSTIMER_init(); /初始
39、化CPU定時器/ EVMOMAPL138_pinmuxConfig(PINMUX_GPIO613_REG, PINMUX_GPIO613_MASK, PINMUX_GPIO613_VAL); /設(shè)置管腳復(fù)用,作為GPIOEVMOMAPL138_pinmuxConfig(PINMUX_GPIO810_REG, PINMUX_GPIO810_MASK, PINMUX_GPIO810_VAL); /設(shè)置管腳復(fù)用,作為GPIO/ GPIO_setDir(GPIO_BANK6, GPIO_PIN13, GPIO_OUTPUT); /設(shè)置GPIO為輸出模式GPIO_setDir(GPIO_BANK8, G
40、PIO_PIN10, GPIO_OUTPUT); /設(shè)置GPIO為輸出模式printf("rnrn* OMAP-L138 LED TEST *rnrn"); /輸出打印信息while(1)/ GPIO_setOutput(GPIO_BANK6, GPIO_PIN13, OUTPUT_LOW);/ USTIMER_delay(500000);/ GPIO_setOutput(GPIO_BANK6, GPIO_PIN13, OUTPUT_HIGH);/ USTIMER_delay(500000);GPIO_setOutput(GPIO_BANK8, GPIO_PIN10, OU
41、TPUT_LOW); /設(shè)置GPIO輸出低電平USTIMER_delay(500000); /延時500msGPIO_setOutput(GPIO_BANK8, GPIO_PIN10, OUTPUT_HIGH); /設(shè)置GPIO輸出高電平USTIMER_delay(500000); /延時500ms上面的代碼就是主函數(shù)的內(nèi)容,簡潔明了,一看注釋就能明白函數(shù)的作用。整體思路也是完全按照芯片手冊中對外設(shè)配置的步驟進行操作的。1 開啟外設(shè)時鐘。2 設(shè)置芯片管腳復(fù)用,用為GPIO。3 設(shè)置GPIO為輸出模式。4 設(shè)置GPIO輸出值,高電平或者低電平。其中第一步是通過EVMOMAPL138_init()
42、這個函數(shù)實現(xiàn)的,具體原理可以參考BSL相關(guān)的源碼注釋,此時已經(jīng)開啟了芯片上所有外設(shè)時鐘,當然也包括了GPIO的。第二步是由EVMOMAPL138_pinmuxConfig()函數(shù)實現(xiàn)的,其內(nèi)部源碼也是對寄存器的操作。第三部是通過GPIO_setDir()函數(shù)實現(xiàn),可以配置為輸入或者輸出。當作為輸入時,配置會更復(fù)雜一些,因為會涉及到中斷等內(nèi)容。第四步通過GPIO_setOutput()函數(shù)實現(xiàn),給指定的GPIO管腳賦值,輸出高電平或者低電平。由此可見,BSL中大部分函數(shù)功能都可以通過名稱知道,內(nèi)部代碼注釋也很全面,容易理解。這個程序的源碼已經(jīng)打包,在CCSV4中直接導(dǎo)入項目就可以運行。運行結(jié)果就
43、是LED燈不停閃爍,亮0.5秒,滅0.5秒。或許有人會問,為什么除main.c之外,還有很多看上去沒用的源文件。這是因為模塊的相關(guān)性導(dǎo)致的,調(diào)用一個模塊的功能函數(shù)的時候,或許會用到其它模塊的函數(shù),因此在編譯的時候必須要將其包含進來,否則編譯會出錯。無論接觸哪種新的硬件平臺,點亮LED一般會是工程師第一個要做的實驗,就像編寫軟件HelloWorld一樣經(jīng)典。雖然程序很短小,但集成了系統(tǒng)設(shè)計中大部分操作。是新手入門,老手熟悉平臺的絕佳選擇。6、DIM138 nand AIS文件燒寫說明各位好,由于最近工作比較忙,很久才更新這次調(diào)試筆記,先說聲抱歉了。另外聲明一下,下面這篇關(guān)于NANDFLASH燒寫
44、的文檔是我們研發(fā)工程師的功勞,我代他發(fā)到論壇上來,可不想搶別人的功勞,哈。同時感謝他白忙之中配合此次論壇活動。他調(diào)試的時候使用的是SEED-DIM138最新的GB底板,LED的地址可能不太一樣,各位需要稍稍留意一下。下面進入正題:1. 首先在下載安裝.net framework 2.0,然后安裝。然后下載安裝AISgen,因為AISgen運行依賴于.net framework。下載地址:.net framework 2.0 :AISgen : 2. 打開CCS4,打開LED工程。修改lind.cmd內(nèi)容如下:-e _bootIRAMStart = 0x80000000;IRAMSize = 0
45、x00020000;DDRStart = 0xc0000000;DDRSize = 0x02000000;DRAMStart = 0x80000000;_DRAMSize = 0x00020000;STACKStart = IRAMStart + IRAMSize;_NAND_EMIFStart = 0x62000000;_NOR_EMIFStart = 0x60000000;MEMORYARM_INTERNAL_RAM (RWXI): origin = 0x80000000 length = 0x00010000SDRAM (RWXI): org=0xc0000000 length = 0x
46、02000000SECTIONS.boot: load = ARM_INTERNAL_RAM.text: load > ARM_INTERNAL_RAM.data: load > ARM_INTERNAL_RAM.bss: load > ARM_INTERNAL_RAM3. 在evmomapl138.c文件中添加函數(shù)void boot(void)asm(" .global STACKStart");asm(" .global _stack");asm(" .global main");asm(" NOP");asm(" MRS r0, cpsr");asm(" BIC r0, r0, #0x1F"); / CLEAR MODESasm(" ORR r0, r0, #0x13"); / SET SUPERVISOR modeasm(" ORR r0, r0, #0xC0"); / Disable FIQ and IRQasm(" MSR cpsr, r0");asm(" NOP");/ Set the IVT t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年新媒體運營兼職內(nèi)容創(chuàng)作者聘用合同3篇
- 二零二五版國際物流運輸服務(wù)電子合同風險評估與管理3篇
- 西安歐亞學院《鉆井液工藝原理》2023-2024學年第一學期期末試卷
- 2025年度廚師團隊培訓與績效評估合同3篇
- 武漢大學《鋼琴與伴奏》2023-2024學年第一學期期末試卷
- 二零二五版人工智能教育合資協(xié)議范本3篇
- 二零二五版建筑行業(yè)工人薪資保障合同范本2篇
- 二零二五年度冷鏈物流車隊運輸合作協(xié)議3篇
- 2024版砌體工程建筑承包合同細則版B版
- 二零二五年知識產(chǎn)權(quán)侵權(quán)糾紛調(diào)解與法律咨詢協(xié)議3篇
- GB/T 45102-2024機采棉采收技術(shù)要求
- 2025年海南省鹽業(yè)集團有限公司招聘筆試參考題庫含答案解析
- 2024-2025學年成都市高一上英語期末考試題(含答案和音頻)
- 2024年南通職業(yè)大學單招職業(yè)技能測試題庫有答案解析
- 2024股權(quán)融資計劃
- 西式面點師試題與答案
- 鋼結(jié)構(gòu)連廊專項吊裝方案(通過專家論證)
- 50MWp漁光互補光伏電站項目錘樁施工方案
- 2025免疫規(guī)劃工作計劃
- 初二家長會課件下載
- 食品安全知識培訓
評論
0/150
提交評論