From 21b6978414bc876ae51b9dd8a1452236cf1dbf80 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Sun, 12 Jan 2020 02:29:15 +0100
Subject: [PATCH] probe.rs connection, mem read, step, run, halt works

---
 ktest/Cargo.toml        |   7 ++++
 ktest/src/lib.rs        |  72 +++++++++++++++++++++++++++++++++++++
 ktest/src/main.rs       |  73 +-------------------------------------
 runner/Cargo.toml       |   2 +-
 runner/src/main.rs      |  76 +++++++++++++++++++++++++++++++++++++++-
 runner/test000001.ktest | Bin 0 -> 140 bytes
 6 files changed, 156 insertions(+), 74 deletions(-)
 create mode 100644 ktest/src/lib.rs
 create mode 100644 runner/test000001.ktest

diff --git a/ktest/Cargo.toml b/ktest/Cargo.toml
index c275c38..92c92b7 100644
--- a/ktest/Cargo.toml
+++ b/ktest/Cargo.toml
@@ -7,3 +7,10 @@ edition = "2018"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 
+[lib]
+name = "ktest"
+path = "src/lib.rs"
+
+[[bin]]
+name = "ktest"
+path = "src/main.rs"
\ No newline at end of file
diff --git a/ktest/src/lib.rs b/ktest/src/lib.rs
new file mode 100644
index 0000000..3592412
--- /dev/null
+++ b/ktest/src/lib.rs
@@ -0,0 +1,72 @@
+use std::fs::File;
+use std::io::prelude::*; // provide io traits
+use std::io::{Error, ErrorKind};
+
+#[derive(Debug)]
+pub struct KTEST {
+    pub version: i32,
+    pub args: Vec<String>,
+    pub objects: Vec<(String, Vec<u8>)>,
+}
+
+pub fn read_ktest(file_name: &str) -> std::io::Result<KTEST> {
+    let mut file: File = File::open(file_name)?;
+    let mut hdr = [0u8; 5];
+    file.read_exact(&mut hdr)?;
+    if &hdr != b"KTEST" {
+        return Err(Error::new(ErrorKind::Other, "not a KTEST file"));
+    }
+
+    let version = read_i32(&mut file)?;
+    println!("version : {}", version);
+    if version > 3 {
+        return Err(Error::new(ErrorKind::Other, "non support KTEST version"));
+    }
+
+    let num_args = read_i32(&mut file)?;
+
+    // info regarding the KTEST file
+    let mut args = vec![];
+    for _ in 0..num_args {
+        let arg = read_sized(&mut file)?;
+        let str = String::from_utf8(arg).unwrap();
+        args.push(str);
+    }
+
+    // metadata not used here
+    let _sym_argvs = read_i32(&mut file)?;
+    let _sym_argv_len = read_i32(&mut file)?;
+
+    // read the objects
+    let num_objects = read_i32(&mut file)?;
+    let mut objects = vec![];
+    for _ in 0..num_objects {
+        let name = read_string(&mut file)?;
+        let data = read_sized(&mut file)?;
+        objects.push((name, data))
+    }
+
+    Ok(KTEST {
+        version,
+        args,
+        objects,
+    })
+}
+
+fn read_i32(file: &mut File) -> std::io::Result<i32> {
+    let mut str = [0u8; 4];
+    file.read_exact(&mut str)?;
+    Ok(i32::from_be_bytes(str)) // big endian
+}
+
+fn read_string(file: &mut File) -> std::io::Result<String> {
+    let str = read_sized(file)?;
+    Ok(String::from_utf8(str).unwrap())
+}
+
+fn read_sized(file: &mut File) -> std::io::Result<Vec<u8>> {
+    let size = read_i32(file)?;
+    let mut buf = vec![0u8; size as usize];
+    file.read_exact(&mut buf)?;
+    Ok(buf)
+}
diff --git a/ktest/src/main.rs b/ktest/src/main.rs
index 6da5c0a..fc70d33 100644
--- a/ktest/src/main.rs
+++ b/ktest/src/main.rs
@@ -1,78 +1,7 @@
-use std::fs::File;
-use std::io::prelude::*; // provide io traits
-use std::io::{Error, ErrorKind};
+use ktest::{read_ktest, KTEST};
 
 fn main() -> std::io::Result<()> {
     let ktest = read_ktest("test000001.ktest");
     println!("{:?}", ktest);
     Ok(())
 }
-
-#[derive(Debug)]
-struct KTEST {
-    version: i32,
-    args: Vec<String>,
-    objects: Vec<(String, Vec<u8>)>,
-}
-
-fn read_ktest(file_name: &str) -> std::io::Result<KTEST> {
-    let mut file: File = File::open(file_name)?;
-    let mut hdr = [0u8; 5];
-    file.read_exact(&mut hdr)?;
-    if &hdr != b"KTEST" {
-        return Err(Error::new(ErrorKind::Other, "not a KTEST file"));
-    }
-
-    let version = read_i32(&mut file)?;
-    println!("version : {}", version);
-    if version > 3 {
-        return Err(Error::new(ErrorKind::Other, "non support KTEST version"));
-    }
-
-    let num_args = read_i32(&mut file)?;
-
-    // info regarding the KTEST file
-    let mut args = vec![];
-    for _ in 0..num_args {
-        let arg = read_sized(&mut file)?;
-        let str = String::from_utf8(arg).unwrap();
-        args.push(str);
-    }
-
-    // metadata not used here
-    let _sym_argvs = read_i32(&mut file)?;
-    let _sym_argv_len = read_i32(&mut file)?;
-
-    // read the objects
-    let num_objects = read_i32(&mut file)?;
-    let mut objects = vec![];
-    for _ in 0..num_objects {
-        let name = read_string(&mut file)?;
-        let data = read_sized(&mut file)?;
-        objects.push((name, data))
-    }
-
-    Ok(KTEST {
-        version,
-        args,
-        objects,
-    })
-}
-
-fn read_i32(file: &mut File) -> std::io::Result<i32> {
-    let mut str = [0u8; 4];
-    file.read_exact(&mut str)?;
-    Ok(i32::from_be_bytes(str)) // big endian
-}
-
-fn read_string(file: &mut File) -> std::io::Result<String> {
-    let str = read_sized(file)?;
-    Ok(String::from_utf8(str).unwrap())
-}
-
-fn read_sized(file: &mut File) -> std::io::Result<Vec<u8>> {
-    let size = read_i32(file)?;
-    let mut buf = vec![0u8; size as usize];
-    file.read_exact(&mut buf)?;
-    Ok(buf)
-}
diff --git a/runner/Cargo.toml b/runner/Cargo.toml
index c6edcae..3f8be8c 100644
--- a/runner/Cargo.toml
+++ b/runner/Cargo.toml
@@ -8,4 +8,4 @@ edition = "2018"
 
 [dependencies]
 probe-rs = { path = "../../probe-rs/probe-rs", version = "0.3.0" }
-ktest = { path = "../probe-rs/probe-rs", version = "0.3.0" }
\ No newline at end of file
+ktest = { path = "../ktest", version = "0.1.0" }
\ No newline at end of file
diff --git a/runner/src/main.rs b/runner/src/main.rs
index e7a11a9..a49975e 100644
--- a/runner/src/main.rs
+++ b/runner/src/main.rs
@@ -1,3 +1,77 @@
+use ktest::{read_ktest, KTEST};
+
+use probe_rs::{
+    config::registry::{Registry, SelectionStrategy},
+    coresight::access_ports::AccessPortError,
+    flash::download::FileDownloadError,
+    probe::{stlink, DebugProbe, DebugProbeError, DebugProbeType, MasterProbe, WireProtocol},
+    session::Session,
+    target::info::{self, ChipInfo},
+};
+
 fn main() {
-    println!("Hello, world!");
+    let mut probe = open_probe();
+    println!("probe connected");
+
+    let strategy = SelectionStrategy::ChipInfo(ChipInfo::read_from_rom_table(&mut probe).unwrap());
+    println!("strategy {:?}", strategy);
+
+    let registry = Registry::from_builtin_families();
+
+    let target = registry.get_target(strategy).unwrap();
+    println!("target {:?}", target);
+
+    let mut session = Session::new(target, probe);
+
+    // session.probe.target_reset().unwrap();
+    let cpu_info = session
+        .target
+        .core
+        .reset_and_halt(&mut session.probe)
+        .unwrap();
+    println!("Core stopped at address 0x{:08x}", cpu_info.pc);
+
+    let mut data = [0u8; 4];
+    session
+        .target
+        .core
+        .read_block8(&mut session.probe, 0x0000_0000, &mut data)
+        .unwrap();
+
+    println!("stack {:?}, 0x{:08x}", data, u32::from_le_bytes(data));
+    let mut data = [0u8; 4];
+    session
+        .target
+        .core
+        .read_block8(&mut session.probe, 0x0000_0004, &mut data)
+        .unwrap();
+
+    println!("reset {:?}, 0x{:08x}", data, u32::from_le_bytes(data));
+
+    let cpu_info = session.target.core.step(&mut session.probe).unwrap();
+    println!("Core stopped at address 0x{:08x}", cpu_info.pc);
+
+    println!("run");
+    session.target.core.run(&mut session.probe).unwrap();
+
+    session
+        .target
+        .core
+        .wait_for_core_halted(&mut session.probe)
+        .unwrap();
+
+    let cpu_info = session.target.core.halt(&mut session.probe).unwrap();
+    println!("Core stopped at address 0x{:08x}", cpu_info.pc);
+}
+
+fn open_probe() -> MasterProbe {
+    let mut devs = stlink::tools::list_stlink_devices();
+    // just pick the first one
+    let device = devs.get(0).unwrap();
+    println!("device {:?}", device);
+    let mut link = stlink::STLink::new_from_probe_info(&device).unwrap();
+
+    link.attach(Some(WireProtocol::Swd)).unwrap();
+
+    MasterProbe::from_specific_probe(link)
 }
diff --git a/runner/test000001.ktest b/runner/test000001.ktest
new file mode 100644
index 0000000000000000000000000000000000000000..e0675e4eaf2e957beb5b60306e08631bf34cad67
GIT binary patch
literal 140
zcmeYcaSaY(U|?WoU|?WmU|@*T&&bbB)i21&(=RG5F3~Rmk(nj>**U4Hx~Ub3xdl0?
z#rh?QMd_&}`bDWZsfop@`f%~0)bz~alGLL3lGNf7-P9Dbl+>hDLz6_q<P-}F3%#5i
S1_S`v##)w~3KnDmi30%2T_-gF

literal 0
HcmV?d00001

-- 
GitLab