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

S3C6410裸機程序相關系統函數

S3C6410裸機程序中可能用到的文件以及函數

//system.c

  1. /************************************************************************************************************* 
  2.  * 文件名: system.c 
  3.  * 功能:      S3C6410相關系統函數 
  4.  * 作者:      cp1300@139.com 
  5.  * 創建時間:    2012年3月4日11:25 
  6.  * 最後修改時間:2012年3月4日 
  7.  * 詳細:      2012年3月5日17:00 添加VIC相關函數 
  8. *************************************************************************************************************/ 
  9. #include "system.h"  
  10.  
  11.  
  12. /************************************************************************************************************************* 
  13. *函數        :    void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger) 
  14. *功能        :    設置外部中斷組0觸發模式 
  15. *參數        :    EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發模式(EXT_LowLevel:低電平觸發;EXT_HighLevel:高電平觸發; 
  16.                     EXT_NegEdge:下降沿觸發;EXT_PosEdge:上升沿觸發;EXT_Edge:邊沿觸發) 
  17. *返回        :    無 
  18. *依賴        :    底層宏定義 
  19. *作者        :    cp1300@139.com 
  20. *時間        :    20120304 
  21. *最後修改時間:    20120304 
  22. *說明        :    編號 GPN0--->GPN15  GPL8--->GPL14  GPM0--->GPM4,中斷設置必須兩個兩個一起 
  23. *************************************************************************************************************************/ 
  24. void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger) 
  25. {     
  26.     if(EINT0_N & 0x80) //EINT0CON1  
  27.     { 
  28.         EINT0_N -= 0x80;//減去標記  
  29.         rEINT0CON1 &= ~(7 << EINT0_N);//清楚原來的設置  
  30.         rEINT0CON1 |= Trigger << EINT0_N; 
  31.     } 
  32.     else    //EINT0CON0  
  33.     { 
  34.         rEINT0CON0 &= ~(7 << EINT0_N);//清楚原來的設置  
  35.         rEINT0CON0 |= Trigger << EINT0_N; 
  36.     } 
  37. } 
  38.  
  39.  
  40.  
  41. /************************************************************************************************************************* 
  42. *函數        :    void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable) 
  43. *功能        :  CLK時鐘門控設置(HCLK,PCLK,SCLK) 
  44. *參數        :  CLK_DIV:外設(見:CLK門控時鐘定義);Enable = ENABLE,1使能;=DISABLE,0失能 
  45. *返回        :  無 
  46. *依賴        :    底層宏定義 
  47. *作者        :  cp1300@139.com 
  48. *時間        :    20120305 
  49. *最後修改時間:    20121005 
  50. *說明        :  PCLK_GATE添加標識0x40,SCLK_GATE添加標示0x80; 
  51. *************************************************************************************************************************/ 
  52.  
  53. void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable) 
  54. { 
  55.     vu32 *P = &rHCLK_GATE; 
  56.      
  57.     if(CLK_DIV & 0x80)      //SCLK  
  58.     { 
  59.         P = &rSCLK_GATE; 
  60.         CLK_DIV -= 0x80;    //去掉標示  
  61.     } 
  62.     else if(CLK_DIV & 0x40) //PCLK  
  63.     { 
  64.         P = &rPCLK_GATE; 
  65.         CLK_DIV -= 0x40;    //去掉標示  
  66.     } 
  67.     if(Enable == ENABLE)    //使能  
  68.         *P |= 1 << CLK_DIV; 
  69.     else        //失能  
  70.         *P &= ~(1 << CLK_DIV); 
  71. } 
  72.  
  73.  
  74.  
  75. /************************************************************************************************************************* 
  76. *函數        :    void Set_INTtoIRQ(u8 INT_N) 
  77. *功能        :  設置一個中斷為IRQ 
  78. *參數        :  INT_N:中斷編號(見:中斷源編號定義); 
  79. *返回        :  無 
  80. *依賴        :    底層宏定義 
  81. *作者        :  cp1300@139.com 
  82. *時間        :    20120305 
  83. *最後修改時間:    20120305 
  84. *說明        :  設置一個中斷為普通中斷模式 
  85. *************************************************************************************************************************/ 
  86. void Set_INTtoIRQ(vu8 INT_N) 
  87. { 
  88.     if(INT_N > 31)   //VIC1  
  89.     { 
  90.         INT_N -= 32; 
  91.         VIC1->INTSELECT &= ~(1 << INT_N); 
  92.     } 
  93.     else            //VIC0  
  94.         VIC0->INTSELECT &= ~(1 << INT_N); 
  95. } 
  96.  
  97.  
  98. /************************************************************************************************************************* 
  99. *函數        :    void Set_INTtoFIQ(u8 INT_N) 
  100. *功能        :  設置一個中斷為FIQ 
  101. *參數        :  INT_N:中斷編號(見:中斷源編號定義); 
  102. *返回        :  無 
  103. *依賴        :    底層宏定義 
  104. *作者        :  cp1300@139.com 
  105. *時間        :    20120305 
  106. *最後修改時間:    20120305 
  107. *說明        :  設置一個中斷為快速中斷模式 
  108. *************************************************************************************************************************/ 
  109. void Set_INTtoFIQ(vu8 INT_N) 
  110. { 
  111.     if(INT_N > 31)   //VIC1  
  112.     { 
  113.         INT_N -= 32; 
  114.         VIC1->INTSELECT |= (1 << INT_N); 
  115.     } 
  116.     else            //VIC0  
  117.         VIC0->INTSELECT |= (1 << INT_N); 
  118. } 
  119.  
  120.  
  121. /************************************************************************************************************************* 
  122. *函數        :    void Set_IntEnable(u8 INT_N,FunctionalState EnInt) 
  123. *功能        :  開啟或關閉一個VIC中斷 
  124. *參數        :  INT_N:中斷編號(見:中斷源編號定義), 
  125. *           EnInt = ENABLE,1使能;=DISABLE,0失能; 
  126. *返回        :  無 
  127. *依賴        :    底層宏定義 
  128. *作者        :  cp1300@139.com 
  129. *時間        :    20120305 
  130. *最後修改時間:    20120305 
  131. *說明        :  使能或失能VIC0,VIC1的一個中斷 
  132. *************************************************************************************************************************/ 
  133. void Set_IntEnable(vu8 INT_N,FunctionalState EnInt) 
  134. { 
  135.     VICx_TypeDef *P = VIC0; 
  136.      
  137.     if(INT_N > 31)   //VIC1  
  138.     { 
  139.         INT_N -= 32; 
  140.         P = VIC1; 
  141.     }   
  142.     if(EnInt == ENABLE) //使能中斷  
  143.         P->INTENABLE = 1 << INT_N; //寫1使能中斷,寫0無影響  
  144.     else        //取消中斷  
  145.         P->INTENCLEAR = 1 << INT_N;    //寫1清除中斷使能,寫0無影響  
  146. } 
  147.  
  148.  
  149. /************************************************************************************************************************* 
  150. *函數        :    u8 Get_IntEnable(vu8 INT_N) 
  151. *功能        :  獲取一個中斷屏蔽狀態 
  152. *參數        :  中斷編號 
  153. *返回        :  1:該中斷失能,0:該中斷失能 
  154. *依賴        :    底層宏定義 
  155. *作者        :  cp1300@139.com 
  156. *時間        :    20120524 
  157. *最後修改時間:    20120524 
  158. *說明        :  獲取一個中斷屏蔽狀態 
  159. *************************************************************************************************************************/ 
  160. u8 Get_IntEnable(vu8 INT_N) 
  161. { 
  162.     VICx_TypeDef *P = VIC0; 
  163.      
  164.     if(INT_N > 31)   //VIC1  
  165.     { 
  166.         INT_N -= 32; 
  167.         P = VIC1; 
  168.     }   
  169.     if(P->INTENABLE & (1 << INT_N)) //該中斷使能  
  170.         return 1; 
  171.     else   
  172.         return 0; 
  173. } 
  174.  
  175.  
  176. /************************************************************************************************************************* 
  177. *函數        :    void Set_SoftInt(u8 INT_N,u8 ENABLE) 
  178. *功能        :  開啟或關閉一個軟件中斷 
  179. *參數        :  INT_N:中斷編號(見:中斷源編號定義),ENABLE = Enable,1使能;=Disable,0失能; 
  180. *返回        :  無 
  181. *依賴        :    底層宏定義 
  182. *作者        :  cp1300@139.com 
  183. *時間        :    20120305 
  184. *最後修改時間:    20120305 
  185. *說明        :  使能或失能VIC0,VIC1的一個軟件中斷 
  186. *************************************************************************************************************************/ 
  187. void Set_SoftInt(vu8 INT_N,vu8 ENABLE) 
  188. { 
  189.     VICx_TypeDef *P = VIC0; 
  190.      
  191.     if(INT_N > 31)   //VIC1  
  192.     { 
  193.         INT_N -= 32; 
  194.         P = VIC1; 
  195.     }   
  196.     if(ENABLE) //使能中斷  
  197.         P->SOFTINT = 1 << INT_N;   //寫1使能軟件中斷,寫0無影響  
  198.     else        //取消中斷  
  199.         P->SOFTINTCLEAR = 1 << INT_N;  //寫1清除軟件中斷使能,寫0無影響  
  200. } 
  201.  
  202.  
  203.  
  204. /************************************************************************************************************************* 
  205. *函數        :    void Set_IsrAddr(u8 INT_N,vu32 IsrAdd) 
  206. *功能        :  設置中斷矢量入口 
  207. *參數        :  INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務程序指針; 
  208. *返回        :  無 
  209. *依賴        :    底層宏定義 
  210. *作者        :  cp1300@139.com 
  211. *時間        :    20120305 
  212. *最後修改時間:    20120311 
  213. *說明        :  設置矢量地址寄存器 
  214. *************************************************************************************************************************/ 
  215. void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd) 
  216. { 
  217.     VICx_TypeDef *P = VIC0; 
  218.      
  219.     if(INT_N > 31)   //VIC1  
  220.     { 
  221.         INT_N -= 32; 
  222.         P = VIC1; 
  223.     } 
  224.     P->VECTADDR[INT_N] = IsrAdd;//將中斷服務程序入口地址寫入矢量地址寄存器  
  225. } 
  226.  
  227.  
  228. /************************************************************************************************************************* 
  229. *函數        :    void Set_VectorPriority(u8 INT_N,u8 Priority) 
  230. *功能        :  設置矢量優先級 
  231. *參數        :  INT_N:中斷編號(見:中斷源編號定義),Priority:優先級0-15; 
  232. *返回        :  無 
  233. *依賴        :    底層宏定義 
  234. *作者        :  cp1300@139.com 
  235. *時間        :    20120305 
  236. *最後修改時間:    20120305 
  237. *說明        :  優先級為0-15,值越大優先級越高,15最高,0最低; 
  238. *************************************************************************************************************************/ 
  239. void Set_VectorPriority(vu8 INT_N,vu8 Priority) 
  240. { 
  241.     VICx_TypeDef *P = VIC0; 
  242.      
  243.     if(INT_N > 31)   //VIC1  
  244.     { 
  245.         INT_N -= 32; 
  246.         P = VIC1; 
  247.     } 
  248.     P->VECTRPRIORITY[INT_N] = Priority;//將中斷優先級寫入寄存器  
  249. } 
  250.  
  251.  
  252.  
  253.  
  254.  
  255. /************************************************************************************************************************* 
  256. *函數        :    u32 Get_PLLCLK(int pllreg) 
  257. *功能        :  獲取PLL時鐘頻率 
  258. *參數        :  pllreg : PLL選擇 
  259.                     APLL    0   //ARM內核時鐘PLL 
  260.                     MPLL    1   //主時鐘PLL 
  261.                     EPLL    2   //外設時鐘PLL 
  262. *返回        :  頻率,HZ 
  263. *依賴        :    底層宏定義 
  264. *作者        :  cp1300@139.com 
  265. *時間        :    20120526 
  266. *最後修改時間:    20120526 
  267. *說明        :  無 
  268. *************************************************************************************************************************/ 
  269. u32 Get_PLLCLK(u8 pllreg) 
  270. { 
  271.     u32 r = 0, m, p, s; 
  272.  
  273.     if (pllreg == APLL) 
  274.         r = rAPLL_CON; 
  275.     else if (pllreg == MPLL) 
  276.         r = rMPLL_CON; 
  277.     else if (pllreg == EPLL) 
  278.         r = rEPLL_CON0; 
  279.  
  280.     m = (r>>16) & 0x3ff; 
  281.     p = (r>>8) & 0x3f; 
  282.     s = r & 0x7; 
  283.  
  284.     return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 << s)))); 
  285. } 
  286.  
  287.  
  288. /************************************************************************************************************************* 
  289. *函數        :    u32 Get_FCLK(void) 
  290. *功能        :  獲取FCLK時鐘頻率 
  291. *參數        :  無 
  292. *返回        :  頻率,HZ 
  293. *依賴        :    底層宏定義 
  294. *作者        :  cp1300@139.com 
  295. *時間        :    20120526 
  296. *最後修改時間:    20120526 
  297. *說明        :  無 
  298. *************************************************************************************************************************/ 
  299. u32 Get_FCLK(void) 
  300. { 
  301.     return (Get_PLLCLK(APLL)); 
  302. } 
  303.  
  304.  
  305.  
  306. /************************************************************************************************************************* 
  307. *函數        :    u32 Get_PCLK(void) 
  308. *功能        :  獲取PCLK時鐘頻率 
  309. *參數        :  無 
  310. *返回        :  頻率,HZ 
  311. *依賴        :    底層宏定義 
  312. *作者        :  cp1300@139.com 
  313. *時間        :    20120526 
  314. *最後修改時間:    20120526 
  315. *說明        :  無 
  316. *************************************************************************************************************************/ 
  317. u32 Get_PCLK(void) 
  318. { 
  319.     u32 fclk; 
  320.     u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1; 
  321.     u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1; 
  322.  
  323.     if(rOTHERS & 0x80) 
  324.         fclk = Get_FCLK();      // SYNC Mode  
  325.     else 
  326.         fclk = Get_PLLCLK(MPLL);    // ASYNC Mode  
  327.  
  328.     return fclk/(hclkx2_div * pre_div); 
  329. } 
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. //////////////////////////////////////////////////////////////////  
  343. //???????′???,???printf????,  
  344. //PRINTF_EN == 1,?????printf??????  
  345. #if (PRINTF_EN_ == 1)  
  346. #include "uart.h"   
  347.  
  348. int fputc(int ch,FILE *f) 
  349. {       
  350.     UART0_SendByte((u8)ch);       
  351.     return ch; 
  352. } 
  353. #endif  
  354.  
  355. //PRINTF_EN == 2,?????printf?????  
  356. #if (PRINTF_EN_== 2)  
  357. #include "tft_lcd.h"  
  358.  
  359. int fputc(int ch, FILE *f) 
  360. {     
  361.     static u16 X; 
  362.     static u16 X1; 
  363.     static u16 Y; 
  364.     static u8 flag; 
  365.      
  366.     if(flag == 0) 
  367.     { 
  368.         if(Y > LCD_YSIZE-1-16) 
  369.         { 
  370.              
  371.             Y = 0; 
  372.             X = X1 = LCD_XSIZE/2; 
  373.             flag = 1; 
  374.             LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  
  375.         } 
  376.     } 
  377.     else 
  378.     { 
  379.         if(Y > LCD_YSIZE-1-16) 
  380.         { 
  381.             Y = 0; 
  382.             X = X1 = 0; 
  383.             flag = 0; 
  384.             LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  
  385.         } 
  386.     } 
  387.      
  388.      
  389.     if((u8)ch == '\n') 
  390.     { 
  391.         X = X1; 
  392.         Y += 12; 
  393.     } 
  394.     else if((u8)ch > 0x80) //????  
  395.     { 
  396.         return ch; 
  397.     } 
  398.     else 
  399.     { 
  400.         LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80); 
  401.          
  402.         if(flag == 0) 
  403.         { 
  404.             if(X > LCD_XSIZE/2-1-8) 
  405.             { 
  406.                 X = X1; 
  407.                 Y += 12; 
  408.             } 
  409.             else 
  410.                 X += 8; 
  411.         } 
  412.         else 
  413.         { 
  414.             if(X > LCD_XSIZE-1-8) 
  415.             { 
  416.                 X = X1; 
  417.                 Y += 12; 
  418.             } 
  419.             else 
  420.                 X += 8; 
  421.         } 
  422.     }       
  423.  
  424.     return ch; 
  425. } 
  426. #endif  
  427.  
  428.  
  429. //PRINTF_EN == 3,???????printf??????????  
  430. #if (PRINTF_EN_ == 3)  
  431. #include "tft_lcd.h"  
  432. #include "uart.h"  
  433. #include <locale.h>  
  434. u8 PrintfSet = 0;   //0:????printf??????;1:????printf?????  
  435.  
  436. int fputc(int ch, FILE *f) 
  437. {     
  438.     static u16 X; 
  439.     static u16 X1; 
  440.     static u16 Y; 
  441.     static u8 flag; 
  442.      
  443.     if(PrintfSet) 
  444.     { 
  445.         if(flag == 0) 
  446.         { 
  447.             if(Y > LCD_YSIZE-1-16) 
  448.             { 
  449.                  
  450.                 Y = 0; 
  451.                 X = X1 = LCD_XSIZE/2; 
  452.                 flag = 1; 
  453.                 LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  
  454.             } 
  455.         } 
  456.         else 
  457.         { 
  458.             if(Y > LCD_YSIZE-1-16) 
  459.             { 
  460.                 Y = 0; 
  461.                 X = X1 = 0; 
  462.                 flag = 0; 
  463.                 LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  
  464.             } 
  465.         } 
  466.          
  467.          
  468.         if((u8)ch == '\n') 
  469.         { 
  470.             X = X1; 
  471.             Y += 12; 
  472.         } 
  473.         else if((u8)ch > 0x80) //????  
  474.         { 
  475.             return ch; 
  476.         } 
  477.         else 
  478.         { 
  479.             LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80); 
  480.              
  481.             if(flag == 0) 
  482.             { 
  483.                 if(X > LCD_XSIZE/2-1-8) 
  484.                 { 
  485.                     X = X1; 
  486.                     Y += 12; 
  487.                 } 
  488.                 else 
  489.                     X += 8; 
  490.             } 
  491.             else 
  492.             { 
  493.                 if(X > LCD_XSIZE-1-8) 
  494.                 { 
  495.                     X = X1; 
  496.                     Y += 12; 
  497.                 } 
  498.                 else 
  499.                     X += 8; 
  500.             } 
  501.         } 
  502.     } 
  503.     else 
  504.         UART0_SendByte((u8)ch); 
  505.  
  506.     return ch; 
  507. } 
  508. #endif 
/*************************************************************************************************************
 * 文件名:	system.c
 * 功能:		S3C6410相關系統函數
 * 作者:		cp1300@139.com
 * 創建時間:	2012年3月4日11:25
 * 最後修改時間:2012年3月4日
 * 詳細:		2012年3月5日17:00 添加VIC相關函數
*************************************************************************************************************/
#include "system.h"


/*************************************************************************************************************************
*函數        :	void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)
*功能        :	設置外部中斷組0觸發模式
*參數        :	EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發模式(EXT_LowLevel:低電平觸發;EXT_HighLevel:高電平觸發;
					EXT_NegEdge:下降沿觸發;EXT_PosEdge:上升沿觸發;EXT_Edge:邊沿觸發)
*返回        :	無
*依賴        :	底層宏定義
*作者        :	cp1300@139.com
*時間        :	20120304
*最後修改時間:	20120304
*說明        :	編號 GPN0--->GPN15  GPL8--->GPL14  GPM0--->GPM4,中斷設置必須兩個兩個一起
*************************************************************************************************************************/
void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger)
{	
	if(EINT0_N & 0x80) //EINT0CON1
	{
		EINT0_N -= 0x80;//減去標記
		rEINT0CON1 &= ~(7 << EINT0_N);//清楚原來的設置
		rEINT0CON1 |= Trigger << EINT0_N;
	}
	else	//EINT0CON0
	{
		rEINT0CON0 &= ~(7 << EINT0_N);//清楚原來的設置
		rEINT0CON0 |= Trigger << EINT0_N;
	}
}



/*************************************************************************************************************************
*函數        :	void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)
*功能        :  CLK時鐘門控設置(HCLK,PCLK,SCLK)
*參數        :  CLK_DIV:外設(見:CLK門控時鐘定義);Enable = ENABLE,1使能;=DISABLE,0失能
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20121005
*說明        :  PCLK_GATE添加標識0x40,SCLK_GATE添加標示0x80;
*************************************************************************************************************************/

void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)
{
	vu32 *P = &rHCLK_GATE;
	
	if(CLK_DIV & 0x80)		//SCLK
	{
		P = &rSCLK_GATE;
		CLK_DIV -= 0x80;	//去掉標示
	}
	else if(CLK_DIV & 0x40)	//PCLK
	{
		P = &rPCLK_GATE;
		CLK_DIV -= 0x40;	//去掉標示
	}
	if(Enable == ENABLE)	//使能
		*P |= 1 << CLK_DIV;
	else		//失能
		*P &= ~(1 << CLK_DIV);
}



/*************************************************************************************************************************
*函數        :	void Set_INTtoIRQ(u8 INT_N)
*功能        :  設置一個中斷為IRQ
*參數        :  INT_N:中斷編號(見:中斷源編號定義);
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  設置一個中斷為普通中斷模式
*************************************************************************************************************************/
void Set_INTtoIRQ(vu8 INT_N)
{
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		VIC1->INTSELECT &= ~(1 << INT_N);
	}
	else			//VIC0
		VIC0->INTSELECT &= ~(1 << INT_N);
}


