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

S3C6410裸機程序相關系統函數

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

//system.c

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



/*************************************************************************************************************************
*函數        :	u32 Get_PCLK(void)
*功能        :  獲取PCLK時鐘頻率
*參數        :  無
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	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.  * 作者:      [email protected] 
  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.     VIC0->ADDRESS = 0xffffffff;  //寫入任何值都可以清除當前中斷  
  338.     VIC1->ADDRESS = 0xffffffff;  //寫入任何值都可以清除當前中斷  
  339.  
  340.  
  341. //通道選擇  
  342. #define ch0     0  
  343. #define ch1     1  
  344. #define ch2     2  
  345.  
  346.  
  347.  
  348. //printf輸出定義  
  349. #if (PRINTF_EN_ == 1)   //使能到串口  
  350. #define uart_printf(format,...) (printf(format, ##__VA_ARGS__)) //串口打印  
  351. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG輸出  
  352. #endif  
  353.  
  354.  
  355. //printf輸出定義  
  356. #if (PRINTF_EN_ == 2)   //使能到液晶  
  357. #define lcd_printf(format,...)  (printf(format, ##__VA_ARGS__)) //LCD打印  
  358. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG輸出  
  359. #endif  
  360.  
  361.  
  362. //printf輸出定義  
  363. #if (PRINTF_EN_ == 3)   //同時使能到液晶和串口  
  364. #define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS__)   //串口打印  
  365. #define lcd_printf(format,...)  PrintfSet=1;printf(format, ##__VA_ARGS__)   //LCD打印  
  366. #define DEBUG(format,...)       PrintfSet=0;printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)   //DEBUG輸出  
  367. #endif  
  368.  
  369. #endif 
Copyright © Linux教程網 All Rights Reserved