⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 采用ch375开发鼠标的例程
💻 C
📖 第 1 页 / 共 2 页
字号:
//CH372外部固件模式 命令子函数 默认在24MHz下
#include <REG52.h>
#include <intrins.h>
#include <CH375INC.H>
#include <custom_define.h>
#include <usb_descriptor.h>
#include <stdio.h>
//#ifndef DELAY_CONSTANT
//#define DELAY_CONSTANT 
//#endif


/*sbit    KEY= P3^3;
sbit LED4= P1^4;
sbit LED5= P1^5;
sbit LED6= P1^6;
sbit LED7= P1^7;
*/
UINT8 int_status;
//bit flag_err_unknownsetup; 

//UINT8  data_buf[8];
union _ep0_data
{ 
    UINT8 data_buf[8];
    struct 
    { 
        UINT8  bmRequestType;       //标准请求字
        UINT8  bRequest;     //请求代码
        UINT16   wValue; //特性选择高
        UINT16   wIndx; //索引
        UINT16   wLength; //数据长度
    }device_request;
}ep0_data;

struct _desc_info
{ 
      UINT8 desc_type;
      UINT8 desc_index;
      UINT8 desc_length;
}desc_info;

bit flag_return_desc;
bit flag_configured;
bit  flag_set_add;
bit flag_report_input;
UINT8 configure_value;

UINT8 report_input_length;
UINT8 report_id;
UINT8 report_x=0,report_y=0;
///////////////////////////////
UINT8 test_temp=0xff;
UINT8 idata test_buf[128];
UINT8 test_count=0;
////////////////////////////////
UINT8 *p_desc_type;

void delay();
UINT8 CH37x_get_status();
void CH37x_unlock_usb();
UINT8 CH37x_rd_usb_data();
void CH37x_set_endp3(UINT8);
void CH37x_set_usb_addr(UINT8);
void CH37x_return_desc();
void CH37x_wr_usb_data3(UINT8);
void CH37x_wr_usb_data5(UINT8);
bit CH37x_set_usb_mode(UINT8);
void CH37x_set_endp4(UINT8);
void CH37x_set_endp5(UINT8);
void CH37x_set_endp6(UINT8);
void CH37x_set_endp7(UINT8);
void CH37x_return_report();

void intt1() interrupt 2 //using 1
{ 
      UINT8 status_temp,ep0_data_len,requesttype_temp,usb_address;
      IE1=0;
      status_temp=CH37x_get_status();

      switch(status_temp)
      { 
          case(USB_INT_EP0_SETUP): // 端点0 的接收器接收到数据,SETUP 成功
          { 
              ep0_data_len=CH37x_rd_usb_data();
              if(ep0_data_len!=8)
              { //flag_err_unknownsetup=1;
                  CH37x_set_endp3(0x0f);//return stall 
                  break;
              }
              ///////////////////
              test_buf[test_count++]=ep0_data.device_request.bmRequestType;
              test_buf[test_count++]=ep0_data.device_request.bRequest;
              test_buf[test_count++]=ep0_data.data_buf[2];
              test_buf[test_count++]=ep0_data.data_buf[3];
              test_buf[test_count++]=ep0_data.data_buf[4];
              test_buf[test_count++]=ep0_data.data_buf[5];
              test_buf[test_count++]=ep0_data.data_buf[6];
              test_buf[test_count++]=ep0_data.data_buf[7];
              /////////////////// 
              requesttype_temp=ep0_data.device_request.bmRequestType>>5&0x03;
              switch(requesttype_temp)
              { 
                  case(0): //setup standard request 
                  { 
                      switch(ep0_data.device_request.bRequest)
                      { 
                          case(DEF_USB_GET_STATUS):
                          { 
                              ep0_data.data_buf[0]=0;
                              ep0_data.data_buf[1]=0;
                              CH37x_wr_usb_data3(2);
                              break;//asm// return 数据0
                          }
                          case(DEF_USB_CLR_FEATURE):
                          { 
                              if(ep0_data.device_request.bmRequestType&0x1f==0x02)
                              { 
                                  switch(ep0_data.data_buf[4])
                                  { 
                                      case(0x82):
                                      { 
                                          CH37x_set_endp7(0x8E);                 //发命令清除端点
                                          break;
                                      }
                                      case(0x02):
                                      { 
                                          CH37x_set_endp6(0x80); //清除端点2下传
                                          break;
                                      }
                                      case(0x81):
                                      { 
                                          CH37x_set_endp5(0x8E);
                                          break;
                                      }
                                      case(0x01):
                                      { 
                                          CH37x_set_endp4(0x80);
                                          break;
                                      }
                                      default:
                                      break;
                                  }
                               }
                               else{CH37x_set_endp3(0x0f);}//return stall
                                break;
                            }
                            case(DEF_USB_SET_FEATURE):
                            { 
                                CH37x_set_endp3(0x0f);//return stall
                                break;
                            }
                            case(DEF_USB_SET_ADDRESS): //////////////LED
                            { 
                                usb_address=ep0_data.data_buf[2];//ep0_data.device_request.wValue>>8&0xff (UINT8); 
                                CH37x_wr_usb_data3(0);//CH37x_set_endp3(0xc0); //return ack
                                //ep0_data.data_buf[0]=0;CH37x_wr_usb_data3(1);
                                //delay();delay();
                                flag_set_add=1;
                                break;
                            }
                            case(DEF_USB_GET_DESCR):   ///////////////LED
                            { 
                                desc_info.desc_type=ep0_data.data_buf[3];
                                desc_info.desc_index=ep0_data.data_buf[2];
                                desc_info.desc_length=ep0_data.data_buf[6];
                                flag_return_desc=1;
                                switch(desc_info.desc_type)
                                { 
                                    case(1):{p_desc_type=device_descriptor;break;}
                                    case(2):{p_desc_type=config_descriptor;break;}//config interface class endpoint desc
                                    case(3):
                                    { //siwtch(desc_info.desc_index)
                                    //{ case(0):{p_desc_type=string_descriptor;break;}
                                    //case(1):{break;}
                                    //case(2):{break;}
                                    
                                    //}
                                    break;
                                    }
                                    case(4):{p_desc_type=interface_descriptor;break;}
                                    case(5):{p_desc_type=endpoint_descriptor;break;}
                                    case(0x21):{p_desc_type=hid_descriptor;break;}//hid descriptor
                                    case(0x22):{p_desc_type=report_descriptor;desc_info.desc_length=0x32;flag_report_input=1;break;}//report descriptor
                                    // case(0x23):{p_desc_type=physical_descriptor;break;}//physical descriptor
                                    
                                }
                                CH37x_return_desc();
                                break;
                            }
                            case(DEF_USB_SET_DESCR):
                            { 
                                CH37x_set_endp3(0x0f);//return stall
                                break;
                            }
                            case(DEF_USB_GET_CONFIG):
                            { 
                                if(!flag_configured){ep0_data.data_buf[0]=0;CH37x_wr_usb_data3(1);}
                                else {ep0_data.data_buf[0]=configure_value;CH37x_wr_usb_data3(1);}
                                break;
                            }
                            case(DEF_USB_SET_CONFIG):
                            { 
                                configure_value=ep0_data.data_buf[2];
                                flag_configured=1;
                                CH37x_wr_usb_data3(0);// 
                                break;
                            }
                            //asm//从SET CONFIG 中得到CONFIG VALUE 返回ACK 保存,在GET CONFIG 中将CONFIG VALUE 返回,
                            case(DEF_USB_GET_INTERF):
                            { 
                                ep0_data.data_buf[0]=0;//asm//返回数据0
                                CH37x_wr_usb_data3(1);
                                break;
                            }
                            case(DEF_USB_SET_INTERF):
                            { 
                                CH37x_set_endp3(0x0f);//return stall
                                break;
                            }
                            case(DEF_USB_SYNC_FRAME):
                            { 
                                CH37x_set_endp3(0x0f);//return stall
                                break;
                            }
                            default:{CH37x_set_endp3(0x0f);break;}//return stall
                            }
                       break;
                       }
                        case(1): //setup class request
                        { /*switch(ep0_data.device_request.bRequest)
                        { case(DEF_USB_HID_GET_REPORT):
                        { switch(ep0_data.data_buf[3])
                        { case(1): //report type is input
                        { //flag_report_input=1;
                        report_input_length=0x32;//ep0_data.data_buf[7];
                        report_id=ep0_data.data_buf[2];
                        //CH37x_wr_usb_data3(0);
                        p_desc_type=report_descriptor;
                        CH37x_return_report();
                        break;
                        } 
                        case(2):{CH37x_set_endp3(0x0f);break;} //report type is output
                        case(3):{CH37x_set_endp3(0x0f);break;} //report type is feature
                        } 
                        // CH37x_wr_usb_data3(0);
                        LED4=0; break;
                        }
                        case(DEF_USB_HID_SET_REPORT):{LED5=0;CH37x_set_endp3(0x0f);break;}
                        
                        case(DEF_USB_HID_GET_IDLE):{CH37x_set_endp3(0x0f);break;}//return stall
                        case(DEF_USB_HID_GET_PROTOCOL):{CH37x_set_endp3(0x0f);break;}//return stall
                        
                        case(DEF_USB_HID_SET_IDLE):{CH37x_wr_usb_data3(0);break;}//return ack
                        case(DEF_USB_HID_SET_PROTOCOL):{CH37x_set_endp3(0x0f);break;}//return stall
                        
                        }
                        LED7=0;test_temp=ep0_data.device_request.bRequest;*/ break;
                        }
                        case(2):CH37x_set_endp3(0x0f);break; //setup vendor request
                        case(3):CH37x_set_endp3(0x0f);break; //reserved request
                        default:{CH37x_set_endp3(0x0f);break;}//return stall
                        }
                     break;
                     }
              case(USB_INT_EP0_OUT):break;
              case(USB_INT_EP0_IN):
              { 
                  if(flag_return_desc)CH37x_return_desc();
                  else if (flag_set_add)
                  {
                    CH37x_set_usb_addr(usb_address);
                    flag_set_add=0;
                  }
                  else{}
                  break;
              }
              case(USB_INT_EP1_OUT):break;
              case(USB_INT_EP1_IN):break;
              case(USB_INT_EP2_OUT):break;
              case(USB_INT_EP2_IN):break;
              case(USB_INT_BUS_RESET1):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET2):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET3):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET4):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              default:
              { //CH37x_set_endp3(0x0f);
              break;//return stall
              }

            }
        CH37x_unlock_usb();
}

void delay()
{;}

void delay20us()
{ UINT8 ms=40; //24MHz
while(ms--);

}

/*void delay1ms()
{ UINT8 ms,sm;
    for ( ms=4; ms!=0; ms-- )
{   sm=250;
    while(--sm);
}
}*/
void delayms(UINT8 delay)
{ UINT8 ms,sm,c;
for(ms=delay;ms!=0;ms--)
{ for(sm=200;sm!=0;sm--)c+=3;  /* 在24MHz时钟下延时500uS */
for(sm=200;sm!=0;sm--)c+=3;  /* 在24MHz时钟下延时500uS */
}
}

bit temp_bit;

void init_CH37x()
{ //flag_err_unknownsetup=0;
flag_return_desc=0;
flag_configured=0;

⌨️ 快捷键说明

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