📄 test02.c
字号:
if(USB_STA0 & 0x01) { //ep0 rx packet
if(USB_STA1 & 0x80) { //setup packet
//disable further interrupt
USB_CTL4 = USB_CTL4 & 0xFE; //clear rxd0ie=0
USB_STA0 = USB_STA0 | 0x01; //clear rxd0f
SETUP_PROC();
USB_CTL4 = USB_CTL4 | 0x01; //set rxd0ie=1
return;
}
else { // out data packet
USB_STA0 = USB_STA0 | 0x01; //clear rxd0f
return;
}
}
}
void SETUP_PROC(void)
{
unsigned char UADDR;
if((USB_STA1 & 0x1F) != 0x08) return;
else {
USB_EPP = 0;
SETUPR0 = USB_EP0;
SETUPR1 = USB_EP0;
SETUPR2 = USB_EP0;
SETUPR3 = USB_EP0;
SETUPR4 = USB_EP0;
SETUPR5 = USB_EP0;
SETUPR6 = USB_EP0;
SETUPR7 = USB_EP0;
//b6-b5=(00)=standard, (01)=class
if((SETUPR0 & 0x60)==0){
switch (SETUPR1) {
case SET_ADDRESS: {
if((SETUPR0 == 0) & (SETUPR6 == 0) & (SETUPR7 == 0)) {
UADDR = SETUPR2;
in_status();
USB_CTL5 = UADDR;
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0=1
USB_CTL2 = USB_CTL2 | 0x40; //istall0=1
}
break;
}
case GET_DESCRIPTOR:
switch(SETUPR3){
case DEVICE_DESC:
//if((SETUPR7==0) & (SETUPR6 < dev_desc_table[0])) len = SETUPR6;
//else len = dev_desc_table[0];
if((SETUPR7==0) & (SETUPR6 < 0x12)) len = SETUPR6;
else len = 0x12;
toggle = 1;
j=0;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = dev_desc_table[j];
if(len1 >= 0x08) {
if(toggle) USB_CTL1 = 0xd8;
else USB_CTL1 = 0xc8;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len1;
if(toggle) USB_CTL1 = USB_CTL1 | 0xd0;
else USB_CTL1 = USB_CTL1 | 0xc0;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
if(toggle) USB_CTL1 = USB_CTL1 | 0xd0;
else USB_CTL1 = USB_CTL1 | 0xc0;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
break;
case CONFIGURATION_DESC:
if((SETUPR7==0) & (SETUPR6 < conf_desc_table[2])) len = SETUPR6;
else len = conf_desc_table[2];
toggle = 1;
j=0;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
else USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
break;
case STRING_DESC:
if(SETUPR2==0){
if((SETUPR7==0) & (SETUPR6 < str0_table[0])) len = SETUPR6;
else len = str0_table[0];
}
else if(SETUPR2==1){
if((SETUPR7==0) & (SETUPR6 < str1_table[0])) len = SETUPR6;
else len = str1_table[0];
}
else if(SETUPR2==2){
if((SETUPR7==0) & (SETUPR6 < str2_table[0])) len = SETUPR6;
else len = str2_table[0];
}
else {
USB_CTL1 = USB_CTL1 | 0x20;
USB_CTL2 = USB_CTL2 | 0x40;
len = 0;
return;
}
toggle = 1;
j=0;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) {
if(SETUPR2==0) USB_EP0 = str0_table[j];
else if(SETUPR2==1) USB_EP0 = str1_table[j];
else
USB_EP0 = str2_table[j];
}
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
len -= len1;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
break;
case CLASS_HID_DESC:
if((SETUPR0 == 0x81) & (SETUPR4==0)){//interface0
//assume intf0_hid_len=0x09
if((SETUPR7==0) & (SETUPR6 < 0x09)) len = SETUPR6;
else len = 0x09;
toggle = 1;
j=18;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
else USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02));
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
}
else if((SETUPR0 == 0x81) & (SETUPR4==1)){//interface1
//assume intf1_hid_len=0x09
if((SETUPR7==0) & (SETUPR6 < 0x09)) len = SETUPR6;
else len = 0x09;
toggle = 1;
j=43;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
else USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02));
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
}
else {
USB_CTL2 = USB_CTL2 | 0x40; // Invalid request
USB_CTL1 = USB_CTL1 | 0x20;
}
break;
case CLASS_REPORT_DESC:
if((SETUPR0 == 0x81) & (SETUPR4==0)){//interface 0
//
if((SETUPR7==0)& (SETUPR6 < 64)) len = SETUPR6;
else len = 64;
toggle = 1;
j=0;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = keyboard_report[j];
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
else USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
}
else if((SETUPR0 == 0x81) & (SETUPR4==1)){//interface 1
//
if((SETUPR7==0)& (SETUPR6 < 0x66)) len = SETUPR6;
else len = 0x66;
toggle = 1;
j=0;
USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
while(len){
if(len > 0x08) len1 = 0x08;
else len1 = len;
USB_EPP = 0;
for(i=0;i<len1;i++,j++) USB_EP0 = mouse_report[j];
if(len >= 0x08) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
else USB_CTL1 = USB_CTL1 | 0x88;
}
else {
USB_CTL1 = 0x40;
USB_CTL1 = USB_CTL1 | len;
if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
else USB_CTL1 = USB_CTL1 | 0x80;
}
len -= len1;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
toggle = ~toggle;
if((len1==8) & (len==0)) {
USB_CTL1 = 0x40;
if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
USB_CTL1 = USB_CTL1 | 0x80;
while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
}
}
out_status();
}
else {
USB_CTL2 = USB_CTL2 | 0x40; // Invalid request
USB_CTL1 = USB_CTL1 | 0x20;
}
break;
default:
USB_CTL2 = USB_CTL2 | 0x40; // Invalid request
USB_CTL1 = USB_CTL1 | 0x20;
break;
} //get descriptor case
break;
case SET_CONFIGURATION:
if((SETUPR6==0) & (SETUPR7==0)){
configuration = SETUPR2;
if(configuration==0) configured = 0;
else configured = 1;
if(configured==1){
//enable endpoint 1, 2
USB_CTL0 = 0xf0;
//
}
else {
//disable endpoint 1, 2
USB_CTL0 = 0x90;
//USB_CTL4 = USB_CTL4 & 0xe3;
}
//
USB_CTL2 = USB_CTL2 & 0x40;
ep1toggle = 0;
ep2toggle = 0;
in_status();
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
}
break;
case GET_CONFIGURATION:
if((SETUPR6==1) & (SETUPR7==0)){
USB_EPP = 0;
USB_EPP = configuration;
USB_CTL1 = 0x91;
while(!(USB_STA0 & 0x02)); //wait until txd0f=1
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
out_status();
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
}
break;
case GET_STATUS:
switch(SETUPR0)
{
case 0x80: // Device rmwake=0, selpower=0
if((SETUPR6==2) & (SETUPR7==0)){
USB_EPP = 0;
USB_EP0 = (unsigned char) remote_wku_enable;
USB_EP0 = 0; //bus powered
USB_CTL1 = 0x92;
while(!(USB_STA0 & 0x02));
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
out_status();
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
}
break;
case 0x81: // Interface
case 0x82: // End Point halt
if((SETUPR6==2) & (SETUPR7==0)){
USB_EPP = 0;
USB_EP0 = 0;
USB_EP0 = 0;
USB_CTL1 = 0x92;
while(!(USB_STA0 & 0x02));
USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
USB_STA0 = USB_STA0 | 0x02; //txd0f=0
out_status();
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
}
break;
default: // Invalid Command
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
break;
}
break;
case CLEAR_FEATURE:
switch(SETUPR0)
{
case 0x00: // Device
if((SETUPR2 == 1) & (SETUPR6==0) & (SETUPR7==0)) {
remote_wku_enable = 0; // Disable Remote Wakeup
in_status();
}
else {
USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -