static RESET_TYPE LINK_reset_in(struct connection_in * in) { BYTE resp[1+in->CRLF_size]; if (in->changed_bus_settings > 0) { --in->changed_bus_settings ; LINK_set_baud(in); // reset paramters } else { LINK_flush(in); } if ( BAD(LINK_write(LINK_string("r"), 1, in) || BAD( LINK_read(resp, 1, in))) ) { LEVEL_DEBUG("Error resetting LINK device"); LINK_slurp(in); return BUS_RESET_ERROR; } switch (resp[0]) { case 'P': in->AnyDevices = anydevices_yes; return BUS_RESET_OK; case 'N': in->AnyDevices = anydevices_no; return BUS_RESET_OK; case 'S': return BUS_RESET_SHORT; default: LEVEL_DEBUG("bad, Unknown LINK response %c", resp[0]); LINK_slurp(in); return BUS_RESET_ERROR; } }
static GOOD_OR_BAD LINK_detect_serial(struct connection_in * in) { struct port_in * pin = in->pown ; /* Set up low-level routines */ LINK_setroutines(in); pin->timeout.tv_sec = Globals.timeout_serial ; pin->timeout.tv_usec = 0 ; /* Open the com port */ RETURN_BAD_IF_BAD(COM_open(in)) ; //COM_break( in ) ; LEVEL_DEBUG("Slurp in initial bytes"); LINK_slurp( in ) ; UT_delay(100) ; // based on http://morpheus.wcf.net/phpbb2/viewtopic.php?t=89&sid=3ab680415917a0ebb1ef020bdc6903ad LINK_slurp( in ) ; RETURN_GOOD_IF_GOOD( LINK_version(in) ) ; LEVEL_DEFAULT("LINK detection error"); serial_powercycle(in) ; LEVEL_DEBUG("Slurp in initial bytes"); LINK_slurp( in ) ; UT_delay(100) ; // based on http://morpheus.wcf.net/phpbb2/viewtopic.php?t=89&sid=3ab680415917a0ebb1ef020bdc6903ad LINK_slurp( in ) ; RETURN_GOOD_IF_GOOD( LINK_version(in) ) ; LEVEL_DEFAULT("LINK detection error"); COM_close(in) ; return gbBAD; }
static GOOD_OR_BAD LINK_readback_data( BYTE * buf, const size_t size, struct connection_in * in) { int qmode_extra ; switch ( in->master.link.qmode ) { case e_link_t_extra: qmode_extra = 1 ; break ; case e_link_t_unknown: case e_link_t_none: default: qmode_extra = 0 ; break ; } // read back RETURN_BAD_IF_BAD( LINK_read(buf, size+qmode_extra, in) ) ; // see if we've yet tested the extra '?' "feature" if ( in->master.link.qmode == e_link_t_unknown ) { if ( buf[size] != 0x0D ) { in->master.link.qmode = e_link_t_extra ; LINK_slurp(in) ; } else { in->master.link.qmode = e_link_t_none ; } } return gbGOOD; }
static GOOD_OR_BAD LINK_detect_net(struct connection_in * in) { struct port_in * pin = in->pown ; /* Set up low-level routines */ LINKE_setroutines(in); pin->timeout.tv_sec = 0 ; pin->timeout.tv_usec = 300000 ; /* Open the tcp port */ RETURN_BAD_IF_BAD( COM_open(in) ) ; LEVEL_DEBUG("Slurp in initial bytes"); // LINK_slurp( in ) ; UT_delay(1000) ; // based on http://morpheus.wcf.net/phpbb2/viewtopic.php?t=89&sid=3ab680415917a0ebb1ef020bdc6903ad LINK_slurp( in ) ; // LINK_flush(in); pin->dev.telnet.telnet_negotiated = needs_negotiation ; RETURN_GOOD_IF_GOOD( LINK_version(in) ) ; // second try -- send a break and line settings LEVEL_DEBUG("Second try -- send BREAK"); COM_flush(in) ; COM_break(in); telnet_change(in); // LINK_slurp( in ) ; RETURN_GOOD_IF_GOOD( LINK_version(in) ) ; LEVEL_DEFAULT("LINK detection error"); COM_close(in) ; return gbBAD; }
static GOOD_OR_BAD LINK_search_type(struct device_search *ds, struct connection_in * in) { char resp[3+in->CRLF_size]; int response_length ; LEVEL_DEBUG("Test to see if LINK supports the tF0 command"); switch ( in->master.link.tmode ) { case e_link_t_unknown: RETURN_BAD_IF_BAD( LINK_write(LINK_string("tF0"), 3, in)); RETURN_BAD_IF_BAD(LINK_read(LINK_string(resp), 2, in)); switch ( resp[0] ) { case 'F': in->master.link.tmode = e_link_t_none ; response_length = 2 ; break; default: in->master.link.tmode = e_link_t_extra ; response_length = 3 ; LINK_slurp(in); break; } break ; case e_link_t_extra: response_length = 3 ; break ; case e_link_t_none: default: response_length = 2 ; break ; } //Depending on the search type, the LINK search function //needs to be selected //tEC -- Conditional searching //tF0 -- Normal searching // Send the configuration command and check response if (ds->search == _1W_CONDITIONAL_SEARCH_ROM) { RETURN_BAD_IF_BAD(LINK_write(LINK_string("tEC"), 3, in)) ; RETURN_BAD_IF_BAD(LINK_read(LINK_string(resp), response_length, in)) ; if (strstr(resp, "EC") == NULL) { LEVEL_DEBUG("Did not change to conditional search"); return gbBAD; } LEVEL_DEBUG("LINK set for conditional search"); } else { RETURN_BAD_IF_BAD( LINK_write(LINK_string("tF0"), 3, in)); RETURN_BAD_IF_BAD(LINK_read(LINK_string(resp), response_length, in)); if (strstr(resp, "F0") == NULL) { LEVEL_DEBUG("Did not change to normal search"); return gbBAD; } LEVEL_DEBUG("LINK set for normal search"); } return gbGOOD ; }
static void LINK_set_baud(struct connection_in * in) { struct port_in * pin = in->pown ; char * speed_code ; if ( pin->type == ct_telnet ) { // telnet pinned at 115200 return ; } COM_BaudRestrict( &(pin->baud), B9600, B19200, B38400, B57600, 0 ) ; LEVEL_DEBUG("to %d",COM_BaudRate(pin->baud)); // Find rate parameter switch ( pin->baud ) { case B9600: COM_break(in) ; LINK_flush(in); return ; case B19200: speed_code = "," ; break ; case B38400: speed_code = "`" ; break ; #ifdef B57600 /* MacOSX support max 38400 in termios.h ? */ case B57600: speed_code = "^" ; break ; #endif default: LEVEL_DEBUG("Unrecognized baud rate"); return ; } LEVEL_DEBUG("LINK change baud string <%s>",speed_code); LINK_flush(in); if ( BAD( LINK_write(LINK_string(speed_code), 1, in) ) ) { LEVEL_DEBUG("LINK change baud error -- will return to 9600"); pin->baud = B9600 ; ++in->changed_bus_settings ; return ; } // Send configuration change LINK_flush(in); // Change OS view of rate UT_delay(5); COM_change(in) ; UT_delay(5); LINK_slurp(in); return ; }