
Add weak callback to allow board specific behavior - flush - initiated
This patch prepare usage of DFU back end for communication with STM32CubeProgrammer on stm32mp1 platform with stm32prog command.
Signed-off-by: Patrick Delaunay patrick.delaunay@st.com ---
Changes in v2: - Update dfu documentation for callbacks - Update callbacks comment after Lukasz review
doc/README.dfu | 8 ++++++++ drivers/dfu/dfu.c | 19 +++++++++++++++++++ include/dfu.h | 22 ++++++++++++++++++++++ 3 files changed, 49 insertions(+)
diff --git a/doc/README.dfu b/doc/README.dfu index 7b293fc08d..f3ac9a5375 100644 --- a/doc/README.dfu +++ b/doc/README.dfu @@ -142,6 +142,14 @@ Commands: mtd <dev>=<alt1>;....;<altN> virt <dev>=<alt1>;....;<altN>
+Callbacks: + The weak callback functions can be implemented to manage specific behavior + - dfu_initiated_callback : called when the DFU transaction is started, + used to initiase the device + - dfu_flush_callback : called at the end of the DFU write after DFU + manifestation, used to manage the device when + DFU transaction is closed + Host tools: When U-Boot runs the dfu stack, the DFU host tools can be used to send/receive firmwares on each configurated alternate. diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index 2697235c24..38aecd3a05 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -22,6 +22,22 @@ static int dfu_alt_num; static int alt_num_cnt; static struct hash_algo *dfu_hash_algo;
+/* + * The purpose of the dfu_flush_callback() function is to + * provide callback for dfu user + */ +__weak void dfu_flush_callback(struct dfu_entity *dfu) +{ +} + +/* + * The purpose of the dfu_initiated_callback() function is to + * provide callback for dfu user + */ +__weak void dfu_initiated_callback(struct dfu_entity *dfu) +{ +} + /* * The purpose of the dfu_usb_get_reset() function is to * provide information if after USB_DETACH request @@ -263,6 +279,7 @@ int dfu_transaction_initiate(struct dfu_entity *dfu, bool read) }
dfu->inited = 1; + dfu_initiated_callback(dfu);
return 0; } @@ -282,6 +299,8 @@ int dfu_flush(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) printf("\nDFU complete %s: 0x%08x\n", dfu_hash_algo->name, dfu->crc);
+ dfu_flush_callback(dfu); + dfu_transaction_cleanup(dfu);
return ret; diff --git a/include/dfu.h b/include/dfu.h index 4de7d35914..564966333f 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -183,6 +183,28 @@ int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
+/** + * dfu_initiated_callback - weak callback called on DFU transaction start + * + * It is a callback function called by DFU stack when a DFU transaction is + * initiated. This function allows to manage some board specific behavior on + * DFU targets. + * + * @param dfu - pointer to the dfu_entity, which should be initialized + * + */ +void dfu_initiated_callback(struct dfu_entity *dfu); +/** + * dfu_flush_callback - weak callback called at the end of the DFU write + * + * It is a callback function called by DFU stack after DFU manifestation. + * This function allows to manage some board specific behavior on DFU targets + * + * @param dfu - pointer to the dfu_entity, which should be flushed + * + */ +void dfu_flush_callback(struct dfu_entity *dfu); + /* * dfu_defer_flush - pointer to store dfu_entity for deferred flashing. * It should be NULL when not used.