/*************************************************************************************************************************
*函數        :	void Set_INTtoFIQ(u8 INT_N)
*功能        :  設置一個中斷為FIQ
*參數        :  INT_N:中斷編號(見:中斷源編號定義);
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  設置一個中斷為快速中斷模式
*************************************************************************************************************************/
void Set_INTtoFIQ(vu8 INT_N)
{
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		VIC1->INTSELECT |= (1 << INT_N);
	}
	else			//VIC0
		VIC0->INTSELECT |= (1 << INT_N);
}


/*************************************************************************************************************************
*函數        :	void Set_IntEnable(u8 INT_N,FunctionalState EnInt)
*功能        :  開啟或關閉一個VIC中斷
*參數        :  INT_N:中斷編號(見:中斷源編號定義),
* 			EnInt = ENABLE,1使能;=DISABLE,0失能;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  使能或失能VIC0,VIC1的一個中斷
*************************************************************************************************************************/
void Set_IntEnable(vu8 INT_N,FunctionalState EnInt)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(EnInt == ENABLE) //使能中斷
		P->INTENABLE = 1 << INT_N;	//寫1使能中斷,寫0無影響
	else		//取消中斷
		P->INTENCLEAR = 1 << INT_N;	//寫1清除中斷使能,寫0無影響
}


/*************************************************************************************************************************
*函數        :	u8 Get_IntEnable(vu8 INT_N)
*功能        :  獲取一個中斷屏蔽狀態
*參數        :  中斷編號
*返回        :  1:該中斷失能,0:該中斷失能
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120524
*最後修改時間: 	20120524
*說明        :  獲取一個中斷屏蔽狀態
*************************************************************************************************************************/
u8 Get_IntEnable(vu8 INT_N)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(P->INTENABLE & (1 << INT_N)) //該中斷使能
		return 1;
	else 
		return 0;
}


/*************************************************************************************************************************
*函數        :	void Set_SoftInt(u8 INT_N,u8 ENABLE)
*功能        :  開啟或關閉一個軟件中斷
*參數        :  INT_N:中斷編號(見:中斷源編號定義),ENABLE = Enable,1使能;=Disable,0失能;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  使能或失能VIC0,VIC1的一個軟件中斷
*************************************************************************************************************************/
void Set_SoftInt(vu8 INT_N,vu8 ENABLE)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(ENABLE) //使能中斷
		P->SOFTINT = 1 << INT_N;	//寫1使能軟件中斷,寫0無影響
	else		//取消中斷
		P->SOFTINTCLEAR = 1 << INT_N;	//寫1清除軟件中斷使能,寫0無影響
}



/*************************************************************************************************************************
*函數        :	void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)
*功能        :  設置中斷矢量入口
*參數        :  INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務程序指針;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120311
*說明        :  設置矢量地址寄存器
*************************************************************************************************************************/
void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	}
	P->VECTADDR[INT_N] = IsrAdd;//將中斷服務程序入口地址寫入矢量地址寄存器
}


/*************************************************************************************************************************
*函數        :	void Set_VectorPriority(u8 INT_N,u8 Priority)
*功能        :  設置矢量優先級
*參數        :  INT_N:中斷編號(見:中斷源編號定義),Priority:優先級0-15;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  優先級為0-15,值越大優先級越高,15最高,0最低;
*************************************************************************************************************************/
void Set_VectorPriority(vu8 INT_N,vu8 Priority)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	}
	P->VECTRPRIORITY[INT_N] = Priority;//將中斷優先級寫入寄存器
}





