From 9ed884b34fa3b69d5b7ee8a0adf8013c6f5df210 Mon Sep 17 00:00:00 2001 From: tfx2001 Date: Sat, 16 Mar 2024 14:51:51 +0800 Subject: [PATCH] Print chip name when opening HID device (#13) * feat: print chip name when opening HID device Signed-off-by: tfx2001 * fix: fix workspace resolver warning Signed-off-by: tfx2001 --- Cargo.toml | 1 + hpm_isp/src/hid.rs | 78 ++++++++++++++++++++++++++++----------------- hpm_isp/src/main.rs | 2 ++ 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a002bba..8370345 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,3 @@ [workspace] members = ["hpm_isp"] +resolver = "2" diff --git a/hpm_isp/src/hid.rs b/hpm_isp/src/hid.rs index 4131b6f..4a6af73 100644 --- a/hpm_isp/src/hid.rs +++ b/hpm_isp/src/hid.rs @@ -1,37 +1,12 @@ -#![allow(unused)] +use std::fmt::Display; use hidapi::{HidApi, HidDevice, HidError}; use num_enum::FromPrimitive; use strum::{EnumIter, IntoEnumIterator}; use zerocopy::{AsBytes, FromBytes, FromZeroes}; -use crate::hid::PacketType::Ack; use crate::isp_command::{Error, Interface, IspCommand, Packet}; -#[derive(EnumIter, Clone, Copy)] -#[repr(u16)] -enum Family { - HPM6700_6400 = 0x0001, - HPM6300 = 0x0002, - HPM6200 = 0x0003, - HPM6800 = 0x0004, - HPM5300 = 0x0005, -} - -impl Family { - pub fn pid() -> u16 { - 0x34b7 - } - - pub fn vid(&self) -> u16 { - *self as u16 - } -} - -pub struct HpmDevice { - device: HidDevice, -} - #[derive(AsBytes, FromZeroes, FromBytes)] #[repr(C, packed)] struct HidPayloadPacket { @@ -87,14 +62,59 @@ impl HidAcknowledgement { } } +#[derive(EnumIter, Clone, Copy)] +#[repr(u16)] +pub enum Family { + HPM6700_6400 = 0x0001, + HPM6300 = 0x0002, + HPM6200 = 0x0003, + HPM6800 = 0x0004, + HPM5300 = 0x0005, +} + +impl Family { + pub fn pid() -> u16 { + 0x34b7 + } + + pub fn vid(&self) -> u16 { + *self as u16 + } +} + +impl Display for Family { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let name = match self { + Family::HPM6700_6400 => "HPM6700/6400", + Family::HPM6300 => "HPM6300", + Family::HPM6200 => "HPM6200", + Family::HPM6800 => "HPM6800", + Family::HPM5300 => "HPM5300", + }; + write!(f, "{name}") + } +} + +pub struct HpmDevice { + device: HidDevice, + family: Family, +} + impl HpmDevice { pub fn open() -> Result> { let api = HidApi::new().unwrap(); // Connect to device using its VID and PID - let device = Family::iter() - .find_map(|chip| api.open(Family::pid(), chip.vid()).ok()) + let (device, family) = Family::iter() + .find_map(|chip| match api.open(Family::pid(), chip.vid()).ok() { + Some(device) => Some((device, chip)), + None => None, + }) .ok_or("Can't find any HPMicro device")?; - Ok(Self { device }) + Ok(Self { device, family }) + } + + pub fn family(&self) -> Family { + self.family } } diff --git a/hpm_isp/src/main.rs b/hpm_isp/src/main.rs index 3623b61..bfbc1e6 100644 --- a/hpm_isp/src/main.rs +++ b/hpm_isp/src/main.rs @@ -102,6 +102,8 @@ fn main() -> Result<(), Box> { let is_default = config.is_none(); let config_path = config.unwrap_or(DEFAULT_CONFIG_FILE.into()); + println!("Found chip: {}", device.family()); + match fs::File::open(config_path) { Ok(mut config_file) => { memory_config_bin.resize(12, 0);