void soft_reset_print( ) { /* 控制传输:软复位打印机 */ tog_send=tog_recv=0; /* 复位USB数据同步标志 */ toggle_send( 0 ); /* SETUP阶段为DATA0 */ buffer[0]=0x21; buffer[1]=2; buffer[2]=buffer[3]=buffer[4]=buffer[5]=buffer[6]=buffer[7]=0; /* SETUP数据,SOFT_RESET */ wr_usb_data( 8, buffer ); /* SETUP数据总是8字节 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) { /* SETUP阶段操作成功 */ toggle_recv( 1 ); /* STATUS阶段,准备接收DATA1 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) return; /* STATUS阶段操作成功,操作成功返回 */ } }
unsigned char get_port_status( ) { /* 查询打印机端口状态,返回状态码,如果为0FFH则说明操作失败 */ /* 返回状态码中: 位5(Paper Empty)为1说明无纸, 位4(Select)为1说明打印机联机, 位3(Not Error)为0说明打印机出错 */ toggle_send( 0 ); /* 下面通过控制传输获取打印机的状态, SETUP阶段为DATA0 */ buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0; /* SETUP数据,GET_PORT_STATUS */ wr_usb_data( 8, buffer ); /* SETUP数据总是8字节 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) { /* SETUP阶段操作成功 */ toggle_recv( 1 ); /* DATA阶段,准备接收DATA1 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) { /* DATA阶段操作成功 */ rd_usb_data( buffer ); /* 读出接收到的数据,通常只有1个字节 */ toggle_send( 1 ); /* STATUS阶段为DATA1 */ wr_usb_data( 0, buffer ); /* 发送0长度的数据说明控制传输成功 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_OUT )==USB_INT_SUCCESS ) return( buffer[0] ); /* 返回状态码 */ } } return( 0xFF ); /* 返回操作失败 */ }
unsigned char MeUsb::host_recv() { unsigned char irq; toggle_recv(); irq = issue_token( ( endp_in_addr << 4 ) | DEF_USB_PID_IN ); if(irq==USB_INT_SUCCESS){ int len = rd_usb_data(RECV_BUFFER); #ifdef USB_DBG for(int i=0;i<len;i++){ // point hid device Serial.print("0x"); Serial.println((int)RECV_BUFFER[i],HEX); } Serial.println(); #endif stallCount = 0; return len; }else if(irq==USB_INT_DISCONNECT){ device_online = false; device_ready = false; #ifdef USB_DBG Serial.println("##### disconn #####"); #endif return 0; }else{ clr_stall6(); #ifdef USB_DBG Serial.println("##### stall #####"); #endif delay(10); /* stallCount++; if(stallCount>10){ device_online = false; device_ready = false; resetBus(); } */ return 0; } }