/* 主机端的主程序简单示例 */ main() { unsigned char xdata data_to_send[200]; /* 缓冲区 */ unsigned char str_to_print[]="OK, support text print\n"; unsigned char s; mDelaymS( 200 ); set_usb_mode( 6 ); /* 设置USB主机模式 */ while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待USB打印机连接上来 */ /* 如果设备端是CH341转打印口或者是CH37X,那么以下步骤是可选的,如果是其它USB芯片,那么可能需要执行以下步骤 */ #define USB_RESET_FIRST 1 /* USB规范中未要求在USB设备插入后必须复位该设备,但是计算机的WINDOWS总是这样做,所以有些USB设备也要求在插入后必须先复位才能工作 */ #ifdef USB_RESET_FIRST set_usb_mode( 7 ); /* 复位USB设备,CH375向USB信号线的D+和D-输出低电平 */ /* 如果单片机对CH375的INT#引脚采用中断方式而不是查询方式,那么应该在复制USB设备期间禁止CH375中断,在USB设备复位完成后清除CH375中断标志再允许中断 */ mDelaymS( 10 ); /* 复位时间不少于1mS,建议为10mS */ set_usb_mode( 6 ); /* 结束复位 */ mDelaymS( 100 ); while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待复位之后的设备端再次连接上来 */ #endif mDelaymS( 200 ); /* 有些USB设备要等待数百毫秒才能正常工作 */ if ( init_print()!=USB_INT_SUCCESS ) while(1); /* 错误 */ while ( 1 ) { s = get_port_status( ); if ( s!=0xFF ) { /* if ( s&0x20 ) printf("No paper!\n"); if ( (s&0x08) == 0 ) printf("Print ERROR!\n");*/ } send_data( strlen(str_to_print), str_to_print ); /* 输出数据给打印机,与通过并口方式输出一样 */ send_data( sizeof(data_to_send), data_to_send ); /* 输出的数据必须按照打印机的格式要求或者遵循打印描述语言 */ /* 可以再次继续发送数据或者接收数据 */ } }
void MeUSBHost::resetBus() { int16_t c; c = set_usb_mode(7); #ifdef CH375_DBG Serial.printf("set mode 7: %x\n",c); #endif delay(10); c = set_usb_mode(6); #ifdef CH375_DBG Serial.printf("set mode 6: %x\n",c); #endif delay(10); }
void MeUsb::resetBus() { int c; c = set_usb_mode(7); #ifdef USB_DBG Serial.print("set mode 7: "); Serial.println(c,HEX); #endif delay(10); c = set_usb_mode(6); #ifdef USB_DBG Serial.print("set mode 6: "); Serial.println(c,HEX); #endif delay(10); }
gboolean usb_cleanup_timeout(gpointer data) { /* signal usb disconnected */ usb_moded_send_signal(USB_DISCONNECTED); usb_moded_mode_cleanup(get_usb_module()); usb_moded_module_cleanup(get_usb_module()); set_usb_mode(MODE_UNDEFINED); return FALSE; }
/* * === FUNCTION ====================================================================== * Name: initialize_usb * Description: * ===================================================================================== */ int initialize_usb(void) { PIO_USB_RD=1; PIO_USB_WR=1; PIO_USB_A0=1; usb.receive_ok_flag=0; // enable the io interrupt IOWR_ALTERA_AVALON_PIO_IRQ_MASK(USB_NINT_BASE,1); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(USB_NINT_BASE,0); alt_irq_register(USB_NINT_IRQ,NULL,irq_usb); set_usb_mode(USB_DEVICE); return 0; }
static DBusHandlerResult msg_handler(DBusConnection *const connection, DBusMessage *const msg, gpointer const user_data) { DBusHandlerResult status = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; DBusMessage *reply = 0; const char *interface = dbus_message_get_interface(msg); const char *member = dbus_message_get_member(msg); const char *object = dbus_message_get_path(msg); int type = dbus_message_get_type(msg); const char *xml = "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\" " "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n" "<node name=\"/com/meego/usb_moded\">\n" " <interface name=\"com.meego.usb_moded\">\n" " <method name=\"mode_request\">\n" " <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n" " </method>\n" " <method name=\"set_mode\">\n" " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" " </method>\n" " <signal name=\"sig_usb_state_ind\">\n" " <arg name=\"mode\" type=\"s\"/>\n" " </signal>\n" " </interface>\n" " </node>\n"; (void)user_data; if(!interface || !member || !object) goto EXIT; if( type == DBUS_MESSAGE_TYPE_METHOD_CALL && !strcmp(interface, USB_MODE_INTERFACE) && !strcmp(object, USB_MODE_OBJECT)) { status = DBUS_HANDLER_RESULT_HANDLED; if(!strcmp(member, USB_MODE_STATE_REQUEST)) { const char *mode = get_usb_mode(); if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID); } else if(!strcmp(member, USB_MODE_STATE_SET)) { char *use = 0; DBusError err = DBUS_ERROR_INIT; if(!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &use, DBUS_TYPE_INVALID)) reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member); else { /* check if usb is connected, since it makes no sense to change mode if it isn't */ if(!get_usb_connection_state()) { log_warning("USB not connected, not changing mode!\n"); goto error_reply; } /* check if the mode exists */ if(valid_mode(use)) goto error_reply; /* do not change mode if the mode requested is the one already set */ if(strcmp(use, get_usb_mode()) != 0) set_usb_mode(use); if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &use, DBUS_TYPE_INVALID); else error_reply: reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member); } dbus_error_free(&err); } else if(!strcmp(member, USB_MODE_CONFIG_SET)) { char *config = 0; DBusError err = DBUS_ERROR_INIT; if(!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &config, DBUS_TYPE_INVALID)) reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member); else { /* error checking is done when setting configuration */ if(!set_mode_setting(config)) { if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &config, DBUS_TYPE_INVALID); } else reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, config); } dbus_error_free(&err); } else if(!strcmp(member, USB_MODE_NETWORK_SET)) { char *config = 0, *setting = 0; DBusError err = DBUS_ERROR_INIT; if(!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &config, DBUS_TYPE_STRING, &setting, DBUS_TYPE_INVALID)) reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member); else { /* error checking is done when setting configuration */ if(!set_network_setting(config, setting)) { if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &config, DBUS_TYPE_STRING, &setting, DBUS_TYPE_INVALID); usb_network_update(); } else reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, config); } dbus_error_free(&err); } else if(!strcmp(member, USB_MODE_NETWORK_GET)) { char *config = 0; const char *setting = 0; DBusError err = DBUS_ERROR_INIT; if(!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &config, DBUS_TYPE_INVALID)) { reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member); } else { setting = get_network_setting(config); if(setting) { if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &config, DBUS_TYPE_STRING, &setting, DBUS_TYPE_INVALID); free((void *)setting); } else reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, config); } } else if(!strcmp(member, USB_MODE_CONFIG_GET)) { const char *config = get_mode_setting(); if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &config, DBUS_TYPE_INVALID); free((void *)config); } else if(!strcmp(member, USB_MODE_LIST)) { gchar *mode_list = get_mode_list(); if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, (const char *) &mode_list, DBUS_TYPE_INVALID); g_free(mode_list); } else if(!strcmp(member, USB_MODE_RESCUE_OFF)) { rescue_mode = FALSE; log_debug("Rescue mode off\n "); reply = dbus_message_new_method_return(msg); } else { /*unknown methods are handled here */ reply = dbus_message_new_error(msg, DBUS_ERROR_UNKNOWN_METHOD, member); } if( !reply ) { reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, member); } } else if( type == DBUS_MESSAGE_TYPE_METHOD_CALL && !strcmp(interface, "org.freedesktop.DBus.Introspectable") && !strcmp(object, USB_MODE_OBJECT) && !strcmp(member, "Introspect")) { status = DBUS_HANDLER_RESULT_HANDLED; if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID); } EXIT: if(reply) { if( !dbus_message_get_no_reply(msg) ) { if( !dbus_connection_send(connection, reply, 0) ) log_debug("Failed sending reply. Out Of Memory!\n"); } dbus_message_unref(reply); } return status; }