USB固件开发.doc_第1页
USB固件开发.doc_第2页
USB固件开发.doc_第3页
USB固件开发.doc_第4页
USB固件开发.doc_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USB固件开发 分类: USB设备开发-固件设计 2012-08-19 21:54 201人阅读 评论(0) 收藏 举报 上篇介绍了基于libusb的无驱动设计,上位机没问题了,现在还留下个下位机的问题,该项目中USB下位机采用的Cypress的CY7C68013A控制芯片, 下面来仔细看如何编写下位机的固件程序(firmware)。先看看工程的结构,如下图所示(开发工具为Keil uVision3):其中:(1): fw.c: 这个文件是整个USB的固件的根本,USB协议方面的通信都是在这里完成的,包括上电枚举,重枚举,唤醒以及调用用户自己的程序和控制命令等等。 一般的开发,该文件无需修改。固件的main程序就位于该文件中,概括来说,它首先进行一系列通用初始化设置,并调用void TD_Init(void)函数来实现用户的特殊初始化设置。之后,程序会一直监视是否有指令收到,并在空闲的时候反复调用TD_Poll()函数来实现我们用户的功能。代码如下:cpp view plaincopyprint?1. /- 2. /File:fw.c 3. /Contents:Firmwareframeworkstaskdispatcheranddevicerequestparser 4. /source. 5. / 6. /indent3.NOTABS! 7. / 8. /$Revision:18$ 9. /$Date:12/04/015:33p$ 10. / 11. /Copyright(c)1997AnchorChips,Inc.Allrightsreserved 12. / 13. 14. /- 15. #include.Incfx2.h 16. #include.Incfx2regs.h 17. 18. /- 19. /Constants 20. /- 21. #defineDELAY_COUNT0x9248*8L/Delayfor8secat24Mhz,4secat48 22. #define_IFREQ48000/IFCLKconstantforSynchronizationDelay 23. #define_CFREQ48000/CLKOUTconstantforSynchronizationDelay 24. 25. /- 26. /RandomMacros 27. /- 28. #definemin(a,b)(a)(b)?(a):(b) 30. 31. /Registerswhichrequireasynchronizationdelay,seesection15.14 32. /FIFORESETFIFOPINPOLAR 33. /INPKTENDOUTPKTEND 34. /EPxBCH:LREVCTL 35. /GPIFTCB3GPIFTCB2 36. /GPIFTCB1GPIFTCB0 37. /EPxFIFOPFH:LEPxAUTOINLENH:L 38. /EPxFIFOCFGEPxGPIFFLGSEL 39. /PINFLAGSxxEPxFIFOIRQ 40. /EPxFIFOIEGPIFIRQ 41. /GPIFIEGPIFADRH:L 42. /UDMACRCH:LEPxGPIFTRIG 43. /GPIFTRIG 44. 45. /Note:Thepre-REVEEPxGPIFTCH/Lregisterareaffected,aswell. 46. /.thesehavebeenreplacedbyGPIFTCB3:B0registers 47. 48. #include.Incfx2sdly.h/Define_IFREQand_CFREQabovethis#include 49. 50. /- 51. /GlobalVariables 52. /- 53. volatileBOOLGotSUD;54. BOOLRwuen;55. BOOLSelfpwr;56. volatileBOOLSleep;/Sleepmodeenableflag 57. 58. WORDpDeviceDscr;/PointertoDeviceDescriptor;Descriptorsmaybemoved 59. WORDpDeviceQualDscr;60. WORDpHighSpeedConfigDscr;61. WORDpFullSpeedConfigDscr;62. WORDpConfigDscr;63. WORDpOtherConfigDscr;64. WORDpStringDscr;65. 66. /- 67. /Prototypes 68. /- 69. voidSetupCommand(void);70. voidTD_Init(void);71. voidTD_Poll(void);72. BOOLTD_Suspend(void);73. BOOLTD_Resume(void);74. 75. BOOLDR_GetDescriptor(void);76. BOOLDR_SetConfiguration(void);77. BOOLDR_GetConfiguration(void);78. BOOLDR_SetInterface(void);79. BOOLDR_GetInterface(void);80. BOOLDR_GetStatus(void);81. BOOLDR_ClearFeature(void);82. BOOLDR_SetFeature(void);83. BOOLDR_VendorCmnd(void);84. 85. /thistableisusedbytheepcsmacro 86. constcharcodeEPCS_Offset_Lookup_Table=87. 88. 0,/EP1OUT 89. 1,/EP1IN 90. 2,/EP2OUT 91. 2,/EP2IN 92. 3,/EP4OUT 93. 3,/EP4IN 94. 4,/EP6OUT 95. 4,/EP6IN 96. 5,/EP8OUT 97. 5,/EP8IN 98. ;99. 100. /macroforgeneratingtheaddressofanendpointscontrolandstatusregister(EPnCS) 101. #defineepcs(EP)(EPCS_Offset_Lookup_Table(EP&0x7E)|(EP128)+0xE6A1) 102. 103. /- 104. /Code 105. /- 106. 107. /Taskdispatcher 108. voidmain(void)109. 110. DWORDi;111. WORDoffset;112. DWORDDevDescrLen;113. DWORDj=0;114. WORDIntDescrAddr;115. WORDExtDescrAddr;116. 117. /InitializeGlobalStates 118. Sleep=FALSE;/Disablesleepmode 119. Rwuen=FALSE;/Disableremotewakeup 120. Selfpwr=FALSE;/Disableselfpowered 121. GotSUD=FALSE;/ClearGotsetupdataflag 122. 123. /Initializeuserdevice 124. TD_Init();125. 126. /Thefollowingsectionofcodeisusedtorelocatethedescriptortable. 127. /SincetheSUDPTRHandSUDPTRLareassignedtheaddressofthedescriptor 128. /table,thedescriptortablemustbelocatedinon-partmemory. 129. /The4Kdemotoolslocateallcodesectionsinexternalmemory. 130. /ThedescriptortableisrelocatedbytheframeworksONLYifitisfound 131. /tobelocatedinexternalmemory. 132. pDeviceDscr=(WORD)&DeviceDscr;133. pDeviceQualDscr=(WORD)&DeviceQualDscr;134. pHighSpeedConfigDscr=(WORD)&HighSpeedConfigDscr;135. pFullSpeedConfigDscr=(WORD)&FullSpeedConfigDscr;136. pStringDscr=(WORD)&StringDscr;137. 138. if(WORD)&DeviceDscr&0xe000)139. 140. IntDescrAddr=INTERNAL_DSCR_ADDR;141. ExtDescrAddr=(WORD)&DeviceDscr;142. DevDescrLen=(WORD)&UserDscr-(WORD)&DeviceDscr+2;143. for(i=0;iDevDescrLen;i+)144. *(BYTExdata*)IntDescrAddr+i)=0xCD;145. for(i=0;iDevDescrLen;i+)146. *(BYTExdata*)IntDescrAddr+i)=*(BYTExdata*)ExtDescrAddr+i);147. pDeviceDscr=IntDescrAddr;148. offset=(WORD)&DeviceDscr-INTERNAL_DSCR_ADDR;149. pDeviceQualDscr-=offset;150. pConfigDscr-=offset;151. pOtherConfigDscr-=offset;152. pHighSpeedConfigDscr-=offset;153. pFullSpeedConfigDscr-=offset;154. pStringDscr-=offset;155. 156. 157. EZUSB_IRQ_ENABLE();/EnableUSBinterrupt(INT2) 158. EZUSB_ENABLE_RSMIRQ();/Wake-upinterrupt 159. 160. INTSETUP|=(bmAV2EN|bmAV4EN);/EnableINT2&4autovectoring 161. 162. USBIE|=bmSUDAV|bmSUTOK|bmSUSP|bmURES|bmHSGRANT;/Enableselectedinterrupts 163. EA=1;/Enable8051interrupts 164. 165. #ifndefNO_RENUM 166. /Renumerateifnecessary.Dothisbycheckingtherenumbit.Ifit 167. /isalreadyset,thereisnoneedtorenumerate.Therenumbitwill 168. /alreadybesetifthisfirmwarewasloadedfromaneeprom. 169. if(!(USBCS&bmRENUM)170. 171. EZUSB_Discon(TRUE);/renumerate 172. 173. #endif 174. 175. /unconditionallyre-connect.Ifweloadedfromeepromweare 176. /disconnectedandneedtoconnect.Ifwejustrenumeratedthis 177. /isnotnecessarybutdoesnthurtanything 178. USBCS&=bmDISCON;179. 180. CKCON=(CKCON&(bmSTRETCH)|FW_STRETCH_VALUE;/Setstretchto0(afterrenumeration) 181. 182. /cleartheSleepflag. 183. Sleep=FALSE;184. 185. /TaskDispatcher 186. while(TRUE)/MainLoop 187. 188. if(GotSUD)/WaitforSUDAV 189. 190. SetupCommand();/Implementsetupcommand 191. GotSUD=FALSE;/ClearSUDAVflag 192. 193. 194. /PollUserDevice 195. /NOTE:Idlemodestopstheprocessorclock.Thereareonlytwo 196. /waysoutofidlemode,theWAKEUPpin,anddetectionoftheUSB 197. /resumestateontheUSBbus.Thetimerswillstopandthe 198. /processorwillnotwakeuponanyotherinterrupts. 199. if(Sleep)200. 201. if(TD_Suspend()202. 203. Sleep=FALSE;/Clearthegotosleepflag.Doitheretopreventanyraceconditionbetweenwakeupandthenextsleep. 204. do205. 206. EZUSB_Susp();/Placeprocessorinidlemode. 207. 208. while(!Rwuen&EZUSB_EXTWAKEUP();209. /Mustcontinuetogobackintosuspendifthehosthasdisabledremotewakeup 210. /*and*thewakeupwascausedbytheexternalwakeuppin. 211. 212. /8051activitywillresumehereduetoUSBbusorWakeup#pinactivity. 213. EZUSB_Resume();/IfsourceistheWakeup#pin,signalthehosttoResume. 214. TD_Resume();215. 216. 217. TD_Poll();218. 219. 220. 221. /Devicerequestparser 222. voidSetupCommand(void)223. 224. void*dscr_ptr;225. 226. switch(SETUPDAT1)227. 228. caseSC_GET_DESCRIPTOR:/*GetDescriptor 229. if(DR_GetDescriptor()230. switch(SETUPDAT3)231. 232. caseGD_DEVICE:/Device 233. SUDPTRH=MSB(pDeviceDscr);234. SUDPTRL=LSB(pDeviceDscr);235. break;236. caseGD_DEVICE_QUALIFIER:/DeviceQualifier 237. SUDPTRH=MSB(pDeviceQualDscr);238. SUDPTRL=LSB(pDeviceQualDscr);239. break;240. caseGD_CONFIGURATION:/Configuration 241. SUDPTRH=MSB(pConfigDscr);242. SUDPTRL=LSB(pConfigDscr);243. break;244. caseGD_OTHER_SPEED_CONFIGURATION:/OtherSpeedConfiguration 245. SUDPTRH=MSB(pOtherConfigDscr);246. SUDPTRL=LSB(pOtherConfigDscr);247. break;248. caseGD_STRING:/String 249. if(dscr_ptr=(void*)EZUSB_GetStringDscr(SETUPDAT2)250. 251. SUDPTRH=MSB(dscr_ptr);252. SUDPTRL=LSB(dscr_ptr);253. 254. else255. EZUSB_STALL_EP0();/StallEndPoint0 256. break;257. default:/Invalidrequest 258. EZUSB_STALL_EP0();/StallEndPoint0 259. 260. break;261. caseSC_GET_INTERFACE:/*GetInterface 262. DR_GetInterface();263. break;264. caseSC_SET_INTERFACE:/*SetInterface 265. DR_SetInterface();266. break;267. caseSC_SET_CONFIGURATION:/*SetConfiguration 268. DR_SetConfiguration();269. break;270. caseSC_GET_CONFIGURATION:/*GetConfiguration 271. DR_GetConfiguration();272. break;273. caseSC_GET_STATUS:/*GetStatus 274. if(DR_GetStatus()275. switch(SETUPDAT0)276. 277. caseGS_DEVICE:/Device 278. EP0BUF0=(BYTE)Rwuen1)|(BYTE)Selfpwr;279. EP0BUF1=0;280. EP0BCH=0;281. EP0BCL=2;282. break;283. caseGS_INTERFACE:/Interface 284. EP0BUF0=0;285. EP0BUF1=0;286. EP0BCH=0;287. EP0BCL=2;288. break;289. caseGS_ENDPOINT:/EndPoint 290. EP0BUF0=*(BYTExdata*)epcs(SETUPDAT4)&bmEPSTALL;291. EP0BUF1=0;292. EP0BCH=0;293. EP0BCL=2;294. break;295. default:/InvalidCommand 296. EZUSB_STALL_EP0();/StallEndPoint0 297. 298. break;299. caseSC_CLEAR_FEATURE:/*ClearFeature 300. if(DR_ClearFeature()301. switch(SETUPDAT0)302. 303. caseFT_DEVICE:/Device 304. if(SETUPDAT2=1)305. Rwuen=FALSE;/DisableRemoteWakeup 306. else307. EZUSB_STALL_EP0();/StallEndPoint0 308. break;309. caseFT_ENDPOINT:/EndPoint 310. if(SETUPDAT2=0)311. 312. *(BYTExdata*)epcs(SETUPDAT4)&=bmEPSTALL;313. EZUSB_RESET_DATA_TOGGLE(SETUPDAT4);314. 315. else316. EZUSB_STALL_EP0();/StallEndPoint0 317. break;318. 319. break;320. caseSC_SET_FEATURE:/*SetFeature 321. if(DR_SetFeature()322. switch(SETUPDAT0)323. 324. caseFT_DEVICE:/Device 325. if(SETUPDAT2=1)326. Rwuen=TRUE;/EnableRemoteWakeup 327. elseif(SETUPDAT2=2)328. /SetFeatureTestMode.Thecorehandlesthisrequest.However,itis 329. /necessaryforthefirmwaretocompletethehandshakephaseofthe 330. /controltransferbeforethechipwillentertestmode.Itisalso 331. /necessaryforFX2tobephysicallydisconnected(D+andD-) 332. /fromthehostbeforeitwillentertestmode. 333. break;334. else335. EZUSB_STALL_EP0();/StallEndPoint0 336. break;337. caseFT_ENDPOINT:/EndPoint 338. *(BYTExdata*)epcs(SETUPDAT4)|=bmEPSTALL;339. break;340. 341. break;342. default:/*InvalidCommand 343. if(DR_VendorCmnd()344. EZUSB_STALL_EP0();/StallEndPoint0 345. 346. 347. /Acknowledgehandshakephaseofdevicerequest 348. EP0CS|=bmHSNAK;349. 350. 351. /Wake-upinterrupthandlear 352. voidresume_isr(void)interruptWKUP_VECT353. 354. EZUSB_CLEAR_RSMIRQ();355. /-/ File: fw.c/ Contents: Firmware frameworks task dispatcher and device request parser/ source./ indent 3. NO TABS!/ $Revision: 18 $/ $Date: 12/04/01 5:33p $/ Copyright (c) 1997 AnchorChips, Inc. All rights reserved/-#include .Incfx2.h#include .Incfx2regs.h/-/ Constants/-#define DELAY_COUNT 0x9248*8L / Delay for 8 sec at 24Mhz, 4 sec at 48#define _IFREQ 48000 / IFCLK constant for Synchronization Delay#define _CFREQ 48000 / CLKOUT constant for Synchronization Delay/-/ Random Macros/-#define min(a,b) (a)(b)?(a):(b) / Registers which require a synchronization delay, see section 15.14 / FIFORESET FIFOPINPOLAR / INPKTEND OUTPKTEND / EPxBCH:L REVCTL / GPIFTCB3 GPIFTCB2 / GPIFTCB1 GPIFTCB0 / EPxFIFOPFH:L EPxAUTOINLENH:L / EPxFIFOCFG EPxGPIFFLGSEL / PINFLAGSxx EPxFIFOIRQ / EPxFIFOIE GPIFIRQ / GPIFIE GPIFADRH:L / UDMACRCH:L EPxGPIFTRIG / GPIFTRIG / Note: The pre-REVE EPxGPIFTCH/L register are affected, as well. / .these have been replaced by GPIFTCB3:B0 registers #include .Incfx2sdly.h / De

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论