opaque: Use bus probing
Change-Id: I94f6f99144f28259efa358ed4d9fe82bd51c30b7
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/450
diff --git a/flashchips.c b/flashchips.c
index 6a99456..726a6ea 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -27361,7 +27361,7 @@
.page_size = 256,
/* probe is assumed to work, rest will be filled in by probe */
.tested = TEST_OK_PROBE,
- .probe = probe_opaque,
+ .probe = probe_buses,
/* eraseblock sizes will be set by the probing function */
.block_erasers =
{
diff --git a/include/chipdrivers/opaque.h b/include/chipdrivers/opaque.h
index d172861..d6d3eba 100644
--- a/include/chipdrivers/opaque.h
+++ b/include/chipdrivers/opaque.h
@@ -19,11 +19,15 @@
#include <stdint.h>
struct flashprog_flashctx;
+struct master_common;
+struct bus_probe;
+struct flashchip;
+
+struct found_id *probe_opaque(const struct bus_probe *, const struct master_common *, const struct flashchip *);
enum preparation_steps;
int prepare_opaque(struct flashprog_flashctx *, enum preparation_steps);
-int probe_opaque(struct flashprog_flashctx *);
int read_opaque(struct flashprog_flashctx *, uint8_t *buf, unsigned int start, unsigned int len);
int write_opaque(struct flashprog_flashctx *, const uint8_t *buf, unsigned int start, unsigned int len);
int erase_opaque(struct flashprog_flashctx *, unsigned int blockaddr, unsigned int blocklen);
diff --git a/opaque.c b/opaque.c
index a005d91..7a11b90 100644
--- a/opaque.c
+++ b/opaque.c
@@ -21,14 +21,30 @@
*/
#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "flash.h"
#include "flashchips.h"
#include "chipdrivers/opaque.h"
+#include "chipdrivers/probing.h"
#include "programmer.h"
-int probe_opaque(struct flashctx *flash)
+struct found_id *probe_opaque(const struct bus_probe *probe,
+ const struct master_common *mst,
+ const struct flashchip *chip)
{
- return 1;
+ struct found_id *const found = calloc(1, sizeof(*found));
+ if (!found) {
+ msg_cerr("Out of memory!\n");
+ return NULL;
+ }
+
+ found->info.id.type = ID_OPAQUE;
+ found->info.id.manufacture = PROGMANUF_ID;
+ found->info.id.model = PROGDEV_ID;
+
+ return found;
}
int prepare_opaque(struct flashctx *flash, enum preparation_steps step)
@@ -53,6 +69,16 @@
return flash->mst.opaque->erase(flash, blockaddr, blocklen);
}
+static const struct bus_probe opaque_probes[] = {
+ /* prio. type function function argument */
+ { 0, ID_OPAQUE, probe_opaque, NULL },
+};
+
+static bool opaque_probe_match(const struct flashchip *chip, const struct id_info_ext *found)
+{
+ return memcmp(&chip->id, &found->id, sizeof(found->id)) == 0;
+}
+
int register_opaque_master(const struct opaque_master *mst, void *data)
{
struct registered_master rmst = { 0 };
@@ -71,6 +97,9 @@
return ERROR_FLASHPROG_BUG;
}
rmst.buses_supported = BUS_PROG;
+ rmst.probing.probe_count = ARRAY_SIZE(opaque_probes);
+ rmst.probing.probes = opaque_probes;
+ rmst.probing.match = opaque_probe_match;
rmst.opaque = *mst;
if (data)
rmst.opaque.data = data;