cqprc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-26
  • 最后登录2004-11-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1196回复:2

请各位大侠帮忙分析一下d12固件程序!

楼主#
更多 发布于:2004-10-22 09:11
#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;

}
cqprc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-26
  • 最后登录2004-11-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-22 09:19
1.为了能在bushound上看到发到d12的数据,在ep2_rxdone()里面加入了把数据发回主机的语句。
2.程序是根据周立功公司的程序来修改的,把outportb和inportb等语句改成了命令字方式。现在用的是51的仿真器。
3.现在的问题是:当我用bushound收发数据时,头两次一般可以成功,也就是DO和DI正常,但下面的就会出现endpoint halted,数据就无法收发了,但程序里面没有停止端点啊?已经试了好久都是老样子,请哪位大侠能够真诚协助,帮我找出原因所在,不胜感激!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-23 21:52
通常情况下,你应该先写一个包的数据到端点里,然后主机的程序在启动,否则主机是收不到数据的,因为设备端不知道你主机什么时候开始读数据的。
游客

返回顶部