cancel
Showing results for 
Search instead for 
Did you mean: 

DFU leave issue on STM32G0B1

eraquin
Associate II

Using STM32G0B1 device, DFU FW update is working as expected
Including leave request, wich results in expected device leave and start at requested address
But `dfu-util` returns error status due to get_status error after leave request

As stated in "AN3156 : USB DFU protocol used in the STM32 bootloader" documentation,
Once file download is complete, host submits leave request
And expects the device to return OK from following get_status
But STM32G0B1 returns `LIBUSB_ERROR_PIPE (-9)` before leaving

Same issue using `STM32CubeProgrammer`, either from CLI or GUI
Need to increase verbosity level for the error log to show up

`dfu-util` and `STM32CubeProgrammer` logs attached

Do I miss something ?
Feel free to ask for any additional information

4 REPLIES 4
STOne-32
ST Employee

Dear @eraquin ,

The protocol implementation is described here : https://www.st.com/resource/en/application_note/an3156-usb-dfu-protocol-used-in-the-stm32-bootloader-stmicroelectronics.pdf

see Figure 5 ans Figure 6 , Once the DOWNLOAD Command is sent with 0 Data the device trig a reset and enumeration, then the Host is not expected to send a Get_Status as in this case it will be stalled and so as seen in the Logs . May be to see the Manifest bit if set correctly at descriptor level . 

I would not expect any error after this operations as the device already left USB and is jumping to its final application. 

Hope it helps ,

STOne-32

eraquin
Associate II

Thanks a lot for your quick reply

> The protocol implementation is described here
Thanks for confirmation, this is the application note I was looking at

> Once the DOWNLOAD Command is sent with 0 Data the device trig a reset and enumeration,
> then the Host is not expected to send a Get_Status
This is not what I got from the specification
As per the "5.5 Leave DFU mode" section :
> The operation is effectively executed only when a DFU_GETSTATUS request is issued by the host
So from my current understanding, after initiating the leave (download without data),
It is expected for the host to send a get_status status request, to actually trigger the leave
I think I'm able to confirm that this get_status is mandatory
As a host leave request without any following get_status doesn't result in any leave/reset on device side

Still from "5.5 Leave DFU mode" section :
> If the status returned by the device is not dfuMANIFEST, an error has occurred
And here is my concern, as returned status isn't the expected one

STOne-32
ST Employee

Dear @eraquin 

Very clear,  let's focus on this at the end indeed.  we will try to see if other MCUs behaving on same way ? or this is particular to this device .  I assume all is running embedded ROM Bootloader ?   as we have the Source sode of DFU implementation and we can run it from user flash as well.  @FBL  your help is appreciated.

Still from "5.5 Leave DFU mode" section :
> If the status returned by the device is not dfuMANIFEST, an error has occurred
And here is my concern, as returned status isn't the expected one

Ciao

STOne-32.

Thanks for quick reply

> other MCUs behaving on same way ?
I can tell that some STM32 devices are not behaving this way
For instance, no issue with STM32F7x3IxK, which is used on a former product on our side

> I assume all is running embedded ROM Bootloader ?
Yes, DFU running from ROM, on both STM32G0B1 and STM32F7x3IxK