mini2440之ADS下DMA测试


找到一个dma的ads工程,将其dma功能整到了原来的ads工程TQ2440_Test里面
用帮客之家(Linuxidc.com)提供的main.c替换原来TQ2440_Test的main.c

main.c下载地址:

下载在帮客之家的1号FTP服务器里,下载地址:

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

用户名:www.bkjia.com

密码:www.muu.cc

在 2011年LinuxIDC.com\10月\mini2440之ADS下DMA测试

下载方法见 http://www.bkjia.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  

相关内容