init.c
上传用户:ids068
上传日期:2013-04-04
资源大小:639k
文件大小:14k
源码类别:

USB编程

开发平台:

C/C++

  1. //***********************************************************************
  2. //                         *  
  3. //                P H I L I P S   P R O P R I E T A R Y              *
  4. //                                                                      *
  5. //          COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE (APIC).        *
  6. //                    --  ALL RIGHTS RESERVED  --                  *
  7. //                                                                      *
  8. //  File Name :       Init.c                                        *
  9. //  Author :       Albert Goh         *
  10. //  Created :       3 March 2000                                *
  11. //                                                                      *
  12. //***********************************************************************
  13. //***********************************************************************
  14. //                                                                      *
  15. // Init.c is the initialization of the device attached and also the D14 *
  16. // It will initialize the various variables and component.             *
  17. //                                                                      *
  18. //***********************************************************************
  19. //***********************************************************************
  20. //                                                                      *
  21. //  Module History             *
  22. //  **************             *
  23. //                   *
  24. //  Date    Version Author Changes       *
  25. //  ==== ======= ====== =======          *
  26. //  030300   0.1  Albert Created           *     
  27. //                                                                      *
  28. //                                                                      *
  29. //***********************************************************************
  30. //***********************************************************************
  31. //*                *
  32. //*                      Include Files Definition    *
  33. //*                *
  34. //***********************************************************************
  35. #include "standard.h"
  36. #include "Kernel.h"
  37. #include "D14.h"
  38. //***********************************************************************
  39. //*                *
  40. //*                  External Variable Definition      *
  41. //*                *
  42. //***********************************************************************
  43. extern void Start_mSEC_Timer(Data);
  44. extern void Start_SEC_Timer(Data);
  45. extern KERNEL Kernel_Flag;
  46. extern USB_INT_FLAG USB_Int_Flag;
  47. extern USB_DEVICE USB_Device;
  48. extern UI Temp,PIO_Count;
  49. extern UC Device_Config_Value;
  50. extern UC idata Endpt_FIFO[MAX_BUF];
  51. extern void DMA_Init(void);
  52. extern ULI bytecount;
  53. extern UC Address_Count;
  54. extern UC xdata Address[20];
  55. //***********************************************************************
  56. //*                *
  57. //*                  Prototype Routine Definition      *
  58. //*                *
  59. //***********************************************************************
  60. void Init_D14_SFR(void);
  61. void Init_Endpoint(void);
  62. void Init_Main(void);
  63. void Init_8051(void);
  64. void Init_D14(void);
  65. //***********************************************************************
  66. //*                *
  67. //*                      Variable Definition        *
  68. //*                *
  69. //***********************************************************************
  70. TIMER Timer;
  71. DATA_SWAP idata Data_Swap;
  72. DMA_INT_FLAG DMA_Int_Flag;
  73. UI count;
  74. UC Device_Config_Value;
  75. UC  Type;
  76. UI idata Init_Count;
  77.  D14_CNTRL_REG volatile xdata   D14_Cntrl_Reg _at_ 0x7000;
  78. D14_CNTRL_REG xdata *D14_Cntrl_Ptr = &D14_Cntrl_Reg;
  79. //***********************************************************************
  80. //*                     *
  81. //* Routine  : Init_Main                                           *
  82. //* Input : None                           *
  83. //* Output : None                                       *
  84. //* Function : To initialize the D14 and the 8051               *
  85. //*                *
  86. //***********************************************************************
  87. void Init_Main(void)
  88. {
  89. AUXR = 0x02;
  90. CKCON = 0x01;
  91. //disable ISP1581 chip select
  92. ISP1581_CS = 1; //关1581片选
  93. bytecount = 0;
  94. PIO_Count = 64;
  95.     Type = 0;
  96. USB_Device.BITS.DMA_Test_Mode = PIO_Test;
  97. //初始化8051
  98. Init_8051();
  99. ISP1581_CS = 0; //片选ISP1581
  100. D14_Cntrl_Reg.D14_MODE.BITS.SOFTCT = 0;
  101. //检查是否连接了ISP1581
  102. do
  103. {
  104. //reset ISP1581                  
  105. ISP1581_RESET = 0;
  106. Start_mSEC_Timer(100);
  107. ISP1581_RESET = 1;
  108. Start_mSEC_Timer(100);
  109. //读取接口器件是否ISP1581            
  110. if(D14_Cntrl_Ptr->D14_CHIP_ID_MBYTE == 0x81 && D14_Cntrl_Ptr->D14_CHIP_ID_MSB == 0x15)
  111. break;
  112. }while(1);
  113. //初始化标志寄存器
  114. USB_Int_Flag.VALUE = 0;//USB中断标志寄存器
  115. DMA_Int_Flag.VALUE = 0;//DMA中断标志寄存器
  116. Kernel_Flag.VALUE = 0;//ISP1581状态标志寄存器
  117. //设置为设备默认状态
  118. Kernel_Flag.BITS.HS_FS_State = FULL_SPEED;//设置为全速状态
  119. HS_FS_LED = FULL_SPEED_LED;
  120. //初始化ISP1581
  121. Init_D14();
  122. }
  123. //***********************************************************************
  124. //*                     *
  125. //* Routine  : Init 8051                                         *
  126. //* Input : 8051 Special Function Register                *
  127. //* Output : None                                      *
  128. //* Function : To initialize 8051                               *
  129. //*                *
  130. //***********************************************************************
  131. void Init_8051(void)
  132. {
  133. //定义定时器方式
  134. TMOD = 0x11;
  135. //初始化定时器时间
  136. Timer.mSEC_Scale = 2000;
  137. Timer.Hundred_mSEC_Scale = 20000;
  138. TL1=80;
  139. TH1=60;
  140. //reset timer control
  141. TCON = 0;     
  142. //disable all interrupt
  143. EA = 0;   
  144. //disable UART interrupt
  145. //disable timer 1 overflow interrupt
  146. //disable external interrupt 1
  147. //enable timer 0 overflow interrupt
  148. //enable external interrupt 0
  149. IE = 0x03;
  150. ET1=0;
  151. //reset interrupt priority
  152. IP = 0;
  153. PT1 = 1;
  154. PT0 = 1;
  155. // EX0 = 1; //开ISP1581中断
  156. //enable all interrupt
  157. EA = 1;
  158. TR1=0;
  159. //disable all power mode control
  160. //enable half/doble baud rate 
  161. PCON = 0x40;
  162. }
  163. //***********************************************************************
  164. //*                     *
  165. //* Routine  : Init D14                                          *
  166. //* Input : ISP1581 SFR                                   *
  167. //* Output : None                                      *
  168. //* Function : To initialize ISP1581                            *
  169. //*                *
  170. //***********************************************************************
  171. void Init_D14(void)
  172. {
  173. //初始化ISP1581寄存器
  174. Init_D14_SFR();
  175. //初始化ISP1581端点
  176. Init_Endpoint();
  177. //初始化ISP1581工作标志寄存器
  178. USB_Device.BITS.State = USB_Default;
  179. Device_Config_Value = 0;
  180. USB_Device.BITS.Alter_Interface = 0;
  181. USB_Device.BITS.Big_Endian = On;
  182. Kernel_Flag.BITS.Tx_Done = 0;
  183. EX0 = 1; //开ISP1581中断
  184. }
  185. //***********************************************************************
  186. //*                     *
  187. //* Routine  : Init D14 SFR                                      *
  188. //* Input : ISP1581 SFR                                   *
  189. //* Output : None                                      *
  190. //* Function : To initialize ISP1581                            *
  191. //*                *
  192. //***********************************************************************
  193. void Init_D14_SFR(void)
  194. {
  195. //enable Global Interrupt enable
  196. //enable soft connect and other feature
  197. //enable wakeup on chip select
  198. //disable soft connect
  199. //设置模式:时钟始终有效,全局中断使能,片选唤醒
  200. D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;
  201. //set all interrupt source to mode 1
  202. //设置全部中断为模式1,电平触发,低电平有效
  203. D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;
  204. //设置中断使能寄存器
  205. //注释: D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x790D0000;先发送高字节
  206. //0x14(xdata)=0x79
  207. //0x15(xdata)=0x0D
  208. //0x16(xdata)=00
  209. //0x17(xdata0=00
  210. //使用端点0和端点2
  211. D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;
  212. }
  213. //***********************************************************************
  214. //*                     *
  215. //* Routine  : Init Endpoint                                     *
  216. //* Input : ISP1581 FIFO                                  *
  217. //* Output : None                                      *
  218. //* Function : To initialize ISP1581 endpoint FIFO              *
  219. //*                *
  220. //***********************************************************************
  221. void Init_Endpoint(void)
  222. {
  223. //设置全速端点
  224. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  225. {
  226. //设置全速端点FIFO大小
  227. //Interrupt Out MaxPacketSize Endpoint
  228. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  229. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000; //FIFO=64bytes
  230. //Interrupt In MaxPacketSize Endpoint
  231. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  232. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  233. //Bulk Out MaxPacketSize Endpoint
  234. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  235. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  236. //Bulk In MaxPacketSize Endpoint
  237. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  238. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  239. //Iso Out MaxPacketSize Endpoint
  240. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  241. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  242. //Iso In MaxPacketSize Endpoint
  243. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  244. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  245. //设置全速端点类型
  246. //Interrupt In Endpoint Type
  247. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  248. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
  249. //Interrupt Out Endpoint Type
  250. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  251. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
  252. //Bulk Out Endpoint Type
  253. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  254. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
  255. //Bulk In Endpoint Type
  256. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  257. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
  258. //Iso Out Endpoint Type
  259. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  260. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
  261. //Iso In Endpoint Type
  262. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  263. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
  264. //端点使能
  265. //enable FIFO
  266. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  267. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  268. //enable FIFO
  269. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  270. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  271. //enable FIFO
  272. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  273. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  274. //enable FIFO
  275. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  276. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  277. //enable FIFO
  278. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  279. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  280. //enable FIFO
  281. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  282. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  283. }
  284. //设置高速端点
  285. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  286. {
  287. //设置全速端点FIFO大小
  288. //Interrupt Out MaxPacketSize Endpoint
  289. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  290. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  291. //Interrupt In MaxPacketSize Endpoint
  292. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  293. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  294. //Bulk Out MaxPacketSize Endpoint
  295. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  296. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;//FIFO=64bytes
  297. //Bulk In MaxPacketSize Endpoint
  298. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  299. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;//FIFO=64bytes
  300. //Iso Out MaxPacketSize Endpoint
  301. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  302. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  303. //Iso In MaxPacketSize Endpoint
  304. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  305. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  306. //设置高速端点类型
  307. //Interrupt In Endpoint Type
  308. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  309. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
  310. //Interrupt Out Endpoint Type
  311. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  312. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
  313. //Bulk Out Endpoint Type
  314. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  315. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
  316. //Bulk In Endpoint Type
  317. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  318. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
  319. //Iso Out Endpoint Type
  320. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  321. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
  322. //Iso In Endpoint Type
  323. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  324. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
  325. //端点使能
  326. //enable FIFO
  327. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  328. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  329. //enable FIFO
  330. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  331. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  332. //enable FIFO
  333. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  334. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  335. //enable FIFO
  336. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  337. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  338. //enable FIFO
  339. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  340. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  341. //enable FIFO
  342. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  343. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  344. }
  345. //设置默认地址有效
  346. D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80;
  347. }