歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

mini2440之ADS下DMA測試

找到一個dma的ads工程,將其dma功能整到了原來的ads工程TQ2440_Test裡面
用Linux公社(Linuxidc.com)提供的main.c替換原來TQ2440_Test的main.c

main.c下載地址:

下載在Linux公社的1號FTP服務器裡,下載地址:

FTP地址:ftp://www.linuxidc.com

用戶名:www.linuxidc.com

密碼:www.muu.cc

在 2011年LinuxIDC.com\10月\mini2440之ADS下DMA測試

下載方法見 http://www.linuxidc.net/thread-1187-1-1.html

之所以要介紹DMA,因為它對性能太重要了!只有活用了DMA,CPU的性能才能上去!S3c2410有四個DMA,每個DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具體見Datasheet。

這裡具體DMA CONTROL寄存器(DCON)的配置說明,進而引出DMA的各種工作方式。

Atomic transfer:指的是DMA的單次原子操作,它可以是Unit模式(傳輸1個data size),也可以是burst模式(傳輸4個data size),具體對應DCON[28]。

Data Size:指的是單次原子操作的數據位寬,8、16、32,具體對應DCON[21:20]。

Request Source:DMA請求的來源有兩種,軟件&硬件模塊,由DCON[23]控制;當為前者時,由軟件對DMASKTRIG寄存器的位0置位觸發一次DMA 操作。當為後者時,具體來源由DCON[26:24]控制,不同硬件模塊的某時間觸發一次DMA操作,具體要見不同的硬件模塊。
   
DMA service mode:DMA的工作模式有兩種,單一服務模式&整體服務模式。前一模式下,一次DMA請求完成一項原子操作,並且transfer count的值減1。後一模式下,一次DMA請求完成一批原子操作,直到transfer count等於0表示完成一次整體服務。具體對應DCON[27]。

RELOAD:在reload模式下,當transfer count的值變為零時,將自動加src、dst、TC的值加載到CURR_DST、CURR_SRC、CURR_TC,並開始一次新的DMA傳輸。該模式一般和整體服務模式一起使用,也就是說當一次整體服務開始後,src、dst、TC的值都已經被加載,因此可以更改為下一次

   服務的地址,2410說明文檔中建議加入以下語句來判斷當前的服務開始,src、dst、TC的值可以被更改了:while((rDSTATn & 0xfffff) == 0) ;

Req&Ack:DMA請求和應答的協議有兩種,Demard mode 和 Handshake mode。兩者對Request和Ack的時序定義有所不同:在Demard模式下,如果

   DMA完成一次請求如果Request仍然有效,那麼DMA就認為這是下一次DMA請求;在Handshake模式下,DMA完成一次請求後等待Request信號無效,然後把ACK也置無效,再等待下一次Request。這個設計外部DMA請求時可能要用到。

