1
1
//! Get information about system power (battery, AC, PD ports)
2
2
3
3
use alloc:: format;
4
- use alloc:: string:: String ;
4
+ use alloc:: string:: { String , ToString } ;
5
5
use alloc:: vec;
6
6
use alloc:: vec:: Vec ;
7
7
use core:: convert:: TryInto ;
@@ -798,6 +798,11 @@ pub fn is_charging(ec: &CrosEc) -> EcResult<(bool, bool)> {
798
798
Ok ( ( port0 || port1, port2 || port3) )
799
799
}
800
800
801
+ fn parse_pd_ver_slice ( data : & [ u8 ] ) -> ControllerVersion {
802
+ parse_pd_ver ( & [
803
+ data[ 0 ] , data[ 1 ] , data[ 2 ] , data[ 3 ] , data[ 4 ] , data[ 5 ] , data[ 6 ] , data[ 7 ] ,
804
+ ] )
805
+ }
801
806
fn parse_pd_ver ( data : & [ u8 ; 8 ] ) -> ControllerVersion {
802
807
ControllerVersion {
803
808
base : BaseVersion {
@@ -815,15 +820,37 @@ fn parse_pd_ver(data: &[u8; 8]) -> ControllerVersion {
815
820
}
816
821
}
817
822
818
- // NOTE: Only works on ADL at the moment!
819
- // TODO: Not on TGL, need to check if RPL and later have it.
823
+ // NOTE: TGL (hx20) does not have this host command
820
824
pub fn read_pd_version ( ec : & CrosEc ) -> EcResult < MainPdVersions > {
821
- let info = EcRequestReadPdVersion { } . send_command ( ec) ? ;
825
+ let info = EcRequestReadPdVersionV1 { } . send_command_vec ( ec) ;
822
826
823
- Ok ( MainPdVersions {
824
- controller01 : parse_pd_ver ( & info. controller01 ) ,
825
- controller23 : parse_pd_ver ( & info. controller23 ) ,
826
- } )
827
+ // If v1 not available, fall back
828
+ if let Err ( EcError :: Response ( EcResponseStatus :: InvalidVersion ) ) = info {
829
+ let info = EcRequestReadPdVersionV0 { } . send_command ( ec) ?;
830
+
831
+ return Ok ( if info. controller23 == [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] {
832
+ MainPdVersions :: Single ( parse_pd_ver ( & info. controller01 ) )
833
+ } else {
834
+ MainPdVersions :: RightLeft ( (
835
+ parse_pd_ver ( & info. controller01 ) ,
836
+ parse_pd_ver ( & info. controller23 ) ,
837
+ ) )
838
+ } ) ;
839
+ }
840
+ // If any other error, exit
841
+ let info = info?;
842
+
843
+ let mut versions = vec ! [ ] ;
844
+ let pd_count = info[ 0 ] as usize ;
845
+ for i in 0 ..pd_count {
846
+ // TODO: Is there a safer way to check the range?
847
+ if info. len ( ) < 1 + 8 * ( i + 1 ) {
848
+ return Err ( EcError :: DeviceError ( "Not enough data returned" . to_string ( ) ) ) ;
849
+ }
850
+ versions. push ( parse_pd_ver_slice ( & info[ 1 + 8 * i..1 + 8 * ( i + 1 ) ] ) ) ;
851
+ }
852
+
853
+ Ok ( MainPdVersions :: Many ( versions) )
827
854
}
828
855
829
856
pub fn standalone_mode ( ec : & CrosEc ) -> bool {
0 commit comments