00000005.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 808 行 · 第 1/4 页

HTM
808
字号
<?xml version="1.0" encoding="gb2312"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>Re: usb数字小键盘                      turbolinux </title></head><body><center><h1>BBS 水木清华站∶精华区</h1></center><a name="top"></a>发信人:&nbsp;luckbird&nbsp;(幸福鸟),&nbsp;信区:&nbsp;Embedded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />标&nbsp;&nbsp;题:&nbsp;Re:&nbsp;usb数字小键盘&nbsp;<br />发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Apr&nbsp;18&nbsp;08:17:56&nbsp;2002)&nbsp;<br />&nbsp;<br />对了是2131的板子&nbsp;<br />//-------------------------------------------------------------------------&nbsp;<br />----&nbsp;<br />//&nbsp;File:&nbsp;&nbsp;fw.c&nbsp;<br />//&nbsp;Contents:&nbsp;Firmware&nbsp;frameworks&nbsp;task&nbsp;dispatcher&nbsp;and&nbsp;device&nbsp;request&nbsp;parser&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;source.&nbsp;<br />//&nbsp;<br />//&nbsp;Copyright&nbsp;(c)&nbsp;2001&nbsp;Cypress&nbsp;Semiconductor,&nbsp;Inc.&nbsp;All&nbsp;rights&nbsp;reserved&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />#include&nbsp;&lt;ezusb.h&gt;&nbsp;<br />#include&nbsp;&lt;ezregs.h&gt;&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Random&nbsp;Macros&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />#define&nbsp;min(a,b)&nbsp;(((a)&lt;(b))?(a):(b))&nbsp;<br />#define&nbsp;max(a,b)&nbsp;(((a)&gt;(b))?(a):(b))&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Constants&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />#define&nbsp;DELAY_COUNT&nbsp;&nbsp;&nbsp;&nbsp;0x9248*8L&nbsp;&nbsp;//&nbsp;Delay&nbsp;for&nbsp;8&nbsp;sec&nbsp;at&nbsp;24Mhz,&nbsp;4&nbsp;sec&nbsp;at&nbsp;48&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Global&nbsp;Variables&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />volatile&nbsp;BOOL&nbsp;GotSUD;&nbsp;<br />BOOL&nbsp;&nbsp;Rwuen;&nbsp;<br />BOOL&nbsp;&nbsp;Selfpwr;&nbsp;<br />volatile&nbsp;BOOL&nbsp;Sleep;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Sleep&nbsp;mode&nbsp;enable&nbsp;flag&nbsp;<br />WORD&nbsp;pDeviceDscr;&nbsp;//&nbsp;Pointer&nbsp;to&nbsp;Device&nbsp;Descriptor;&nbsp;Descriptors&nbsp;may&nbsp;be&nbsp;moved&nbsp;<br />WORD&nbsp;pConfigDscr;&nbsp;<br />WORD&nbsp;pStringDscr;&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Prototypes&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />void&nbsp;SetupCommand(void);&nbsp;<br />void&nbsp;TD_Init(void);&nbsp;<br />void&nbsp;TD_Poll(void);&nbsp;<br />BOOL&nbsp;TD_Suspend(void);&nbsp;<br />BOOL&nbsp;TD_Resume(void);&nbsp;<br />BOOL&nbsp;DR_GetDescriptor(void);&nbsp;<br />BOOL&nbsp;DR_SetConfiguration(void);&nbsp;<br />BOOL&nbsp;DR_GetConfiguration(void);&nbsp;<br />BOOL&nbsp;DR_SetInterface(void);&nbsp;<br />BOOL&nbsp;DR_GetInterface(void);&nbsp;<br />BOOL&nbsp;DR_GetStatus(void);&nbsp;<br />BOOL&nbsp;DR_ClearFeature(void);&nbsp;<br />BOOL&nbsp;DR_SetFeature(void);&nbsp;<br />BOOL&nbsp;DR_VendorCmnd(void);&nbsp;<br />BOOL&nbsp;DR_ClassRequest(void);&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Code&nbsp;<br />//--------------------------------------------------------------------------&nbsp;<br />---&nbsp;<br />//&nbsp;Task&nbsp;dispatcher&nbsp;<br />void&nbsp;main(void)&nbsp;<br />{&nbsp;<br />&nbsp;DWORD&nbsp;i;&nbsp;<br />&nbsp;WORD&nbsp;offset;&nbsp;<br />&nbsp;DWORD&nbsp;DevDescrLen;&nbsp;<br />&nbsp;DWORD&nbsp;j=0;&nbsp;<br />&nbsp;WORD&nbsp;IntDescrAddr;&nbsp;<br />&nbsp;WORD&nbsp;ExtDescrAddr;&nbsp;<br />&nbsp;//&nbsp;Initialize&nbsp;Global&nbsp;States&nbsp;<br />&nbsp;Sleep&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Disable&nbsp;sleep&nbsp;mode&nbsp;<br />&nbsp;Rwuen&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Disable&nbsp;remote&nbsp;wakeup&nbsp;<br />&nbsp;Selfpwr&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Disable&nbsp;self&nbsp;powered&nbsp;<br />&nbsp;GotSUD&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clear&nbsp;&quot;Got&nbsp;setup&nbsp;data&quot;&nbsp;flag&nbsp;<br />&nbsp;//&nbsp;Initialize&nbsp;user&nbsp;device&nbsp;<br />&nbsp;TD_Init();&nbsp;<br />&nbsp;//&nbsp;The&nbsp;following&nbsp;section&nbsp;of&nbsp;code&nbsp;is&nbsp;used&nbsp;to&nbsp;relocate&nbsp;the&nbsp;descriptor&nbsp;table.&nbsp;<br />&nbsp;//&nbsp;Since&nbsp;the&nbsp;SUDPTRH&nbsp;and&nbsp;SUDPTRL&nbsp;are&nbsp;assigned&nbsp;the&nbsp;address&nbsp;of&nbsp;the&nbsp;descriptor&nbsp;<br />&nbsp;<br />&nbsp;//&nbsp;table,&nbsp;the&nbsp;descriptor&nbsp;table&nbsp;must&nbsp;be&nbsp;located&nbsp;in&nbsp;on-part&nbsp;memory.&nbsp;<br />&nbsp;//&nbsp;The&nbsp;4K&nbsp;demo&nbsp;tools&nbsp;locate&nbsp;all&nbsp;code&nbsp;sections&nbsp;in&nbsp;external&nbsp;memory.&nbsp;<br />&nbsp;//&nbsp;The&nbsp;descriptor&nbsp;table&nbsp;is&nbsp;relocated&nbsp;by&nbsp;the&nbsp;frameworks&nbsp;ONLY&nbsp;if&nbsp;it&nbsp;is&nbsp;found&nbsp;<br />&nbsp;//&nbsp;to&nbsp;be&nbsp;located&nbsp;in&nbsp;external&nbsp;memory.&nbsp;<br />&nbsp;pDeviceDscr&nbsp;=&nbsp;(WORD)&amp;DeviceDscr;&nbsp;<br />&nbsp;pConfigDscr&nbsp;=&nbsp;(WORD)&amp;ConfigDscr;&nbsp;<br />&nbsp;pStringDscr&nbsp;=&nbsp;(WORD)&amp;StringDscr;&nbsp;<br />&nbsp;if&nbsp;((WORD)&amp;DeviceDscr&nbsp;&amp;&nbsp;0xe000)&nbsp;<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;IntDescrAddr&nbsp;=&nbsp;INTERNAL_DSCR_ADDR;&nbsp;<br />&nbsp;&nbsp;ExtDescrAddr&nbsp;=&nbsp;(WORD)&amp;DeviceDscr;&nbsp;<br />&nbsp;&nbsp;DevDescrLen&nbsp;=&nbsp;(WORD)&amp;UserDscr&nbsp;-&nbsp;(WORD)&amp;DeviceDscr&nbsp;+&nbsp;2;&nbsp;<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;DevDescrLen;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;*((BYTE&nbsp;xdata&nbsp;*)IntDescrAddr+i)&nbsp;=&nbsp;0xCD;&nbsp;<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;DevDescrLen;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;*((BYTE&nbsp;xdata&nbsp;*)IntDescrAddr+i)&nbsp;=&nbsp;*((BYTE&nbsp;xdata&nbsp;*)ExtDescrAddr+i);&nbsp;<br />&nbsp;&nbsp;pDeviceDscr&nbsp;=&nbsp;IntDescrAddr;&nbsp;<br />&nbsp;&nbsp;offset&nbsp;=&nbsp;(WORD)&amp;DeviceDscr&nbsp;-&nbsp;INTERNAL_DSCR_ADDR;&nbsp;<br />&nbsp;&nbsp;pConfigDscr&nbsp;-=&nbsp;offset;&nbsp;<br />&nbsp;&nbsp;pStringDscr&nbsp;-=&nbsp;offset;&nbsp;<br />&nbsp;}&nbsp;<br />&nbsp;EZUSB_IRQ_ENABLE();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;USB&nbsp;interrupt&nbsp;(INT2)&nbsp;<br />&nbsp;EZUSB_ENABLE_RSMIRQ();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Wake-up&nbsp;interrupt&nbsp;<br />&nbsp;//&nbsp;The&nbsp;8051&nbsp;is&nbsp;responsible&nbsp;for&nbsp;all&nbsp;USB&nbsp;events,&nbsp;even&nbsp;those&nbsp;that&nbsp;have&nbsp;happene&nbsp;<br />d&nbsp;<br />&nbsp;//&nbsp;before&nbsp;this&nbsp;point.&nbsp;&nbsp;We&nbsp;cannot&nbsp;ignore&nbsp;pending&nbsp;USB&nbsp;interrupts.&nbsp;<br />&nbsp;//&nbsp;The&nbsp;chip&nbsp;will&nbsp;come&nbsp;out&nbsp;of&nbsp;reset&nbsp;with&nbsp;the&nbsp;flags&nbsp;all&nbsp;cleared.&nbsp;<br />&nbsp;//&nbsp;USBIRQ&nbsp;=&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clear&nbsp;any&nbsp;pending&nbsp;USB&nbsp;interrupt&nbsp;requests&nbsp;<br />&nbsp;PORTCCFG&nbsp;|=&nbsp;0xc0;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Turn&nbsp;on&nbsp;r/w&nbsp;lines&nbsp;for&nbsp;external&nbsp;memory&nbsp;<br />&nbsp;USBBAV&nbsp;=&nbsp;USBBAV&nbsp;|&nbsp;1&nbsp;&amp;&nbsp;~bmBREAK;&nbsp;//&nbsp;Disable&nbsp;breakpoints&nbsp;and&nbsp;autovectoring&nbsp;<br />&nbsp;USBIEN&nbsp;|=&nbsp;bmSUDAV&nbsp;|&nbsp;bmSUTOK&nbsp;|&nbsp;bmSUSP&nbsp;|&nbsp;bmURES;&nbsp;//&nbsp;Enable&nbsp;selected&nbsp;interrupt&nbsp;<br />s&nbsp;<br />&nbsp;EA&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;8051&nbsp;interrupts&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Note:&nbsp;at&nbsp;full&nbsp;speed,&nbsp;high&nbsp;speed&nbsp;hosts&nbsp;may&nbsp;take&nbsp;5&nbsp;sec&nbsp;to&nbsp;detect&nbsp;device&nbsp;<br />&nbsp;<br />&nbsp;#ifndef&nbsp;NO_RENUM&nbsp;<br />&nbsp;&nbsp;&nbsp;EZUSB_Discon(TRUE);&nbsp;//&nbsp;renumerate&nbsp;<br />&nbsp;#endif&nbsp;<br />&nbsp;CKCON&nbsp;=&nbsp;(CKCON&amp;(~bmSTRETCH))&nbsp;|&nbsp;FW_STRETCH_VALUE;&nbsp;//&nbsp;Set&nbsp;stretch&nbsp;to&nbsp;0&nbsp;(after&nbsp;<br />&nbsp;renumeration)&nbsp;<br />&nbsp;//&nbsp;Task&nbsp;Dispatcher&nbsp;<br />&nbsp;while(TRUE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Main&nbsp;Loop&nbsp;<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;if(GotSUD)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Wait&nbsp;for&nbsp;SUDAV&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;SetupCommand();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Implement&nbsp;setup&nbsp;command&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GotSUD&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clear&nbsp;SUDAV&nbsp;flag&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;//&nbsp;Poll&nbsp;User&nbsp;Device&nbsp;<br />&nbsp;&nbsp;//&nbsp;NOTE:&nbsp;Idle&nbsp;mode&nbsp;stops&nbsp;the&nbsp;processor&nbsp;clock.&nbsp;&nbsp;There&nbsp;are&nbsp;only&nbsp;two&nbsp;<br />&nbsp;&nbsp;//&nbsp;ways&nbsp;out&nbsp;of&nbsp;idle&nbsp;mode,&nbsp;the&nbsp;WAKEUP&nbsp;pin,&nbsp;and&nbsp;detection&nbsp;of&nbsp;the&nbsp;USB&nbsp;<br />&nbsp;&nbsp;//&nbsp;resume&nbsp;state&nbsp;on&nbsp;the&nbsp;USB&nbsp;bus.&nbsp;&nbsp;The&nbsp;timers&nbsp;will&nbsp;stop&nbsp;and&nbsp;the&nbsp;<br />&nbsp;&nbsp;//&nbsp;processor&nbsp;will&nbsp;not&nbsp;wake&nbsp;up&nbsp;on&nbsp;any&nbsp;other&nbsp;interrupts.&nbsp;<br />&nbsp;&nbsp;if&nbsp;(Sleep)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(TD_Suspend())&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep&nbsp;=&nbsp;FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clear&nbsp;the&nbsp;&quot;go&nbsp;to&nbsp;sleep&quot;&nbsp;flag.&nbsp;&nbsp;Do&nbsp;it&nbsp;here&nbsp;t&nbsp;<br />o&nbsp;prevent&nbsp;any&nbsp;race&nbsp;condition&nbsp;between&nbsp;wakeup&nbsp;and&nbsp;the&nbsp;next&nbsp;sleep.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EZUSB_Susp();&nbsp;&nbsp;&nbsp;//&nbsp;Place&nbsp;processor&nbsp;in&nbsp;idle&nbsp;mode.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!Rwuen&nbsp;&amp;&amp;&nbsp;EZUSB_EXTWAKEUP());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Must&nbsp;continue&nbsp;to&nbsp;go&nbsp;back&nbsp;into&nbsp;suspend&nbsp;if&nbsp;the&nbsp;host&nbsp;has&nbsp;dis&nbsp;<br />abled&nbsp;remote&nbsp;wakeup&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;*and*&nbsp;the&nbsp;wakeup&nbsp;was&nbsp;caused&nbsp;by&nbsp;the&nbsp;external&nbsp;wakeup&nbsp;pin.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;8051&nbsp;activity&nbsp;will&nbsp;resume&nbsp;here&nbsp;due&nbsp;to&nbsp;USB&nbsp;bus&nbsp;or&nbsp;Wakeup#&nbsp;pin&nbsp;activ&nbsp;<br />ity.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EZUSB_Resume();&nbsp;//&nbsp;If&nbsp;source&nbsp;is&nbsp;the&nbsp;Wakeup#&nbsp;pin,&nbsp;signal&nbsp;the&nbsp;host&nbsp;to&nbsp;R&nbsp;<br />esume.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TD_Resume();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;TD_Poll();&nbsp;<br />&nbsp;}&nbsp;<br />}&nbsp;<br />//&nbsp;Device&nbsp;request&nbsp;parser&nbsp;<br />void&nbsp;SetupCommand(void)&nbsp;<br />{&nbsp;<br />&nbsp;void&nbsp;*dscr_ptr;&nbsp;<br />&nbsp;DWORD&nbsp;i;&nbsp;<br />&nbsp;switch(SETUPDAT[0]&nbsp;&amp;&nbsp;SETUP_MASK)&nbsp;<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;case&nbsp;SETUP_STANDARD_REQUEST:&nbsp;&nbsp;//Standard&nbsp;Request&nbsp;<br />&nbsp;&nbsp;&nbsp;switch(SETUPDAT[1])&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;SC_GET_DESCRIPTOR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;***&nbsp;Get&nbsp;Descriptor&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(DR_GetDescriptor())&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(SETUPDAT[3])&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;GD_DEVICE:&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Device&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUDPTRH&nbsp;=&nbsp;MSB(pDeviceDscr);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUDPTRL&nbsp;=&nbsp;LSB(pDeviceDscr);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;GD_CONFIGURATION:&nbsp;&nbsp;&nbsp;//&nbsp;Configuration&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dscr_ptr&nbsp;=&nbsp;(void&nbsp;*)EZUSB_GetConfigDscr(SETUPDAT[2]))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUDPTRH&nbsp;=&nbsp;MSB(dscr_ptr);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUDPTRL&nbsp;=&nbsp;LSB(dscr_ptr);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EZUSB_STALL_EP0();&nbsp;&nbsp;//&nbsp;Stall&nbsp;End&nbsp;Point&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;GD_STRING:&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;String&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dscr_ptr&nbsp;=&nbsp;(void&nbsp;*)EZUSB_GetStringDscr(SETUPDAT[2]))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?