@@ -6,7 +6,7 @@ use std::{
6
6
7
7
use binread:: { io:: Cursor , BinRead , BinReaderExt } ;
8
8
use bytemuck:: { Pod , Zeroable } ;
9
- use serialport:: SerialPort ;
9
+ use serialport:: { available_ports , SerialPort , SerialPortType } ;
10
10
use slip_codec:: SlipDecoder ;
11
11
12
12
use crate :: {
@@ -15,6 +15,8 @@ use crate::{
15
15
error:: { ConnectionError , Error , ResultExt , RomError , RomErrorKind } ,
16
16
} ;
17
17
18
+ const USB_SERIAL_JTAG_PID : u16 = 0x1001 ;
19
+
18
20
#[ derive( Debug , Copy , Clone , BinRead ) ]
19
21
pub struct CommandResponse {
20
22
pub resp : u8 ,
@@ -60,19 +62,65 @@ impl Connection {
60
62
Ok ( ( ) )
61
63
}
62
64
65
+ // This function is probably redundant there should be another way how to get
66
+ // PID in src/cli/mod.rs
67
+ pub fn get_pid ( & self ) -> u16 {
68
+ match available_ports ( ) {
69
+ Ok ( ports) => {
70
+ for p in ports {
71
+ match p. port_type {
72
+ SerialPortType :: UsbPort ( info) => {
73
+ if self . serial . name ( ) . unwrap ( ) == p. port_name {
74
+ return info. pid ;
75
+ }
76
+ }
77
+ _ => { }
78
+ }
79
+ }
80
+ }
81
+ Err ( e) => {
82
+ eprintln ! ( "{:?}" , e) ;
83
+ eprintln ! ( "Error listing serial ports" ) ;
84
+ }
85
+ }
86
+
87
+ 0
88
+ }
89
+
63
90
pub fn reset_to_flash ( & mut self , extra_delay : bool ) -> Result < ( ) , Error > {
64
- self . serial . write_data_terminal_ready ( false ) ?;
65
- self . serial . write_request_to_send ( true ) ?;
91
+ if Connection :: get_pid ( & self ) == USB_SERIAL_JTAG_PID {
92
+ self . serial . write_data_terminal_ready ( false ) ?;
93
+ self . serial . write_request_to_send ( false ) ?;
66
94
67
- sleep ( Duration :: from_millis ( 100 ) ) ;
95
+ sleep ( Duration :: from_millis ( 100 ) ) ;
68
96
69
- self . serial . write_data_terminal_ready ( true ) ?;
70
- self . serial . write_request_to_send ( false ) ?;
97
+ self . serial . write_data_terminal_ready ( true ) ?;
98
+ self . serial . write_request_to_send ( false ) ?;
71
99
72
- let millis = if extra_delay { 500 } else { 50 } ;
73
- sleep ( Duration :: from_millis ( millis) ) ;
100
+ sleep ( Duration :: from_millis ( 100 ) ) ;
74
101
75
- self . serial . write_data_terminal_ready ( false ) ?;
102
+ self . serial . write_request_to_send ( true ) ?;
103
+ self . serial . write_data_terminal_ready ( false ) ?;
104
+ self . serial . write_request_to_send ( true ) ?;
105
+
106
+ sleep ( Duration :: from_millis ( 100 ) ) ;
107
+
108
+ self . serial . write_data_terminal_ready ( false ) ?;
109
+ self . serial . write_request_to_send ( false ) ?;
110
+ } else {
111
+ self . serial . write_data_terminal_ready ( false ) ?;
112
+ self . serial . write_request_to_send ( true ) ?;
113
+
114
+ sleep ( Duration :: from_millis ( 100 ) ) ;
115
+
116
+ self . serial . write_data_terminal_ready ( true ) ?;
117
+ self . serial . write_request_to_send ( false ) ?;
118
+
119
+ let millis = if extra_delay { 500 } else { 50 } ;
120
+ sleep ( Duration :: from_millis ( millis) ) ;
121
+
122
+ self . serial . write_data_terminal_ready ( false ) ?;
123
+ }
76
124
77
125
Ok ( ( ) )
78
126
}
0 commit comments