44 * Copyright The Asahi Linux Contributors
55 */
66
7+ use crate :: transport:: Transport ;
78use crate :: { Error , Result } ;
8- use i2cdev:: { core:: I2CDevice , linux:: LinuxI2CDevice } ;
99use log:: { error, info} ;
1010use std:: {
11+ io,
1112 str:: FromStr ,
1213 thread,
1314 time:: { Duration , Instant } ,
@@ -43,6 +44,7 @@ enum TpsMode {
4344
4445impl FromStr for TpsMode {
4546 type Err = ( ) ;
47+
4648 fn from_str ( input : & str ) -> std:: result:: Result < TpsMode , ( ) > {
4749 match input {
4850 "APP " => Ok ( TpsMode :: App ) ,
@@ -60,41 +62,24 @@ fn is_invalid_cmd(val: u32) -> bool {
6062 val == 0x444d4321
6163}
6264
63- pub ( crate ) struct Device {
64- i2c : LinuxI2CDevice ,
65+ pub ( crate ) struct Device < ' a > {
66+ transport : & ' a mut dyn Transport ,
6567 key : Vec < u8 > ,
6668}
6769
68- /// Try to open the given I2C bus and slave address.
69- /// Returns a configured LinuxI2CDevice on success.
70- fn verify_i2c_device ( bus : & str , slave_address : u16 ) -> Result < LinuxI2CDevice > {
71- match LinuxI2CDevice :: new ( bus, slave_address) {
72- Ok ( dev) => {
73- return Ok ( dev) ;
74- }
75- Err ( _) => { } // Fall through to attempt forced open
76- }
70+ impl < ' a > Device < ' a > {
71+ pub ( crate ) fn new ( transport : & ' a mut dyn Transport , code : & str ) -> Result < Self > {
72+ let mut key = code. as_bytes ( ) . to_vec ( ) ;
73+ key. reverse ( ) ;
7774
78- info ! ( "Safely opening failed ==> Forcefully opening device..." ) ;
79- let forced = unsafe { LinuxI2CDevice :: force_new ( bus, slave_address) } ;
80- match forced {
81- Ok ( dev) => Ok ( dev) ,
82- Err ( _) => Err ( Error :: I2C ) ,
83- }
84- }
75+ let mut device = Self { transport, key } ;
8576
86- impl Device {
87- pub ( crate ) fn new ( bus : & str , address : u16 , code : String ) -> Result < Self > {
88- let mut device = Self {
89- i2c : verify_i2c_device ( bus, address) ?,
90- key : code. into_bytes ( ) . into_iter ( ) . rev ( ) . collect :: < Vec < u8 > > ( ) ,
91- } ;
9277 if device. get_mode ( ) ? != TpsMode :: App {
9378 return Err ( Error :: TypecController ) ;
9479 }
80+
9581 device. lock ( device. key . clone ( ) . as_slice ( ) ) ?;
9682 device. dbma ( true ) ?;
97-
9883 Ok ( device)
9984 }
10085
@@ -109,7 +94,6 @@ impl Device {
10994 cmd_timeout : Duration ,
11095 res_delay : Duration ,
11196 ) -> Result < ( ) > {
112- // First: Check CMD1 Register busy
11397 {
11498 let mut status_buf = [ 0u8 ; 4 ] ;
11599 self . read_block ( TPS_REG_CMD1 , & mut status_buf) ?;
@@ -120,20 +104,18 @@ impl Device {
120104 }
121105 }
122106
123- // Write input Data to DATA1
124107 if !in_data. is_empty ( ) {
125108 self . write_block ( TPS_REG_DATA1 , in_data) ?;
126109 }
127110
128- // Write 4-byte command tag
129111 self . write_block ( TPS_REG_CMD1 , cmd_tag) ?;
130112
131- // Poll until CMD1 becomes zero or timeout
132113 let start = Instant :: now ( ) ;
133114 loop {
134115 let mut status_buf = [ 0u8 ; 4 ] ;
135116 self . read_block ( TPS_REG_CMD1 , & mut status_buf) ?;
136117 let val = u32:: from_le_bytes ( status_buf) ;
118+
137119 if is_invalid_cmd ( val) {
138120 info ! ( "Invalid Command" ) ;
139121 return Err ( Error :: TypecController ) ;
@@ -145,6 +127,7 @@ impl Device {
145127 return Err ( Error :: ControllerTimeout ) ;
146128 }
147129 }
130+
148131 thread:: sleep ( res_delay) ;
149132 Ok ( ( ) )
150133 }
@@ -155,23 +138,32 @@ impl Device {
155138 buf. push ( reg) ;
156139 buf. push ( size) ;
157140 buf. extend_from_slice ( data) ;
158- self . i2c . write ( & buf) . map_err ( |_| Error :: I2C ) ?;
141+
142+ self . transport . write ( & buf) . map_err ( Error :: Io ) ?;
159143 Ok ( ( ) )
160144 }
161145
162- fn read_block ( & mut self , reg : u8 , buf : & mut [ u8 ] ) -> Result < ( ) > {
163- self . i2c . write ( & [ reg] ) . map_err ( |_| Error :: I2C ) ?;
164- let mut internal_buf = vec ! [ 0u8 ; buf. len( ) + 1 ] ;
165- self . i2c . read ( & mut internal_buf) . map_err ( |_| Error :: I2C ) ?;
166- buf. copy_from_slice ( & internal_buf[ 1 ..=buf. len ( ) ] ) ;
146+ fn read_block ( & mut self , reg : u8 , out : & mut [ u8 ] ) -> Result < ( ) > {
147+ self . transport . write ( & [ reg] ) . map_err ( Error :: Io ) ?;
148+
149+ let need = out. len ( ) + 1 ;
150+ let internal = self . transport . read ( need) . map_err ( Error :: Io ) ?;
151+ if internal. len ( ) != need {
152+ return Err ( Error :: Io ( io:: Error :: new (
153+ io:: ErrorKind :: UnexpectedEof ,
154+ format ! ( "read_block: expected {need} bytes, got {}" , internal. len( ) ) ,
155+ ) ) ) ;
156+ }
167157
158+ out. copy_from_slice ( & internal[ 1 ..=out. len ( ) ] ) ;
168159 Ok ( ( ) )
169160 }
170161
171162 fn get_mode ( & mut self ) -> Result < TpsMode > {
172163 let mut buf = [ 0u8 ; 4 ] ;
173164 self . read_block ( TPS_REG_MODE , & mut buf) ?;
174- let s = std:: str:: from_utf8 ( & buf) . unwrap ( ) ;
165+
166+ let s = std:: str:: from_utf8 ( & buf) . map_err ( Error :: Utf8 ) ?;
175167 let m = TpsMode :: from_str ( s) . map_err ( |_| Error :: TypecController ) ?;
176168 Ok ( m)
177169 }
@@ -196,11 +188,13 @@ impl Device {
196188 if self . get_mode ( ) ? != TpsMode :: Dbma {
197189 return Err ( Error :: TypecController ) ;
198190 }
191+
199192 let data = [
200193 vec ! [ ( ( sop as u8 ) << 4 ) | vdos. len( ) as u8 ] ,
201194 vdos. iter ( ) . flat_map ( |val| val. to_le_bytes ( ) ) . collect ( ) ,
202195 ]
203196 . concat ( ) ;
197+
204198 self . exec_cmd_with_timing (
205199 b"VDMs" ,
206200 & data,
@@ -250,6 +244,7 @@ impl Device {
250244 return Err ( Error :: ReconnectTimeout ) ;
251245 }
252246 }
247+
253248 info ! ( " Connected" ) ;
254249 thread:: sleep ( RECONNECT_WAIT ) ;
255250 self . serial ( )
@@ -260,6 +255,7 @@ impl Device {
260255 info ! ( "Putting target into serial mode..." ) ;
261256 self . vdms ( VdmSopType :: SopStar , & vdos) ?;
262257 info ! ( "Putting local end into serial mode... " ) ;
258+
263259 if self . get_mode ( ) ? != TpsMode :: Dbma {
264260 return Err ( Error :: TypecController ) ;
265261 }
@@ -273,7 +269,7 @@ impl Device {
273269 }
274270}
275271
276- impl Drop for Device {
272+ impl Drop for Device < ' _ > {
277273 fn drop ( & mut self ) {
278274 let lock: [ u8 ; 4 ] = [ 0 , 0 , 0 , 0 ] ;
279275 let _ = self . dbma ( false ) ;
0 commit comments