View source for Dfu-util-windows
From Openmoko
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Template used on this page:
Return to Dfu-util-windows.
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Template used on this page:
Return to Dfu-util-windows.
WARNING: This is very preliminary software. It has not been tested outside of the developer's box and may not work for you. Any feedback would be much appreciated! |
In order to use dfu-util for Win32, you need to install a Windows driver when the device is in U-Boot. The LibUSB-Win32 driver and accompanying INF file for the OpenMoko can be found in OpenMokoDFU.zip at the link below. When the Windows New Device Wizard pops up, use this driver.
Once the driver is installed, then you can proceed and use the instructions found at the main dfu-util page. Note that the program will crash upon first attempt to upload or download new firmware after the device is switched from Runtime Mode to DFU Mode. Simply run the same command again and the upload or download should proceed.
The above mentioned files can be downloaded at: http://projects.openmoko.org/projects/dfu-util-win32/
The information below is for developers who would like to know how to compile dfu-util for Win32.
NOTE: This is entirely work in progress. Nevertheless hopefully the information on this page will serve as a starting point for anyone who find the time to take this further. After all, as many people still use Windows PCs as their every day computers, having a convenient way to re-flash a Neo from Windows would probably open up the user base. |
The preferred order of installation is:
Here is step-by-step howto:
NOTE: It has often been a good idea to install into a directory that has no spaces in the filename. |
NOTE: {{{1}}} |
That should give you an Icon in your Start menu in MinGW->MSYS with the name of msys. Open that one, and you will find yourself in a bourne compatible shell on your native Windows system.
You can try to execute some commends such as gcc, make, etc. to make sure you installed everything correctly.
Download autoconf 2.59 from http://prdownloads.sf.net/mingw/msys-autoconf-2.59.tar.bz2?download. All you need to do to install it is to use a utility like 7-Zip to extract the files into your msys\1.0 directory.
You will also need pkg-config. According to http://www.mingw.org/MinGWiki/index.php/pkg-config, you need the following packages:
glib glib-dev libiconv gettext pkg-config
You can get all of these from the GTK+ for Windows page at: http://www.gtk.org/download-windows.html. Unzip them to your msys\1.0 directory.
Open the file /etc/profile (C:\msys\1.0\etc\profile) with your favorite editor (make sure it uses LF line endings) and add:
PKG_CONFIG_PATH="/msys/1.0/lib/pkgconfig"
If you haven't installed LibUSB-Win32 yet, install it now.
Then you will need to create a libusb.pc file in the msys\1.0\lib\pkgconfig directory. I created the following:
prefix=c:/msys/1.0 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: LibUSB Description: USB for Win32 Requires: Version: 0.1.12.1 Libs: -L${libdir} -lusb Cflags:
Then, copy the libusb.a file from the LibUSB-Win32\lib\gcc directory into the MinGW\lib directory and the usb.h file from LibUSB-Win32\include into MinGW\include (or you can copy it into your dfu-util\src directory.
Use your favorite Subversion client to check out the dfu-util sources. The dfu-util sources can be checked out from https://svn.openmoko.org/trunk/src/host/dfu-util/.
Apply the following patch to the source code:
Index: main.c =================================================================== --- main.c (revision 4544) +++ main.c (working copy) @@ -26,8 +26,10 @@ #include <getopt.h> #include <usb.h> #include <errno.h> +#ifndef __MINGW32__ #include <byteswap.h> #include <endian.h> +#endif #include "dfu.h" #include "usb_dfu.h" @@ -37,6 +39,10 @@ #include "config.h" #endif +#ifdef __MINGW32__ +#define sleep(seconds) Sleep((seconds)*1000) +#endif + #ifdef HAVE_USBPATH_H #include <usbpath.h> #endif @@ -579,6 +585,15 @@ /* FIXME: check if the selected device really has only one */ +#ifdef __MINGW32__ + dif->configuration = 1; + printf("Setting Configuration %u...\n", dif->configuration); + if (usb_set_configuration(dif->dev_handle, dif->configuration) < 0) { + fprintf(stderr, "Cannot set configuration: %s\n", usb_strerror()); + exit(1); + } +#endif + printf("Claiming USB DFU Runtime Interface...\n"); if (usb_claim_interface(_rt_dif.dev_handle, _rt_dif.interface) < 0) { fprintf(stderr, "Cannot claim interface: %s\n", usb_strerror()); @@ -700,7 +715,8 @@ exit(1); } -#if 0 +#ifdef __MINGW32__ + dif->configuration = 1; printf("Setting Configuration %u...\n", dif->configuration); if (usb_set_configuration(dif->dev_handle, dif->configuration) < 0) { fprintf(stderr, "Cannot set configuration: %s\n", usb_strerror()); Index: sam7dfu.c =================================================================== --- sam7dfu.c (revision 4544) +++ sam7dfu.c (working copy) @@ -20,6 +20,11 @@ #define O_BINARY 0 #endif +#ifdef __MINGW32__ +#define sleep(seconds) Sleep((seconds)*1000) +#define usleep(microseconds) Sleep((microseconds)/1000) +#endif + int sam7dfu_do_upload(struct usb_dev_handle *usb_handle, int interface, int xfer_size, const char *fname) { Index: usb_dfu.h =================================================================== --- usb_dfu.h (revision 4544) +++ usb_dfu.h (working copy) @@ -12,6 +12,13 @@ #include <sys/types.h> +#ifdef __MINGW32__ +#include <stdint.h> +#define u_int8_t uint8_t +#define u_int16_t uint16_t +#define u_int32_t uint32_t +#endif + #define USB_DT_DFU 0x21 struct usb_dfu_func_descriptor {
In the Msys shell inside the dfu-util directory, run the following command:
./configure && make
dfu-util should successfully compile and you should have the .exe files in the src directory.
A Windows driver needs to be installed when the device is in U-Boot and connected through the USB. Windows does not come with a DFU class driver and Jungo seems to be the only one that has created a DFU class driver, but it is non-free. You can use LibUSB-Win32 as the driver for the device by creating an INF file for it for this device. Use inf-wizard.exe, which is a part of the LibUSB-Win32 binaries distribution. Run the wizard, select the following device:
Vendor ID Product ID Description 0x1D50 0x5119 USB Device
Insert the Manufacturer name: OpenMoko, or FIC?
Insert device description: Device Firmware Upgrade
Then save the INF file along with the auto generated CAT files.
When you get the New Device Wizard when plugging in the device in U-Boot mode into Windows, select this newly generated INF file.
Once the Windows driver is successfully installed, you can try some commands:
dfu-util --list
and you should be able to list the device. Example:
Found Runtime: [0x1d50:0x5119] devnum=7, cfg=0, intf=2, alt=0, name="USB Device Firmware Upgrade"
When you attempt to upload or download firmware, the first run will crash after the "Resetting USB..." and "Opening USB Device..." messages. After it crashes, the device will be in DFU Mode instead of Runtime Mode.
Simply run the same command again and the upload or download will proceed.
http://projects.openmoko.org/projects/dfu-util-win32/
dfu-util crashes after resetting the USB device. It sounds like this was an issue in the Cygwin port as well and sounds like it might be an issue with LibUSB-Win32 as discussed here: http://lists.openmoko.org/pipermail/openmoko-uboot/2007-October/000135.html.
Had to call usb_set_configuration() with configuration set to 1 before attempting to claim the device instead of using configuration 0 that the device returns. It sounds like DFU implementation in U-Boot might not be compliant with USB spec. A similar issue and discussion can be found here: http://thread.gmane.org/gmane.comp.lib.libusb.devel.windows/1546/focus=1554