傳輸總長度:DMA一次整體服務傳輸的總長度為:

    Data Size × Atomic transfer size × TC(字節)。

  1. /**************************************************************** 
  2.  NAME: u2440mon.c 
  3.  DESC: u2440mon entry point,menu,download 
  4.  ****************************************************************/  
  5. #define GLOBAL_CLK      1   
  6.   
  7. #include <stdlib.h>   
  8. #include <string.h>   
  9. #include "def.h"   
  10. #include "option.h"   
  11. #include "2440addr.h"   
  12. #include "2440lib.h"   
  13. #include "2440slib.h"   
  14. #include "mmu.h"   
  15. #include "profile.h"   
  16. #include "memtest.h"   
  17.   
  18. extern char Image$RO$Limit[];  
  19. extern char Image$RO$Base[];  
  20. extern char Image$RW$Limit[];  
  21. extern char Image$RW$Base[];  
  22. extern char Image$ZI$Limit[];  
  23. extern char Image$ZI$Base[];  
  24.   
  25. void Isr_Init(void);  
  26. void HaltUndef(void);  
  27. void HaltSwi(void);  
  28. void HaltPabort(void);  
  29. void HaltDabort(void);  
  30. void ClearMemory(void);  
  31.   
  32.   
  33. void Clk0_Enable(int clock_sel);      
  34. void Clk1_Enable(int clock_sel);  
  35. void Clk0_Disable(void);  
  36. void Clk1_Disable(void);  
  37.   
  38. extern void Lcd_TFT_Init(void);  
  39. extern void Lcd_TFT_Test( void ) ;  
  40. extern void Test_Touchpanel(void) ;  
  41. extern void Test_Adc(void) ;  
  42. extern void KeyScan_Test(void) ;  
  43. extern void RTC_Display(void) ;  
  44. extern void Test_IrDA_Tx(void) ;  
  45. extern void PlayMusicTest(void) ;  
  46. extern void RecordTest( void ) ;  
  47. extern void Test_Iic(void) ;  
  48. extern void Test_SDI(void) ;  
  49. extern void Camera_Test( void ) ;  
  50.   
  51. volatile U32 downloadAddress;  
  52.   
  53. void (*restart)(void)=(void (*)(void))0x0;  
  54.   
  55. volatile unsigned char *downPt;  
  56. volatile U32 downloadFileSize;  
  57. volatile U16 checkSum;  
  58. volatile unsigned int err=0;  
  59. volatile U32 totalDmaCount;  
  60.   
  61. volatile int isUsbdSetConfiguration;  
  62.   
  63. int download_run=0;  
  64. U32 tempDownloadAddress;  
  65. int menuUsed=0;  
  66.   
  67. extern char Image$RW$Limit[];  
  68. U32 *pMagicNum=(U32 *)Image$RW$Limit;  
  69. int consoleNum;  
  70.   
  71. static U32 cpu_freq;  
  72. static U32 UPLL;  
  73. static void cal_cpu_bus_clk(void)  
  74. {  
  75.     U32 val;  
  76.     U8 m, p, s;  
  77.       
  78.     val = rMPLLCON;  
  79.     m = (val>>12)&0xff;  
  80.     p = (val>>4)&0x3f;  
  81.     s = val&3;  
  82.   
  83.     //(m+8)*FIN*2 不要超出32位數!   
  84.     FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;  
  85.       
  86.     val = rCLKDIVN;  
  87.     m = (val>>1)&3;  
  88.     p = val&1;    
  89.     val = rCAMDIVN;  
  90.     s = val>>8;  
  91.       
  92.     switch (m) {  
  93.     case 0:  
  94.         HCLK = FCLK;  
  95.         break;  
  96.     case 1:  
  97.         HCLK = FCLK>>1;  
  98.         break;  
  99.     case 2:  
  100.         if(s&2)  
  101.             HCLK = FCLK>>3;  
  102.         else  
  103.             HCLK = FCLK>>2;  
  104.         break;  
  105.     case 3:  
  106.         if(s&1)  
  107.             HCLK = FCLK/6;  
  108.         else  
  109.             HCLK = FCLK/3;  
  110.         break;  
  111.     }  
  112.       
  113.     if(p)  
  114.         PCLK = HCLK>>1;  
  115.     else  
  116.         PCLK = HCLK;  
  117.       
  118.     if(s&0x10)  
  119.         cpu_freq = HCLK;  
  120.     else  
  121.         cpu_freq = FCLK;  
  122.           
  123.     val = rUPLLCON;  
  124.     m = (val>>12)&0xff;  
  125.     p = (val>>4)&0x3f;  
  126.     s = val&3;  
  127.     UPLL = ((m+8)*FIN)/((p+2)*(1<<s));  
  128.     UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;  
  129. }  
  130. /****************************************************************************************************************/  
  131. static volatile unsigned done;  
  132. struct reg  
  133. {  
  134. volatile U32 DISRC;//初始原基地址寄存器   
  135. volatile U32 DISRCC;//初始源控制寄存器   
  136. volatile U32 DIDST;//初始目的基地址寄存器   
  137. volatile U32 DIDSTC;//初始目的控制寄存器   
  138. volatile U32 DCON;//dma控制寄存器   
  139. volatile U32 DSTAT;//狀態/計數寄存器   
  140. volatile U32 DCSRC;//當前源地址寄存器   
  141. volatile U32 DCDST;//當前目的地址寄存器   
  142. volatile U32 DMASKTRIG;//dma掩碼,觸發寄存器   
  143. };//用於描述某個dma通道的9個寄存器   
  144.   
  145.   
  146. /* 
  147. 此timer用於計時,使用了看門狗定時器 
  148. watchdog timer看門狗也是一個定時器,比普通定時器多了一個功能,就是在定時器定時結束時會觸發 
  149. 一個特殊的事件:重啟cpu 
  150. */  
  151. void timer_start(int time)  
  152. {  
  153. rWTCON=((PCLK/1000000-1)<<8)|(time<<3);  
  154. //rWTCON=((PCLK-1)<<8)|(time<<3);   
  155. rWTCNT=0xffff;  
  156. rWTDAT=0xffff;  
  157. rWTCON=rWTCON &~(1<<5)&~(1<<2)|(1<<5);  
  158. }  
  159. /* 
  160.  
  161. rWTCON 
  162. b8-b15,預分頻值 
  163. b3-b4, 
  164. 時鐘分頻選擇 
  165. 00,16 
  166. 01,32 
  167. 10,64 
  168. 11,128* 
  169.  
  170. b5=1,enable watch dog  timer 
  171. b2=0,disable watch dog timer interrupt 
  172.  
  173. 一般 
  174. fclk=400MHZ 
  175. hclk=100MHZ 
  176. pclk=50MHZ 
  177. 可用輸出看一下本板子的頻率 
  178. Uart_Printf("FCLK=%d,HCLK=%d,PCLK=%d\n",FCLK,HCLK,PCLK ); 
  179.  
  180. FCLK=400000000,HCLK=100000000,PCLK=50000000 
  181. 相關寄存器的設置在其他地方 
  182. cal_cpu_bus_clk來查詢相關寄存器以確定fclk,hclk,pclk 
  183. rWTCON高8位設置為50x10^6/10^6-1=49,//用PCLK/1000000-1設置其高8位,即使PCLK變化,狗的時間計算方法也不必變 
  184. 時鐘分頻選擇11為128 
  185. 根據2440 spec 狗的周期為 t_watchdog = 1/[ PCLK / (Prescaler value + 1) / Division_factor ]=128*10^(-6) S=128/1000ms 
  186. 所以有如下計算所用時間的公式 
  187. src_to_dst=timer_stop() 
  188. Uart_Printf("DMA transfer done time=%u MS\n",src_to_dst*128/1000); 
  189.  
  190. */  
  191.   
  192. int timer_stop(void)  
  193. {  
  194. rWTCON=((PCLK/1000000-1)<<8);  
  195. return (0xffff-rWTCNT);  
  196. }  
  197.   
  198. /* 
  199. 本例使用dma傳輸數據的步驟 
  200. 1.指定dma傳輸完成中斷處理函數,設置源目的寄存器,傳輸次數,傳輸模式等 
  201. 2.向cpu發出dma傳輸請求信號,請求cpu將總線控制權交釋放,dma控制器控制數據在兩個內存區間經由總線傳輸, 
  202. 可以是外部引腳請求dma傳輸, 
  203. 也可以是設置寄存器DMASKTRIG  b0來產生請求dma傳輸 
  204. 到底是哪個,由寄存器DCON  b23決定 
  205. 3.比如dma0傳輸完成,則自動產生dma0中斷請求信號,要在中斷處理程序中手動清除中斷請求位 
  206. */  
  207. void __irq DMA0done(void)  
  208. {  
  209. done=1;  
  210. ClearPending(BIT_DMA0);  
  211. }  
  212.   
  213. void __irq DMA1done(void)  
  214. {  
  215. done=1;  
  216. ClearPending(BIT_DMA1);  
  217. }  
  218.   
  219. void __irq DMA2done(void)  
  220. {  
  221. done=1;  
  222. ClearPending(BIT_DMA2);  
  223. }  
  224.   
  225. void __irq DMA3done(void)  
  226. {  
  227. done=1;  
  228. ClearPending(BIT_DMA3);  
  229. }  
  230.   
  231. void DMA_move(int ch,int srcaddr,int dstaddr,int tc,int dsz,int tsz)  
  232. {  
  233. int i;  
  234. struct reg *pDMA;  
  235. int src_to_dst;  
  236. int sum0=0,sum1=0;  
  237. int length;  
  238. length=tc*((tsz)?4:1)*((dsz==0)*1+(dsz==1)*2+(dsz==2)*4);  
  239. /*tc傳輸次數 
  240. tsz每次傳輸幾個數據類型,tsz=0為1個,tsz=1為4個 
  241. dsz傳輸的數據類型,dsz=0為字節,dsz=1為半字,dsz=2為字,dsz=3未指定 
  242. 所以有上面的length計算 
  243. 見2440 spec 
  244. */  
  245. switch(ch)  
  246. {  
  247. case 0:  
  248. pISR_DMA0=(unsigned)DMA0done;//指定dma0中斷處理程序為DMA0done   
  249. EnableIrq(BIT_DMA0);//允許dma0通道產生數據傳輸完成中斷(設置中斷掩碼寄存器0x4a000008)   
  250. pDMA=(void *)0x4b000000;//使pDMA指向通道0的9個寄存器   
  251. break;  
  252. case 1:  
  253. pISR_DMA1=(unsigned)DMA1done;  
  254. EnableIrq(BIT_DMA1);  
  255. pDMA=(void *)0x4b000040;  
  256. break;  
  257. case 2:  
  258. pISR_DMA2=(unsigned)DMA2done;  
  259. EnableIrq(BIT_DMA2);  
  260. pDMA=(void *)0x4b000080;  
  261. break;  
  262. case 3:  
  263. pISR_DMA3=(unsigned)DMA3done;  
  264. EnableIrq(BIT_DMA3);  
  265. pDMA=(void *)0x4b0000c0;  
  266. break;  
  267. default:  
  268. Uart_Printf("channel error\n");  
  269. break;  
  270. }  
  271.   
  272. for(i=srcaddr;i<(srcaddr+length);i+=4)//sum0和sum1用於校驗傳輸是夠正確   
  273. {  
  274. *((U32 *)i)=i^0x55aa5aa5;//按位異或   
  275. sum0+=i^0x55aa5aa5;  
  276. }  
  277. Uart_Printf("DMA%d %8xh->%8xh,size=%xh(tc=%xh),dsz=%d,burst=%d\n",ch,  
  278.             srcaddr,dstaddr,length,tc,dsz,tsz);  
  279. done=0;  
  280. pDMA->DISRC=srcaddr;//源地址   
  281. pDMA->DISRCC=(0<<1)|(0<<0);//源地址所在總線為ahb,源地址自動增加 0 或1 2 4(由dsz定)   
  282. pDMA->DIDST=dstaddr;//目的地址   
  283. pDMA->DIDSTC=(0<<1)|(0<<0);//目的地址所在總線為ahb,目的地址自動增加0 或1 2 4(由dsz定)   
  284. pDMA->DCON=(1<<31)|(1<<30)|(1<<29)|(tsz<<28)|(1<<27)|(0<<23)|(1<<22)|(dsz<<20)|(tc);  
  285. /* 
  286. b31=1單服務握手 
  287. b30=1與hclk同步,高速外設 
  288. b29=1當所有的傳輸結束時,產生中斷請求 
  289.  
  290. b28=tsz ,每次所要傳輸的數據類型個數 
  291. tsz=1,執行4數據長的突發傳輸 boost 
  292. tsz=0.執行單數據傳輸 
  293. note:dma執行期間,和cpu可以交替占有總線 
  294.  
  295.  
  296. b27=1,全服務傳輸,不查詢dreq,但傳輸一次也要釋放總線 
  297.  
  298. b23=0,由軟件方式產生dma請求,需要用DMASKTRIG寄存器的SW_TRIG位置1觸發 
  299.  
  300. b21-b20=dsz,每次傳輸的數據類型設置 
  301. dsz=00,字節 
  302. dsz=01,半字 
  303. dsz=10,字 
  304. dsz=11,保留 
  305.  
  306. b19-b0=tc,傳輸次數,每次自動減1,直至減到0,便產生dma傳輸完成中斷********************** 
  307. */  
  308.   
  309. pDMA->DMASKTRIG=(1<<1)|(1);  
  310. /* 
  311. b1=1,開放通道 
  312. b0=1,此b0是dma軟件觸發位,實現軟件觸發dma請求 
  313. */  
  314.   
  315.   
  316. timer_start(3);//開始計時   
  317. while(done==0);//在done=1之前cpu一直在此循環,實際中的dma傳輸計時不可能是這樣,dma傳輸期間,cpu可以可以去執行其他任務   
  318. src_to_dst=timer_stop();//停止計時,返回本次dma傳輸所用時間   
  319.   
  320. Uart_Printf("DMA transfer done time=%u MS\n",src_to_dst*128/1000);  
  321. DisableIrq(BIT_DMA0);  
  322. DisableIrq(BIT_DMA1);  
  323. DisableIrq(BIT_DMA2);  
  324. DisableIrq(BIT_DMA3);  
  325.   
  326. for(i=dstaddr;i<(dstaddr+length);i+=4)  
  327. sum1+=i^0x55aa5aa5;  
  328.   
  329. Uart_Printf("sum0=%2x,sum1=%2x\n",sum0,sum1);  
  330. if(sum0==sum1)  
  331. Uart_Printf("DMA test OK\n");  
  332. else  
  333. Uart_Printf("DMA test failured\n");  
  334. }  
  335.   
  336. void DMA_test(void)  
  337. {  
  338.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single   
  339.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single       
  340.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single   
  341.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst       
  342.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst   
  343.     DMA_move(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst   
  344.   
  345.     //DMA Ch 1   
  346.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single   
  347.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single   
  348.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single   
  349.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst   
  350.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst   
  351.     DMA_move(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst   
  352.   
  353.     //DMA Ch 2   
  354.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single   
  355.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single   
  356.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single   
  357.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst   
  358.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst   
  359.     DMA_move(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst   
  360.   
  361.     //DMA Ch 3   
  362.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single   
  363.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single   
  364.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single   
  365.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst   
  366.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst   
  367.     DMA_move(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1);   
  368. }  
  369.   
  370.   
  371. /****************************************************************************************************************/  
  372.   
  373. void Temp_function()   
  374.     { Uart_Printf("\nPlease input 1-11 to select test!!!\n"); }  
  375.   
  376. struct {  
  377.     void (*fun)(void);  
  378.     char *tip;  
  379. }CmdTip[] = {  
  380.                 { Temp_function, "Please input 1-11 to select test,song" } ,  
  381.                 { BUZZER_PWM_Test, "Test PWM" } ,  
  382.                 { RTC_Display, "RTC time display" } ,  
  383.                 { Test_Adc, "Test ADC" } ,  
  384.                 { KeyScan_Test, "Test interrupt and key scan" } ,  
  385.                 { Test_Touchpanel, "Test Touchpanel" } ,  
  386.                 { Lcd_TFT_Test, "Test TFT LCD" } ,  
  387.                 { Test_Iic, "Test IIC EEPROM" } ,  
  388.                 { PlayMusicTest, "UDA1341 play music" } ,  
  389.                 { RecordTest, "UDA1341 record voice" } ,  
  390.                 { Test_SDI, "Test SD Card" } ,  
  391.                 { Camera_Test, "Test CMOS Camera"},  
  392.                 { DMA_test, "Test dma"};//add by song    
  393.                 { 0, 0}                       
  394.             };  
  395.   
  396.   
  397. void Main(void)  
  398. {  
  399.     char *mode;  
  400.     int i;  
  401.     U8 key;  
  402.     U32 mpll_val = 0 ;  
  403.     //U32 divn_upll = 0 ;   
  404.       
  405.     #if ADS10      
  406. //  __rt_lib_init(); //for ADS 1.0   
  407.     #endif   
  408.   
  409.     Port_Init();  
  410.       
  411.     Isr_Init();  
  412.       
  413.     i = 2 ; //don't use 100M!   
  414.     switch ( i ) {  
  415.     case 0: //200   
  416.         key = 12;  
  417.         mpll_val = (92<<12)|(4<<4)|(1);  
  418.         break;  
  419.     case 1: //300   
  420.         key = 13;  
  421.         mpll_val = (67<<12)|(1<<4)|(1);  
  422.         break;  
  423.     case 2: //400   
  424.         key = 14;  
  425.         mpll_val = (92<<12)|(1<<4)|(1);  
  426.         break;  
  427.     case 3: //440!!!   
  428.         key = 14;  
  429.         mpll_val = (102<<12)|(1<<4)|(1);  
  430.         break;  
  431.     default:  
  432.         key = 14;  
  433.         mpll_val = (92<<12)|(1<<4)|(1);  
  434.         break;  
  435.     }  
  436.       
  437.     //init FCLK=400M, so change MPLL first   
  438.     ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);  
  439.     ChangeClockDivider(key, 12);  
  440.     cal_cpu_bus_clk();  
  441.       
  442.     consoleNum = 0; // Uart 1 select for debug.   
  443.     Uart_Init( 0,115200 );  
  444.     Uart_Select( consoleNum );  
  445.       
  446.     Beep(2000, 1000);  
  447.       
  448.     Uart_SendByte('\n');  
  449.     Uart_Printf("<***************************************>\n");  
  450.     Uart_Printf("               TQ2440 Test Program\n");  
  451.     Uart_Printf("                www.embedsky.net\n");  
  452.     Uart_Printf("      Build time is: %s  %s\n", __DATE__ , __TIME__  );  
  453.     Uart_Printf("<***************************************>\n");  
  454.   
  455.     rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1    
  456.     rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.   
  457.   
  458.   
  459.     rDSC0 = 0x2aa;  
  460.     rDSC1 = 0x2aaaaaaa;  
  461.     //Enable NAND, USBD, PWM TImer, UART0,1 and GPIO clock,   
  462.     //the others must be enabled in OS!!!   
  463.     rCLKCON = 0xfffff0;  
  464.   
  465.     MMU_Init(); //   
  466.   
  467.     pISR_SWI=(_ISR_STARTADDRESS+0xf0);  //for pSOS   
  468.   
  469.     Led_Display(0x66);  
  470.   
  471.     mode="DMA";  
  472.   
  473.     Clk0_Disable();  
  474.     Clk1_Disable();  
  475.       
  476.     mpll_val = rMPLLCON;  
  477.   
  478.     Lcd_TFT_Init() ;        // LCD initial   
  479.       
  480.     download_run=1; //The default menu is the Download & Run mode.   
  481.   
  482.     while(1)  
  483.     {  
  484.         U8 idx;  
  485.           
  486.         Uart_Printf("\nPlease select function : \n");     
  487.         for(i=0; CmdTip[i].fun!=0; i++)  
  488.             Uart_Printf("%d : %s\n", i, CmdTip[i].tip);  
  489.         idx = Uart_GetIntNum_GJ() ;   
  490.         if(idx<i)  
  491.         {  
  492.             (*CmdTip[idx].fun)();  
  493.             Delay(20);  
  494.             Uart_Init( 0,115200 );  
  495.         }     
  496.       
  497.     }         
  498.   
  499. }  
  500.   
  501. void Isr_Init(void)  
  502. {  
  503.     pISR_UNDEF=(unsigned)HaltUndef;  
  504.     pISR_SWI  =(unsigned)HaltSwi;  
  505.     pISR_PABORT=(unsigned)HaltPabort;  
  506.     pISR_DABORT=(unsigned)HaltDabort;  
  507.     rINTMOD=0x0;      // All=IRQ mode   
  508.     rINTMSK=BIT_ALLMSK;   // All interrupt is masked.   
  509. }  
  510.   
  511.   
  512. void HaltUndef(void)  
  513. {  
  514.     Uart_Printf("Undefined instruction exception!!!\n");  
  515.     while(1);  
  516. }  
  517.   
  518. void HaltSwi(void)  
  519. {  
  520.     Uart_Printf("SWI exception!!!\n");  
  521.     while(1);  
  522. }  
  523.   
  524. void HaltPabort(void)  
  525. {  
  526.     Uart_Printf("Pabort exception!!!\n");  
  527.     while(1);  
  528. }  
  529.   
  530. void HaltDabort(void)  
  531. {  
  532.     Uart_Printf("Dabort exception!!!\n");  
  533.     while(1);  
  534. }  
  535.   
  536.   
  537. void ClearMemory(void)  
  538. {  
  539.     int memError=0;  
  540.     U32 *pt;  
  541.       
  542.     Uart_Printf("Clear Memory (%xh-%xh):WR",_RAM_STARTADDRESS,HEAPEND);  
  543.   
  544.     pt=(U32 *)_RAM_STARTADDRESS;  
  545.     while((U32)pt < HEAPEND)  
  546.     {  
  547.         *pt=(U32)0x0;  
  548.         pt++;  
  549.     }  
  550.       
  551.     if(memError==0)Uart_Printf("\b\bO.K.\n");  
  552. }  
  553.   
  554. void Clk0_Enable(int clock_sel)   
  555. {   // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0   
  556.     rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);  
  557.     rGPHCON = rGPHCON&~(3<<18) | (2<<18);  
  558. }  
  559. void Clk1_Enable(int clock_sel)  
  560. {   // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1       
  561.     rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);  
  562.     rGPHCON = rGPHCON&~(3<<20) | (2<<20);  
  563. }  
  564. void Clk0_Disable(void)  
  565. {  
  566.     rGPHCON = rGPHCON&~(3<<18);   // GPH9 Input   
  567. }  
  568. void Clk1_Disable(void)  
  569. {  
  570.     rGPHCON = rGPHCON&~(3<<20);   // GPH10 Input   
  571. }  
 
  1. Please select function :   
  2. 0 : Please input 1-11 to select test,song  
  3. 1 : Test PWM  
  4. 2 : RTC time display  
  5. 3 : Test ADC  
  6. 4 : Test interrupt and key scan  
  7. 5 : Test Touchpanel  
  8. 6 : Test TFT LCD  
  9. 7 : Test IIC EEPROM  
  10. 8 : UDA1341 play music  
  11. 9 : UDA1341 record voice  
  12. 10 : Test SD Card  
  13. 11 : Test CMOS Camera  
  14. 12 : Test dma  
  15. 12DMA0 31000000h->31800000h,size=80000h(tc=80000h),dsz=0,burst=0  
  16. DMA transfer done time=154 MS  
  17. sum0=fffe0000,sum1=fffe0000  
  18. DMA test OK  
  19. DMA0 31000000h->31800000h,size=80000h(tc=40000h),dsz=1,burst=0  
  20. DMA transfer done time=77 MS  
  21. sum0=fffe0000,sum1=fffe0000  
  22. DMA test OK  
  23. DMA0 31000000h->31800000h,size=80000h(tc=20000h),dsz=2,burst=0  
  24. DMA transfer done time=38 MS  
  25. sum0=fffe0000,sum1=fffe0000  
  26. DMA test OK  
  27. DMA0 31000000h->31800000h,size=80000h(tc=20000h),dsz=0,burst=1  
  28. DMA transfer done time=68 MS  
  29. sum0=fffe0000,sum1=fffe0000  
  30. DMA test OK  
  31. DMA0 31000000h->31800000h,size=80000h(tc=10000h),dsz=1,burst=1  
  32. DMA transfer done time=34 MS  
  33. sum0=fffe0000,sum1=fffe0000  
  34. DMA test OK  
  35. DMA0 31000000h->31800000h,size=80000h(tc=8000h),dsz=2,burst=1  
  36. DMA transfer done time=12 MS  
  37. sum0=fffe0000,sum1=fffe0000  
  38. DMA test OK  
  39. DMA1 31000000h->31800000h,size=80000h(tc=80000h),dsz=0,burst=0  
  40. DMA transfer done time=154 MS  
  41. sum0=fffe0000,sum1=fffe0000  
  42. DMA test OK  
  43. DMA1 31000000h->31800000h,size=80000h(tc=40000h),dsz=1,burst=0  
  44. DMA transfer done time=77 MS  
  45. sum0=fffe0000,sum1=fffe0000  
  46. DMA test OK  
  47. DMA1 31000000h->31800000h,size=80000h(tc=20000h),dsz=2,burst=0  
  48. DMA transfer done time=38 MS  
  49. sum0=fffe0000,sum1=fffe0000  
  50. DMA test OK  
  51. DMA1 31000000h->31800000h,size=80000h(tc=20000h),dsz=0,burst=1  
  52. DMA transfer done time=68 MS  
  53. sum0=fffe0000,sum1=fffe0000  
  54. DMA test OK  
  55. DMA1 31000000h->31800000h,size=80000h(tc=10000h),dsz=1,burst=1  
  56. DMA transfer done time=34 MS  
  57. sum0=fffe0000,sum1=fffe0000  
  58. DMA test OK  
  59. DMA1 31000000h->31800000h,size=80000h(tc=8000h),dsz=2,burst=1  
  60. DMA transfer done time=12 MS  
  61. sum0=fffe0000,sum1=fffe0000  
  62. DMA test OK  
  63. DMA2 31000000h->31800000h,size=80000h(tc=80000h),dsz=0,burst=0  
  64. DMA transfer done time=154 MS  
  65. sum0=fffe0000,sum1=fffe0000  
  66. DMA test OK  
  67. DMA2 31000000h->31800000h,size=80000h(tc=40000h),dsz=1,burst=0  
  68. DMA transfer done time=77 MS  
  69. sum0=fffe0000,sum1=fffe0000  
  70. DMA test OK  
  71. DMA2 31000000h->31800000h,size=80000h(tc=20000h),dsz=2,burst=0  
  72. DMA transfer done time=38 MS  
  73. sum0=fffe0000,sum1=fffe0000  
  74. DMA test OK  
  75. DMA2 31000000h->31800000h,size=80000h(tc=20000h),dsz=0,burst=1  
  76. DMA transfer done time=68 MS  
  77. sum0=fffe0000,sum1=fffe0000  
  78. DMA test OK  
  79. DMA2 31000000h->31800000h,size=80000h(tc=10000h),dsz=1,burst=1  
  80. DMA transfer done time=34 MS  
  81. sum0=fffe0000,sum1=fffe0000  
  82. DMA test OK  
  83. DMA2 31000000h->31800000h,size=80000h(tc=8000h),dsz=2,burst=1  
  84. DMA transfer done time=12 MS  
  85. sum0=fffe0000,sum1=fffe0000  
  86. DMA test OK  
  87. DMA3 31000000h->31800000h,size=80000h(tc=80000h),dsz=0,burst=0  
  88. DMA transfer done time=154 MS  
  89. sum0=fffe0000,sum1=fffe0000  
  90. DMA test OK  
  91. DMA3 31000000h->31800000h,size=80000h(tc=40000h),dsz=1,burst=0  
  92. DMA transfer done time=77 MS  
  93. sum0=fffe0000,sum1=fffe0000  
  94. DMA test OK  
  95. DMA3 31000000h->31800000h,size=80000h(tc=20000h),dsz=2,burst=0  
  96. DMA transfer done time=38 MS  
  97. sum0=fffe0000,sum1=fffe0000  
  98. DMA test OK  
  99. DMA3 31000000h->31800000h,size=80000h(tc=20000h),dsz=0,burst=1  
  100. DMA transfer done time=68 MS  
  101. sum0=fffe0000,sum1=fffe0000  
  102. DMA test OK  
  103. DMA3 31000000h->31800000h,size=80000h(tc=10000h),dsz=1,burst=1  
  104. DMA transfer done time=34 MS  
  105. sum0=fffe0000,sum1=fffe0000  
  106. DMA test OK  
  107. DMA3 31000000h->31800000h,size=80000h(tc=8000h),dsz=2,burst=1  
  108. DMA transfer done time=12 MS  
  109. sum0=fffe0000,sum1=fffe0000  
  110. DMA test OK  
Copyright © Linux教程網 All Rights Reserved