中文版pdiusbd12固件編程指南_第1頁
中文版pdiusbd12固件編程指南_第2頁
中文版pdiusbd12固件編程指南_第3頁
中文版pdiusbd12固件編程指南_第4頁
中文版pdiusbd12固件編程指南_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

PDIUSBD12PDIUSBD12DMAUSB接口器件固件設(shè)計(jì)的目標(biāo)就是PDIUSBD12在USB上達(dá)到最大的傳輸速率外圍設(shè)備例如打印機(jī)掃描儀外部的海量存儲(chǔ)器和數(shù)碼PDIUSBD12在USBCPU要忙于處理許多設(shè)備控制和數(shù)據(jù)以及圖像處理等任務(wù)PDIUSBD12CPU處理前臺(tái)任務(wù)時(shí)USB的傳輸可在后臺(tái)進(jìn)行這就確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu)同時(shí)簡(jiǎn)化了編程和調(diào)試ISR中斷服務(wù)程序和前臺(tái)主程序循環(huán)之間的數(shù)據(jù)交換通過事件標(biāo)志和數(shù)據(jù)緩沖區(qū)來實(shí)現(xiàn)例如PDIUSBD12的批量輸出端點(diǎn)可使用循環(huán)的數(shù)據(jù)緩沖區(qū)當(dāng)PDIUSBD12USB收到一個(gè)數(shù)據(jù)包那CPU產(chǎn)生一個(gè)中斷請(qǐng)求CPU立即響應(yīng)中斷在ISRPDIUSBD12PDIUSBD12DMAUSB接口器件固件設(shè)計(jì)的目標(biāo)就是PDIUSBD12在USB上達(dá)到最大的傳輸速率外圍設(shè)備例如打印機(jī)掃描儀外部的海量存儲(chǔ)器和數(shù)碼PDIUSBD12在USBCPU要忙于處理許多設(shè)備控制和數(shù)據(jù)以及圖像處理等任務(wù)PDIUSBD12CPU處理前臺(tái)任務(wù)時(shí)USB的傳輸可在后臺(tái)進(jìn)行這就確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu)同時(shí)簡(jiǎn)化了編程和調(diào)試ISR中斷服務(wù)程序和前臺(tái)主程序循環(huán)之間的數(shù)據(jù)交換通過事件標(biāo)志和數(shù)據(jù)緩沖區(qū)來實(shí)現(xiàn)例如PDIUSBD12的批量輸出端點(diǎn)可使用循環(huán)的數(shù)據(jù)緩沖區(qū)當(dāng)PDIUSBD12USB收到一個(gè)數(shù)據(jù)包那CPU產(chǎn)生一個(gè)中斷請(qǐng)求CPU立即響應(yīng)中斷在ISR中固件將數(shù)據(jù)包從PDIUSBD12內(nèi)部緩沖區(qū)PDIUSBD12的內(nèi)部緩沖區(qū)以使能接收新的數(shù)據(jù)包CPU可以繼續(xù)它當(dāng)USB串口還是并口它只檢查循環(huán)緩沖區(qū)內(nèi)需要處理的新ISR能夠以最大可能的速度進(jìn)行數(shù)據(jù)的傳輸相似的控制端點(diǎn)在數(shù)據(jù)包處理時(shí)采用了同樣的概念I(lǐng)SR接收和保存數(shù)據(jù)緩沖區(qū)中的控制傳輸并設(shè)置相應(yīng)的標(biāo)志寄存器主循環(huán)向協(xié)議處理程序發(fā)出請(qǐng)求由于所有的標(biāo)準(zhǔn)器件級(jí)別和廠商請(qǐng)求都是在協(xié)議處理程序中進(jìn)行處理ISR得以保持它的效率而且一旦增加新的請(qǐng)求只需要在協(xié)議層進(jìn)行修改1PDIUSBD12主循環(huán)發(fā)送USB請(qǐng)求KeyLED硬件提取層PDIUSBD12I/OCPU平臺(tái)接口時(shí)這部分代碼需要修改或增加//File#ifdefC51#include<reg51.h>#include"epphal.h"#include"d12ci.h"#include硬件提取層PDIUSBD12I/OCPU平臺(tái)接口時(shí)這部分代碼需要修改或增加//File#ifdefC51#include<reg51.h>#include"epphal.h"#include"d12ci.h"#include/*specialfunctionregisterexternEPPFLAGSvoidoutportb(unsignedcharport,unsignedchar{unsignedcharxdataMCU_HOSTDACKext_address=0xff00+MCU_HOSTDACK}unsignedcharinportb(unsignedchar{unsignedcharunsignedcharxdataMCU_HOSTDACKext_address=0xff00+c=*ext_addressMCU_HOSTDACK2return}{MCU_HOSTDACKreturn}{MCU_HOSTDACKP0=(A_data|EPP_WRITE=EPP_DSTROBE=EPP_ASTROBE=EPP_ASTROBE=EPP_ASTROBE=P0=(A_data&EPP_ASTROBE=EPP_ASTROBE=MCU_HOSTDACK}voidprogram_cpld(unsignedshortuSize,unsignedchar{MCU_HOSTDACK= //setCPLDprintf("CPLDcounterreadback=0x%bx,0x%bx.\n",inportb(CPLD_CNT0),if(bCommand&0x1)MCU_DMARD_WR=EPP_WRITE=//}MCU_DMARD_WR=3EPP_WRITE=//}MCU_HOSTDACK=}{eppAwrite((pio->uAddressL>>13)EPP_WRITE=//}MCU_HOSTDACK=}{eppAwrite((pio->uAddressL>>13)+(pio->bAddressH<<3));program_cpld(pio->uSize,pio->bCommand);}PDIUSBD12命令接口PDIUSBD12PDIUSBD12////I/OmodeMainendpointsread/writeupdate(WK)AddedD12_ReadMainEndpoint(WK)#ifdef#include/*specialfunctionregister#include"epphal.h"#includeexternEPPFLAGSvoidD12_SetAddressEnable(unsignedcharbAddress,unsignedchar{outportb(D12_COMMAND,0xD0);bAddress|=outportb(D12_DATA,4if(bEPPflags.bits.in_isr==}{outportb(D12_COMMAND,if(bEPPflags.bits.in_isr==}{outportb(D12_COMMAND,0xD8);outportb(D12_DATA,outportb(D12_DATA,if(bEPPflags.bits.in_isr==}{outportb(D12_COMMAND,0xF3);outportb(D12_DATA,bConfig);if(bEPPflags.bits.in_isr==}voidD12_SetDMA(unsignedchar{outportb(D12_COMMAND,outportb(D12_DATA,if(bEPPflags.bits.in_isr==}5unsignedshort{unsignedintj;outportb(D12_COMMAND,0xF4);b1=inportb(D12_DATA);junsignedshort{unsignedintj;outportb(D12_COMMAND,0xF4);b1=inportb(D12_DATA);j=j<<=j+=}{unsignedcharif(bEPPflags.bits.in_isr==outportb(D12_COMMAND,c=if(bEPPflags.bits.in_isr==return}{outportb(D12_COMMAND,0x40+bEndp);returninportb(D12_DATA);}{unsignedcharif(bEPPflags.bits.in_isr==6outportb(D12_COMMAND,0x80+c=if(bEPPflags.bits.in_isr==return}outportb(D12_COMMAND,0x80+c=if(bEPPflags.bits.in_isr==return}{outportb(D12_COMMAND,0x40+outportb(D12_DATA,if(bEPPflags.bits.in_isr==}void{outportb(D12_COMMAND,}unsignedshort{unsignedshortif(bEPPflags.bits.in_isr==outportb(D12_COMMAND,0xF5);i=inportb(D12_DATA);j=i+=if(bEPPflags.bits.in_isr==}7unsignedshort{unsignedshortif(bEPPflags.bits.in_isr==outportb(portbase+D12_COMMAND,unsignedshort{unsignedshortif(bEPPflags.bits.in_isr==outportb(portbase+D12_COMMAND,0xFD);i+=if(bEPPflags.bits.in_isr==}unsignedcharD12_ReadEndpoint(unsignedcharendp,unsignedchar*buf,unsignedchar{unsignedchari,if(bEPPflags.bits.in_isr==outportb(D12_COMMAND,endp);if((inportb(D12_DATA)&D12_FULLEMPTY)==0){return}outportb(D12_COMMAND,0xF0);j=inportb(D12_DATA);j=if(j>j=*(buf+i)=outportb(D12_COMMAND,8if(bEPPflags.bits.in_isr==}//D12_ReadMainEndpoint()addedbyV2.2toif(bEPPflags.bits.in_isr==}//D12_ReadMainEndpoint()addedbyV2.2tosupportdouble-//Callershouldassumemaxium128bytesofreturneddata.unsignedcharD12_ReadMainEndpoint(unsignedchar*buf){unsignedchari,j,k=0,bDblBuf=if(bEPPflags.bits.in_isr==outportb(D12_COMMAND,if((inportb(D12_DATA)&0x60)==0x60)bDblBuf=2;outportb(D12_COMMAND,4);if((inportb(D12_DATA)&D12_FULLEMPTY)==0)outportb(D12_COMMAND,0xF0);j=inportb(D12_DATA);j=*(buf+i+k)=k+=outportb(D12_COMMAND,bDblBuf--}if(bEPPflags.bits.in_isr==return}9unsignedcharD12_WriteEndpoint(unsignedcharendp,unsignedchar*buf,unsignedcharD12_WriteEndpoint(unsignedcharendp,unsignedchar*buf,unsignedchar{unsignedcharif(bEPPflags.bits.in_isr==outportb(D12_COMMAND,outportb(D12_COMMAND,0xF0);outportb(D12_DATA,0);outportb(D12_DATA,outportb(D12_DATA,outportb(D12_COMMAND,if(bEPPflags.bits.in_isr==return}{outportb(D12_COMMAND,endp);outportb(D12_COMMAND,0xF1);if(endp==0)outportb(D12_COMMAND,}#ifndefunsignedchar{}voidD12Eval_outportb(unsignedcharval,unsignedchar{staticunsignedcharlast_val=val=(val&mask)|(last_val&last_val=}中斷服務(wù)程序PDIUSBD12產(chǎn)生的中斷它將數(shù)據(jù)從PDIUSBD12FIFOCPU存儲(chǔ)//last_val=}中斷服務(wù)程序PDIUSBD12產(chǎn)生的中斷它將數(shù)據(jù)從PDIUSBD12FIFOCPU存儲(chǔ)//FileName://AddedI/OmodeMainendpointsaccess.#include<stdio.h>#include#ifdefC51#include/*specialfunctionregister#include"epphal.h"#include"d12ci.h"#includeexternvoidexternvoidexternvoidexternvoidexternvoidexternvoidexternvoidexternvoid//PublicstaticEPPFLAGS/*ControlendpointTX/RXbuffersexternCONTROL_XFER/*EPPFLAGS/*ControlendpointTX/RXbuffersexternCONTROL_XFER/*ISRstaticvarsIO_REQUESTidataioRequest;unsignedlongClockTicks=#ifndefvoidinterrupt(*OldUsbIsr)();unsignedlongClockIsr=0;externunsignedlongioBuffer;//externunsignedshortioSize,ioCount;//V2.1#ifdefC51{}voidinterrupt{bEPPflags.bits.timer=}#ifdefusb_isr()interrupt{}voidinterruptusb_isr()interrupt{}voidinterrupt{ClockIsr=outportb(0x20,}void{unsignedinti_st=if(i_st!=0)if(i_st&{bus_reset();}if(i_st&if(i_st&D12_INT_ENDP0IN)if(i_st&if(i_st&D12_INT_ENDP1IN)if(i_st&D12_INT_ENDP1OUT)if(i_stif(i_st&D12_INT_ENDP1IN)if(i_st&D12_INT_ENDP1OUT)if(i_st&D12_INT_ENDP2OUT)}}}void{}void{unsignedcharep_last,ControlData.wCount=if(D12_ReadEndpoint(0,(unsignedcharD12_SetEndpointStatus(0,1);}#ifdef//Acknowledgesetupheretounlockin/outControlData.wLength=ControlData.wCount=//Acknowledgesetupheretounlockin/outControlData.wLength=ControlData.wCount={bEPPflags.bits.control_state=USB_IDLE/*getcommand}{bEPPflags.bits.setup_packet=1;}/*setcommand{bEPPflags.bits.control_state=D12_SetEndpointStatus(0D12_SetEndpointStatus(1}bEPPflags.bits.control_s=USB_RECEIVE/*setcommandwithtoken}}//setcommandwith}//elseset}//ifsetupi= ControlData.wCount+={bEPPflags.bits.setup_packet=1;bEPPflags.bits.control_state=USB_IDLE;}}bEPPflags.bits.control_state=bEPPflags.bits.control_state=USB_IDLE}}void{shorti=ControlData.wLength-if(bEPPflags.bits.control_state!=ControlData.wCount+=EP0_PACKET_SIZE;bEPPflags.bits.control_state=USB_TRANSMIT}elseif(i!=0)ControlData.wCount+=i;bEPPflags.bits.control_state=USB_IDLE}elseif(i==D12_WriteEndpoint(1,0,0);//SendzeropacketattheendbEPPflags.bits.control_state=USB_IDLE}}void{if(bEPPflags.bits.dma_state==DMA_PENDING)bEPPflags.bits.setup_dma=1;bEPPflags.bits.dma_state=DMA_IDLE}void{}void{unsignedchar}void{unsignedcharlen=D12_ReadEndpoint(2,GenEpBuf,if(len!=bEPPflags.bits.ep1_rxdone=}void{#ifndefunsignedshortlen;unsignedcharfar*fp;unsignedshortseg,#ifndefseg=(ioBuffer+off=(ioBuffer+ioCount)&0xf;fp=MK_FP(seg,off);len=ioSize-ioCount;if(len==0){if(bEPPflags.bits.dma_state==DMA_PENDING)bEPPflags.bits.setup_dma=1;bEPPflags.bits.dma_state=DMA_IDLE}if(len>len=ioCount+=len;}}void{#ifndefunsignedcharlen;unsignedcharfar*fp;unsignedshortseg,#ifndefvoid{#ifndefunsignedcharlen;unsignedcharfar*fp;unsignedshortseg,#ifndefseg=(ioBuffer+off=(ioBuffer+ioCount)&0xf;fp=MK_FP(seg,off);len=D12_ReadMainEndpoint(fp);ioCount+=len;if(ioCount>=ioSize)if(bEPPflags.bits.dma_state==DMA_PENDING)bEPPflags.bits.setup_dma=1;bEPPflags.bits.dma_state=DMA_IDLE}}主循環(huán)例如//FileName://AddedI/OaccesssupportonMainendpoints.#include<stdio.h>#include#ifdef#include<bios.h>#include<dos.h>/*specialfunctionregister#include"epphal.h"#include"d12ci.h"#include"usb100.h"#include"chap_9.h"#include"epphal.h"#include"d12ci.h"#include"usb100.h"#include"chap_9.h"http://USBprotocolfunctionpointer{{//Public//PublicstaticexternEPPFLAGSbEPPflags;externunsignedcharidataexternIO_REQUESTidataCONTROL_XFERcodechar*_NAME_USB_REQUEST_DIRECTION[]{codechar*_NAME_USB_REQUEST_RECIPIENT[]{codechar*_NAME_USB_REQUEST_TYPE[]{codechar*_NAME_USB_STANDARD_REQUEST[]voidhelp_devreq(unsignedchartyp,voidhelp_devreq(unsignedchartyp,unsignedchar{typ>>=if(typ==USB_STANDARD_REQUEST)printf("RequestType=%s,Request=%s.\n",}{#ifdefprintf("RequestType=%s,bRequest=0x%bx.\n",_NAME_USB_REQUEST_TYPE[typ],printf("RequestType=%s,bRequest=0x%x.\n",_NAME_USB_REQUEST_TYPE[typ],}}Clock====#ifndefexternvoidinterrupt(*OldUsbIsr)();externunsignedlongunsignedlongdmaBuffer;unsignedlongioBuffer;//#ifndefexternvoidinterrupt(*OldUsbIsr)();externunsignedlongunsignedlongdmaBuffer;unsignedlongioBuffer;//V2.1unsignedshortioSize,ioCount;//void{#ifdefTMOD&=0XF0;TMOD|=0X1;TL0=0X0;ET0=1;TR0=PT0=/*valuesetby /*valuesetbyuser/*/*TCON.4starttimerEA=setvect(0x8,timer_isr);}/*InterruptControlUnit****EnabledinterruptsinInterruptEnableRegisterGLOBALINTERRUPTMUSTBEENABLEDFORANYINTERRUPTTOGLOBALINTERRUPTDISABLEDALLAREExternalinterrupt0PriorityLevel=0Timer0interruptPriorityLevel=void{#ifdefIT0=EX0={#ifdefIT0=EX0=PX0=unsignedcharc,OldUsbIsr=c=c&=0xDF;eo=0x0;eo=0x80;}void{#ifdefP0=0xFF;P1=0xFF;P2=unsignedlongif(privateBuffer==NULL){}phys=(unsignedlong)FP_SEG(privateBuffer)*16+FP_OFF(privateBuffer);if((phys&0x0ffffL)==0){dmaBuffer=}phys+=0x10000;dmaBuffer=}privateBuffer,dmaBuffer);}dmaBuffer=}privateBuffer,dmaBuffer);}/*SerialPortSerialPort=1/8-bit==/*AutoAddressing voidinit_serial(void){#ifdefSCON=PCON=0X80|PCON;TMOD=0X20;TCON=0x69; /*TCON*/TH1=0xF3;}void{#ifndefunsignedcharc|=0x20;outportb(0x21,}void{BOOLin_loop=TRUE;unsignedcharkey,i;#ifndefvoid{BOOLin_loop=TRUE;unsignedcharkey,i;#ifndef/*Poweronreset,lightupLEDsfor1sec,printf("Re-connectPDIUSBD12evaluationboardto/*Mainprogramloopwhile(in_loop#ifdefer){DISABLE;bEPPflags.bits.timer=}if(RI)key=ifbEPPflags.bits.timer=if(ClockSec!=last_clk){printf("Idletime=%ldsec.\r",bEPPflags.bits.timer=if(ClockSec!=last_clk){printf("Idletime=%ldsec.\r",(ClockTicks-ClockIsr)*10/182);last_clk=ClockSec;}}if(bioskey(1))key&=0xff;case0x1b:/*ESC#ifndefin_loop=case'r':case'i':printf("Controlstate=USB_IDLE.");printf("Controlstate=elseif(bEPPflags.bits.control_state==USB_TRANSMIT)printf("Controlstate=USB_TRANSMIT.");#ifndefprintf("Endpoint4(BulkOut)Status=%x,Endpoint5(BulkIn)Status=%x.\n",D12_ReadEndpointStatus(4),D12_ReadEndpointStatus(5));printf("ioSize=%x,ioCount=%x.\n",ioSize,printf("Endpoint4(BulkOut)Status=%bx,Endpoint5(BulkIn)Status=if(bEPPflags.bits.dma_state==DMA_IDLEelseif(bEPPflags.bits.dma_state==DMA_RUNNING)printf("DMA_State=DMA_RUNNING.\n");elseif(bEPPflags.bits.dma_state==printf("DMA_State=#ifndefelseif(bEPPflags.bits.dma_state==DMA_RUNNING)printf("DMA_State=DMA_RUNNING.\n");elseif(bEPPflags.bits.dma_state==printf("DMA_State=#ifndefprintf("LastDeviceRequest:bmRequestType=0x%x,bRequest=0x%x,wValue=0x%x,wLength=0x%x,wIndex=0x%x.\n",MCU_HOSTDACK=printf("CPLDcounterreadback=0x%bx,0x%bx.\n",inportb(CPLD_CNT0),MCU_HOSTDACK=printf("LastDeviceRequest:bmRequestType=0x%bx,bRequest=0x%bx,wValue=0x%x,wLength=0x%x,wIndex=0x%x.\n",#ifndefprintf("0x%x,",printf("0x%bx,",case'\r':printf("VerboseMode=ON.\n");bEPPflags.bits.verbose=printf("VerboseMode=ON.\n");bEPPflags.bits.verbose=}printf("VerboseMode=OFF.\n");bEPPflags.bits.verbose=}}}if{printf("Bus}//ifbusif{}//ifsuspend}//ifsetup_packet}//Main}void{}void}//Main}void{}void{D12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,}void{//InitializeD12D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING D12_SETTOONE |D12_CLOCK_12}void{bEPPflags.value=//V2.1enablenormal+sofD12_SetDMA(D12_ENDP4INTENABLE|D12_ENDP5INTENABL//InitializeD12configurationD12_SETTOONE|}void{unsignedlong#ifndefMCU_LED0=MCU_LED1=printf("Waitfor1secondMCU_LED1=printf("Waitfor1secondclk_cnt=ClockTicks;;#ifndefMCU_LED0=MCU_LED1=}void{unsignedchar}void{}voidsingle_transmit(unsignedchar*buf,unsignedchar{D12_WriteEndpoint(1,buf,}}voidcode_transmit(unsignedcharcode*pRomData,unsignedshort{ControlData.wCount=0;ControlData.pData=if(ControlData.wLength>=bEPPflags.bits.control_state=USB_TRANSMIT;if(ControlData.wLength>=bEPPflags.bits.control_state=USB_TRANSMIT;}ControlData.wCount+=ControlData.wLength;bEPPflags.bits.control_state=USB_IDLE}}void{staticunsignedcharc,last_key=#ifndefc=c=MCU_SWM1&c&=if(c!=last_key)}last_key={#ifndefMCU_LED0=!(GenEpBuf[3]&0x1);MCU_LED1=!(GenEpBuf[3]&}}void{#ifndefif(!(ioRequest.bCommand&{bEPPflags.bits.dma_disablevoid{#ifndefif(!(ioRequest.bCommand&{bEPPflags.bits.dma_disable=1;//V2.1,x86D12_SetDMA(D12_ENDP4INTENABLE|D12_ENDP5INTENABL}bEPPflags.bits.dma_disable=0;//bEPPflags.bits.dma_state=DMA_RUNNING;D12_SetDMA(D12_BURST_16|D12_DMAENABLE|D12_SetDMA(D12_BURST_16|}#ifndef//setup_io()setupbufferaddressforI/OmodeMainendpoints//itonlyworksonPCevaluationkit.voidsetup_io(){unsignedlongoffset;unsignedcharfar*fp;unsignedshortseg,offset=(((unsigned+ioCount=0;seg=(ioBuffer+fp=MK_FP(seg,off);bEPPflags.bits.dma_state=DMA_RUNNING;{if(ioSizebEPPflags.bits.dma_state=DMA_RUNNING;{if(ioSize>64)D12_WriteEndpoint(5,fp,ioCount+=}ioCount+=ioSize;}}}void{unsignedchartype,help_devreq(type,req);//printoutdeviceif(type==elseif(type==USB_VENDOR_REQUEST)}協(xié)議層CHAP_9.CUSB器件請(qǐng)求DMA//FileName:#include#include#ifdefC51#include/*specialfunction#include#include#ifdefC51#include/*specialfunctionregister#include"epphal.h"#include"d12ci.h"#include"usb100.h"#include#defineNUM_ENDPOINTS#definesizeof(USB_CONFIGURATION_DESCRIPTOR +sizeof(USB_INTERFACE_DESCRIPTOR)+*externIO_REQUESTidataioRequest;externEPPFLAGSbEPPflags;codeUSB_DEVICE_DESCRIPTORDeviceDescr{0,0,#ifndef0,0,0,1{USB_CONFIGURATION_DESCRIPTO{USB_CONFIGURATION_DESCRIPTORConfigDes={USB_INTERFACE_DESCRIPTORInterfaceDescr0{USB_ENDPOINT_DESCRIPTOREP1_TXDes={USB_ENDPOINT_DESCRIPTOREP1_RXDes={USB_ENDPOINT_DESCRIP{USB_ENDPOINT_DESCRIPTOREP2_TXDes={USB_ENDPOINT_DESCRIPTOREP2_RXDes=#ifndef//USBProtocolvoid{}//USBstandarddevicevoid{unsignedcharendp,unsignedcharc;if(bRecipient==USB_RECIPIENT_DEVICE)txdat[0]=txdat[0]=1;}txdat[0]=txdat[0]=1;}elseif(bRecipient==}elseif(bRecipient==USB_RECIPIENT_ENDPOINT)&c=D12_SelectEndpoint(endp*2);/*Control-out*/if(c&D12_STALL)txdat[0]=txdat[0]=txdat[1]=}}void{unsignedchar&if(bRecipient=={}elseif(bRecipient=={endp=(unsignedchar)(ControlData.DeviceRequest.wIndex&if(ControlData.DeviceRequest.wIndex&(unsigned/*clearTXstallforINonEPn.*/D12_SetEndpointStatus(endp*2+1,0);/*clearRXstallforOUTonEPn.*/D12_SetEndpoin/*clearRXstallforOUTonEPn.*/D12_SetEndpointStatus(endp*2,0);}}void{unsignedcharif(bRecipient=={}elseif(bRecipient=={endp=(unsignedchar)(ControlData.DeviceRequest.wIndex&if(ControlData.DeviceRequest.wIndex&(unsigned/*clearTXstallforINonEPn.*/D12_SetEndpointStatus(endp*2+1,1);/*clearRXstallforOUTonEPn.*/D12_SetEndpointStatus(endp*2,1);}}void{DEVICE_ADDRESS_MASK),1);}&void{unsignedcharbDescriptor=if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)}elseif(bDescriptor==}}void{unsignedcharc=}void{/*putdeviceinunconfiguredstate*/single_transmit(0,0);}elseif(ControlData.DeviceRequest.wValue==1)}}void{unsignedchartxdat=0;}/*Only/Currentinterface=0void{single_transmit(0,0);}void{single_transmit(0,0);}//FileName:////////18Aug#include#include#ifdef#include#include<dos.h>/*specialfunctionregister#include"d12ci.h"#include"usb100.h"#includeexternCONTROL_XFERexternIO_REQUESTidataioRequest;externEPPFLAGSbEPPflags;void{unsignedchar#ifndefi=0x01;//firmwareversionnumber,return0x01forPCkitversioni=0x21;//firmwareversionnumber,return0x11forPCkitusing8052,0x21forUSB-}void}void{ioRequest.uSize=ioRequest.uAddressL=if(ioRequest.uSize>DMA_BUFFER_SIZE){//Unacceptedrequest}{}bEPPflags.bits.dma_state=DMA_PENDING;}}//elseifaccepted}void{unsignedcharUSB_ENDPOINT_DIRECTION_MASK){printf("ReadRegisters:Offset=0x%x,Length=0x%x,Index=0x%x.\n",if(ControlData.DeviceRequest.wIndex==GET_FIRMWARE_VERSIONControlData.DeviceRequest.wValue==0}//ifreadif(bEPPflags.bits.verbose)printf("WriteRegisters:Offset=0x%x,Length=0x%x,Index=0x%x.\n",}//ifreadif(bEPPflags.bits.verbose)printf("WriteRegisters:Offset=0x%x,Length=0x%x,Index=0x%x.\n",#ifndefprintf("0x%x,",printf("0x%bx,",}ControlData.DeviceRequest.wValue==0&&ControlData.DeviceRequest.wLength==6)//ifwrite}}CPU下表所示為積木結(jié)構(gòu)中需要修改的部分有兩個(gè)級(jí)別的接口第一是第9USB請(qǐng)求使固件通過枚舉第二級(jí)是完全的產(chǎn)品開發(fā)Chapter9USB如果需要增加廠商請(qǐng)求CPU和系統(tǒng)決定口定時(shí)器在MAINLOOP.H中有如下CPU和編譯器預(yù)定#ifdef#defineSWAP(x)#definecode#defineSWAP8031”code”和”idata”在MAINLOOP.H中有如下CPU和編譯器預(yù)定#ifdef#defineSWAP(x)#definecode#defineSWAP8031”code”和”idata”8031KeilC編譯器時(shí)才需要在輪詢模式中使用固件是十分方便的在主循環(huán)中ISRCPUvoidoutportb(unsignedcharport,unsignedcharval);voidinportb(unsignedcharport);PDIUSBD12I/O訪問都可由前兩個(gè)函數(shù)outportbinportb實(shí)現(xiàn)對(duì)于最后一個(gè)函數(shù)它用于實(shí)現(xiàn)EPPDMAEPPCPLD計(jì)數(shù)器這種類型的實(shí)現(xiàn)允許系統(tǒng)脫8051PC以外的平臺(tái)USB_EPPdma_start()22voidprogram_cpld(unsignedshortuSize,unsignedcharPDIUSBD12下面的函數(shù)定義成PDIUSBD12的命令接口以簡(jiǎn)化器件的編程它們是由數(shù)據(jù)手冊(cè)簡(jiǎn)化的PDIUSBD12voidD12_SetAddressEnable(unsignedcharbAddress,unsignedcharbEnable);voidD12_SetEndpointEnable(unsignedcharbEnable);voidD12_SetMode(unsignedcharbConfig,unsignedcharbClkDiv);voidD12_SetDMA(unsignedcharbMode);unsignedshortD12_ReadInterruptRegister(void);voidD12_SetEndpointStatus(unsignedcharbEndp,unsignedcharbStalled);voidD12_SendResume(void);unsignedshortunsignedcharD12_ReadEndpoint(unsignedcharendp,unsignedchar*buf,unsignedcharlen);unsignedcharD12_WriteEndpoint(unsignedcharendp,unsignedchar*buf,unsignedcharlen);voidD12_AcknowledgeEndpoint(unsignedcharendp);PDIUSBD12的固件完全由中斷驅(qū)動(dòng)ISR在ISRD12_ReadInterruptRegiste()ISRBusN DMAN ControlInN ControlOutN GenericIn Generic在ISRD12_ReadInterruptRegiste()ISRBusN DMAN ControlInN ControlOutN GenericIn GenericOutN MainInN MainOut YesEndofSendEOItoInterruptMainTXGenericTXhandlerGenericRXhandlerControlRXhandlerDMAEOThandlerSetBusResetReadD12InterruptRegisterResetIdleTimerISR與前臺(tái)主循環(huán)通過事件標(biāo)志EPPFLAGStypedefunion_epp_flags{{unsignedchartimerunsignedcharsuspendunsignedcharunsignedcharunsignedcharunsignedcharISR與前臺(tái)主循環(huán)通過事件標(biāo)志EPPFLAGStypedefunion_epp_flags{{unsignedchartimerunsignedcharsuspendunsignedcharunsignedcharunsignedcharunsignedcharunsignedcharverboseunsignedcharep1_rxdoneunsignedcharsetup_dmaunsignedcharunsignedshorttypedef{unsignedcharbRequest;unsignedshortwValue;unsignedshortwindex;unsignedshortwLength;{unsignedshortwLengthunsignedshortunsignedchar*unsignedcharISR之間的任務(wù)分配是這樣的ISRD12收集數(shù)據(jù)而主循環(huán)對(duì)數(shù)據(jù)進(jìn)行處理集了足夠的數(shù)據(jù)時(shí)它只通知主循環(huán)已經(jīng)準(zhǔn)備好等待處理例如OUTISRISROUT數(shù)據(jù)都存入CONTROL_XFER緩沖區(qū)中然后將setup_packer標(biāo)志送到主循環(huán)這將減ISR中進(jìn)行特殊的處理ISREPPFLAGS中設(shè)置bus_resetsuspends標(biāo)志位然后退出即可SETUPDATA階段然后在STATUS階段結(jié)束上圖所3如下所示為控制輸出處理程序?yàn)榱苏f明它舉一個(gè)主機(jī)請(qǐng)求的例子叫做GetDescriptor()ControlOutSetup ControlState<-ValidDeviceAllDataControlState<-USB_IDLESetEvent:SetupPacketYesControlState<-ControlSetEvent:SetupControlWritewithsuspends標(biāo)志位然后退出即可SETUPDATA階段然后在STATUS階段結(jié)束上圖所3如下所示為控制輸出處理程序?yàn)榱苏f明它舉一個(gè)主機(jī)請(qǐng)求的例子叫做GetDescriptor()ControlOutSetup ControlState<-ValidDeviceAllDataControlState<-USB_IDLESetEvent:SetupPacketYesControlState<-ControlSetEvent:SetupControlWritewithControlState<-USB_IDLESetEvent:SetupPacket Datalength StallControlControlState<-EndofAcknowledgeSetuponControlInandControlOutSelectControlOutReadBuffer,savetoControlDataBufferClearBufferSelectControlOutEndpointReadBuffer,savetoDeviceRequeClearUSBD12MCU微控制器響應(yīng)中斷通過讀D12中斷寄存器決定包是發(fā)到控制端點(diǎn)還是普通端點(diǎn)如果包是送往控制端點(diǎn)MCUD12的最后處理狀態(tài)寄存器進(jìn)一步確定數(shù)據(jù)是否是一個(gè)建立包第一個(gè)包必須是建立包從上面的流程圖中MCU需要通過選擇控制輸出端點(diǎn)提取建立包的內(nèi)容來決定端點(diǎn)是為滿還是空如果控制端點(diǎn)為滿MCU將從緩沖區(qū)讀出內(nèi)容并將其存入存儲(chǔ)區(qū)之后它將從存儲(chǔ)區(qū)使主設(shè)備請(qǐng)求生效如果是一個(gè)有效的請(qǐng)求MCU必須向控制輸出端點(diǎn)發(fā)送應(yīng)答建立命令以重新使能下一個(gè)建立階段接下來MCUbmRequestType8位來實(shí)現(xiàn)如果控制傳輸是一個(gè)控制讀類型那就是說器件需要在下一個(gè)數(shù)據(jù)階段向主機(jī)發(fā)回?cái)?shù)據(jù)包MCUUSB設(shè)備現(xiàn)在正處于傳輸模式即準(zhǔn)備在主機(jī)發(fā)送請(qǐng)求時(shí)發(fā)送數(shù)據(jù)建立階段結(jié)束之后主機(jī)會(huì)執(zhí)行數(shù)據(jù)階段D12等待接收Control_In包過程如下面的流程圖Control_In處理程序所示MCUD12Control_InUSBD12MCU微控制器響應(yīng)中斷通過讀D12中斷寄存器決定包是發(fā)到控制端點(diǎn)還是普通端點(diǎn)如果包是送往控制端點(diǎn)MCUD12的最后處理狀態(tài)寄存器進(jìn)一步確定數(shù)據(jù)是否是一個(gè)建立包第一個(gè)包必須是建立包從上面的流程圖中MCU需要通過選擇控制輸出端點(diǎn)提取建立包的內(nèi)容來決定端點(diǎn)是為滿還是空如果控制端點(diǎn)為滿MCU將從緩沖區(qū)讀出內(nèi)容并將其存入存儲(chǔ)區(qū)之后它將從存儲(chǔ)區(qū)使主設(shè)備請(qǐng)求生效如果是一個(gè)有效的請(qǐng)求MCU必須向控制輸出端點(diǎn)發(fā)送應(yīng)答建立命令以重新使能下一個(gè)建立階段接下來MCUbmRequestType8位來實(shí)現(xiàn)如果控制傳輸是一個(gè)控制讀類型那就是說器件需要在下一個(gè)數(shù)據(jù)階段向主機(jī)發(fā)回?cái)?shù)據(jù)包MCUUSB設(shè)備現(xiàn)在正處于傳輸模式即準(zhǔn)備在主機(jī)發(fā)送請(qǐng)求時(shí)發(fā)送數(shù)據(jù)建立階段結(jié)束之后主機(jī)會(huì)執(zhí)行數(shù)據(jù)階段D12等待接收Control_In包過程如下面的流程圖Control_In處理程序所示MCUD12Control_In中斷標(biāo)志位接著MCUD12處于傳輸模式后進(jìn)行數(shù)據(jù)包的發(fā)送D1216FIFO16字節(jié)MCU在傳輸階段就必須控制數(shù)據(jù)的數(shù)量如流程圖所示MCU必須檢查要發(fā)送到主機(jī)的當(dāng)前和剩余的數(shù)據(jù)大小如果剩下的字節(jié)數(shù)大16MCU16字節(jié)并用減去參考長(zhǎng)度要求的長(zhǎng)度16Control_In標(biāo)志來到時(shí)MCU將確定剩余的字節(jié)是否為零如果已經(jīng)沒有數(shù)據(jù)要發(fā)送如果建立包為Set_Descriptor()請(qǐng)求那么建立包中的控制傳輸將指示此包為控制寫類型在執(zhí)行完Set_Descriptor請(qǐng)求過程后MCUControl_Out標(biāo)志MCUD12緩沖區(qū)中減去數(shù)據(jù)流程現(xiàn)在處于Control_Out處理程序的右端MCUD12USB_Receive模式MCULEDMCU標(biāo)志通過讀中斷寄存器識(shí)別時(shí)D12中斷位必須清零選擇端點(diǎn)將清零Generic_OutMCUGeneric_InGenericInDataLength=EndofGenericIntEndofGenericOut由于主輸入/DMA中斷服務(wù)但是MainOutMainInEndLEDMCU標(biāo)志通過讀中斷寄存器識(shí)別時(shí)D12中斷位必須清零選擇端點(diǎn)將清零Generic_OutMCUGeneric_InGenericInDataLength=EndofGenericIntEndofGenericOut由于主輸入/DMA中斷服務(wù)但是MainOutMainInEndofMainOutEndofMainInEOTEOTMCU一旦上電就需要初始化其所有端口USBSoft_Connect寄存器設(shè)置為OND12D12不會(huì)進(jìn)行操作在主循環(huán)程序中MCUDMA支持存儲(chǔ)區(qū)定時(shí)器和中斷服務(wù)程序MCU這些過程是很重要的因?yàn)樗_保了在MCU如果任何一個(gè)特定的按鍵被按下序并返回主循環(huán)增加該子程序的目的僅僅是為了調(diào)試1ms定時(shí)器用于激活該子程序以檢測(cè)在評(píng)估板上當(dāng)輪詢到了檢測(cè)建立包時(shí)它確認(rèn)建立標(biāo)志在之前是否被中斷服務(wù)程序所置位ClearMainInInterruptClearMainOutInterruptClearGenericOutInterruptBitMainReadKeyCodeNOnEvaluationBoardTimerNBus ReadSuspendStateDispatchDeviceRequesttoNMainReadKeyCodeNOnEvaluationBoardTimerNBus ReadSuspendStateDispatchDeviceRequesttoN在清除特征請(qǐng)求中MCU需要清除或禁止器件的一個(gè)具體特征MCU端點(diǎn)有意義如果接收器是一個(gè)接口那么將不會(huì)有任何支持當(dāng)使能或設(shè)置器件或端點(diǎn)的具體特征例如遠(yuǎn)程喚醒時(shí)使用特征選擇器如果接收器是一個(gè)器件而遠(yuǎn)程喚醒功能已經(jīng)使能MCU需要禁止該功能如果接收器是端點(diǎn)MCU必須通過設(shè)置端點(diǎn)狀態(tài)命令恢復(fù)指定的端點(diǎn)RestoreISRvectorsinitializePorts,MemoryandTimerClearIsrecipienta Isrecipientan Isrecipientan ClearIsrecipienta Isrecipientan Isrecipientan accordingto"FeatureSelector"MCUMCU求是對(duì)器件MCU必須向主機(jī)返回器件狀態(tài)對(duì)于具有遠(yuǎn)程遙控和自供電能力的系統(tǒng)0x0003如果接收器是一個(gè)接口MCUpackettoCleardevicefeatureaccordingto"FeatureSelector"Isrecipienta Isrecipientan ReturnInterfacestatustohostIsrecipientan statustoEndof因此MCUSetIsrecipienta Isrecipientan ReturnInterfacestatustohostIsrecipientan statustoEndof因此MCUSetEndSet在獲得配置請(qǐng)求中MCU配置將向主機(jī)返回一個(gè)0MCU將確定是否已配置好如果器件尚未packettoWritenewaddressReturnDevicestatustoGetHasDevicebeen 對(duì)于獲得描述符請(qǐng)求如果存在描述符MCU必須返回指定的描述符首先MCU將確定描述符類16字節(jié)控制返回字節(jié)的長(zhǎng)度是因?yàn)?6字節(jié)的存儲(chǔ)區(qū)MCU需要設(shè)置一個(gè)寄存器以指示傳輸規(guī)格的位置SetDidhostsend"0"to EndSetGetHasDevicebeen 對(duì)于獲得描述符請(qǐng)求如果存在描述符MCU必須返回指定的描述符首先MCU將確定描述符類16字節(jié)控制返回字節(jié)的長(zhǎng)度是因?yàn)?6字節(jié)的存儲(chǔ)區(qū)MCU需要設(shè)置一個(gè)寄存器以指示傳輸規(guī)格的位置SetDidhostsend"0"to EndSet對(duì)于設(shè)置配置請(qǐng)求MCU0MCU必須清除存儲(chǔ)區(qū)中的配1MCU需要將配置標(biāo)志置位該標(biāo)志一旦置位MCU還需要向主機(jī)發(fā)送獲得/tohostSetDeviceClearDeviceSent"1"toSent"0"to獲得接口請(qǐng)求中MCU需要向主機(jī)發(fā)送一個(gè)零數(shù)據(jù)包作為評(píng)估板所唯一支持的接口對(duì)于評(píng)估板的設(shè)置接口請(qǐng)求MCU除了向主機(jī)發(fā)送一個(gè)零數(shù)據(jù)包作為應(yīng)答階段之外不需要做任何事設(shè)置特征請(qǐng)求和清除特征請(qǐng)求正好相反如果接收器是一個(gè)器件MCU征選擇器設(shè)置器件特征再次說明的是不支持接口的接收例如0D12指定的端點(diǎn)必須通過D12設(shè)置端點(diǎn)狀態(tài)SetIsrecipienta EndSet獲得接口請(qǐng)求中MCU需要向主機(jī)發(fā)送一個(gè)零數(shù)據(jù)包作為評(píng)估板所唯一支持的接口對(duì)于評(píng)估板的設(shè)置接口請(qǐng)求MCU除了向主機(jī)發(fā)送一個(gè)零數(shù)據(jù)包作為應(yīng)答階段之外不需要做任何事設(shè)置特征請(qǐng)求和清除特征請(qǐng)求正好相反如果接收器是一個(gè)器件MCU征選擇器設(shè)置器件特征再次說明的是不支持接口的接收例如0D12指定的端點(diǎn)必須通過D12設(shè)置端點(diǎn)狀態(tài)SetIsrecipienta

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論