📄 main.c
字号:
} else if (iIrqUsb & 0x20) //EP2 IN { XmtBuff.pNum = 64; XmtBuff.in = 5; SETADDR = 0x45; //读 in 最后状态 tmp = SETDATA; XmtBuff.b[0] = 5; XmtBuff.wrLength = 1; XmtBuff.p = XmtBuff.b; rx_0 (); } else if (iIrqUsb & 0x80) { } else if (iIrqUsb & 0x40) { } } }}voidMLsup_StallEP0 (void){ // Give a needle hole for Setup Overwritten as well as ISR SETADDR = 0x40; // 0 端点停止(用于发送Stall包) SETDATA = 0x01; SETADDR = 0x41; // 1 端点停止(用于发送Stall包) SETDATA = 0x01; SETADDR = 0xF1; // 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令}voidGetStatus (void){ XmtBuff.b[1] = 0x00; switch (XmtBuff.b[0]) { case 0x80: //返回设备状态 //发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。 XmtBuff.b[0] = 0x03; break; case 0x81: //返回接口状态 //发送两个字节数据:第一字节为0;第二字节为0。 //XmtBuff.b[5] 为接口号 XmtBuff.b[0] = 0x00; break; case 0x82: //返回端点状态 //发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。 //XmtBuff.b[5] D7为方向,D3~0为端点号 XmtBuff.b[0] = 0x00; break; } XmtBuff.wrLength = 2; XmtBuff.p = XmtBuff.b; rx_0 ();}voidClearFeature (void){ switch (XmtBuff.b[0]) { case 0x00: //清设备唤醒功能 break; case 0x01: //清接口状态 break; case 0x02: //启用端点 //XmtBuff.b[5] D7为方向,D3~0为端点号 if (XmtBuff.b[5] < 0x80) { SETADDR = 0x40 + XmtBuff.b[5] * 2; // 启用OUT端点 SETDATA = 0x00; } else { XmtBuff.b[5] = XmtBuff.b[5] & 0x0f; SETADDR = 0x41 + XmtBuff.b[5] * 2; // 启用IN端点 SETDATA = 0x00; } break; } XmtBuff.wrLength = 0; rx_0 ();}voidSetFeature (void){ switch (XmtBuff.b[0]) { case 0x00: //设置设备唤醒功能 break; case 0x01: //设置接口状态 break; case 0x02: //停止端点 //XmtBuff.b[5] D7为方向,D3~0为端点号 if (XmtBuff.b[5] < 0x80) { SETADDR = 0x40 + XmtBuff.b[5] * 2; // 停止OUT端点 SETDATA = 0x01; } else { XmtBuff.b[5] = XmtBuff.b[5] & 0x0F; SETADDR = 0x41 + XmtBuff.b[5] * 2; // 停止IN端点 SETDATA = 0x01; } break; } XmtBuff.wrLength = 0; rx_0 ();}voidSetAddress (void){ SETADDR = 0xD0; //设置新地址使能 SETDATA = 0x80 | XmtBuff.b[2]; XmtBuff.wrLength = 0; rx_0 ();}voidGetDescriptor (void){ unsigned int i = 0; switch (XmtBuff.b[3]) { case 0x01: //USB_DEVICE XmtBuff.wrLength = sizeof (device_descriptor); XmtBuff.p = device_descriptor; break; case 0x02: // USB_CONFIGURATION i = XmtBuff.b[7]; i = ((i << 8) | XmtBuff.b[6]); XmtBuff.wrLength = TotalConf[2]; XmtBuff.p = TotalConf; if (i < 16) XmtBuff.wrLength = XmtBuff.b[6]; break; case 0x03: //USB_STRING switch (XmtBuff.b[2]) { case 0x00: XmtBuff.wrLength = sizeof (USBStringLanguageDescription); XmtBuff.p = USBStringLanguageDescription; break; case 0x01: XmtBuff.wrLength = sizeof (USBStringDescription1); XmtBuff.p = USBStringDescription1; break; case 0x02: XmtBuff.wrLength = sizeof (USBStringDescription2); XmtBuff.p = USBStringDescription2; break; default: MLsup_StallEP0 (); return; } break;//HID code start case 0x21: XmtBuff.wrLength = sizeof (HIDDscr); XmtBuff.p = HIDDscr; break; case 0x22: //HID Report descriptor //Assumes there is one report descriptor. //To do: add the ability to return a specific report descriptor. //Can't use SUDPTRH and SUDPTRL because the report descriptor doesn't store //its length in the first bytes. //Instead, adapt code from the String descriptor rev D errata code (above). //rdp holds the address of a REPORTDSCR structure. XmtBuff.wrLength = sizeof (ReportDscr); XmtBuff.p = ReportDscr; //else // EZUSB_STALL_EP0(); // Stall End Point 0 break;//HID code end default: MLsup_StallEP0 (); return; } rx_0 ();}voidGetConfiguration (void){ XmtBuff.b[0] = 1; //返回是否被配置(非 0 为配置) XmtBuff.wrLength = 1; XmtBuff.p = XmtBuff.b; rx_0 ();}voidSetConfiguration (void){ if (XmtBuff.b[0] == 0x00) { XmtBuff.wrLength = 0; rx_0 (); SETADDR = 0xD8; if (XmtBuff.b[2] == 0x00) { SETDATA = 0x00; // 停止普通/同步端点 } else if (XmtBuff.b[2] == 0x01) { SETDATA = 0x01; // 使能普通/同步端点 SETADDR = 0x03; SETADDR = 0xFA; // 设置 IN 缓冲区有效(满标志) SETADDR = 0x05; SETADDR = 0xFA; // 设置 IN 缓冲区有效(满标志) } } else MLsup_StallEP0 ();}voidGetInterface (void){ XmtBuff.b[0] = 0; XmtBuff.wrLength = 1; XmtBuff.p = XmtBuff.b; rx_0 ();}voidSetInterface (void){ XmtBuff.wrLength = 0; rx_0 ();}voidInitD12 (){ int i = 0; *(volatile unsigned char *)0x80000043 &= 0xf7; *(volatile unsigned char *)0x80000003 &= 0xf7; for (i=0; i<20000; i++) ; *(volatile unsigned char *)0x80000003 |= 0x08; *(volatile unsigned long *)0x80000180 |= 0x12000000; *(volatile unsigned long *)0x80000180 &= 0x12ffffff; SETADDR = 0xD0; SETDATA = 0x80; SETADDR = 0xF3; SETDATA = 0x06; SETDATA = 0x03; for (i=0; i<200000; i++); SETADDR = 0xF3; SETDATA = 0x16;}voidrx_0 (){ INT8 tmp; if (XmtBuff.pNum > XmtBuff.wrLength) { XmtBuff.b[6] = XmtBuff.wrLength; } else { XmtBuff.b[6] = XmtBuff.pNum; bIsOrig = 0; } tmp = XmtBuff.in; SETADDR = tmp; // 选择 IN 端点(指针指向0位置) SETADDR = 0xF0; // 写缓冲区 SETDATA = 0x00; tmp = XmtBuff.b[6]; SETDATA = tmp; for (XmtBuff.b[7] = 0; XmtBuff.b[7] < XmtBuff.b[6]; XmtBuff.b[7]++) { tmp = *(XmtBuff.p++); SETDATA = tmp; } XmtBuff.wrLength -= XmtBuff.b[6]; if (XmtBuff.wrLength <= 0) bIsOrig = 1; SETADDR = 0xFA; // 设置 IN 缓冲区有效(满标志) tmp = XmtBuff.in; SETADDR = tmp | 0x40; tmp = SETDATA;}voidtx_0 (){ int i; SETADDR = 0x00; SETADDR = 0xF0; XmtBuff.b[0] = SETDATA; XmtBuff.b[1] = SETDATA; for (i = 0; i < 8; i++) { XmtBuff.b[i] = SETDATA; } SETADDR = 0xF1; // 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令 SETADDR = 0xF2; // 清 OUT 缓冲区 SETADDR = 0x01; // 选择端点 1(指针指向0位置) SETADDR = 0xF1; // 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令 if (XmtBuff.b[0] & 0x20) //厂商请求跳转表 { (*NonStandardDeviceRequest[XmtBuff.b[1]]) (); return; } else { if (XmtBuff.b[1] <= 0x0B) //标准请求跳转表 { (*StandardDeviceRequest[XmtBuff.b[1]]) (); return; } }}voidtx_1 (){ int i; SETADDR = XmtBuff.out; // 选择端点0(指针指向0位置) SETADDR = 0xF0; // 读标准控制码 XmtBuff.b[0] = SETDATA; XmtBuff.b[1] = SETDATA; for (i = 0; i < 8; i++) { XmtBuff.b[i] = SETDATA; } SETADDR = 0xF2; // 清 OUT 缓冲区}voidread_out (){ INT8 i; SETADDR = XmtBuff.out; // 选择端点0(指针指向0位置) SETADDR = 0xF0; // 读标准控制码 XmtBuff.b[0] = SETDATA; XmtBuff.b[1] = SETDATA; for (i = 0; i < 8; i++) { XmtBuff.b[i] = SETDATA; } SETADDR = 0xF2; // 清 OUT 缓冲区}voidSetReport (){ bSetReport = 1;}voidGetReport (){ XmtBuff.wrLength = sizeof (HIDData); XmtBuff.p = HIDData; rx_0 ();}voidSetIdle () {}voidGetIdle (){ idle = XmtBuff.b[2];}voidSetProtocol (){ protocol = XmtBuff.b[2];}voidGetProtocol (){ XmtBuff.wrLength = sizeof (protocol); XmtBuff.p = &protocol; rx_0();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -