Dfu-util-windows

From Openmoko

Revision as of 17:05, 21 July 2008 by Dewey (Talk | contribs)

Jump to: navigation, search

Contents

Porting dfu-util to Windows

Note: This is entirely work in progress and has not yet been successfully finished. 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.

Potential Approaches

  • Cygwin
Not very attactive as Cygwin binaries require Cygwin in order to run. You will not get a simple, native dfu-util.exe which can be downloaded and used on any Windows machine that way.
  • MinGW/MSYS
MinGW (Minimalist GNU for Windows) seems to be the platform of choice.
  • LibUSB-Win32
Will only be able to be built on a Windows box

MinGW/MSYS port: What has been done so far

The preferred order of installation is:

  1. Install MinGW (the core installation should be sufficient)
  2. Install MSYS (Note: make comes with MSYS while GCC comes with MinGW)

Here is step-by-step howto:

  1. Download http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780&release_id=529741 and execute the installer.
Note: It has often been a good idea to install into a directory that has no spaces in the filename.
  1. Download MSYS-1.0.10.exe from http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=24963 and install. You will need to enter the path where you installed MinGW. It's a good idea to install MinGW and MSYS next to each other, i.e. C:\SOMEDIR\MinGW and C:\SOMEDIR\MSYS.
Note: Make sure to open the "Current Version: 1.0.10" folder as the newer version 1.0.11 does not have an installer yet. (See: http://sourceforge.net/mailarchive/message.php?msg_id=fhvul1%24f6j%241%40ger.gmane.org)
  1. Download http://prdownloads.sourceforge.net/mingw/msysDTK-1.0.1.exe?download, which contains the autotools. Install into the same directory into which you installed MSYS itself. The installer might not automatically suggest the right directory.
Note: If anyone can spot this file from http://sourceforge.net/project/showfiles.php?group_id=2435, please edit this page. I was only able to find this direct link by using a search engine.

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.

Getting dfu-util sources

Your home directory in msys lives in the location where you installed MSYS in %MSYS_HOME%\home\%USERNAME. Check out the dfu-util sources there or copy them into that directory in case you checked them out somehwere else on your Windows filesystem.

Where we're stuck

configure.ac:4: error: Autoconf version 2.59 or higher is required configure.ac:4: the top level autom4te: /bin/m4 failed with exit status: 1 configure.ac: `AM_INIT_AUTOMAKE' must be used automake: your implementation of AM_INIT_AUTOMAKE comes from an automake: old Automake version. You should recreate aclocal.m4 automake: with aclocal and run automake again. configure.ac: required file `./install-sh' not found configure.ac: required file `./mkinstalldirs' not found configure.ac: required file `./missing' not found automake: no `Makefile.am' found or specified

You can 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.

Once you get that going, you can do a

 ./configure

Then it will choke on PKG_CHECK_MODULES because pkg-config is not installed. To install pkg-config, check out http://www.mingw.org/MinGWiki/index.php/pkg-config

It says that you need the following package:

 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

Depending on how you installed MSys, you may have to copy the pkg.m4 file from the MinGW/share/aclocal directory into the MSys\1.0\share\aclocal directory.

Then you will need to create a libusb.pc file in the MinGW\lib\pkgconfig directory. I created the following:

 prefix=c:/MinGW
 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.

Now try this again:

 ./configure

It should be successful. Then you can try building:

 ./make

And you will get this:

 main.c:29:22: byteswap.h: No such file or directory
 main.c:30:20: endian.h: No such file or directory

Unfortunately, both these files are missing in Gnulib for mingw as described here: http://www.gnu.org/software/gnulib/manual/html_node/byteswap_002eh.html#byteswap_002eh and here: http://www.gnu.org/software/gnulib/manual/html_node/endian_002eh.html#endian_002eh

But, the default endianness assumed appears to be little endian, so you can comment out the #include's for those two files and just use the defaults.

Once you get passed that, it will complain about the types u_int8_t, u_int16_t, and u_int32_t. They might be defined somewhere, but it was easier to

 #define u_int8_t uint8_t
 #define u_int16_t uint16_t
 #define u_int32_t uint32_t

to get passed that.

Then it will complain about undefined references to sleep and usleep. These were taken out of MinGW so you will have to define the following macros:

 #define sleep(seconds) Sleep((seconds)*1000)
 #define usleep(microseconds) Sleep((microseconds)/1000)

Then you should be able to successfully compile.

After this, 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 in-wizard.exe that is 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 you get to that stage and run

 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"  

Where to go from here

When trying to upload or download files, the following error is encountered:

 Opening USB Device 0x0000:0x0000...
 Claiming USB DFU Runtime Interface...
 Cannot claim interface: usb_claim_interface: could not claim interface 2, invalid configuration 0

Hopefully someone can pick this up and figure it out from here!

Personal tools

Porting dfu-util to Windows

Note: This is entirely work in progress and has not yet been successfully finished. 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.

Potential Approaches

  • Cygwin
Not very attactive as Cygwin binaries require Cygwin in order to run. You will not get a simple, native dfu-util.exe which can be downloaded and used on any Windows machine that way.
  • MinGW/MSYS
MinGW (Minimalist GNU for Windows) seems to be the platform of choice.
  • LibUSB-Win32
Will only be able to be built on a Windows box

MinGW/MSYS port: What has been done so far

The preferred order of installation is:

  1. Install MinGW (the core installation should be sufficient)
  2. Install MSYS (Note: make comes with MSYS while GCC comes with MinGW)

Here is step-by-step howto:

  1. Download http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780&release_id=529741 and execute the installer.
Note: It has often been a good idea to install into a directory that has no spaces in the filename.
  1. Download MSYS-1.0.10.exe from http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=24963 and install. You will need to enter the path where you installed MinGW. It's a good idea to install MinGW and MSYS next to each other, i.e. C:\SOMEDIR\MinGW and C:\SOMEDIR\MSYS.
Note: Make sure to open the "Current Version: 1.0.10" folder as the newer version 1.0.11 does not have an installer yet. (See: http://sourceforge.net/mailarchive/message.php?msg_id=fhvul1%24f6j%241%40ger.gmane.org)
  1. Download http://prdownloads.sourceforge.net/mingw/msysDTK-1.0.1.exe?download, which contains the autotools. Install into the same directory into which you installed MSYS itself. The installer might not automatically suggest the right directory.
Note: If anyone can spot this file from http://sourceforge.net/project/showfiles.php?group_id=2435, please edit this page. I was only able to find this direct link by using a search engine.

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.

Getting dfu-util sources

Your home directory in msys lives in the location where you installed MSYS in %MSYS_HOME%\home\%USERNAME. Check out the dfu-util sources there or copy them into that directory in case you checked them out somehwere else on your Windows filesystem.

Where we're stuck

configure.ac:4: error: Autoconf version 2.59 or higher is required configure.ac:4: the top level autom4te: /bin/m4 failed with exit status: 1 configure.ac: `AM_INIT_AUTOMAKE' must be used automake: your implementation of AM_INIT_AUTOMAKE comes from an automake: old Automake version. You should recreate aclocal.m4 automake: with aclocal and run automake again. configure.ac: required file `./install-sh' not found configure.ac: required file `./mkinstalldirs' not found configure.ac: required file `./missing' not found automake: no `Makefile.am' found or specified

You can 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.

Once you get that going, you can do a

 ./configure

Then it will choke on PKG_CHECK_MODULES because pkg-config is not installed. To install pkg-config, check out http://www.mingw.org/MinGWiki/index.php/pkg-config

It says that you need the following package:

 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

Depending on how you installed MSys, you may have to copy the pkg.m4 file from the MinGW/share/aclocal directory into the MSys\1.0\share\aclocal directory.

Then you will need to create a libusb.pc file in the MinGW\lib\pkgconfig directory. I created the following:

 prefix=c:/MinGW
 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.

Now try this again:

 ./configure

It should be successful. Then you can try building:

 ./make

And you will get this:

 main.c:29:22: byteswap.h: No such file or directory
 main.c:30:20: endian.h: No such file or directory

Unfortunately, both these files are missing in Gnulib for mingw as described here: http://www.gnu.org/software/gnulib/manual/html_node/byteswap_002eh.html#byteswap_002eh and here: http://www.gnu.org/software/gnulib/manual/html_node/endian_002eh.html#endian_002eh

But, the default endianness assumed appears to be little endian, so you can comment out the #include's for those two files and just use the defaults.

Once you get passed that, it will complain about the types u_int8_t, u_int16_t, and u_int32_t. They might be defined somewhere, but it was easier to

 #define u_int8_t uint8_t
 #define u_int16_t uint16_t
 #define u_int32_t uint32_t

to get passed that.

Then it will complain about undefined references to sleep and usleep. These were taken out of MinGW so you will have to define the following macros:

 #define sleep(seconds) Sleep((seconds)*1000)
 #define usleep(microseconds) Sleep((microseconds)/1000)

Then you should be able to successfully compile.

After this, 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 in-wizard.exe that is 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 you get to that stage and run

 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"  

Where to go from here

When trying to upload or download files, the following error is encountered:

 Opening USB Device 0x0000:0x0000...
 Claiming USB DFU Runtime Interface...
 Cannot claim interface: usb_claim_interface: could not claim interface 2, invalid configuration 0

Hopefully someone can pick this up and figure it out from here!