/*************************************************************************************************************************
*函數        :	u32 Get_PLLCLK(int pllreg)
*功能        :  獲取PLL時鐘頻率
*參數        :  pllreg : PLL選擇
					APLL 	0	//ARM內核時鐘PLL
					MPLL 	1	//主時鐘PLL
					EPLL 	2	//外設時鐘PLL
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_PLLCLK(u8 pllreg)
{
	u32 r = 0, m, p, s;

	if (pllreg == APLL)
		r = rAPLL_CON;
	else if (pllreg == MPLL)
		r = rMPLL_CON;
	else if (pllreg == EPLL)
		r = rEPLL_CON0;

	m = (r>>16) & 0x3ff;
	p = (r>>8) & 0x3f;
	s = r & 0x7;

	return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 << s))));
}


/*************************************************************************************************************************
*函數        :	u32 Get_FCLK(void)
*功能        :  獲取FCLK時鐘頻率
*參數        :  無
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_FCLK(void)
{
	return (Get_PLLCLK(APLL));
}



/*************************************************************************************************************************
*函數        :	u32 Get_PCLK(void)
*功能        :  獲取PCLK時鐘頻率
*參數        :  無
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  cp1300@139.com
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_PCLK(void)
{
	u32 fclk;
	u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1;
	u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1;

	if(rOTHERS & 0x80)
		fclk = Get_FCLK();		// SYNC Mode
	else
		fclk = Get_PLLCLK(MPLL);	// ASYNC Mode

	return fclk/(hclkx2_div * pre_div);
}












//////////////////////////////////////////////////////////////////
//???????′???,???printf????,
//PRINTF_EN == 1,?????printf??????
#if (PRINTF_EN_ == 1)
#include "uart.h" 

int fputc(int ch,FILE *f)
{     
	UART0_SendByte((u8)ch);     
	return ch;
}
#endif

//PRINTF_EN == 2,?????printf?????
#if (PRINTF_EN_== 2)
#include "tft_lcd.h"

int fputc(int ch, FILE *f)
{    
	static u16 X;
	static u16 X1;
	static u16 Y;
	static u8 flag;
 	
 	if(flag == 0)
 	{
	 	if(Y > LCD_YSIZE-1-16)
		{
			
			Y = 0;
			X = X1 = LCD_XSIZE/2;
			flag = 1;
			LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);	//????????
		}
 	}
 	else
 	{
	 	if(Y > LCD_YSIZE-1-16)
		{
			Y = 0;
			X = X1 = 0;
			flag = 0;
			LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff);	//????????
		}
 	}
	
	
	if((u8)ch == '\n')
	{
	 	X = X1;
		Y += 12;
	}
	else if((u8)ch > 0x80) //????
	{
		return ch;
	}
	else
	{
		LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
		
		if(flag == 0)
		{
			if(X > LCD_XSIZE/2-1-8)
			{
			 	X = X1;
				Y += 12;
			}
			else
				X += 8;
		}
		else
		{
			if(X > LCD_XSIZE-1-8)
			{
			 	X = X1;
				Y += 12;
			}
			else
				X += 8;
		}
	}     

	return ch;
}
#endif


//PRINTF_EN == 3,???????printf??????????
#if (PRINTF_EN_ == 3)
#include "tft_lcd.h"
#include "uart.h"
#include <locale.h>
u8 PrintfSet = 0;	//0:????printf??????;1:????printf?????

int fputc(int ch, FILE *f)
{    
	static u16 X;
	static u16 X1;
	static u16 Y;
	static u8 flag;
 	
	if(PrintfSet)
	{
		if(flag == 0)
	 	{
		 	if(Y > LCD_YSIZE-1-16)
			{
				
				Y = 0;
				X = X1 = LCD_XSIZE/2;
				flag = 1;
				LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);	//????????
			}
	 	}
	 	else
	 	{
		 	if(Y > LCD_YSIZE-1-16)
			{
				Y = 0;
				X = X1 = 0;
				flag = 0;
				LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff);	//????????
			}
	 	}
		
		
		if((u8)ch == '\n')
		{
		 	X = X1;
			Y += 12;
		}
		else if((u8)ch > 0x80) //????
		{
			return ch;
		}
		else
		{
			LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
			
			if(flag == 0)
			{
				if(X > LCD_XSIZE/2-1-8)
				{
				 	X = X1;
					Y += 12;
				}
				else
					X += 8;
			}
			else
			{
				if(X > LCD_XSIZE-1-8)
				{
				 	X = X1;
					Y += 12;
				}
				else
					X += 8;
			}
		}
	}
	else
		UART0_SendByte((u8)ch);

	return ch;
}
#endif






//system.h

 

 

[cpp] view plaincopyprint?
  1. /************************************************************************************************************* 
  2.  * 文件名: system.h 
  3.  * 功能:      S3C6410相關系統函數 
  4.  * 作者:      cp1300@139.com 
  5.  * 創建時間:    2012年3月4日11:25 
  6.  * 最後修改時間:2012年3月4日 
  7.  * 詳細:      相關系統操作宏定義 
  8. *************************************************************************************************************/ 
  9.  
  10. #ifndef _SYSTEM_H_  
  11. #define _SYSTEM_H_   
  12.  
  13. #include "sys_types.h"  
  14. #include "stdio.h"  
  15. #include "s3c6410_map.h"  
  16.  
  17. #define Debug printf    //調試支持  
  18.  
  19. #define nop __nop()     //空指令延時一個系統時鐘周期  
  20.  
  21.  
  22.  
  23. //相關外部函數申明  
  24. void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger);//設置外部中斷組0觸發模式  
  25. void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable);   //CLK時鐘門控設置(HCLK,PCLK,SCLK)  
  26. void Set_INTtoIRQ(vu8 INT_N);   //設置一個中斷為IRQ  
  27. void Set_INTtoFIQ(vu8 INT_N);   //設置一個中斷為FIQ  
  28. void Set_IntEnable(vu8 INT_N,FunctionalState EnInt);    //開啟或關閉一個VIC中斷  
  29. void Set_SoftInt(vu8 INT_N,vu8 ENABLE); //開啟或關閉一個軟件中斷  
  30. void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd);    //設置中斷矢量入口  
  31. void Set_VectorPriority(vu8 INT_N,vu8 Priority);    //設置矢量優先級  
  32. u8 Get_IntEnable(vu8 INT_N);    //獲取一個中斷屏蔽狀態  
  33. u32 Get_PCLK(void);         //獲取PCLK時鐘頻率  
  34. u32 Get_FCLK(void);         //獲取FCLK時鐘頻率  
  35. u32 Get_PLLCLK(u8 pllreg);  //獲取PLL時鐘頻率  
  36.  
  37. //相關外部全局變量聲明  
  38. extern u8 PrintfSet;    //0:定義printf到串口;1:定義printf到液晶  
  39.  
  40. //IO模式宏定義  
  41. #define IO_IN_PUT       0   //輸入模式  
  42. #define IO_OUT_PUT      1   //輸出模式  
  43. #define IO_SF_MODE      2   //特殊模式,復用功能  
  44. #define IO_EXT_INT      7   //外部中斷輸入模式  
  45. #define IO_NO_UP        0   //禁止上拉,下拉  
  46. #define IO_DROP_DOWM    1   //下拉  
  47. #define IO_PULL_UP      2   //上拉  
  48.  
  49. //外部中斷觸發模式定義  
  50. #define EXT_LowLevel    0   //低電平觸發  
  51. #define EXT_HighLevel   1   //高電平觸發  
  52. #define EXT_NegEdge     2   //下降沿觸發  
  53. #define EXT_PosEdge     4   //上升沿觸發  
  54. #define EXT_Edge        6   //邊沿觸發  
  55.  
  56. //使能printf輸出  
  57. //0:關閉printf輸出;1:使能printf到串口;2:使能printf到液晶;3:同時使能printf到串口和液晶  
  58. #define PRINTF_EN_      3  
  59.  
  60.  
  61.  
  62. //中斷組0編號定義  
  63. //   外部中斷組0的IO  偏移+標示   中斷組0中的編號  
  64. #define EINT0_GPN0      0           //0  
  65. #define EINT0_GPN1      0           //1  
  66. #define EINT0_GPN2      4           //2  
  67. #define EINT0_GPN3      4           //3  
  68. #define EINT0_GPN4      8           //4  
  69. #define EINT0_GPN5      8           //5  
  70. #define EINT0_GPN6      12          //6   
  71. #define EINT0_GPN7      12          //7  
  72. #define EINT0_GPN8      16          //8  
  73. #define EINT0_GPN9      16          //9  
  74. #define EINT0_GPN10     20          //10  
  75. #define EINT0_GPN11     20          //11  
  76. #define EINT0_GPN12     24          //12  
  77. #define EINT0_GPN13     24          //13  
  78. #define EINT0_GPN14     28          //14  
  79. #define EINT0_GPN15     28          //15  
  80. #define EINT0_GPL8      (0x80 + 0)  //16  
  81. #define EINT0_GPL9      (0x80 + 0)  //17  
  82. #define EINT0_GPL10     (0x80 + 4)  //18  
  83. #define EINT0_GPL11     (0x80 + 4)  //19  
  84. #define EINT0_GPL12     (0x80 + 8)  //20  
  85. #define EINT0_GPL13     (0x80 + 8)  //21  
  86. #define EINT0_GPL14     (0x80 + 12) //22  
  87. #define EINT0_GPM0      (0x80 + 12) //23  
  88. #define EINT0_GPM1      (0x80 + 16) //24  
  89. #define EINT0_GPM2      (0x80 + 16) //25  
  90. #define EINT0_GPM3      (0x80 + 20) //26  
  91. #define EINT0_GPM4      (0x80 + 20) //27  
  92.  
  93.  
  94.  
  95.  
  96. //外部中斷分組定義  
  97. //      組名          //組號            //范圍  
  98. #define EINT_Group0     0               //GPN0--->GPN15        GPL8--->GPL14         GPM0--->GPM4  
  99. #define EINT_Group01    1               //GPA0--->GPA7         GPB0--->GPB6  
  100. #define EINT_Group02    1               //GPC0--->GPC7  
  101. #define EINT_Group03    2               //GPD0--->GPD5  
  102. #define EINT_Group04    2               //GPF0--->GPF14  
  103. #define EINT_Group05    3               //GPG0--->GPG7  
  104. #define EINT_Group06    3               //GPH0--->GPH9  
  105. #define EINT_Group07    4               //GPO0--->GPO15  
  106. #define EINT_Group08    4               //GPP0--->GPP14  
  107. #define EINT_Group09    5               //GPQ0--->GPQ9  
  108.  
  109.  
  110. //HCLK門控時鐘定義  
  111. /*HCLK_GATE控制所有Ips的HCLK,如果區域為‘1’,則HCLK被提供,否則,HCLK被屏蔽。當S3C6410 
  112. 轉換成掉電模式時,系統控制器檢查一些模塊(IROM,MEM0,MEM1和MFC模塊)的狀態。因此,位25,22, 
  113. 21,0必須為‘1’,以符合掉電的要求。 
  114.         HCLK_GATE       位       描述                                                              初始狀態*/ 
  115. #define HCLK_UHOST      29      //為UHOST 選通HCLK(0:屏蔽,1:通過)。                                 1  
  116. #define HCLK_SECUR      28      //為安全子系統選通HCLK(0:屏蔽,1:通過)。                          1  
  117. #define HCLK_SDMA1      27      //為SDMA1 選通HCLK(0:屏蔽,1:通過)。                                 1  
  118. #define HCLK_SDMA0      26      //為SDMA0 選通HCLK(0:屏蔽,1:通過)。                                 1  
  119. #define HCLK_IROM       25      //為IROM 選通HCLK(0:屏蔽,1:通過)。                              1  
  120. #define HCLK_DDR1       24      //為DDR1 選通HCLK(0:屏蔽,1:通過)。                              1  
  121. #define HCLK_DDR0       23      //為DDR0 選通HCLK(0:屏蔽,1:通過)。                              1  
  122. #define HCLK_MEM1       22      //為DMC1 選通HCLK(0:屏蔽,1:通過)。                              1  
  123. #define HCLK_MEM0       21      //為DMC0,SROM,OneNAND,NFCON 和CFCON 選通HCLK(0:屏蔽,1:通過)。    1  
  124. #define HCLK_USB        20      //為USB OTG 選通HCLK(0:屏蔽,1:通過)。                           1  
  125. #define HCLK_HSMMC2     19      //為HSMMC2 選通HCLK(0:屏蔽,1:通過)。                            1  
  126. #define HCLK_HSMMC1     18      //為HSMMC1 選通HCLK(0:屏蔽,1:通過)。                            1  
  127. #define HCLK_HSMMC0     17      //為HSMMC0 選通HCLK(0:屏蔽,1:通過)。                            1  
  128. #define HCLK_MDP        16      //為MDP 選通HCLK(0:屏蔽,1:通過)。                               1  
  129. #define HCLK_DHOST      15      //為直接HOST 接口選通HCLK(0:屏蔽,1:通過)。                      1  
  130. #define HCLK_IHOST      14      //為間接HOST 接口選通HCLK(0:屏蔽,1:通過)。                      1  
  131. #define HCLK_DMA1       13      //為DMA1 選通HCLK(0:屏蔽,1:通過)。                              1  
  132. #define HCLK_DMA0       12      //為DMA0 選通HCLK(0:屏蔽,1:通過)。                              1  
  133. #define HCLK_JPEG       11      //為JPEG 選通HCLK(0:屏蔽,1:通過)。                              1  
  134. #define HCLK_CAMIF      10      //為相機接口選通HCLK(0:屏蔽,1:通過)。                           1  
  135. #define HCLK_SCALER     9       //為定標器選通HCLK(0:屏蔽,1:通過)。                                1  
  136. #define HCLK_2D         8       //為2D 選通HCLK(0:屏蔽,1:通過)。                                1  
  137. #define HCLK_TV         7       //為TV 譯碼器選通HCLK(0:屏蔽,1:通過)。                             1  
  138. #define HCLK_POST0      5       //為POST0 選通HCLK(0:屏蔽,1:通過)。                                 1  
  139. #define HCLK_ROT        4       //為旋轉器選通HCLK(0:屏蔽,1:通過)。                                1  
  140. #define HCLK_LCD        3       //為LCD 控制器選通HCLK(0:屏蔽,1:通過)。                            1  
  141. #define HCLK_TZIC       2       //為中斷控制器選通HCLK(0:屏蔽,1:通過)。                          1  
  142. #define HCLK_INTC       1       //為向量中斷控制器選通HCLK(0:屏蔽,1:通過)。                        1  
  143. #define HCLK_MFC        0       //為MFC 選通HCLK(0:屏蔽,1:通過)。                               1  
  144.  
  145.  
  146. //PCLK門控時鐘定義  
  147. //      PCLK_GATE       位               描述                                          初始狀態  
  148. #define PCLK_SKEY       (0x40 | 24)     // 為安全鍵選通PCLK(0:屏蔽,1:通過)。       1  
  149. #define PCLK_CHIPID     (0x40 | 23)     // 為片上ID 選通PCLK(0:屏蔽,1:通過)。         1  
  150. #define PCLK_SPI1       (0x40 | 22)     // 為SPI1 選通PCLK(0:屏蔽,1:通過)。             1  
  151. #define PCLK_SPI0       (0x40 | 21)     // 為SPI0 選通PCLK(0:屏蔽,1:通過)。             1  
  152. #define PCLK_HSIRX      (0x40 | 20)     // 為HSI 接收器選通PCLK(0:屏蔽,1:通過)。   1  
  153. #define PCLK_HSITX      (0x40 | 19)     // 為HIS 發送器選通PCLK(0:屏蔽,1:通過)。   1  
  154. #define PCLK_GPIO       (0x40 | 18)     // 為GPIO 選通PCLK(0:屏蔽,1:通過)。             1  
  155. #define PCLK_IIC        (0x40 | 17)     // 為IIC 選通PCLK(0:屏蔽,1:通過)。          1  
  156. #define PCLK_IIS1       (0x40 | 16)     // 為IIS1 選通PCLK(0:屏蔽,1:通過)。             1  
  157. #define PCLK_IIS0       (0x40 | 15)     // 為IIS0 選通PCLK(0:屏蔽,1:通過)。         1  
  158. #define PCLK_AC97       (0x40 | 14)     // 為AC97 選通PCLK(0:屏蔽,1:通過)。             1  
  159. #define PCLK_TZPC       (0x40 | 13)     // 為TZPC 選通PCLK(0:屏蔽,1:通過)。             1  
  160. #define PCLK_TSADC      (0x40 | 12)     // 為觸摸屏ADC 選通PCLK(0:屏蔽,1:通過。        1  
  161. #define PCLK_KEYPAD     (0x40 | 11)     // 為Key PAD 選通PCLK(0:屏蔽,1:通過)。      1  
  162. #define PCLK_IRDA       (0x40 | 10)     // 為IRDA 選通PCLK(0:屏蔽,1:通過)。             1  
  163. #define PCLK_PCM1       (0x40 | 9)      // 為PCM1 選通PCLK(0:屏蔽,1:通過)。             1  
  164. #define PCLK_PCM0       (0x40 | 8)      // 為PCM0 選通PCLK(0:屏蔽,1:通過)。             1  
  165. #define PCLK_PWM        (0x40 | 7)      // 為PWM 選通PCLK(0:屏蔽,1:通過)。          1  
  166. #define PCLK_RTC        (0x40 | 6)      // 為RTC 選通PCLK(0:屏蔽,1:通過)。          1  
  167. #define PCLK_WDT        (0x40 | 5)      // 為看門狗定時器選通PCLK(0:屏蔽,1:通過)。    1  
  168. #define PCLK_UART3      (0x40 | 4)      // 為UART3 選通PCLK(0:屏蔽,1:通過)。        1  
  169. #define PCLK_UART2      (0x40 | 3)      // 為UART2 選通PCLK(0:屏蔽,1:通過)。        1  
  170. #define PCLK_UART1      (0x40 | 2)      // 為UART1 選通PCLK(0:屏蔽,1:通過)。        1  
  171. #define PCLK_UART0      (0x40 | 1)      // 為UART0 選通PCLK(0:屏蔽,1:通過)。        1  
  172. #define PCLK_MFC        (0x40 | 0)      // 為MFC 選通PCLK(0:屏蔽,1:通過)。          1  
  173.  
  174.  
  175. //PCLK門控時鐘定義  
  176. //PCLK_GATE 位 描述 初始狀態  
  177. #define SCLK_UHOST      (0x80 | 30)     // 為USB-HOST 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  178. #define SCLK_MMC2_48    (0x80 | 29)     // 為MMC2 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  179. #define SCLK_MMC1_48    (0x80 | 28)     // 為MMC1 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  180. #define SCLK_MMC0_48    (0x80 | 27)     // 為MMC0 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  181. #define SCLK_MMC2       (0x80 | 26)     // 為MMC2 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  182. #define SCLK_MMC1       (0x80 | 25)     // 為MMC1 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  183. #define SCLK_MMC0       (0x80 | 24)     // 為MMC0 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  184. #define SCLK_SPI1_48    (0x80 | 23)     // 為SPI 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  185. #define SCLK_SPI0_48    (0x80 | 22)     // 為SPI 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  186. #define SCLK_SPI1       (0x80 | 21)     // 為SPI 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  187. #define SCLK_SPI0       (0x80 | 20)     // 為SPI 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  188. #define SCLK_DAC27      (0x80 | 19)     // 為DAC 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  189. #define SCLK_TV27       (0x80 | 18)     // 為TV 譯碼器選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  190. #define SCLK_SCALER27   (0x80 | 17)     // 為scaler27 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  191. #define SCLK_SCALER     (0x80 | 16)     // 為定標器選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  192. #define SCLK_LCD27      (0x80 | 15)     // 為LCD 控制器選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  193. #define SCLK_LCD        (0x80 | 14)     // 為LCD 控制器選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  194. #define SCLK_POST0_27   (0x80 | 12)     // 為POST0 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  195. #define SCLK_POST0      (0x80 | 10)     // 為POST0 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  196. #define SCLK_AUDIO1     (0x80 | 9)      // 為PCM1,IIS1 和AC97 1 選通特殊時鐘 (0:屏蔽,1:通過)。1  
  197. #define SCLK_AUDIO0     (0x80 | 8)      // 為PCM0,IIS0 和AC97 0 選通特殊時鐘 (0:屏蔽,1:通過)。1  
  198. #define SCLK_SECUR      (0x80 | 7)      // 為安全模塊選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  199. #define SCLK_IRDA       (0x80 | 6)      // 為IRDA 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  200. #define SCLK_UART       (0x80 | 5)      // 為UART0~3 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  201. #define SCLK_OneNAND    (0x80 | 4)      // 為OneNAND 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  202. #define SCLK_MFC        (0x80 | 3)      // 為MFC 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  203. #define SCLK_CAM        (0x80 | 2)      // 為相機接口選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  204. #define SCLK_JPEG       (0x80 | 1)      // 為JPEG 選通特殊時鐘 (0:屏蔽,1:通過)。 1  
  205.  
  206. //中斷源編號定義  
  207. /*      S3C6410X 支持64 位中斷源,不支持ARM1176HZF-S 鏡像中斷運行. 
  208.  
  209.                 中斷源                 中斷號 描述                                  組*/ 
  210. #define         INT_ADC             63      //ADC EOC 中斷                            VIC1  
  211. #define         INT_PENDNUP         62      //ADC 筆向下/向上中斷 中斷               VIC1  
  212. #define         INT_SEC             61      //安全中斷                              VIC1  
  213. #define         INT_RTC_ALARM       60      //RTC 警告中斷                          VIC1  
  214. #define         INT_IrDA            59      //IrDA 中斷                           VIC1  
  215. #define         INT_OTG             58      //USB OTG 中斷                            VIC1  
  216. #define         INT_HSMMC1          57      //HSMMC1 中斷                             VIC1  
  217. #define         INT_HSMMC0          56      //HSMMC0 中斷                             VIC1  
  218. #define         INT_HOSTIF          55      //主機接口中斷                            VIC1  
  219. #define         INT_MSM             54      //MSM 調制解調器 I/F 中斷              VIC1  
  220. #define         INT_EINT4           53      //外部中斷組1~組9                         VIC1  
  221. #define         INT_HSIrx           52      //HS Rx 中斷                          VIC1  
  222. #define         INT_HSItx           51      //HS Tx 中斷                          VIC1  
  223. #define         INT_I2C0            50      //I2C 0 中斷                          VIC1  
  224. #define         INT_SPI_INT_HSMMC2  49      //SPI 中斷或HSMMC2 中斷              VIC1  
  225. #define         INT_SPI0            48      //SPI0 中斷                           VIC1  
  226. #define         INT_UHOST           47      //USB 主機中斷                          VIC1  
  227. #define         INT_CFC             46      //CFCON 中斷                          VIC1  
  228. #define         INT_NFC             45      //NFCON 中斷                          VIC1  
  229. #define         INT_ONENAND1        44      //板塊1 的ONENANE 中斷                   VIC1  
  230. #define         INT_ONENAND0        43      //板塊0 的ONENAND 中斷                   VIC1  
  231. #define         INT_DMA1            42      //DMA1 中斷                           VIC1  
  232. #define         INT_DMA0            41      //DMA0 中斷                           VIC1  
  233. #define         INT_UART3           40      //UART3 中斷                          VIC1  
  234. #define         INT_UART2           39      //UART2 中斷                          VIC1  
  235. #define         INT_UART1           38      //UART1 中斷                          VIC1  
  236. #define         INT_UART0           37      //UART0 中斷                          VIC1  
  237. #define         INT_AC97            36      //AC 中斷                                 VIC1  
  238. #define         INT_PCM1            35      //PCM1 中斷                           VIC1  
  239. #define         INT_PCM0            34      //PCM0 中斷                           VIC1  
  240. #define         INT_EINT3           33      //外部中斷20~27                         VIC1  
  241. #define         INT_EINT2           32      //外部中斷12~19                         VIC1  
  242. #define         INT_LCD_2           31      //LCD 中斷.系統I/F 完成               VIC0  
  243. #define         INT_LCD_1           30      //LCD 中斷.VSYNC 中斷                   VIC0  
  244. #define         INT_LCD_0           29      //LCD 中斷.FIFO 不足                    VIC0  
  245. #define         INT_TIMER4          28      //定時器4 中斷.                      VIC0  
  246. #define         INT_TIMER3          27      //定時器3 中斷.                      VIC0  
  247. #define         INT_WDT             26      //看門狗定時器中斷.                     VIC0  
  248. #define         INT_TIMER2          25      //定時器2 中斷.                      VIC0  
  249. #define         INT_TIMER1          24      //定時器1 中斷.                      VIC0  
  250. #define         INT_TIMER0          23      //定時器0 中斷.                      VIC0  
  251. #define         INT_KEYPAD          22      //鍵盤中斷.                             VIC0  
  252. #define         INT_ARM_DMAS        21      //ARM DMAS 中斷.                      VIC0  
  253. #define         INT_ARM_DMA         20      //ARM DMA 中斷.                       VIC0  
  254. #define         INT_ARM_DMAERR      19      //ARM DMA 錯誤中斷.                     VIC0  
  255. #define         INT_SDMA1           18      //安全 DMA1 中斷.                       VIC0  
  256. #define         INT_SDMA0           17      //安全 DMA0 中斷.                       VIC0  
  257. #define         INT_MFC             16      //MFC 中斷.                           VIC0  
  258. #define         INT_JPEG            15      //JPEG 中斷.                          VIC0  
  259. #define         INT_BATF            14      //電池故障中斷.                       VIC0  
  260. #define         INT_SCALER          13      //TV 轉換器中斷.                         VIC0  
  261. #define         INT_TVENC           12      //TV 編碼器中斷.                         VIC0  
  262. #define         INT_2D              11      //2D 中斷.                                VIC0  
  263. #define         INT_ROTATOR         10      //旋轉器中斷.                            VIC0  
  264. #define         INT_POSTO           9       //後處理器中斷.                       VIC0  
  265. #define         INT_3D              8       //3D 圖像控制器中斷.                   VIC0  
  266. //#define       Reserved            7       //保留                                    VIC0  
  267. #define         INT_I2S             6       //I2S0/I2S1/INT_I2SV40/I2SV40中斷     VIC0                 
  268. #define         INT_I2C1            5       //I2C1 中斷                               VIC0  
  269. #define         INT_CAMIF_P         4       //照相機接口中斷                       VIC0  
  270. #define         INT_CAMIF_C         3       //照相機接口中斷                       VIC0  
  271. #define         INT_RTC_TIC         2       //RTC TIC 中斷                            VIC0  
  272. #define         INT_EINT1           1       //外部中斷4~11                          VIC0  
  273. #define         INT_EINT0           0       //外部中斷0~3                           VIC0     
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281. /*************************************************************************************************/ 
  282. /*          對應位聲明,方便位操作     */ 
  283. #define BIT0    (0x0001 << 0)  
  284. #define BIT1    (0x0001 << 1)  
  285. #define BIT2    (0x0001 << 2)  
  286. #define BIT3    (0x0001 << 3)  
  287. #define BIT4    (0x0001 << 4)  
  288. #define BIT5    (0x0001 << 5)  
  289. #define BIT6    (0x0001 << 6)  
  290. #define BIT7    (0x0001 << 7)  
  291. #define BIT8    (0x0001 << 8)  
  292. #define BIT9    (0x0001 << 9)  
  293. #define BIT10   (0x0001 << 10)  
  294. #define BIT11   (0x0001 << 11)  
  295. #define BIT12   (0x0001 << 12)  
  296. #define BIT13   (0x0001 << 13)  
  297. #define BIT14   (0x0001 << 14)  
  298. #define BIT15   (0x0001 << 15)  
  299. #define BIT16   (0x00000001 << 16)  
  300. #define BIT17   (0x00000001 << 17)  
  301. #define BIT18   (0x00000001 << 18)  
  302. #define BIT19   (0x00000001 << 19)  
  303. #define BIT20   (0x00000001 << 20)  
  304. #define BIT21   (0x00000001 << 21)  
  305. #define BIT22   (0x00000001 << 22)  
  306. #define BIT23   (0x00000001 << 23)  
  307. #define BIT24   (0x00000001 << 24)  
  308. #define BIT25   (0x00000001 << 25)  
  309. #define BIT26   (0x00000001 << 26)  
  310. #define BIT27   (0x00000001 << 27)  
  311. #define BIT28   (0x00000001 << 28)  
  312. #define BIT29   (0x00000001 << 29)  
  313. #define BIT30   (0x00000001 << 30)  
  314. #define BIT31   (0x00000001 << 31)  
  315.  
  316. //PLL選擇  
  317. #define APLL    0   //ARM內核時鐘PLL  
  318. #define MPLL    1   //主時鐘PLL  
  319. #define EPLL    2   //外設時鐘PLL  
  320.  
  321. //主時鐘輸入  
  322. #define SYSTEM_MAIN_CLK_IN  12000000        //12MHZ  
  323.  
  324. /************************************************************************************************************************* 
  325. *函數        :    __inline void VICInterruptEnd(void) 
  326. *功能        :  在中斷快要結束時清除中斷 
  327. *參數        :  無 
  328. *返回        :  無 
  329. *依賴        :    底層宏定義 
  330. *作者        :  陳鵬 
  331. *時間        :    20120305 
  332. *最後修改時間:    20120305 
  333. *說明        :  寫入任何數據清除中斷,只有在中斷服務程序中才可讀,結束時才寫 
  334.                 兩個要一起清除,否則可能導致無法再次進入中斷,無意間發現的 
  335. *************************************************************************************************************************/ 
  336. __inline void VICInterruptEnd(void) 
  337. { 
  338.     VIC0->ADDRESS = 0xffffffff;  //寫入任何值都可以清除當前中斷  
  339.     VIC1->ADDRESS = 0xffffffff;  //寫入任何值都可以清除當前中斷  
  340. } 
  341.  
  342.  
  343. //通道選擇  
  344. #define ch0     0  
  345. #define ch1     1  
  346. #define ch2     2  
  347.  
  348.  
  349.  
  350. //printf輸出定義  
  351. #if (PRINTF_EN_ == 1)   //使能到串口  
  352. #define uart_printf(format,...) (printf(format, ##__VA_ARGS__)) //串口打印  
  353. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG輸出  
  354. #endif  
  355.  
  356.  
  357. //printf輸出定義  
  358. #if (PRINTF_EN_ == 2)   //使能到液晶  
  359. #define lcd_printf(format,...)  (printf(format, ##__VA_ARGS__)) //LCD打印  
  360. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG輸出  
  361. #endif  
  362.  
  363.  
  364. //printf輸出定義  
  365. #if (PRINTF_EN_ == 3)   //同時使能到液晶和串口  
  366. #define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS__)   //串口打印  
  367. #define lcd_printf(format,...)  PrintfSet=1;printf(format, ##__VA_ARGS__)   //LCD打印  
  368. #define DEBUG(format,...)       PrintfSet=0;printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)   //DEBUG輸出  
  369. #endif  
  370.  
  371. #endif 
Copyright © Linux教程網 All Rights Reserved