Add infrastructure to probe per bus
Add some infrastructure around per-bus probing functions. Each function
is provided a private parameter, e.g. the expected length of an ID. This
will allow us to implement probing functions that are only called as of-
ten as necessary. The results will be stored in the `registered_master`
structure, to be compared to database entries later.
The probe_buses() wrapper can be used for chip entries, and allows us to
transition the existing probing functions one by one. Once all functions
have been ported, probe_flash() can be adapted as well and the wrapper
will become obsolete.
Change-Id: I6e82b6d61df50234096ac39acab58a4014203933
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/74899
diff --git a/include/chipdrivers/probing.h b/include/chipdrivers/probing.h
index 7563f74..fefca3c 100644
--- a/include/chipdrivers/probing.h
+++ b/include/chipdrivers/probing.h
@@ -17,6 +17,7 @@
#ifndef __PROBING_H__
#define __PROBING_H__ 1
+#include <stddef.h>
#include <stdint.h>
enum id_type {
@@ -47,9 +48,43 @@
* Identification code.
*/
struct id_info {
- uint32_t manufacture;
- uint32_t model;
+ union {
+ uint32_t manufacture;
+ uint32_t id1;
+ };
+ union {
+ uint32_t model;
+ uint32_t id2;
+ };
enum id_type type;
};
+struct id_info_ext {
+ struct id_info id;
+ void *ext;
+};
+
+struct found_id {
+ struct found_id *next;
+ struct id_info_ext info;
+};
+
+struct flashprog_chip;
+struct master_common;
+
+struct bus_probe {
+ enum id_type type;
+ struct found_id *(*run)(const struct bus_probe *, const struct master_common *);
+ void *arg;
+};
+
+struct bus_probing {
+ unsigned int probe_count;
+ const struct bus_probe *probes;
+ bool (*match)(const struct flashprog_chip *, const struct id_info_ext *);
+};
+
+struct flashprog_flashctx;
+int probe_buses(struct flashprog_flashctx *);
+
#endif /* !__PROBING_H__ */
diff --git a/include/flash.h b/include/flash.h
index 60e35d0..c4d9040 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -243,7 +243,8 @@
PREPARE_FULL,
};
-struct flashchip {
+#define flashchip flashprog_chip
+struct flashprog_chip {
const char *vendor;
const char *name;
@@ -505,6 +506,7 @@
void print_supported_wiki(void);
/* helpers.c */
+bool flashprog_no_data(const void *raw_data, size_t);
int flashprog_read_chunked(struct flashctx *, uint8_t *dst, unsigned int start, unsigned int len, unsigned int chunksize, readfunc_t *);
uint32_t address_to_bits(uint32_t addr);
unsigned int bitcount(unsigned long a);
diff --git a/include/programmer.h b/include/programmer.h
index 5cef491..46b50f1 100644
--- a/include/programmer.h
+++ b/include/programmer.h
@@ -474,6 +474,11 @@
struct registered_master {
size_t max_rom_decode;
enum chipbustype buses_supported;
+
+ struct bus_probing probing;
+ struct found_id *found_ids;
+ bool probed;
+
union {
struct master_common common;
struct par_master par;