阅读:1198回复:2
请各位大侠帮忙分析一下d12固件程序!
#include "reg51.h"
#include<stdio.h> #include <absacc.h> #define COM XBYTE[0x07f03] #define DAT XBYTE[0x07f02] #define SWAP(x) (((x)&0xff)<<8|(((x)>>8)&0xff)); #define MSB(x) ((x)>>8&0xff); #define USB_IDLE 0; #define USB_TRANSMIT 1; #define USB_RECEIVE 2; typedef struct _device_request { unsigned char bmRequestType; unsigned char bRequest; unsigned short wValue; unsigned short wIndex; unsigned short wLength; }DEVICE_REQUEST; typedef struct _control_xfer { DEVICE_REQUEST DeviceRequest; unsigned short wLength; unsigned short wCount; unsigned char *pData; unsigned char DataBuffer[0x03]; }CONTROL_XFER; CONTROL_XFER ControlData; unsigned char setup_flag; bit config_flag; bit int_flag; unsigned char ep2_data[6]; code unsigned char DeviceDescr[]={0x12,0x01,0x00,0x01,0xdc,0x00,0x00,0x10,0x71,0x04,0x66,0x06,0x00,0x01,0x00,0x00,0x00,0x01}; code unsigned char ConfigDescr[]={0x09,0x02,0x2E,0x00,0x01,0x01,0x00,0x80,0x32, 0x09,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x07,0x05,0x81,0x02,0x10,0x00,0x0A, 0x07,0x05,0x01,0x02,0x10,0x00,0x0A, 0x07,0x05,0x82,0x02,0x40,0x00,0x00, 0x07,0x05,0x02,0x02,0x40,0x00,0x00, }; unsigned char Control_State; void control_handler(); //unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,unsigned char *buf); //unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,unsigned char *buf); /********************************************* usb standard device request address pointer *********************************************/ void stall_ep0(void); void reserved(void); void get_status(void); void clear_feature(void); void set_feature(void); void set_address(void); void get_descriptor(void); void get_configuration(void); void set_configuration(void); void get_interface(void); code void(*StandardDeviceRequest[])(void)= {get_status,clear_feature,reserved,set_feature,reserved,set_address,get_descriptor,reserved,get_configuration,set_configuration,get_interface,reserved}; void D12_WriteEndpoint(unsigned char endp,unsigned char len,unsigned char *buf) { unsigned char i; COM=endp; COM=0xf0; DAT=0; DAT=len; for(i=0; i<len; i++) DAT=(*(buf+i)); COM=0xFA; if(int_flag==0) EA=1; } void D12_ReadEndpoint(unsigned char endp,unsigned char len,unsigned char *buf) { unsigned char i,j; if(int_flag==0) EA=0; COM=endp; COM=0xf0; j=DAT; j=DAT; if(j>len) j=len; for(i=0;i<j;i++) *(buf+i)=DAT; COM=endp; COM=0xf2; if(int_flag==0) EA=1; } void stall_ep0(void) { COM=0x40; DAT=1; COM=0x41; DAT=1; } void reserved(void) { stall_ep0(); } void get_status(void) {EA=1; } void clear_feature(void) { EA=1; } void set_feature(void) {EA=1; } void get_descriptor(void) { unsigned char bDescriptor; unsigned int w_len; bDescriptor=MSB(ControlData.DeviceRequest.wValue); if(bDescriptor==1) { D12_WriteEndpoint(1,16,(unsigned char *)&DeviceDescr); ControlData.wCount=16; ControlData.wLength=18; ControlData.pData=&DeviceDescr; Control_State=1; } else if(bDescriptor==2) { w_len=ControlData.wLength; if(w_len>16) { w_len=16; } D12_WriteEndpoint(1,w_len,(unsigned char *)&ConfigDescr); ControlData.wCount=w_len; ControlData.wLength=sizeof(ConfigDescr); ControlData.pData=&ConfigDescr; Control_State=1; if(w_len<16) Control_State=0; } else { stall_ep0(); } } void set_address(void) { COM=0xd0; DAT=0x82; COM=0x01; COM=0xf0; DAT=0; DAT=0; COM=0xfa; } void get_configuration(void) { unsigned char c; c=config_flag; COM=0x01; DAT=0xf0; DAT=0; DAT=1; DAT=c; COM=0xfa; } void set_configuration(void) { if (ControlData.DeviceRequest.wValue == 0) { //* put device in unconfigured state COM=0x01; COM=0xf0; DAT=0; DAT=0; COM=0xfa; EA=0; config_flag = 0; EA=1; COM=0xd8; DAT=0; } else if (ControlData.DeviceRequest.wValue == 1) { COM=0x01; COM=0xf0; DAT=0; DAT=0; COM=0xfa; COM=0xd8; //disable endpoint DAT=0; COM=0xd8; //enable endpoint DAT=1; EA=0; config_flag = 1; EA=1; } else { stall_ep0(); } } void get_interface(void) { // write 1 byte data 0; COM=0x01; COM=0xf0; DAT=0; DAT=1; DAT=0; COM=0xfa; } void ep0_txdone(void) { unsigned char ep0_last; unsigned int i; unsigned char j; //clear interrupt flag COM=0x41; ep0_last=DAT; i=ControlData.wLength-ControlData.wCount; if(Control_State!=1) { return; } if(i>=16) { COM=1; COM=0xf0; DAT=0; DAT=16; for(j=0; j<16; j++) DAT=(*(ControlData.pData+ControlData.wCount+j)); COM=0xFA; ControlData.wCount+=16; Control_State=1; } else if(i!=0) { COM=1; COM=0xf0; DAT=0; DAT=i; for(j=0; j<i; j++) DAT=(*(ControlData.pData+ControlData.wCount+j)); COM=0xFA; ControlData.wCount+=i; Control_State=0; } else if(i==0) { COM=1; COM=0xf0; DAT=0; DAT=0; COM=0xFA; Control_State=0; } } void ep0_rxdone(void) { unsigned char ep0_lass; COM=0x40; ep0_lass=DAT; //transmit response COM=0x00; COM=0xf1; COM=0xf2; COM=0x01; COM=0xf1; if(ep0_lass&0x20) //Receive setup packet; { D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&ControlData.DeviceRequest)); ControlData.DeviceRequest.wValue=SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex=SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength=SWAP(ControlData.DeviceRequest.wLength); ControlData.wLength=ControlData.DeviceRequest.wLength; ControlData.wCount=0; if(ControlData.DeviceRequest.bmRequestType&0x80) { setup_flag=1; Control_State=1; } else { if(ControlData.DeviceRequest.wLength==0) { setup_flag=1; Control_State=0; } else Control_State=2; } }// if setup packet; else if (Control_State==2) { } else { Control_State=0; } } void ep1_rxdone(void) { } void ep1_txdone(void) { } void ep2_rxdone(void) { unsigned char i; COM=0x44; ep2_last=DAT; COM=0x84; ep2_last1=DAT; D12_ReadEndpoint(4,64,ep2_data); if(ep2_last1==0x60) D12_ReadEndpoint(4,64,ep2_data); COM=0x85; ep2_last2=DAT; D12_WriteEndpoint(5,4,ep2_data); if(ep2_last2==0x60) D12_WriteEndpoint(5,4,ep2_data); } void ep2_txdone(void) { unsigned char ep2_lass; COM=0x45; ep2_lass=DAT; } void init_serial(void) { SCON=0x50; PCON=0x80; TMOD=0x20; TH1=0xF3; TL1=0xf3; TR1=1; TI=1; } void init_special_interrupt(void) { IE0=0; IT0=0; EX0=1; } void reconnect_usb(void) { unsigned long clk_cnt; COM=0xf3; DAT=0x06; DAT=0x03; for(clk_cnt=0;clk_cnt<50000;clk_cnt++); COM=0xf3; DAT=0x16; } void main(void) { unsigned char read_inst; unsigned char pv,pw; EA=0; COM=0xf4; read_inst=DAT; EA=1; init_special_interrupt(); //init_serial(); COM=0xfd; pv=DAT; pw=DAT; reconnect_usb(); while(1) { if(setup_flag) {EA=0; setup_flag=0; EA=1; control_handler(); } } } void control_handler() { unsigned char type,req; type=ControlData.DeviceRequest.bmRequestType&0x60; req=ControlData.DeviceRequest.bRequest&0x0f; if(type==0x00) { (*StandardDeviceRequest[req])(); } else { stall_ep0(); } } void usb_isr(void) interrupt 0 using 1//D12 interrrupt EX0 { unsigned char i_st; COM=0xf4; i_st=DAT; int_flag=1; if(i_st&0x40) { } if(i_st&0x80) { } if(i_st&0x01) { ep0_rxdone(); } if(i_st&0x02) ep0_txdone(); if(i_st&0x04) ep1_rxdone(); if(i_st&0x08) ep1_txdone(); if(i_st&0x10) ep2_rxdone(); if(i_st&0x20) ep2_txdone(); int_flag=0; } |
|
沙发#
发布于:2004-10-23 21:52
通常情况下,你应该先写一个包的数据到端点里,然后主机的程序在启动,否则主机是收不到数据的,因为设备端不知道你主机什么时候开始读数据的。
|
|
板凳#
发布于:2004-10-22 09:19
1.为了能在bushound上看到发到d12的数据,在ep2_rxdone()里面加入了把数据发回主机的语句。
2.程序是根据周立功公司的程序来修改的,把outportb和inportb等语句改成了命令字方式。现在用的是51的仿真器。 3.现在的问题是:当我用bushound收发数据时,头两次一般可以成功,也就是DO和DI正常,但下面的就会出现endpoint halted,数据就无法收发了,但程序里面没有停止端点啊?已经试了好久都是老样子,请哪位大侠能够真诚协助,帮我找出原因所在,不胜感激! |
|