Started to add linux 64 bit support, by copying the linux folder to linux64 and changeing platform.txt. Also copied scr folder into each platform's folder to allow the src to be distributed even if the tools are split up when using the Board Manager

This commit is contained in:
roger@rogerclark.net 2016-05-07 08:02:54 +10:00
parent 1b4ee05e80
commit 7e06070ade
555 changed files with 58520 additions and 9441 deletions

View File

@ -107,15 +107,13 @@ recipe.output.save_file={build.project_name}.{build.variant}.bin
# Uploader tools
# -------------------
# Upload using Maple bootloader over DFU
tools.maple_upload.cmd=maple_upload
tools.maple_upload.cmd.windows=maple_upload.bat
tools.maple_upload.path={runtime.hardware.path}/tools/win
tools.maple_upload.path.macosx={runtime.hardware.path}/tools/macosx
tools.maple_upload.path.linux={runtime.hardware.path}/tools/linux
tools.maple_upload.path.linux={runtime.hardware.path}/tools/linux
tools.maple_upload.path.linux64={runtime.hardware.path}/tools/linux64
tools.maple_upload.upload.params.verbose=-d
tools.maple_upload.upload.params.quiet=
tools.maple_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin"
@ -129,29 +127,18 @@ tools.serial_upload.cmd.macosx=serial_upload
tools.serial_upload.path={runtime.hardware.path}/tools/win
tools.serial_upload.path.macosx={runtime.hardware.path}/tools/macosx
tools.serial_upload.path.linux={runtime.hardware.path}/tools/linux
tools.serial_upload.path.linux64={runtime.hardware.path}/tools/linux64
tools.serial_upload.upload.params.verbose=-d
tools.serial_upload.upload.params.quiet=n
tools.serial_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin"
tools.upload_router.cmd=upload_router
tools.upload_router.cmd.windows=upload_router.bat
tools.upload_router.path={runtime.hardware.path}/tools/win
tools.upload_router.path.macosx={runtime.hardware.path}/tools/macosx
tools.upload_router.path.linux={runtime.hardware.path}/tools/linux
tools.upload_router.upload.params.verbose=-d
tools.upload_router.upload.params.quiet=
tools.upload_router.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}" {upload.protocol} {build.debuggingMode} "{runtime.ide.path}/hardware/tools/{build.gcc_ver}/bin/"
# stlink upload
tools.stlink_upload.cmd=stlink_upload
tools.stlink_upload.cmd.windows=stlink_upload.bat
tools.stlink_upload.path.windows={runtime.hardware.path}/tools/win
tools.stlink_upload.path.macosx={runtime.hardware.path}/tools/macosx
tools.stlink_upload.path.linux={runtime.hardware.path}/tools/linux
tools.stlink_upload.path.linux64={runtime.hardware.path}/tools/linux64
tools.stlink_upload.upload.params.verbose=-d
tools.stlink_upload.upload.params.quiet=
tools.stlink_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin"
@ -162,4 +149,4 @@ tools.bmp_upload.path={runtime.tools.arm-none-eabi-gcc.path}/bin/
tools.bmp_upload.upload.speed=230400
tools.bmp_upload.upload.params.verbose=
tools.bmp_upload.upload.params.quiet=-q --batch-silent
tools.bmp_upload.upload.pattern="{path}{cmd}" -cd "{build.path}" -b {upload.speed} {upload.verbose} -ex "set debug remote 0" -ex "set target-async off" -ex "set remotetimeout 60" -ex "set mem inaccessible-by-default off" -ex "set confirm off" -ex "set height 0" -ex "target extended-remote {serial.port}" -ex "monitor swdp_scan" -ex "attach 1" -ex "x/wx 0x8000004" -ex "monitor erase_mass" -ex "echo 0x8000004 expect 0xffffffff after erase\n" -ex "x/wx 0x8000004" -ex "file {build.project_name}.elf" -ex "load" -ex "x/wx 0x08000004" -ex "tbreak main" -ex "run" -ex "echo \n\n\nUpload finished!" -ex "quit"
tools.bmp_upload.upload.pattern="{path}{cmd}" -cd "{build.path}" -b {upload.speed} {upload.verbose} -ex "set debug remote 0" -ex "set target-async off" -ex "set remotetimeout 60" -ex "set mem inaccessible-by-default off" -ex "set confirm off" -ex "set height 0" -ex "target extended-remote {serial.port}" -ex "monitor swdp_scan" -ex "attach 1" -ex "x/wx 0x8000004" -ex "monitor erase_mass" -ex "echo 0x8000004 expect 0xffffffff after erase\n" -ex "x/wx 0x8000004" -ex "file {build.project_name}.elf" -ex "load" -ex "x/wx 0x08000004" -ex "tbreak main" -ex "run" -ex "echo \n\n\nUpload finished!" -ex "quit"

View File

View File

@ -1,30 +1,30 @@
Authors ordered by first contribution.
Harald Welte
Werner Almesberger
Michael Lauer
Jim Huang
Stefan Schmidt
Daniel Willmann
Mike Frysinger
Uwe Hermann
C. Scott Ananian
Bernard Blackham
Holger Freyther
Marc Singer
James Perkins
Tommi Keisala
Pascal Schweizer
Bradley Scott
Uwe Bonnes
Andrey Smirnov
Jussi Timperi
Hans Petter Selasky
Bo Shen
Henrique de Almeida Mendonca
Bernd Krumboeck
Dennis Meier
Veli-Pekka Peltola
Dave Hylands
Michael Grzeschik
Paul Fertser
Authors ordered by first contribution.
Harald Welte
Werner Almesberger
Michael Lauer
Jim Huang
Stefan Schmidt
Daniel Willmann
Mike Frysinger
Uwe Hermann
C. Scott Ananian
Bernard Blackham
Holger Freyther
Marc Singer
James Perkins
Tommi Keisala
Pascal Schweizer
Bradley Scott
Uwe Bonnes
Andrey Smirnov
Jussi Timperi
Hans Petter Selasky
Bo Shen
Henrique de Almeida Mendonca
Bernd Krumboeck
Dennis Meier
Veli-Pekka Peltola
Dave Hylands
Michael Grzeschik
Paul Fertser

View File

@ -1,340 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -1,93 +1,93 @@
0.8:
o New, separate dfu-prefix tool (Uwe Bonnes)
o Allow filtering on serial number (Uwe Bonnes)
o Improved VID/PID/serial filtering (Bradley Scott)
o Support reading firmware from stdin (Tormod Volden)
o Warn if missing DFU suffix (Tormod Volden)
o Improved progress bar (Hans Petter Selasky)
o Fix dfuse leave option (Uwe Bonnes)
o Major code rework (Hans Petter Selasky)
o MS Visual Studio build support (Henrique Mendonca)
o dfuse-pack.py tool for .dfu files (Antonio Galeo)
o Many other fixes from many people
2014-09-13: Tormod Volden <debian.tormod@gmail.com>
0.7:
o Support for TI Stellaris devices (Tommi Keisala)
o Fix libusb detection on MacOSX (Marc Singer)
o Fix libusb detection on FreeBSD (Tormod Volden)
o Improved DfuSe support (Tormod Volden)
o Support all special commands (leave, unprotect, mass-erase)
o Arbitrary upload lengths
o "force" option for various possible (dangerous) overrides
2012-10-07: Tormod Volden <debian.tormod@gmail.com>
0.6:
o Add detach mode (Stefan Schmidt)
o Check return value on all libusb calls (Tormod Volden)
o Fix segmentation fault with -s option (Tormod Volden)
o Add DFU suffix manipulation tool (Stefan Schmidt)
o Port to Windows: (Tormod Volden, some parts based on work from Satz
Klauer)
o Port file handling to stdio streams
o Sleep() macros
o C99 types
o Pack structs
o Detect DfuSe device correctly on big-endian architectures (Tormod
Volden)
o Add dfuse progress indication on download (Tormod Volden)
o Cleanup: gcc pedantic, gcc extension, ... (Tormod Volden)
o Rely on page size from functional descriptor. Please report if you get
an error about it. (Tormod Volden)
o Add quirk for Maple since it reports wrong DFU version (Tormod Volden)
2012-04-22: Stefan Schmidt <stefan@datenfreihafen.org>
0.5:
o DfuSe extension support for ST devices (Tormod Volden)
o Add initial support for bitWillDetach flag from DFU 1.1 (Tormod
Volden)
o Internal cleanup and some manual page fixes (Tormod Volden)
2011-11-02: Stefan Schmidt <stefan@datenfreihafen.org>
0.4:
o Rework to use libusb-1.0 (Stefan Schmidt)
o DFU suffix support (Tormod Volden, Stefan Schmidt)
o Sspeed up DFU downloads directly into memory (Bernard Blackham)
o More flexible -d vid:pid parsing (Tormod Volden)
o Many bug fixes and cleanups
2011-07-20: Stefan Schmidt <stefan@datenfreihafen.org>
0.3:
o quirks: Add OpenOCD to the poll timeout quirk table.
2010-12-22: Stefan Schmidt <stefan@datenfreihafen.org>
0.2:
o Fix some typos on the website and the README (Antonio Ospite, Uwe
Hermann)
o Remove build rule for a static binary. We can use autotools for this.
(Mike Frysinger)
o Fix infinite loop in download error path (C. Scott Ananian)
o Break out to show the 'finished' in upload (C. Scott Ananian)
o Add GPLv2+ headers (Harald Welte)
o Remove dead code (commands.[ch]) remnescent of dfu-programmer (Harald
Welte)
o Simple quirk system with Openmoko quirk for missing bwPollTimeout (Tormod Volden)
o New default (1024) and clamping of transfer size (Tormod Volden)
o Verify sending of completion packet (Tormod Volden)
o Look for DFU functional descriptor among all descriptors (Tormod
Volden)
o Print out in which direction we are transferring data
o Abort in upload if the file already exists
2010-11-17 Stefan Schmidt <stefan@datenfreihafen.org>
0.1:
Initial release
2010-05-23 Stefan Schmidt <stefan@datenfreihafen.org>
0.8:
o New, separate dfu-prefix tool (Uwe Bonnes)
o Allow filtering on serial number (Uwe Bonnes)
o Improved VID/PID/serial filtering (Bradley Scott)
o Support reading firmware from stdin (Tormod Volden)
o Warn if missing DFU suffix (Tormod Volden)
o Improved progress bar (Hans Petter Selasky)
o Fix dfuse leave option (Uwe Bonnes)
o Major code rework (Hans Petter Selasky)
o MS Visual Studio build support (Henrique Mendonca)
o dfuse-pack.py tool for .dfu files (Antonio Galeo)
o Many other fixes from many people
2014-09-13: Tormod Volden <debian.tormod@gmail.com>
0.7:
o Support for TI Stellaris devices (Tommi Keisala)
o Fix libusb detection on MacOSX (Marc Singer)
o Fix libusb detection on FreeBSD (Tormod Volden)
o Improved DfuSe support (Tormod Volden)
o Support all special commands (leave, unprotect, mass-erase)
o Arbitrary upload lengths
o "force" option for various possible (dangerous) overrides
2012-10-07: Tormod Volden <debian.tormod@gmail.com>
0.6:
o Add detach mode (Stefan Schmidt)
o Check return value on all libusb calls (Tormod Volden)
o Fix segmentation fault with -s option (Tormod Volden)
o Add DFU suffix manipulation tool (Stefan Schmidt)
o Port to Windows: (Tormod Volden, some parts based on work from Satz
Klauer)
o Port file handling to stdio streams
o Sleep() macros
o C99 types
o Pack structs
o Detect DfuSe device correctly on big-endian architectures (Tormod
Volden)
o Add dfuse progress indication on download (Tormod Volden)
o Cleanup: gcc pedantic, gcc extension, ... (Tormod Volden)
o Rely on page size from functional descriptor. Please report if you get
an error about it. (Tormod Volden)
o Add quirk for Maple since it reports wrong DFU version (Tormod Volden)
2012-04-22: Stefan Schmidt <stefan@datenfreihafen.org>
0.5:
o DfuSe extension support for ST devices (Tormod Volden)
o Add initial support for bitWillDetach flag from DFU 1.1 (Tormod
Volden)
o Internal cleanup and some manual page fixes (Tormod Volden)
2011-11-02: Stefan Schmidt <stefan@datenfreihafen.org>
0.4:
o Rework to use libusb-1.0 (Stefan Schmidt)
o DFU suffix support (Tormod Volden, Stefan Schmidt)
o Sspeed up DFU downloads directly into memory (Bernard Blackham)
o More flexible -d vid:pid parsing (Tormod Volden)
o Many bug fixes and cleanups
2011-07-20: Stefan Schmidt <stefan@datenfreihafen.org>
0.3:
o quirks: Add OpenOCD to the poll timeout quirk table.
2010-12-22: Stefan Schmidt <stefan@datenfreihafen.org>
0.2:
o Fix some typos on the website and the README (Antonio Ospite, Uwe
Hermann)
o Remove build rule for a static binary. We can use autotools for this.
(Mike Frysinger)
o Fix infinite loop in download error path (C. Scott Ananian)
o Break out to show the 'finished' in upload (C. Scott Ananian)
o Add GPLv2+ headers (Harald Welte)
o Remove dead code (commands.[ch]) remnescent of dfu-programmer (Harald
Welte)
o Simple quirk system with Openmoko quirk for missing bwPollTimeout (Tormod Volden)
o New default (1024) and clamping of transfer size (Tormod Volden)
o Verify sending of completion packet (Tormod Volden)
o Look for DFU functional descriptor among all descriptors (Tormod
Volden)
o Print out in which direction we are transferring data
o Abort in upload if the file already exists
2010-11-17 Stefan Schmidt <stefan@datenfreihafen.org>
0.1:
Initial release
2010-05-23 Stefan Schmidt <stefan@datenfreihafen.org>

View File

@ -1,20 +1,20 @@
List of supported software and hardware products:
Software user (bootloader, etc)
-------------------------------
- Sam7DFU: http://www.openpcd.org/Sam7dfu
- U-boot: DFU patches
- Barebox: http://www.barebox.org/
- Leaflabs: http://code.google.com/p/leaflabs/
- Blackmagic DFU
Products using DFU
------------------
- OpenPCD (sam7dfu)
- Openmoko Neo 1973 and Freerunner (u-boot with DFU patches)
- Leaflabs Maple
- ATUSB from Qi Hardware
- STM32F105/7, STM32F2/F3/F4 in System Bootloader
- Blackmagic debug probe
- NXP LPC31xx/LPC43XX, e.g. LPC-Link and LPC-Link2, need binaries
with LPC prefix and encoding (LPC-Link)
List of supported software and hardware products:
Software user (bootloader, etc)
-------------------------------
- Sam7DFU: http://www.openpcd.org/Sam7dfu
- U-boot: DFU patches
- Barebox: http://www.barebox.org/
- Leaflabs: http://code.google.com/p/leaflabs/
- Blackmagic DFU
Products using DFU
------------------
- OpenPCD (sam7dfu)
- Openmoko Neo 1973 and Freerunner (u-boot with DFU patches)
- Leaflabs Maple
- ATUSB from Qi Hardware
- STM32F105/7, STM32F2/F3/F4 in System Bootloader
- Blackmagic debug probe
- NXP LPC31xx/LPC43XX, e.g. LPC-Link and LPC-Link2, need binaries
with LPC prefix and encoding (LPC-Link)

View File

@ -1,3 +1,3 @@
SUBDIRS = src doc
EXTRA_DIST = autogen.sh TODO DEVICES.txt dfuse-pack.py
SUBDIRS = src doc
EXTRA_DIST = autogen.sh TODO DEVICES.txt dfuse-pack.py

View File

@ -1,20 +1,20 @@
Dfu-util - Device Firmware Upgrade Utilities
Dfu-util is the host side implementation of the DFU 1.0 [1] and DFU 1.1 [2]
specification of the USB forum.
DFU is intended to download and upload firmware to devices connected over
USB. It ranges from small devices like micro-controller boards up to mobile
phones. With dfu-util you are able to download firmware to your device or
upload firmware from it.
dfu-util has been tested with Openmoko Neo1973 and Freerunner and many
other devices.
[1] DFU 1.0 spec: http://www.usb.org/developers/devclass_docs/usbdfu10.pdf
[2] DFU 1.1 spec: http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf
The official website is:
http://dfu-util.gnumonks.org/
Dfu-util - Device Firmware Upgrade Utilities
Dfu-util is the host side implementation of the DFU 1.0 [1] and DFU 1.1 [2]
specification of the USB forum.
DFU is intended to download and upload firmware to devices connected over
USB. It ranges from small devices like micro-controller boards up to mobile
phones. With dfu-util you are able to download firmware to your device or
upload firmware from it.
dfu-util has been tested with Openmoko Neo1973 and Freerunner and many
other devices.
[1] DFU 1.0 spec: http://www.usb.org/developers/devclass_docs/usbdfu10.pdf
[2] DFU 1.1 spec: http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf
The official website is:
http://dfu-util.gnumonks.org/

View File

@ -1,14 +1,14 @@
DfuSe:
- Do erase and write in two separate passes when downloading
- Skip "Set Address" command when downloading contiguous blocks
- Implement "Get Commands" command
Devices:
- Research iPhone/iPod/iPad support
Heavily modified dfu-util fork here:
https://github.com/planetbeing/xpwn/tree/master/dfu-util
- Test against Niftylights
Non-Code:
- Logo
- Re-License as LGPL for usage as library?
DfuSe:
- Do erase and write in two separate passes when downloading
- Skip "Set Address" command when downloading contiguous blocks
- Implement "Get Commands" command
Devices:
- Research iPhone/iPod/iPad support
Heavily modified dfu-util fork here:
https://github.com/planetbeing/xpwn/tree/master/dfu-util
- Test against Niftylights
Non-Code:
- Logo
- Re-License as LGPL for usage as library?

View File

View File

@ -1,41 +1,41 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT([dfu-util],[0.8],[dfu-util@lists.gnumonks.org],,[http://dfu-util.gnumonks.org])
AC_CONFIG_AUX_DIR(m4)
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_HEADERS([config.h])
# Test for new silent rules and enable only if they are available
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# On FreeBSD the libusb-1.0 is called libusb and resides in system location
AC_CHECK_LIB([usb], [libusb_init],, [native_libusb=no],)
AS_IF([test x$native_libusb = xno], [
PKG_CHECK_MODULES([USB], [libusb-1.0 >= 1.0.0],,
AC_MSG_ERROR([*** Required libusb-1.0 >= 1.0.0 not installed ***]))
])
AC_CHECK_LIB([usbpath],[usb_path2devnum],,,-lusb)
LIBS="$LIBS $USB_LIBS"
CFLAGS="$CFLAGS $USB_CFLAGS"
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([usbpath.h windows.h sysexits.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MEMCMP
AC_CHECK_FUNCS([ftruncate getpagesize nanosleep err])
AC_CONFIG_FILES(Makefile src/Makefile doc/Makefile)
AC_OUTPUT
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT([dfu-util],[0.8],[dfu-util@lists.gnumonks.org],,[http://dfu-util.gnumonks.org])
AC_CONFIG_AUX_DIR(m4)
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_HEADERS([config.h])
# Test for new silent rules and enable only if they are available
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# On FreeBSD the libusb-1.0 is called libusb and resides in system location
AC_CHECK_LIB([usb], [libusb_init],, [native_libusb=no],)
AS_IF([test x$native_libusb = xno], [
PKG_CHECK_MODULES([USB], [libusb-1.0 >= 1.0.0],,
AC_MSG_ERROR([*** Required libusb-1.0 >= 1.0.0 not installed ***]))
])
AC_CHECK_LIB([usbpath],[usb_path2devnum],,,-lusb)
LIBS="$LIBS $USB_LIBS"
CFLAGS="$CFLAGS $USB_CFLAGS"
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([usbpath.h windows.h sysexits.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MEMCMP
AC_CHECK_FUNCS([ftruncate getpagesize nanosleep err])
AC_CONFIG_FILES(Makefile src/Makefile doc/Makefile)
AC_OUTPUT

View File

@ -1,77 +1,77 @@
Device:
-------
qi-hardware-atusb:
- Qi Hardware ben-wpan
- DFU implementation:
http://projects.qi-hardware.com/index.php/p/ben-wpan/source/tree/master/atusb/fw/usb
- Tester: Stefan Schmidt
openpcd:
- OpenPCD RFID reader
- DFU implementation: SAM7DFU
http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git
- Tester: Stefan Schmidt
simtrace:
- Sysmocom SimTrace
- DFU implementation: SAM7DFU
http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git
- Tester: Stefan Schmidt
openmoko-freerunner:
- Openmoko Freerunner
- DFU implementation: Old U-Boot
http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches
- Tester: Stefan Schmidt
openmoko-neo1973:
- Openmoko Neo1073
- DFU implementation: Old U-Boot
http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches
- Tester: Stefan Schmidt
tdk-bluetooth:
- TDK Corp. Bluetooth Adapter
- DFU implementation: closed soure
- Only upload has been tested
- Tester: Stefan Schmidt
stm32f107:
- STM32 microcontrollers with built-in (ROM) DFU loader
- DFU implementation: Closed source but probably similar to the one
in their USB device libraries. Some relevant application notes:
http://www.st.com -> AN3156 and AN2606
- Tested by Uwe Bonnes
stm32f4discovery:
- STM32 microcontroller board with built-in (ROM) DFU loader
- DFU implementation: Closed source, probably similar to stm32f107.
- Tested by Joe Rothweiler
dso-nano:
- DSO Nano pocket oscilloscope
- DFU implementation: Based on ST Microelectronics USB FS Library 1.0
http://dsonano.googlecode.com/files/DS0201_OpenSource.rar
- Tester: Tormod Volden
opc-20:
- Custom devices based on STM32F1xx
- DFU implementation: ST Microelectronics USB FS Device Library 3.1.0
http://www.st.com -> um0424.zip
- Tester: Tormod Volden
lpc-link, lpclink2:
- NXP LPCXpresso debug adapters
- Proprietary DFU implementation, uses special download files with
LPC prefix and encoding of the target firmware code
- Tested by Uwe Bonnes
Adding the lsusb output and a download log of your device here helps
us to avoid regressions for hardware we cannot test while working on
the code. To extract the lsusb output use this command:
sudo lsusb -v -d $USBID > $DEVICE.lsusb
Prepare a description snippet as above, and send it to us. A log
(copy-paste of the command window) of a firmware download is also
nice, please use the double verbose option -v -v and include the
command line in the log file.
Device:
-------
qi-hardware-atusb:
- Qi Hardware ben-wpan
- DFU implementation:
http://projects.qi-hardware.com/index.php/p/ben-wpan/source/tree/master/atusb/fw/usb
- Tester: Stefan Schmidt
openpcd:
- OpenPCD RFID reader
- DFU implementation: SAM7DFU
http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git
- Tester: Stefan Schmidt
simtrace:
- Sysmocom SimTrace
- DFU implementation: SAM7DFU
http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git
- Tester: Stefan Schmidt
openmoko-freerunner:
- Openmoko Freerunner
- DFU implementation: Old U-Boot
http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches
- Tester: Stefan Schmidt
openmoko-neo1973:
- Openmoko Neo1073
- DFU implementation: Old U-Boot
http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches
- Tester: Stefan Schmidt
tdk-bluetooth:
- TDK Corp. Bluetooth Adapter
- DFU implementation: closed soure
- Only upload has been tested
- Tester: Stefan Schmidt
stm32f107:
- STM32 microcontrollers with built-in (ROM) DFU loader
- DFU implementation: Closed source but probably similar to the one
in their USB device libraries. Some relevant application notes:
http://www.st.com -> AN3156 and AN2606
- Tested by Uwe Bonnes
stm32f4discovery:
- STM32 microcontroller board with built-in (ROM) DFU loader
- DFU implementation: Closed source, probably similar to stm32f107.
- Tested by Joe Rothweiler
dso-nano:
- DSO Nano pocket oscilloscope
- DFU implementation: Based on ST Microelectronics USB FS Library 1.0
http://dsonano.googlecode.com/files/DS0201_OpenSource.rar
- Tester: Tormod Volden
opc-20:
- Custom devices based on STM32F1xx
- DFU implementation: ST Microelectronics USB FS Device Library 3.1.0
http://www.st.com -> um0424.zip
- Tester: Tormod Volden
lpc-link, lpclink2:
- NXP LPCXpresso debug adapters
- Proprietary DFU implementation, uses special download files with
LPC prefix and encoding of the target firmware code
- Tested by Uwe Bonnes
Adding the lsusb output and a download log of your device here helps
us to avoid regressions for hardware we cannot test while working on
the code. To extract the lsusb output use this command:
sudo lsusb -v -d $USBID > $DEVICE.lsusb
Prepare a description snippet as above, and send it to us. A log
(copy-paste of the command window) of a firmware download is also
nice, please use the double verbose option -v -v and include the
command line in the log file.

View File

@ -1,60 +1,60 @@
Bus 002 Device 004: ID 0483:df11 SGS Thomson Microelectronics
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11
bcdDevice 1.1a
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 DFU
iSerial 3 001
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 64mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 5 @SPI Flash : M25P64/0x00000000/64*064Kg,64*064Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1.1a
Device Status: 0x0000
(Bus Powered)
Bus 002 Device 004: ID 0483:df11 SGS Thomson Microelectronics
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11
bcdDevice 1.1a
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 DFU
iSerial 3 001
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 64mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 5 @SPI Flash : M25P64/0x00000000/64*064Kg,64*064Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1.1a
Device Status: 0x0000
(Bus Powered)

View File

@ -1,59 +1,59 @@
(The on-board LPC3154 has some encryption key set and LPCXpressoWIN.enc
is encrypted.)
$ lsusb | grep NXP
Bus 003 Device 011: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link
$ dfu-util -v -v -v -R -D /opt/lpc/lpcxpresso/bin/LPCXpressoWIN.enc
dfu-util 0.7
Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Deducing device DFU version from functional descriptor length
Opening DFU capable USB device...
ID 0471:df55
Run-time device DFU version 0100
Claiming USB DFU Runtime Interface...
Determining device status:
state = dfuIDLE, status = 0
dfu-util: WARNING: Runtime device already in DFU state ?!?
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status:
state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0100
Device returned transfer size 2048
Copying data from PC to DFU device
Download [ ] 0% 0 bytes
Download [= ] 6% 2048 bytes
Download [=== ] 13% 4096 bytes
Download [==== ] 19% 6144 bytes
Download [====== ] 26% 8192 bytes
Download [======== ] 32% 10240 bytes
Download [========= ] 39% 12288 bytes
Download [=========== ] 45% 14336 bytes
Download [============= ] 52% 16384 bytes
Download [============== ] 59% 18432 bytes
Download [================ ] 65% 20480 bytes
Download [================== ] 72% 22528 bytes
Download [=================== ] 78% 24576 bytes
Download [===================== ] 85% 26624 bytes
Download [====================== ] 91% 28672 bytes
Download [======================== ] 98% 29192 bytes
Download [=========================] 100% 29192 bytes
Download done.
Sent a total of 29192 bytes
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
dfu-util: can't detach
Resetting USB to switch back to runtime mode
$ lsusb | grep NXP
Bus 003 Device 012: ID 1fc9:0009 NXP Semiconductors
(The on-board LPC3154 has some encryption key set and LPCXpressoWIN.enc
is encrypted.)
$ lsusb | grep NXP
Bus 003 Device 011: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link
$ dfu-util -v -v -v -R -D /opt/lpc/lpcxpresso/bin/LPCXpressoWIN.enc
dfu-util 0.7
Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Deducing device DFU version from functional descriptor length
Opening DFU capable USB device...
ID 0471:df55
Run-time device DFU version 0100
Claiming USB DFU Runtime Interface...
Determining device status:
state = dfuIDLE, status = 0
dfu-util: WARNING: Runtime device already in DFU state ?!?
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status:
state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0100
Device returned transfer size 2048
Copying data from PC to DFU device
Download [ ] 0% 0 bytes
Download [= ] 6% 2048 bytes
Download [=== ] 13% 4096 bytes
Download [==== ] 19% 6144 bytes
Download [====== ] 26% 8192 bytes
Download [======== ] 32% 10240 bytes
Download [========= ] 39% 12288 bytes
Download [=========== ] 45% 14336 bytes
Download [============= ] 52% 16384 bytes
Download [============== ] 59% 18432 bytes
Download [================ ] 65% 20480 bytes
Download [================== ] 72% 22528 bytes
Download [=================== ] 78% 24576 bytes
Download [===================== ] 85% 26624 bytes
Download [====================== ] 91% 28672 bytes
Download [======================== ] 98% 29192 bytes
Download [=========================] 100% 29192 bytes
Download done.
Sent a total of 29192 bytes
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
dfu-util: can't detach
Resetting USB to switch back to runtime mode
$ lsusb | grep NXP
Bus 003 Device 012: ID 1fc9:0009 NXP Semiconductors

View File

@ -1,58 +1,58 @@
Bus 003 Device 008: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0471 Philips (or NXP)
idProduct 0xdf55 LPCXpresso LPC-Link
bcdDevice 0.01
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 7
bDescriptorType 33
bmAttributes 1
Will Not Detach
Manifestation Intolerant
Upload Unsupported
Download Supported
wDetachTimeout 65535 milliseconds
wTransferSize 2048 bytes
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
Bus 003 Device 008: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0471 Philips (or NXP)
idProduct 0xdf55 LPCXpresso LPC-Link
bcdDevice 0.01
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 7
bDescriptorType 33
bmAttributes 1
Will Not Detach
Manifestation Intolerant
Upload Unsupported
Download Supported
wDetachTimeout 65535 milliseconds
wTransferSize 2048 bytes
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)

View File

@ -1,59 +1,59 @@
$ lsusb | grep NXP
Bus 003 Device 013: ID 1fc9:000c NXP Semiconductors
$ dfu-util -D ~/devel/dfu-util/firmware.bin.qthdr
dfu-util 0.7
Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Possible unencryptes NXP LPC DFU prefix with the following properties
Payload length: 39 kiByte
Opening DFU capable USB device...
ID 1fc9:000c
Run-time device DFU version 0100
Claiming USB DFU Runtime Interface...
Determining device status:
state = dfuIDLE, status = 0
dfu-util: WARNING: Runtime device already in DFU state ?!?
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status:
state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0100
Device returned transfer size 2048
Copying data from PC to DFU device
Download [ ] 0% 0 bytes
Download [= ] 4% 2048 bytes
Download [== ] 9% 4096 bytes
Download [=== ] 14% 6144 bytes
Download [==== ] 19% 8192 bytes
Download [====== ] 24% 10240 bytes
Download [======= ] 28% 12288 bytes
Download [======== ] 33% 14336 bytes
Download [========= ] 38% 16384 bytes
Download [========== ] 43% 18432 bytes
Download [============ ] 48% 20480 bytes
Download [============= ] 53% 22528 bytes
Download [============== ] 57% 24576 bytes
Download [=============== ] 62% 26624 bytes
Download [================ ] 67% 28672 bytes
Download [================== ] 72% 30720 bytes
Download [=================== ] 77% 32768 bytes
Download [==================== ] 82% 34816 bytes
Download [===================== ] 86% 36864 bytes
Download [====================== ] 91% 38912 bytes
Download [======================== ] 96% 40356 bytes
Download [=========================] 100% 40356 bytes
Download done.
Sent a total of 40356 bytes
dfu-util: unable to read DFU status
$ lsusb | grep NXP
Bus 003 Device 014: ID 1fc9:0018 NXP Semiconductors
$ lsusb | grep NXP
Bus 003 Device 013: ID 1fc9:000c NXP Semiconductors
$ dfu-util -D ~/devel/dfu-util/firmware.bin.qthdr
dfu-util 0.7
Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Possible unencryptes NXP LPC DFU prefix with the following properties
Payload length: 39 kiByte
Opening DFU capable USB device...
ID 1fc9:000c
Run-time device DFU version 0100
Claiming USB DFU Runtime Interface...
Determining device status:
state = dfuIDLE, status = 0
dfu-util: WARNING: Runtime device already in DFU state ?!?
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status:
state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0100
Device returned transfer size 2048
Copying data from PC to DFU device
Download [ ] 0% 0 bytes
Download [= ] 4% 2048 bytes
Download [== ] 9% 4096 bytes
Download [=== ] 14% 6144 bytes
Download [==== ] 19% 8192 bytes
Download [====== ] 24% 10240 bytes
Download [======= ] 28% 12288 bytes
Download [======== ] 33% 14336 bytes
Download [========= ] 38% 16384 bytes
Download [========== ] 43% 18432 bytes
Download [============ ] 48% 20480 bytes
Download [============= ] 53% 22528 bytes
Download [============== ] 57% 24576 bytes
Download [=============== ] 62% 26624 bytes
Download [================ ] 67% 28672 bytes
Download [================== ] 72% 30720 bytes
Download [=================== ] 77% 32768 bytes
Download [==================== ] 82% 34816 bytes
Download [===================== ] 86% 36864 bytes
Download [====================== ] 91% 38912 bytes
Download [======================== ] 96% 40356 bytes
Download [=========================] 100% 40356 bytes
Download done.
Sent a total of 40356 bytes
dfu-util: unable to read DFU status
$ lsusb | grep NXP
Bus 003 Device 014: ID 1fc9:0018 NXP Semiconductors

View File

@ -1,203 +1,203 @@
Bus 003 Device 007: ID 0c72:000c PEAK System PCAN-USB
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x0c72 PEAK System
idProduct 0x000c PCAN-USB
bcdDevice 1c.ff
iManufacturer 0
iProduct 3 VER1:PEAK
VER2:02.8.01
DAT :06.05.2004
TIME:09:35:37
...
iSerial 0
bNumConfigurations 3
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 2
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 394mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 3
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0001
Self Powered
Bus 003 Device 007: ID 0c72:000c PEAK System PCAN-USB
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x0c72 PEAK System
idProduct 0x000c PCAN-USB
bcdDevice 1c.ff
iManufacturer 0
iProduct 3 VER1:PEAK
VER2:02.8.01
DAT :06.05.2004
TIME:09:35:37
...
iSerial 0
bNumConfigurations 3
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 2
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 394mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 20
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 3
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0001
Self Powered

View File

@ -1,60 +1,60 @@
Bus 001 Device 004: ID 0483:df11 SGS Thomson Microelectronics
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11
bcdDevice 2.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 DFU
iSerial 3 ÿÿÿÿÿÿÿÿÿÿÿÿ
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @SPI Flash : M25P64/0x00000000/128*64Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1a.01
Device Status: 0x0001
Self Powered
Bus 001 Device 004: ID 0483:df11 SGS Thomson Microelectronics
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11
bcdDevice 2.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 DFU
iSerial 3 ÿÿÿÿÿÿÿÿÿÿÿÿ
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @SPI Flash : M25P64/0x00000000/128*64Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1a.01
Device Status: 0x0001
Self Powered

View File

@ -1,109 +1,109 @@
Bus 003 Device 017: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader
bcdDevice 0.00
iManufacturer 1 OpenMoko, Inc
iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12
iSerial 3 0000000
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 81
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 7 USB Device Firmware Upgrade
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 8 RAM 0x32000000
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 9 u-boot
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 10 u-boot_env
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 3
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 11 kernel
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 4
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 12 splash
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 5
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 13 factory
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 6
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 14 rootfs
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Device Status: 0x0a00
(Bus Powered)
Bus 003 Device 017: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader
bcdDevice 0.00
iManufacturer 1 OpenMoko, Inc
iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12
iSerial 3 0000000
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 81
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 7 USB Device Firmware Upgrade
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 8 RAM 0x32000000
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 9 u-boot
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 10 u-boot_env
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 3
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 11 kernel
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 4
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 12 splash
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 5
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 13 factory
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 6
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 14 rootfs
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Device Status: 0x0a00
(Bus Powered)

View File

@ -1,179 +1,179 @@
Bus 005 Device 033: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader
bcdDevice 0.00
iManufacturer 1 OpenMoko, Inc
iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12
iSerial 3 0000000
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 85
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 4 TTY via USB
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6 Control Interface
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5 Bulk Data Interface
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 7 USB Device Firmware Upgrade
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 4 TTY via USB
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6 Control Interface
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5 Bulk Data Interface
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Device Status: 0x9a00
(Bus Powered)
Bus 005 Device 033: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader
bcdDevice 0.00
iManufacturer 1 OpenMoko, Inc
iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12
iSerial 3 0000000
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 85
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 4 TTY via USB
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6 Control Interface
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5 Bulk Data Interface
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 7 USB Device Firmware Upgrade
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 4 TTY via USB
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6 Control Interface
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5 Bulk Data Interface
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Device Status: 0x9a00
(Bus Powered)

View File

@ -1,182 +1,182 @@
Bus 006 Device 020: ID 1457:5119 First International Computer, Inc. OpenMoko Neo1973 u-boot cdc_acm serial port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1457 First International Computer, Inc.
idProduct 0x5119 OpenMoko Neo1973 u-boot cdc_acm serial port
bcdDevice 0.00
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 85
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 7
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Device Status: 0x0006
(Bus Powered)
Remote Wakeup Enabled
Test Mode
Bus 006 Device 020: ID 1457:5119 First International Computer, Inc. OpenMoko Neo1973 u-boot cdc_acm serial port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1457 First International Computer, Inc.
idProduct 0x5119 OpenMoko Neo1973 u-boot cdc_acm serial port
bcdDevice 0.00
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 85
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 7
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 4096 bytes
bcdDFUVersion 1.00
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Device Status: 0x0006
(Bus Powered)
Remote Wakeup Enabled
Test Mode

View File

@ -1,60 +1,60 @@
Bus 006 Device 016: ID 16c0:076b VOTI OpenPCD 13.56MHz RFID Reader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x16c0 VOTI
idProduct 0x076b OpenPCD 13.56MHz RFID Reader
bcdDevice 0.00
iManufacturer 1
iProduct 2 OpenPCD RFID Simulator - DFU Mode
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 3
Will Not Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 256 bytes
bcdDFUVersion 1.00
Device Status: 0x0000
(Bus Powered)
Bus 006 Device 016: ID 16c0:076b VOTI OpenPCD 13.56MHz RFID Reader
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x16c0 VOTI
idProduct 0x076b OpenPCD 13.56MHz RFID Reader
bcdDevice 0.00
iManufacturer 1
iProduct 2 OpenPCD RFID Simulator - DFU Mode
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 3
Will Not Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 256 bytes
bcdDFUVersion 1.00
Device Status: 0x0000
(Bus Powered)

View File

@ -1,59 +1,59 @@
Bus 006 Device 013: ID 20b7:1540 Qi Hardware ben-wpan, AT86RF230-based
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x20b7 Qi Hardware
idProduct 0x1540 ben-wpan, AT86RF230-based
bcdDevice 0.01
iManufacturer 0
iProduct 0
iSerial 1 4630333438371508231a
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 40mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 0
Device Status: 0x0000
(Bus Powered)
Bus 006 Device 013: ID 20b7:1540 Qi Hardware ben-wpan, AT86RF230-based
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x20b7 Qi Hardware
idProduct 0x1540 ben-wpan, AT86RF230-based
bcdDevice 0.01
iManufacturer 0
iProduct 0
iSerial 1 4630333438371508231a
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 40mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 0
Device Status: 0x0000
(Bus Powered)

View File

@ -1,70 +1,70 @@
Bus 006 Device 017: ID 16c0:0762 VOTI
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x16c0 VOTI
idProduct 0x0762
bcdDevice 0.00
iManufacturer 1 sysmocom - systems for mobile communications GmbH
iProduct 2 SimTrace SIM Sniffer - DFU Mode
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 45
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 3 SimTrace DFU Configuration
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 SimTrace DFU Interface - Application Partition
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 SimTrace DFU Interface - Bootloader Partition
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 6 SimTrace DFU Interface - RAM
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 3
Will Not Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 256 bytes
bcdDFUVersion 1.00
Device Status: 0x0000
(Bus Powered)
Bus 006 Device 017: ID 16c0:0762 VOTI
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x16c0 VOTI
idProduct 0x0762
bcdDevice 0.00
iManufacturer 1 sysmocom - systems for mobile communications GmbH
iProduct 2 SimTrace SIM Sniffer - DFU Mode
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 45
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 3 SimTrace DFU Configuration
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 SimTrace DFU Interface - Application Partition
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 SimTrace DFU Interface - Bootloader Partition
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 6 SimTrace DFU Interface - RAM
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 3
Will Not Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 65280 milliseconds
wTransferSize 256 bytes
bcdDFUVersion 1.00
Device Status: 0x0000
(Bus Powered)

View File

@ -1,60 +1,60 @@
Bus 001 Device 008: ID 1d50:607f OpenMoko, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x607f
bcdDevice 2.00
iManufacturer 1 Spark Devices
iProduct 2 CORE DFU
iSerial 3 8D80527B5055
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/20*001Ka,108*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @SPI Flash : SST25x/0x00000000/512*04Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1.1a
Device Status: 0x0001
Self Powered
Bus 001 Device 008: ID 1d50:607f OpenMoko, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x607f
bcdDevice 2.00
iManufacturer 1 Spark Devices
iProduct 2 CORE DFU
iSerial 3 8D80527B5055
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/20*001Ka,108*001Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @SPI Flash : SST25x/0x00000000/512*04Kg
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 1024 bytes
bcdDFUVersion 1.1a
Device Status: 0x0001
Self Powered

View File

@ -1,48 +1,48 @@
> src/dfu-util --intf 0 --alt 0 -v -v -v -s 0x8000000 -D test3
dfu-util 0.4
(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Opening DFU USB device... ID 0483:df11
Run-time device DFU version 011a
Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/128*002Kg"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
No valid DFU suffix signature
Warning: File has no DFU suffix
DfuSe interface name: "Internal Flash "
Memory segment at 0x08000000 128 x 2048 = 262144 (rew)
Uploading to address = 0x08000000, size = 16384
Erasing page size 2048 at address 0x08000000, page starting at 0x08000000
Download from image offset 00000000 to memory 08000000-080007ff, size 2048
Setting address pointer to 0x08000000
Erasing page size 2048 at address 0x08000800, page starting at 0x08000800
Download from image offset 00000800 to memory 08000800-08000fff, size 2048
Setting address pointer to 0x08000800
Erasing page size 2048 at address 0x08001000, page starting at 0x08001000
Download from image offset 00001000 to memory 08001000-080017ff, size 2048
Setting address pointer to 0x08001000
Erasing page size 2048 at address 0x08001800, page starting at 0x08001800
Download from image offset 00001800 to memory 08001800-08001fff, size 2048
Setting address pointer to 0x08001800
Erasing page size 2048 at address 0x08002000, page starting at 0x08002000
Download from image offset 00002000 to memory 08002000-080027ff, size 2048
Setting address pointer to 0x08002000
Erasing page size 2048 at address 0x08002800, page starting at 0x08002800
Download from image offset 00002800 to memory 08002800-08002fff, size 2048
Setting address pointer to 0x08002800
Erasing page size 2048 at address 0x08003000, page starting at 0x08003000
Download from image offset 00003000 to memory 08003000-080037ff, size 2048
Setting address pointer to 0x08003000
Erasing page size 2048 at address 0x08003800, page starting at 0x08003800
Download from image offset 00003800 to memory 08003800-08003fff, size 2048
Setting address pointer to 0x08003800
> src/dfu-util --intf 0 --alt 0 -v -v -v -s 0x8000000 -D test3
dfu-util 0.4
(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Opening DFU USB device... ID 0483:df11
Run-time device DFU version 011a
Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/128*002Kg"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
No valid DFU suffix signature
Warning: File has no DFU suffix
DfuSe interface name: "Internal Flash "
Memory segment at 0x08000000 128 x 2048 = 262144 (rew)
Uploading to address = 0x08000000, size = 16384
Erasing page size 2048 at address 0x08000000, page starting at 0x08000000
Download from image offset 00000000 to memory 08000000-080007ff, size 2048
Setting address pointer to 0x08000000
Erasing page size 2048 at address 0x08000800, page starting at 0x08000800
Download from image offset 00000800 to memory 08000800-08000fff, size 2048
Setting address pointer to 0x08000800
Erasing page size 2048 at address 0x08001000, page starting at 0x08001000
Download from image offset 00001000 to memory 08001000-080017ff, size 2048
Setting address pointer to 0x08001000
Erasing page size 2048 at address 0x08001800, page starting at 0x08001800
Download from image offset 00001800 to memory 08001800-08001fff, size 2048
Setting address pointer to 0x08001800
Erasing page size 2048 at address 0x08002000, page starting at 0x08002000
Download from image offset 00002000 to memory 08002000-080027ff, size 2048
Setting address pointer to 0x08002000
Erasing page size 2048 at address 0x08002800, page starting at 0x08002800
Download from image offset 00002800 to memory 08002800-08002fff, size 2048
Setting address pointer to 0x08002800
Erasing page size 2048 at address 0x08003000, page starting at 0x08003000
Download from image offset 00003000 to memory 08003000-080037ff, size 2048
Setting address pointer to 0x08003000
Erasing page size 2048 at address 0x08003800, page starting at 0x08003800
Download from image offset 00003800 to memory 08003800-08003fff, size 2048
Setting address pointer to 0x08003800

View File

@ -1,60 +1,60 @@
Bus 001 Device 028: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11 STM Device in DFU Mode
bcdDevice 20.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 0x418 DFU Bootloader
iSerial 3 STM32
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/128*002Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @Option Bytes /0x1FFFF800/01*016 g
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 2048 bytes
bcdDFUVersion 1.1a
Device Status: 0x0000
(Bus Powered)
Bus 001 Device 028: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11 STM Device in DFU Mode
bcdDevice 20.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 0x418 DFU Bootloader
iSerial 3 STM32
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 36
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/128*002Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @Option Bytes /0x1FFFF800/01*016 g
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 2048 bytes
bcdDFUVersion 1.1a
Device Status: 0x0000
(Bus Powered)

View File

@ -1,36 +1,36 @@
dfu-util --device 0483:df11 --alt 0 \
--dfuse-address 0x08000000 \
-v -v -v \
--download arm/iotoggle.bin
No valid DFU suffix signature
Warning: File has no DFU suffix
dfu-util 0.5
(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Filter on vendor = 0x0483 product = 0xdf11
Opening DFU capable USB device... ID 0483:df11
Run-time device DFU version 011a
Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Memory segment at 0x08000000 4 x 16384 = 65536 (rew)
Memory segment at 0x08010000 1 x 65536 = 65536 (rew)
Memory segment at 0x08020000 7 x 131072 = 917504 (rew)
Uploading to address = 0x08000000, size = 2308
Erasing page size 16384 at address 0x08000000, page starting at 0x08000000
Download from image offset 00000000 to memory 08000000-080007ff, size 2048
Setting address pointer to 0x08000000
Download from image offset 00000800 to memory 08000800-08000903, size 260
Setting address pointer to 0x08000800
dfu-util --device 0483:df11 --alt 0 \
--dfuse-address 0x08000000 \
-v -v -v \
--download arm/iotoggle.bin
No valid DFU suffix signature
Warning: File has no DFU suffix
dfu-util 0.5
(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Filter on vendor = 0x0483 product = 0xdf11
Opening DFU capable USB device... ID 0483:df11
Run-time device DFU version 011a
Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Memory segment at 0x08000000 4 x 16384 = 65536 (rew)
Memory segment at 0x08010000 1 x 65536 = 65536 (rew)
Memory segment at 0x08020000 7 x 131072 = 917504 (rew)
Uploading to address = 0x08000000, size = 2308
Erasing page size 16384 at address 0x08000000, page starting at 0x08000000
Download from image offset 00000000 to memory 08000000-080007ff, size 2048
Setting address pointer to 0x08000000
Download from image offset 00000800 to memory 08000800-08000903, size 260
Setting address pointer to 0x08000800

View File

@ -1,80 +1,80 @@
Bus 001 Device 010: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11 STM Device in DFU Mode
bcdDevice 21.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 BOOTLOADER
iSerial 3 315A28A0B956
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 54
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @Option Bytes /0x1FFFC000/01*016 g
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 6 @OTP Memory /0x1FFF7800/01*512 g,01*016 g
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 3
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 7 @Device Feature/0xFFFF0000/01*004 g
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 2048 bytes
bcdDFUVersion 1.1a
Device Status: 0x0001
Self Powered
Bus 001 Device 010: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 SGS Thomson Microelectronics
idProduct 0xdf11 STM Device in DFU Mode
bcdDevice 21.00
iManufacturer 1 STMicroelectronics
iProduct 2 STM32 BOOTLOADER
iSerial 3 315A28A0B956
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 54
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 4 @Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 5 @Option Bytes /0x1FFFC000/01*016 g
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 2
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 6 @OTP Memory /0x1FFF7800/01*512 g,01*016 g
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 3
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 2
iInterface 7 @Device Feature/0xFFFF0000/01*004 g
Device Firmware Upgrade Interface Descriptor:
bLength 9
bDescriptorType 33
bmAttributes 11
Will Detach
Manifestation Intolerant
Upload Supported
Download Supported
wDetachTimeout 255 milliseconds
wTransferSize 2048 bytes
bcdDFUVersion 1.1a
Device Status: 0x0001
Self Powered

View File

@ -1,269 +1,269 @@
Bus 006 Device 014: ID 04bf:0320 TDK Corp. Bluetooth Adapter
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 224 Wireless
bDeviceSubClass 1 Radio Frequency
bDeviceProtocol 1 Bluetooth
bMaxPacketSize0 64
idVendor 0x04bf TDK Corp.
idProduct 0x0320 Bluetooth Adapter
bcdDevice 26.52
iManufacturer 1 Ezurio
iProduct 2 Turbo Bluetooth Adapter
iSerial 3 008098D4FFBD
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 193
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 64mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x 0 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x 0 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x 9 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x 9 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 2
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x 17 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x 17 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 3
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x 25 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x 25 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 4
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x 33 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x 33 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 5
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x 49 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x 49 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 7
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 5000 milliseconds
wTransferSize 1023 bytes
Device Status: 0x0000
(Bus Powered)
Bus 006 Device 014: ID 04bf:0320 TDK Corp. Bluetooth Adapter
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 224 Wireless
bDeviceSubClass 1 Radio Frequency
bDeviceProtocol 1 Bluetooth
bMaxPacketSize0 64
idVendor 0x04bf TDK Corp.
idProduct 0x0320 Bluetooth Adapter
bcdDevice 26.52
iManufacturer 1 Ezurio
iProduct 2 Turbo Bluetooth Adapter
iSerial 3 008098D4FFBD
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 193
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 64mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x 0 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x 0 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x 9 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x 9 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 2
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x 17 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x 17 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 3
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x 25 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x 25 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 4
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x 33 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x 33 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 5
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x 49 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x 49 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 0
iInterface 0
Device Firmware Upgrade Interface Descriptor:
bLength 7
bDescriptorType 33
bmAttributes 7
Will Not Detach
Manifestation Tolerant
Upload Supported
Download Supported
wDetachTimeout 5000 milliseconds
wTransferSize 1023 bytes
Device Status: 0x0000
(Bus Powered)

View File

@ -1,121 +1,121 @@
#!/usr/bin/python
# Written by Antonio Galea - 2010/11/18
# Distributed under Gnu LGPL 3.0
# see http://www.gnu.org/licenses/lgpl-3.0.txt
import sys,struct,zlib,os
from optparse import OptionParser
DEFAULT_DEVICE="0x0483:0xdf11"
def named(tuple,names):
return dict(zip(names.split(),tuple))
def consume(fmt,data,names):
n = struct.calcsize(fmt)
return named(struct.unpack(fmt,data[:n]),names),data[n:]
def cstring(string):
return string.split('\0',1)[0]
def compute_crc(data):
return 0xFFFFFFFF & -zlib.crc32(data) -1
def parse(file,dump_images=False):
print 'File: "%s"' % file
data = open(file,'rb').read()
crc = compute_crc(data[:-4])
prefix, data = consume('<5sBIB',data,'signature version size targets')
print '%(signature)s v%(version)d, image size: %(size)d, targets: %(targets)d' % prefix
for t in range(prefix['targets']):
tprefix, data = consume('<6sBI255s2I',data,'signature altsetting named name size elements')
tprefix['num'] = t
if tprefix['named']:
tprefix['name'] = cstring(tprefix['name'])
else:
tprefix['name'] = ''
print '%(signature)s %(num)d, alt setting: %(altsetting)s, name: "%(name)s", size: %(size)d, elements: %(elements)d' % tprefix
tsize = tprefix['size']
target, data = data[:tsize], data[tsize:]
for e in range(tprefix['elements']):
eprefix, target = consume('<2I',target,'address size')
eprefix['num'] = e
print ' %(num)d, address: 0x%(address)08x, size: %(size)d' % eprefix
esize = eprefix['size']
image, target = target[:esize], target[esize:]
if dump_images:
out = '%s.target%d.image%d.bin' % (file,t,e)
open(out,'wb').write(image)
print ' DUMPED IMAGE TO "%s"' % out
if len(target):
print "target %d: PARSE ERROR" % t
suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc')
print 'usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix
if crc != suffix['crc']:
print "CRC ERROR: computed crc32 is 0x%08x" % crc
data = data[16:]
if data:
print "PARSE ERROR"
def build(file,targets,device=DEFAULT_DEVICE):
data = ''
for t,target in enumerate(targets):
tdata = ''
for image in target:
tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data']
tdata = struct.pack('<6sBI255s2I','Target',0,1,'ST...',len(tdata),len(target)) + tdata
data += tdata
data = struct.pack('<5sBIB','DfuSe',1,len(data)+11,len(targets)) + data
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
data += struct.pack('<4H3sB',0,d,v,0x011a,'UFD',16)
crc = compute_crc(data)
data += struct.pack('<I',crc)
open(file,'wb').write(data)
if __name__=="__main__":
usage = """
%prog [-d|--dump] infile.dfu
%prog {-b|--build} address:file.bin [-b address:file.bin ...] [{-D|--device}=vendor:device] outfile.dfu"""
parser = OptionParser(usage=usage)
parser.add_option("-b", "--build", action="append", dest="binfiles",
help="build a DFU file from given BINFILES", metavar="BINFILES")
parser.add_option("-D", "--device", action="store", dest="device",
help="build for DEVICE, defaults to %s" % DEFAULT_DEVICE, metavar="DEVICE")
parser.add_option("-d", "--dump", action="store_true", dest="dump_images",
default=False, help="dump contained images to current directory")
(options, args) = parser.parse_args()
if options.binfiles and len(args)==1:
target = []
for arg in options.binfiles:
try:
address,binfile = arg.split(':',1)
except ValueError:
print "Address:file couple '%s' invalid." % arg
sys.exit(1)
try:
address = int(address,0) & 0xFFFFFFFF
except ValueError:
print "Address %s invalid." % address
sys.exit(1)
if not os.path.isfile(binfile):
print "Unreadable file '%s'." % binfile
sys.exit(1)
target.append({ 'address': address, 'data': open(binfile,'rb').read() })
outfile = args[0]
device = DEFAULT_DEVICE
if options.device:
device=options.device
try:
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
except:
print "Invalid device '%s'." % device
sys.exit(1)
build(outfile,[target],device)
elif len(args)==1:
infile = args[0]
if not os.path.isfile(infile):
print "Unreadable file '%s'." % infile
sys.exit(1)
parse(infile, dump_images=options.dump_images)
else:
parser.print_help()
sys.exit(1)
#!/usr/bin/python
# Written by Antonio Galea - 2010/11/18
# Distributed under Gnu LGPL 3.0
# see http://www.gnu.org/licenses/lgpl-3.0.txt
import sys,struct,zlib,os
from optparse import OptionParser
DEFAULT_DEVICE="0x0483:0xdf11"
def named(tuple,names):
return dict(zip(names.split(),tuple))
def consume(fmt,data,names):
n = struct.calcsize(fmt)
return named(struct.unpack(fmt,data[:n]),names),data[n:]
def cstring(string):
return string.split('\0',1)[0]
def compute_crc(data):
return 0xFFFFFFFF & -zlib.crc32(data) -1
def parse(file,dump_images=False):
print 'File: "%s"' % file
data = open(file,'rb').read()
crc = compute_crc(data[:-4])
prefix, data = consume('<5sBIB',data,'signature version size targets')
print '%(signature)s v%(version)d, image size: %(size)d, targets: %(targets)d' % prefix
for t in range(prefix['targets']):
tprefix, data = consume('<6sBI255s2I',data,'signature altsetting named name size elements')
tprefix['num'] = t
if tprefix['named']:
tprefix['name'] = cstring(tprefix['name'])
else:
tprefix['name'] = ''
print '%(signature)s %(num)d, alt setting: %(altsetting)s, name: "%(name)s", size: %(size)d, elements: %(elements)d' % tprefix
tsize = tprefix['size']
target, data = data[:tsize], data[tsize:]
for e in range(tprefix['elements']):
eprefix, target = consume('<2I',target,'address size')
eprefix['num'] = e
print ' %(num)d, address: 0x%(address)08x, size: %(size)d' % eprefix
esize = eprefix['size']
image, target = target[:esize], target[esize:]
if dump_images:
out = '%s.target%d.image%d.bin' % (file,t,e)
open(out,'wb').write(image)
print ' DUMPED IMAGE TO "%s"' % out
if len(target):
print "target %d: PARSE ERROR" % t
suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc')
print 'usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix
if crc != suffix['crc']:
print "CRC ERROR: computed crc32 is 0x%08x" % crc
data = data[16:]
if data:
print "PARSE ERROR"
def build(file,targets,device=DEFAULT_DEVICE):
data = ''
for t,target in enumerate(targets):
tdata = ''
for image in target:
tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data']
tdata = struct.pack('<6sBI255s2I','Target',0,1,'ST...',len(tdata),len(target)) + tdata
data += tdata
data = struct.pack('<5sBIB','DfuSe',1,len(data)+11,len(targets)) + data
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
data += struct.pack('<4H3sB',0,d,v,0x011a,'UFD',16)
crc = compute_crc(data)
data += struct.pack('<I',crc)
open(file,'wb').write(data)
if __name__=="__main__":
usage = """
%prog [-d|--dump] infile.dfu
%prog {-b|--build} address:file.bin [-b address:file.bin ...] [{-D|--device}=vendor:device] outfile.dfu"""
parser = OptionParser(usage=usage)
parser.add_option("-b", "--build", action="append", dest="binfiles",
help="build a DFU file from given BINFILES", metavar="BINFILES")
parser.add_option("-D", "--device", action="store", dest="device",
help="build for DEVICE, defaults to %s" % DEFAULT_DEVICE, metavar="DEVICE")
parser.add_option("-d", "--dump", action="store_true", dest="dump_images",
default=False, help="dump contained images to current directory")
(options, args) = parser.parse_args()
if options.binfiles and len(args)==1:
target = []
for arg in options.binfiles:
try:
address,binfile = arg.split(':',1)
except ValueError:
print "Address:file couple '%s' invalid." % arg
sys.exit(1)
try:
address = int(address,0) & 0xFFFFFFFF
except ValueError:
print "Address %s invalid." % address
sys.exit(1)
if not os.path.isfile(binfile):
print "Unreadable file '%s'." % binfile
sys.exit(1)
target.append({ 'address': address, 'data': open(binfile,'rb').read() })
outfile = args[0]
device = DEFAULT_DEVICE
if options.device:
device=options.device
try:
v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))
except:
print "Invalid device '%s'." % device
sys.exit(1)
build(outfile,[target],device)
elif len(args)==1:
infile = args[0]
if not os.path.isfile(infile):
print "Unreadable file '%s'." % infile
sys.exit(1)
parse(infile, dump_images=options.dump_images)
else:
parser.print_help()
sys.exit(1)

View File

@ -1,4 +1,4 @@
# Example udev rules (usually placed in /etc/udev/rules.d)
# Makes STM32 DfuSe device writeable for the "plugdev" group
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="664", GROUP="plugdev"
# Example udev rules (usually placed in /etc/udev/rules.d)
# Makes STM32 DfuSe device writeable for the "plugdev" group
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="664", GROUP="plugdev"

View File

@ -1,2 +1,2 @@
man_MANS = dfu-util.1
EXTRA_DIST = dfu-util.1 40-dfuse.rules
man_MANS = dfu-util.1
EXTRA_DIST = dfu-util.1 40-dfuse.rules

View File

@ -1,21 +1,21 @@
From 1.0 to 1.1:
----------------
(Page references in 1.1 spec)
Page 10: Added protocol column to table 3.2
Page 12: Changed value for bInterfaceProtocol from 00h to 01h (table 4.1)
Page 13: Added bitWillDetach flag in bmAttributes at bit 3 (table 4.2)
Changed bLength from 07h to 09h (table 4.2)
Page 14: Added bcdDFUVersion (table 4.2)
Changed bDeviceClass value from FEh to 00h (table 4.3)
Changed bDevicesubClass value from 01h to 00h (table 4.3)
Page 15: Changed bInterfaceProtocol value from 00h to 02h (table 4.4)
Page 17: Adjust wording for bitWillDetach addition (5.1)
Page 26: Adjust wording for bitWillDetach addition (7)
Page 29: Adjust wording for bitWillDetach addition (A.2.1)
Summary:
- Addition of the bitWillDetach flag which allows the device to detach instead
of waiting of the host to reset the device.
- Version changes for bInterfaceProtocol, bDeviceClass and bDevicesubClass
- Addition of bcdDFUVersion
From 1.0 to 1.1:
----------------
(Page references in 1.1 spec)
Page 10: Added protocol column to table 3.2
Page 12: Changed value for bInterfaceProtocol from 00h to 01h (table 4.1)
Page 13: Added bitWillDetach flag in bmAttributes at bit 3 (table 4.2)
Changed bLength from 07h to 09h (table 4.2)
Page 14: Added bcdDFUVersion (table 4.2)
Changed bDeviceClass value from FEh to 00h (table 4.3)
Changed bDevicesubClass value from 01h to 00h (table 4.3)
Page 15: Changed bInterfaceProtocol value from 00h to 02h (table 4.4)
Page 17: Adjust wording for bitWillDetach addition (5.1)
Page 26: Adjust wording for bitWillDetach addition (7)
Page 29: Adjust wording for bitWillDetach addition (A.2.1)
Summary:
- Addition of the bitWillDetach flag which allows the device to detach instead
of waiting of the host to reset the device.
- Version changes for bInterfaceProtocol, bDeviceClass and bDevicesubClass
- Addition of bcdDFUVersion

View File

@ -1,248 +1,248 @@
.TH DFU-UTIL 1 "September 23, 2012"
.SH NAME
dfu-util \- Device firmware update (DFU) USB programmer
.SH SYNOPSIS
.\" Listing devices
.HP
.B dfu-util
.B \-l
.RB [\| \-v \|]
.RB [\| \-d
.IR vid:pid [\|, vid:pid \|]\|]
.RB [\| \-p
.IR path \|]
.RB [\| \-c
.IR configuration \|]
.RB [\| \-i
.IR interface \|]
.RB [\| \-a
.IR alt-intf \|]
.RB [\| \-S
.IR serial [\|, serial \|]\|]
.\" Download to or upload from device
.HP
.B dfu-util
.RB [\| \-v \|]
.RB [\| \-d
.IR vid:pid [\|, vid:pid \|]\|]
.RB [\| \-p
.IR path \|]
.RB [\| \-c
.IR configuration \|]
.RB [\| \-i
.IR interface \|]
.RB [\| \-a
.IR alt-intf \|]
.RB [\| \-S
.IR serial [\|, serial \|]\|]
.RB [\| \-t
.IR size \|]
.RB [\| \-Z
.IR size \|]
.RB [\| \-s
.IR address \|]
.RB [\| \-R \|]
.RB [\| \-D \||\| \-U
.IR file \|]
.\" --help and --version
.HP
.B dfu-util
.RB [\| \-hV \|]
.SH DESCRIPTION
.B dfu-util
is a program that implements the host (computer) side of the USB DFU
(Universal Serial Bus Device Firmware Upgrade) protocol.
.sp
dfu-util communicates with devices that implement the device side of the
USB DFU protocol, and is often used to upgrade the firmware of such
devices.
.SH OPTIONS
.TP
.B "\-l, \-\-list"
List the currently attached DFU capable USB devices.
.TP
.BR "\-d, \-\-device" " [\fIRun-Time VENDOR\fP]:[\fIRun-Time PRODUCT\fP][,[\fIDFU Mode VENDOR\fP]:[\fIDFU Mode PRODUCT\fP]]"
.RS
Specify run-time and/or DFU mode vendor and/or product IDs of the DFU device
to work with. \fBVENDOR\fP and \fBPRODUCT\fP are hexadecimal numbers (no prefix
needed), "*" (match any), or "-" (match nothing). By default, any DFU capable
device in either run-time or DFU mode will be considered.
.sp
If you only have one standards-compliant DFU device attached to your computer,
this parameter is optional. However, as soon as you have multiple DFU devices
connected, dfu-util will detect this and abort, asking you to specify which
device to use.
.sp
If only run-time IDs are specified (e.g. "\fB--device 1457:51ab\fP"), then in
addition to the specified run-time IDs, any DFU mode devices will also be
considered. This is beneficial to allow a DFU capable device to be found
again after a switch to DFU mode, since the vendor and/or product ID of a
device usually changes in DFU mode.
.sp
If only DFU mode IDs are specified (e.g. "\fB--device ,951:26\fP"), then all
run-time devices will be ignored, making it easy to target a specific device in
DFU mode.
.sp
If both run-time and DFU mode IDs are specified (e.g. "\fB--device
1457:51ab,:2bc\fP"), then unspecified DFU mode components will use the run-time
value specified.
.sp
Examples:
.TP
.B "--device 1457:51ab,951:26"
.br
Work with a device in run-time mode with
vendor ID 0x1457 and product ID 0x51ab, or in DFU mode with vendor ID 0x0951
and product ID 0x0026
.sp
.TP
.B "--device 1457:51ab,:2bc"
.br
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with vendor ID 0x1457 and product ID 0x02bc
.sp
.TP
.B "--device 1457:51ab"
.br
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with any vendor and product ID
.sp
.TP
.B "--device ,951:26"
.br
Work with a device in DFU mode with vendor ID 0x0951 and product ID 0x0026
.sp
.TP
.B "--device *,-"
.br
Work with any device in run-time mode, and ignore any device in DFU mode
.sp
.TP
.B "--device ,"
.br
Ignore any device in run-time mode, and Work with any device in DFU mode
.RE
.TP
.BR "\-p, \-\-path" " BUS-PORT. ... .PORT"
Specify the path to the DFU device.
.TP
.BR "\-c, \-\-cfg" " CONFIG-NR"
Specify the configuration of the DFU device. Note that this is only used for matching, the configuration is not set by dfu-util.
.TP
.BR "\-i, \-\-intf" " INTF-NR"
Specify the DFU interface number.
.TP
.BR "\-a, \-\-alt" " ALT"
Specify the altsetting of the DFU interface by name or by number.
.TP
.BR "\-S, \-\-serial" " [\fIRun-Time SERIAL\fP][,[\fIDFU Mode SERIAL\fP]]"
Specify the run-time and DFU mode serial numbers used to further restrict
device matches. If multiple, identical DFU devices are simultaneously
connected to a system then vendor and product ID will be insufficient for
targeting a single device. In this situation, it may be possible to use this
parameter to specify a serial number which also must match.
.sp
If only a single serial number is specified, then the same serial number is
used in both run-time and DFU mode. An empty serial number will match any
serial number in the corresponding mode.
.TP
.B "\-t, \-\-transfer-size" " SIZE"
Specify the number of bytes per USB transfer. The optimal value is
usually determined automatically so this option is rarely useful. If
you need to use this option for a device, please report it as a bug.
.TP
.B "\-Z, \-\-upload-size" " SIZE"
Specify the expected upload size, in bytes.
.TP
.BR "\-U, \-\-upload" " FILE"
Read firmware from device into
.BR FILE .
.TP
.BR "\-D, \-\-download" " FILE"
Write firmware from
.B FILE
into device. When FILE is \-, the firmware is read from stdin.
.TP
.B "\-R, \-\-reset"
Issue USB reset signalling after upload or download has finished.
.TP
.BR "\-s, \-\-dfuse-address" " address"
Specify target address for raw binary download/upload on DfuSe devices. Do
.B not
use this for downloading DfuSe (.dfu) files. Modifiers can be added
to the address, separated by a colon, to perform special DfuSE commands such
as "leave" DFU mode, "unprotect" and "mass-erase" flash memory.
.TP
.B "\-v, \-\-verbose"
Print more information about dfu-util's operation. A second
.B -v
will turn on verbose logging of USB requests. Repeat this option to further
increase verbosity.
.TP
.B "\-h, \-\-help"
Show a help text and exit.
.TP
.B "\-V, \-\-version"
Show version information and exit.
.SH EXAMPLES
.SS Using dfu-util in the OpenMoko project
(with the Neo1973 hardware)
.PP
Flashing the rootfs:
.br
.B " $ dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2"
.PP
Flashing the kernel:
.br
.B " $ dfu-util -a kernel -R -D /path/to/uImage"
.PP
Flashing the bootloader:
.br
.B " $ dfu-util -a u-boot -R -D /path/to/u-boot.bin"
.PP
Copying a kernel into RAM:
.br
.B " $ dfu-util -a 0 -R -D /path/to/uImage"
.sp
Once this has finished, the kernel will be available at the default load
address of 0x32000000 in Neo1973 RAM.
.B Note:
You cannot transfer more than 2MB of data into RAM using this method.
.sp
.SS Using dfu-util with a DfuSe device
.PP
Flashing a
.B .dfu
(special DfuSe format) file to the device:
.br
.B " $ dfu-util -a 0 -D /path/to/dfuse-image.dfu"
.PP
Reading out 1 KB of flash starting at address 0x8000000:
.br
.B " $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin"
.PP
Flashing a binary file to address 0x8004000 of device memory and
ask the device to leave DFU mode:
.br
.B " $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin"
.\" There are no bugs of course
.SH BUGS
Please report any bugs to the dfu-util mailing list at
.BR dfu-util@lists.gnumonks.org .
Please use the
.IR --verbose " option (repeated as necessary) to provide more"
information in your bug report.
.SH SEE ALSO
The dfu-util home page is
.B http://dfu-util.gnumonks.org
.SH HISTORY
dfu-util was originally written for the OpenMoko project by
Weston Schmidt <weston_schmidt@yahoo.com> and
Harald Welte <hwelte@hmw-consulting.de>. Over time, nearly complete
support of DFU 1.0, DFU 1.1 and DfuSe ("1.1a") has been added.
.SH LICENCE
.B dfu-util
is covered by the GNU General Public License (GPL), version 2 or later.
.SH COPYRIGHT
This manual page was originally written by Uwe Hermann <uwe@hermann-uwe.de>,
and is now part of the dfu-util project.
.TH DFU-UTIL 1 "September 23, 2012"
.SH NAME
dfu-util \- Device firmware update (DFU) USB programmer
.SH SYNOPSIS
.\" Listing devices
.HP
.B dfu-util
.B \-l
.RB [\| \-v \|]
.RB [\| \-d
.IR vid:pid [\|, vid:pid \|]\|]
.RB [\| \-p
.IR path \|]
.RB [\| \-c
.IR configuration \|]
.RB [\| \-i
.IR interface \|]
.RB [\| \-a
.IR alt-intf \|]
.RB [\| \-S
.IR serial [\|, serial \|]\|]
.\" Download to or upload from device
.HP
.B dfu-util
.RB [\| \-v \|]
.RB [\| \-d
.IR vid:pid [\|, vid:pid \|]\|]
.RB [\| \-p
.IR path \|]
.RB [\| \-c
.IR configuration \|]
.RB [\| \-i
.IR interface \|]
.RB [\| \-a
.IR alt-intf \|]
.RB [\| \-S
.IR serial [\|, serial \|]\|]
.RB [\| \-t
.IR size \|]
.RB [\| \-Z
.IR size \|]
.RB [\| \-s
.IR address \|]
.RB [\| \-R \|]
.RB [\| \-D \||\| \-U
.IR file \|]
.\" --help and --version
.HP
.B dfu-util
.RB [\| \-hV \|]
.SH DESCRIPTION
.B dfu-util
is a program that implements the host (computer) side of the USB DFU
(Universal Serial Bus Device Firmware Upgrade) protocol.
.sp
dfu-util communicates with devices that implement the device side of the
USB DFU protocol, and is often used to upgrade the firmware of such
devices.
.SH OPTIONS
.TP
.B "\-l, \-\-list"
List the currently attached DFU capable USB devices.
.TP
.BR "\-d, \-\-device" " [\fIRun-Time VENDOR\fP]:[\fIRun-Time PRODUCT\fP][,[\fIDFU Mode VENDOR\fP]:[\fIDFU Mode PRODUCT\fP]]"
.RS
Specify run-time and/or DFU mode vendor and/or product IDs of the DFU device
to work with. \fBVENDOR\fP and \fBPRODUCT\fP are hexadecimal numbers (no prefix
needed), "*" (match any), or "-" (match nothing). By default, any DFU capable
device in either run-time or DFU mode will be considered.
.sp
If you only have one standards-compliant DFU device attached to your computer,
this parameter is optional. However, as soon as you have multiple DFU devices
connected, dfu-util will detect this and abort, asking you to specify which
device to use.
.sp
If only run-time IDs are specified (e.g. "\fB--device 1457:51ab\fP"), then in
addition to the specified run-time IDs, any DFU mode devices will also be
considered. This is beneficial to allow a DFU capable device to be found
again after a switch to DFU mode, since the vendor and/or product ID of a
device usually changes in DFU mode.
.sp
If only DFU mode IDs are specified (e.g. "\fB--device ,951:26\fP"), then all
run-time devices will be ignored, making it easy to target a specific device in
DFU mode.
.sp
If both run-time and DFU mode IDs are specified (e.g. "\fB--device
1457:51ab,:2bc\fP"), then unspecified DFU mode components will use the run-time
value specified.
.sp
Examples:
.TP
.B "--device 1457:51ab,951:26"
.br
Work with a device in run-time mode with
vendor ID 0x1457 and product ID 0x51ab, or in DFU mode with vendor ID 0x0951
and product ID 0x0026
.sp
.TP
.B "--device 1457:51ab,:2bc"
.br
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with vendor ID 0x1457 and product ID 0x02bc
.sp
.TP
.B "--device 1457:51ab"
.br
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with any vendor and product ID
.sp
.TP
.B "--device ,951:26"
.br
Work with a device in DFU mode with vendor ID 0x0951 and product ID 0x0026
.sp
.TP
.B "--device *,-"
.br
Work with any device in run-time mode, and ignore any device in DFU mode
.sp
.TP
.B "--device ,"
.br
Ignore any device in run-time mode, and Work with any device in DFU mode
.RE
.TP
.BR "\-p, \-\-path" " BUS-PORT. ... .PORT"
Specify the path to the DFU device.
.TP
.BR "\-c, \-\-cfg" " CONFIG-NR"
Specify the configuration of the DFU device. Note that this is only used for matching, the configuration is not set by dfu-util.
.TP
.BR "\-i, \-\-intf" " INTF-NR"
Specify the DFU interface number.
.TP
.BR "\-a, \-\-alt" " ALT"
Specify the altsetting of the DFU interface by name or by number.
.TP
.BR "\-S, \-\-serial" " [\fIRun-Time SERIAL\fP][,[\fIDFU Mode SERIAL\fP]]"
Specify the run-time and DFU mode serial numbers used to further restrict
device matches. If multiple, identical DFU devices are simultaneously
connected to a system then vendor and product ID will be insufficient for
targeting a single device. In this situation, it may be possible to use this
parameter to specify a serial number which also must match.
.sp
If only a single serial number is specified, then the same serial number is
used in both run-time and DFU mode. An empty serial number will match any
serial number in the corresponding mode.
.TP
.B "\-t, \-\-transfer-size" " SIZE"
Specify the number of bytes per USB transfer. The optimal value is
usually determined automatically so this option is rarely useful. If
you need to use this option for a device, please report it as a bug.
.TP
.B "\-Z, \-\-upload-size" " SIZE"
Specify the expected upload size, in bytes.
.TP
.BR "\-U, \-\-upload" " FILE"
Read firmware from device into
.BR FILE .
.TP
.BR "\-D, \-\-download" " FILE"
Write firmware from
.B FILE
into device. When FILE is \-, the firmware is read from stdin.
.TP
.B "\-R, \-\-reset"
Issue USB reset signalling after upload or download has finished.
.TP
.BR "\-s, \-\-dfuse-address" " address"
Specify target address for raw binary download/upload on DfuSe devices. Do
.B not
use this for downloading DfuSe (.dfu) files. Modifiers can be added
to the address, separated by a colon, to perform special DfuSE commands such
as "leave" DFU mode, "unprotect" and "mass-erase" flash memory.
.TP
.B "\-v, \-\-verbose"
Print more information about dfu-util's operation. A second
.B -v
will turn on verbose logging of USB requests. Repeat this option to further
increase verbosity.
.TP
.B "\-h, \-\-help"
Show a help text and exit.
.TP
.B "\-V, \-\-version"
Show version information and exit.
.SH EXAMPLES
.SS Using dfu-util in the OpenMoko project
(with the Neo1973 hardware)
.PP
Flashing the rootfs:
.br
.B " $ dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2"
.PP
Flashing the kernel:
.br
.B " $ dfu-util -a kernel -R -D /path/to/uImage"
.PP
Flashing the bootloader:
.br
.B " $ dfu-util -a u-boot -R -D /path/to/u-boot.bin"
.PP
Copying a kernel into RAM:
.br
.B " $ dfu-util -a 0 -R -D /path/to/uImage"
.sp
Once this has finished, the kernel will be available at the default load
address of 0x32000000 in Neo1973 RAM.
.B Note:
You cannot transfer more than 2MB of data into RAM using this method.
.sp
.SS Using dfu-util with a DfuSe device
.PP
Flashing a
.B .dfu
(special DfuSe format) file to the device:
.br
.B " $ dfu-util -a 0 -D /path/to/dfuse-image.dfu"
.PP
Reading out 1 KB of flash starting at address 0x8000000:
.br
.B " $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin"
.PP
Flashing a binary file to address 0x8004000 of device memory and
ask the device to leave DFU mode:
.br
.B " $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin"
.\" There are no bugs of course
.SH BUGS
Please report any bugs to the dfu-util mailing list at
.BR dfu-util@lists.gnumonks.org .
Please use the
.IR --verbose " option (repeated as necessary) to provide more"
information in your bug report.
.SH SEE ALSO
The dfu-util home page is
.B http://dfu-util.gnumonks.org
.SH HISTORY
dfu-util was originally written for the OpenMoko project by
Weston Schmidt <weston_schmidt@yahoo.com> and
Harald Welte <hwelte@hmw-consulting.de>. Over time, nearly complete
support of DFU 1.0, DFU 1.1 and DfuSe ("1.1a") has been added.
.SH LICENCE
.B dfu-util
is covered by the GNU General Public License (GPL), version 2 or later.
.SH COPYRIGHT
This manual page was originally written by Uwe Hermann <uwe@hermann-uwe.de>,
and is now part of the dfu-util project.

View File

@ -1,10 +1,10 @@
# (C) Roger Meier <r.meier@siemens.com>
# (C) Pascal Schweizer <pascal.schweizer@siemens.com>
# msvc folder is GPL-2.0+, LGPL-2.1+, BSD-3-Clause or MIT license(SPDX)
Building dfu-util native on Windows with Visual Studio
3rd party dependencies:
- libusbx ( git clone https://github.com/libusbx/libusbx.git )
- getopt (part of libusbx: libusbx/examples/getopt)
# (C) Roger Meier <r.meier@siemens.com>
# (C) Pascal Schweizer <pascal.schweizer@siemens.com>
# msvc folder is GPL-2.0+, LGPL-2.1+, BSD-3-Clause or MIT license(SPDX)
Building dfu-util native on Windows with Visual Studio
3rd party dependencies:
- libusbx ( git clone https://github.com/libusbx/libusbx.git )
- getopt (part of libusbx: libusbx/examples/getopt)

View File

@ -1,100 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}</ProjectGuid>
<RootNamespace>dfusuffix</RootNamespace>
<ProjectName>dfu-suffix</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
<LibraryPath>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath)</LibraryPath>
<ReferencePath>$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib</ReferencePath>
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\dfu_file.c" />
<ClCompile Include="..\src\suffix.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\dfu_file.h" />
<ClInclude Include="..\src\portable.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\libusbx\msvc\getopt_2010.vcxproj">
<Project>{a2169bc8-cf99-40bf-83f3-b0e38f7067bd}</Project>
</ProjectReference>
<ProjectReference Include="..\..\libusbx\msvc\libusb_static_2010.vcxproj">
<Project>{349ee8f9-7d25-4909-aaf5-ff3fade72187}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}</ProjectGuid>
<RootNamespace>dfusuffix</RootNamespace>
<ProjectName>dfu-suffix</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
<LibraryPath>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath)</LibraryPath>
<ReferencePath>$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib</ReferencePath>
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\dfu_file.c" />
<ClCompile Include="..\src\suffix.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\dfu_file.h" />
<ClInclude Include="..\src\portable.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\libusbx\msvc\getopt_2010.vcxproj">
<Project>{a2169bc8-cf99-40bf-83f3-b0e38f7067bd}</Project>
</ProjectReference>
<ProjectReference Include="..\..\libusbx\msvc\libusb_static_2010.vcxproj">
<Project>{349ee8f9-7d25-4909-aaf5-ff3fade72187}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,54 +1,54 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-util", "dfu-util_2010.vcxproj", "{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C4F8746D-B27E-4806-95E5-2052174E923B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-suffix", "dfu-suffix_2010.vcxproj", "{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "getopt_2010", "..\..\libusbx\msvc\getopt_2010.vcxproj", "{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (static)", "..\..\libusbx\msvc\libusb_static_2010.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.ActiveCfg = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.Build.0 = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|x64.ActiveCfg = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.ActiveCfg = Release|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.Build.0 = Release|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|x64.ActiveCfg = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.ActiveCfg = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.Build.0 = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|x64.ActiveCfg = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.ActiveCfg = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.Build.0 = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|x64.ActiveCfg = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.ActiveCfg = Debug|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.Build.0 = Debug|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.ActiveCfg = Debug|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.Build.0 = Debug|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.ActiveCfg = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.Build.0 = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.ActiveCfg = Release|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.Build.0 = Release|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.Build.0 = Debug|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.Build.0 = Release|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-util", "dfu-util_2010.vcxproj", "{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C4F8746D-B27E-4806-95E5-2052174E923B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-suffix", "dfu-suffix_2010.vcxproj", "{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "getopt_2010", "..\..\libusbx\msvc\getopt_2010.vcxproj", "{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (static)", "..\..\libusbx\msvc\libusb_static_2010.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.ActiveCfg = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.Build.0 = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|x64.ActiveCfg = Debug|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.ActiveCfg = Release|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.Build.0 = Release|Win32
{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|x64.ActiveCfg = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.ActiveCfg = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.Build.0 = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|x64.ActiveCfg = Debug|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.ActiveCfg = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.Build.0 = Release|Win32
{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|x64.ActiveCfg = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.ActiveCfg = Debug|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.Build.0 = Debug|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.ActiveCfg = Debug|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.Build.0 = Debug|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.ActiveCfg = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.Build.0 = Release|Win32
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.ActiveCfg = Release|x64
{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.Build.0 = Release|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.Build.0 = Debug|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.Build.0 = Release|Win32
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64
{349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}</ProjectGuid>
<RootNamespace>dfuutil</RootNamespace>
<ProjectName>dfu-util</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
<LibraryPath>$(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath)</LibraryPath>
<ReferencePath>$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib</ReferencePath>
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<PostBuildEvent>
<Command>
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent>
<Command>copy $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0.dll $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\dfu.c" />
<ClCompile Include="..\src\dfuse.c" />
<ClCompile Include="..\src\dfuse_mem.c" />
<ClCompile Include="..\src\dfu_file.c" />
<ClCompile Include="..\src\dfu_load.c" />
<ClCompile Include="..\src\dfu_util.c" />
<ClCompile Include="..\src\main.c" />
<ClCompile Include="..\src\quirks.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\dfu.h" />
<ClInclude Include="..\src\dfuse.h" />
<ClInclude Include="..\src\dfuse_mem.h" />
<ClInclude Include="..\src\dfu_file.h" />
<ClInclude Include="..\src\dfu_load.h" />
<ClInclude Include="..\src\dfu_util.h" />
<ClInclude Include="..\src\portable.h" />
<ClInclude Include="..\src\quirks.h" />
<ClInclude Include="..\src\usb_dfu.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\libusbx\msvc\getopt_2010.vcxproj">
<Project>{a2169bc8-cf99-40bf-83f3-b0e38f7067bd}</Project>
</ProjectReference>
<ProjectReference Include="..\..\libusbx\msvc\libusb_static_2010.vcxproj">
<Project>{349ee8f9-7d25-4909-aaf5-ff3fade72187}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}</ProjectGuid>
<RootNamespace>dfuutil</RootNamespace>
<ProjectName>dfu-util</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
<LibraryPath>$(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath)</LibraryPath>
<ReferencePath>$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib</ReferencePath>
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
<IncludePath>$(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<PostBuildEvent>
<Command>
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent>
<Command>copy $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0.dll $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\dfu.c" />
<ClCompile Include="..\src\dfuse.c" />
<ClCompile Include="..\src\dfuse_mem.c" />
<ClCompile Include="..\src\dfu_file.c" />
<ClCompile Include="..\src\dfu_load.c" />
<ClCompile Include="..\src\dfu_util.c" />
<ClCompile Include="..\src\main.c" />
<ClCompile Include="..\src\quirks.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\dfu.h" />
<ClInclude Include="..\src\dfuse.h" />
<ClInclude Include="..\src\dfuse_mem.h" />
<ClInclude Include="..\src\dfu_file.h" />
<ClInclude Include="..\src\dfu_load.h" />
<ClInclude Include="..\src\dfu_util.h" />
<ClInclude Include="..\src\portable.h" />
<ClInclude Include="..\src\quirks.h" />
<ClInclude Include="..\src\usb_dfu.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\libusbx\msvc\getopt_2010.vcxproj">
<Project>{a2169bc8-cf99-40bf-83f3-b0e38f7067bd}</Project>
</ProjectReference>
<ProjectReference Include="..\..\libusbx\msvc\libusb_static_2010.vcxproj">
<Project>{349ee8f9-7d25-4909-aaf5-ff3fade72187}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,28 +1,28 @@
AM_CFLAGS = -Wall -Wextra
bin_PROGRAMS = dfu-util dfu-suffix dfu-prefix
dfu_util_SOURCES = main.c \
portable.h \
dfu_load.c \
dfu_load.h \
dfu_util.c \
dfu_util.h \
dfuse.c \
dfuse.h \
dfuse_mem.c \
dfuse_mem.h \
dfu.c \
dfu.h \
usb_dfu.h \
dfu_file.c \
dfu_file.h \
quirks.c \
quirks.h
dfu_suffix_SOURCES = suffix.c \
dfu_file.h \
dfu_file.c
dfu_prefix_SOURCES = prefix.c \
dfu_file.h \
dfu_file.c
AM_CFLAGS = -Wall -Wextra
bin_PROGRAMS = dfu-util dfu-suffix dfu-prefix
dfu_util_SOURCES = main.c \
portable.h \
dfu_load.c \
dfu_load.h \
dfu_util.c \
dfu_util.h \
dfuse.c \
dfuse.h \
dfuse_mem.c \
dfuse_mem.h \
dfu.c \
dfu.h \
usb_dfu.h \
dfu_file.c \
dfu_file.h \
quirks.c \
quirks.h
dfu_suffix_SOURCES = suffix.c \
dfu_file.h \
dfu_file.c
dfu_prefix_SOURCES = prefix.c \
dfu_file.h \
dfu_file.c

View File

@ -1,357 +1,357 @@
/*
* Low-level DFU communication routines, originally taken from
* $Id: dfu.c,v 1.3 2006/06/20 06:28:04 schmidtw Exp $
* (part of dfu-programmer).
*
* Copyright 2005-2006 Weston Schmidt <weston_schmidt@alumni.purdue.edu>
* Copyright 2011-2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "quirks.h"
static int dfu_timeout = 5000; /* 5 seconds - default */
/*
* DFU_DETACH Request (DFU Spec 1.0, Section 5.1)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* timeout - the timeout in ms the USB device should wait for a pending
* USB reset before giving up and terminating the operation
*
* returns 0 or < 0 on error
*/
int dfu_detach( libusb_device_handle *device,
const unsigned short interface,
const unsigned short timeout )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_DETACH,
/* wValue */ timeout,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
/*
* DFU_DNLOAD Request (DFU Spec 1.0, Section 6.1.1)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the total number of bytes to transfer to the USB
* device - must be less than wTransferSize
* data - the data to transfer
*
* returns the number of bytes written or < 0 on error
*/
int dfu_download( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data )
{
int status;
status = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_DNLOAD,
/* wValue */ transaction,
/* wIndex */ interface,
/* Data */ data,
/* wLength */ length,
dfu_timeout );
return status;
}
/*
* DFU_UPLOAD Request (DFU Spec 1.0, Section 6.2)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the maximum number of bytes to receive from the USB
* device - must be less than wTransferSize
* data - the buffer to put the received data in
*
* returns the number of bytes received or < 0 on error
*/
int dfu_upload( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data )
{
int status;
status = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_UPLOAD,
/* wValue */ transaction,
/* wIndex */ interface,
/* Data */ data,
/* wLength */ length,
dfu_timeout );
return status;
}
/*
* DFU_GETSTATUS Request (DFU Spec 1.0, Section 6.1.2)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* status - the data structure to be populated with the results
*
* return the number of bytes read in or < 0 on an error
*/
int dfu_get_status( struct dfu_if *dif, struct dfu_status *status )
{
unsigned char buffer[6];
int result;
/* Initialize the status data structure */
status->bStatus = DFU_STATUS_ERROR_UNKNOWN;
status->bwPollTimeout = 0;
status->bState = STATE_DFU_ERROR;
status->iString = 0;
result = libusb_control_transfer( dif->dev_handle,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_GETSTATUS,
/* wValue */ 0,
/* wIndex */ dif->interface,
/* Data */ buffer,
/* wLength */ 6,
dfu_timeout );
if( 6 == result ) {
status->bStatus = buffer[0];
if (dif->quirks & QUIRK_POLLTIMEOUT)
status->bwPollTimeout = DEFAULT_POLLTIMEOUT;
else
status->bwPollTimeout = ((0xff & buffer[3]) << 16) |
((0xff & buffer[2]) << 8) |
(0xff & buffer[1]);
status->bState = buffer[4];
status->iString = buffer[5];
}
return result;
}
/*
* DFU_CLRSTATUS Request (DFU Spec 1.0, Section 6.1.3)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
*
* return 0 or < 0 on an error
*/
int dfu_clear_status( libusb_device_handle *device,
const unsigned short interface )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT| LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_CLRSTATUS,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
/*
* DFU_GETSTATE Request (DFU Spec 1.0, Section 6.1.5)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the maximum number of bytes to receive from the USB
* device - must be less than wTransferSize
* data - the buffer to put the received data in
*
* returns the state or < 0 on error
*/
int dfu_get_state( libusb_device_handle *device,
const unsigned short interface )
{
int result;
unsigned char buffer[1];
result = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_GETSTATE,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ buffer,
/* wLength */ 1,
dfu_timeout );
/* Return the error if there is one. */
if (result < 1)
return -1;
/* Return the state. */
return buffer[0];
}
/*
* DFU_ABORT Request (DFU Spec 1.0, Section 6.1.4)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
*
* returns 0 or < 0 on an error
*/
int dfu_abort( libusb_device_handle *device,
const unsigned short interface )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_ABORT,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
const char* dfu_state_to_string( int state )
{
const char *message;
switch (state) {
case STATE_APP_IDLE:
message = "appIDLE";
break;
case STATE_APP_DETACH:
message = "appDETACH";
break;
case STATE_DFU_IDLE:
message = "dfuIDLE";
break;
case STATE_DFU_DOWNLOAD_SYNC:
message = "dfuDNLOAD-SYNC";
break;
case STATE_DFU_DOWNLOAD_BUSY:
message = "dfuDNBUSY";
break;
case STATE_DFU_DOWNLOAD_IDLE:
message = "dfuDNLOAD-IDLE";
break;
case STATE_DFU_MANIFEST_SYNC:
message = "dfuMANIFEST-SYNC";
break;
case STATE_DFU_MANIFEST:
message = "dfuMANIFEST";
break;
case STATE_DFU_MANIFEST_WAIT_RESET:
message = "dfuMANIFEST-WAIT-RESET";
break;
case STATE_DFU_UPLOAD_IDLE:
message = "dfuUPLOAD-IDLE";
break;
case STATE_DFU_ERROR:
message = "dfuERROR";
break;
default:
message = NULL;
break;
}
return message;
}
/* Chapter 6.1.2 */
static const char *dfu_status_names[] = {
/* DFU_STATUS_OK */
"No error condition is present",
/* DFU_STATUS_errTARGET */
"File is not targeted for use by this device",
/* DFU_STATUS_errFILE */
"File is for this device but fails some vendor-specific test",
/* DFU_STATUS_errWRITE */
"Device is unable to write memory",
/* DFU_STATUS_errERASE */
"Memory erase function failed",
/* DFU_STATUS_errCHECK_ERASED */
"Memory erase check failed",
/* DFU_STATUS_errPROG */
"Program memory function failed",
/* DFU_STATUS_errVERIFY */
"Programmed memory failed verification",
/* DFU_STATUS_errADDRESS */
"Cannot program memory due to received address that is out of range",
/* DFU_STATUS_errNOTDONE */
"Received DFU_DNLOAD with wLength = 0, but device does not think that it has all data yet",
/* DFU_STATUS_errFIRMWARE */
"Device's firmware is corrupt. It cannot return to run-time (non-DFU) operations",
/* DFU_STATUS_errVENDOR */
"iString indicates a vendor specific error",
/* DFU_STATUS_errUSBR */
"Device detected unexpected USB reset signalling",
/* DFU_STATUS_errPOR */
"Device detected unexpected power on reset",
/* DFU_STATUS_errUNKNOWN */
"Something went wrong, but the device does not know what it was",
/* DFU_STATUS_errSTALLEDPKT */
"Device stalled an unexpected request"
};
const char *dfu_status_to_string(int status)
{
if (status > DFU_STATUS_errSTALLEDPKT)
return "INVALID";
return dfu_status_names[status];
}
int dfu_abort_to_idle(struct dfu_if *dif)
{
int ret;
struct dfu_status dst;
ret = dfu_abort(dif->dev_handle, dif->interface);
if (ret < 0) {
errx(EX_IOERR, "Error sending dfu abort request");
exit(1);
}
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
errx(EX_IOERR, "Error during abort get_status");
exit(1);
}
if (dst.bState != DFU_STATE_dfuIDLE) {
errx(EX_IOERR, "Failed to enter idle state on abort");
exit(1);
}
milli_sleep(dst.bwPollTimeout);
return ret;
}
/*
* Low-level DFU communication routines, originally taken from
* $Id: dfu.c,v 1.3 2006/06/20 06:28:04 schmidtw Exp $
* (part of dfu-programmer).
*
* Copyright 2005-2006 Weston Schmidt <weston_schmidt@alumni.purdue.edu>
* Copyright 2011-2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "quirks.h"
static int dfu_timeout = 5000; /* 5 seconds - default */
/*
* DFU_DETACH Request (DFU Spec 1.0, Section 5.1)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* timeout - the timeout in ms the USB device should wait for a pending
* USB reset before giving up and terminating the operation
*
* returns 0 or < 0 on error
*/
int dfu_detach( libusb_device_handle *device,
const unsigned short interface,
const unsigned short timeout )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_DETACH,
/* wValue */ timeout,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
/*
* DFU_DNLOAD Request (DFU Spec 1.0, Section 6.1.1)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the total number of bytes to transfer to the USB
* device - must be less than wTransferSize
* data - the data to transfer
*
* returns the number of bytes written or < 0 on error
*/
int dfu_download( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data )
{
int status;
status = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_DNLOAD,
/* wValue */ transaction,
/* wIndex */ interface,
/* Data */ data,
/* wLength */ length,
dfu_timeout );
return status;
}
/*
* DFU_UPLOAD Request (DFU Spec 1.0, Section 6.2)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the maximum number of bytes to receive from the USB
* device - must be less than wTransferSize
* data - the buffer to put the received data in
*
* returns the number of bytes received or < 0 on error
*/
int dfu_upload( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data )
{
int status;
status = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_UPLOAD,
/* wValue */ transaction,
/* wIndex */ interface,
/* Data */ data,
/* wLength */ length,
dfu_timeout );
return status;
}
/*
* DFU_GETSTATUS Request (DFU Spec 1.0, Section 6.1.2)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* status - the data structure to be populated with the results
*
* return the number of bytes read in or < 0 on an error
*/
int dfu_get_status( struct dfu_if *dif, struct dfu_status *status )
{
unsigned char buffer[6];
int result;
/* Initialize the status data structure */
status->bStatus = DFU_STATUS_ERROR_UNKNOWN;
status->bwPollTimeout = 0;
status->bState = STATE_DFU_ERROR;
status->iString = 0;
result = libusb_control_transfer( dif->dev_handle,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_GETSTATUS,
/* wValue */ 0,
/* wIndex */ dif->interface,
/* Data */ buffer,
/* wLength */ 6,
dfu_timeout );
if( 6 == result ) {
status->bStatus = buffer[0];
if (dif->quirks & QUIRK_POLLTIMEOUT)
status->bwPollTimeout = DEFAULT_POLLTIMEOUT;
else
status->bwPollTimeout = ((0xff & buffer[3]) << 16) |
((0xff & buffer[2]) << 8) |
(0xff & buffer[1]);
status->bState = buffer[4];
status->iString = buffer[5];
}
return result;
}
/*
* DFU_CLRSTATUS Request (DFU Spec 1.0, Section 6.1.3)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
*
* return 0 or < 0 on an error
*/
int dfu_clear_status( libusb_device_handle *device,
const unsigned short interface )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT| LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_CLRSTATUS,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
/*
* DFU_GETSTATE Request (DFU Spec 1.0, Section 6.1.5)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
* length - the maximum number of bytes to receive from the USB
* device - must be less than wTransferSize
* data - the buffer to put the received data in
*
* returns the state or < 0 on error
*/
int dfu_get_state( libusb_device_handle *device,
const unsigned short interface )
{
int result;
unsigned char buffer[1];
result = libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_GETSTATE,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ buffer,
/* wLength */ 1,
dfu_timeout );
/* Return the error if there is one. */
if (result < 1)
return -1;
/* Return the state. */
return buffer[0];
}
/*
* DFU_ABORT Request (DFU Spec 1.0, Section 6.1.4)
*
* device - the usb_dev_handle to communicate with
* interface - the interface to communicate with
*
* returns 0 or < 0 on an error
*/
int dfu_abort( libusb_device_handle *device,
const unsigned short interface )
{
return libusb_control_transfer( device,
/* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
/* bRequest */ DFU_ABORT,
/* wValue */ 0,
/* wIndex */ interface,
/* Data */ NULL,
/* wLength */ 0,
dfu_timeout );
}
const char* dfu_state_to_string( int state )
{
const char *message;
switch (state) {
case STATE_APP_IDLE:
message = "appIDLE";
break;
case STATE_APP_DETACH:
message = "appDETACH";
break;
case STATE_DFU_IDLE:
message = "dfuIDLE";
break;
case STATE_DFU_DOWNLOAD_SYNC:
message = "dfuDNLOAD-SYNC";
break;
case STATE_DFU_DOWNLOAD_BUSY:
message = "dfuDNBUSY";
break;
case STATE_DFU_DOWNLOAD_IDLE:
message = "dfuDNLOAD-IDLE";
break;
case STATE_DFU_MANIFEST_SYNC:
message = "dfuMANIFEST-SYNC";
break;
case STATE_DFU_MANIFEST:
message = "dfuMANIFEST";
break;
case STATE_DFU_MANIFEST_WAIT_RESET:
message = "dfuMANIFEST-WAIT-RESET";
break;
case STATE_DFU_UPLOAD_IDLE:
message = "dfuUPLOAD-IDLE";
break;
case STATE_DFU_ERROR:
message = "dfuERROR";
break;
default:
message = NULL;
break;
}
return message;
}
/* Chapter 6.1.2 */
static const char *dfu_status_names[] = {
/* DFU_STATUS_OK */
"No error condition is present",
/* DFU_STATUS_errTARGET */
"File is not targeted for use by this device",
/* DFU_STATUS_errFILE */
"File is for this device but fails some vendor-specific test",
/* DFU_STATUS_errWRITE */
"Device is unable to write memory",
/* DFU_STATUS_errERASE */
"Memory erase function failed",
/* DFU_STATUS_errCHECK_ERASED */
"Memory erase check failed",
/* DFU_STATUS_errPROG */
"Program memory function failed",
/* DFU_STATUS_errVERIFY */
"Programmed memory failed verification",
/* DFU_STATUS_errADDRESS */
"Cannot program memory due to received address that is out of range",
/* DFU_STATUS_errNOTDONE */
"Received DFU_DNLOAD with wLength = 0, but device does not think that it has all data yet",
/* DFU_STATUS_errFIRMWARE */
"Device's firmware is corrupt. It cannot return to run-time (non-DFU) operations",
/* DFU_STATUS_errVENDOR */
"iString indicates a vendor specific error",
/* DFU_STATUS_errUSBR */
"Device detected unexpected USB reset signalling",
/* DFU_STATUS_errPOR */
"Device detected unexpected power on reset",
/* DFU_STATUS_errUNKNOWN */
"Something went wrong, but the device does not know what it was",
/* DFU_STATUS_errSTALLEDPKT */
"Device stalled an unexpected request"
};
const char *dfu_status_to_string(int status)
{
if (status > DFU_STATUS_errSTALLEDPKT)
return "INVALID";
return dfu_status_names[status];
}
int dfu_abort_to_idle(struct dfu_if *dif)
{
int ret;
struct dfu_status dst;
ret = dfu_abort(dif->dev_handle, dif->interface);
if (ret < 0) {
errx(EX_IOERR, "Error sending dfu abort request");
exit(1);
}
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
errx(EX_IOERR, "Error during abort get_status");
exit(1);
}
if (dst.bState != DFU_STATE_dfuIDLE) {
errx(EX_IOERR, "Failed to enter idle state on abort");
exit(1);
}
milli_sleep(dst.bwPollTimeout);
return ret;
}

View File

@ -1,133 +1,133 @@
/*
* dfu-programmer
*
* $Id: dfu.h,v 1.2 2005/09/25 01:27:42 schmidtw Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFU_H
#define DFU_H
#include <libusb.h>
#include "usb_dfu.h"
/* DFU states */
#define STATE_APP_IDLE 0x00
#define STATE_APP_DETACH 0x01
#define STATE_DFU_IDLE 0x02
#define STATE_DFU_DOWNLOAD_SYNC 0x03
#define STATE_DFU_DOWNLOAD_BUSY 0x04
#define STATE_DFU_DOWNLOAD_IDLE 0x05
#define STATE_DFU_MANIFEST_SYNC 0x06
#define STATE_DFU_MANIFEST 0x07
#define STATE_DFU_MANIFEST_WAIT_RESET 0x08
#define STATE_DFU_UPLOAD_IDLE 0x09
#define STATE_DFU_ERROR 0x0a
/* DFU status */
#define DFU_STATUS_OK 0x00
#define DFU_STATUS_ERROR_TARGET 0x01
#define DFU_STATUS_ERROR_FILE 0x02
#define DFU_STATUS_ERROR_WRITE 0x03
#define DFU_STATUS_ERROR_ERASE 0x04
#define DFU_STATUS_ERROR_CHECK_ERASED 0x05
#define DFU_STATUS_ERROR_PROG 0x06
#define DFU_STATUS_ERROR_VERIFY 0x07
#define DFU_STATUS_ERROR_ADDRESS 0x08
#define DFU_STATUS_ERROR_NOTDONE 0x09
#define DFU_STATUS_ERROR_FIRMWARE 0x0a
#define DFU_STATUS_ERROR_VENDOR 0x0b
#define DFU_STATUS_ERROR_USBR 0x0c
#define DFU_STATUS_ERROR_POR 0x0d
#define DFU_STATUS_ERROR_UNKNOWN 0x0e
#define DFU_STATUS_ERROR_STALLEDPKT 0x0f
/* DFU commands */
#define DFU_DETACH 0
#define DFU_DNLOAD 1
#define DFU_UPLOAD 2
#define DFU_GETSTATUS 3
#define DFU_CLRSTATUS 4
#define DFU_GETSTATE 5
#define DFU_ABORT 6
/* DFU interface */
#define DFU_IFF_DFU 0x0001 /* DFU Mode, (not Runtime) */
/* This is based off of DFU_GETSTATUS
*
* 1 unsigned byte bStatus
* 3 unsigned byte bwPollTimeout
* 1 unsigned byte bState
* 1 unsigned byte iString
*/
struct dfu_status {
unsigned char bStatus;
unsigned int bwPollTimeout;
unsigned char bState;
unsigned char iString;
};
struct dfu_if {
struct usb_dfu_func_descriptor func_dfu;
uint16_t quirks;
uint16_t busnum;
uint16_t devnum;
uint16_t vendor;
uint16_t product;
uint16_t bcdDevice;
uint8_t configuration;
uint8_t interface;
uint8_t altsetting;
uint8_t flags;
uint8_t bMaxPacketSize0;
char *alt_name;
char *serial_name;
libusb_device *dev;
libusb_device_handle *dev_handle;
struct dfu_if *next;
};
int dfu_detach( libusb_device_handle *device,
const unsigned short interface,
const unsigned short timeout );
int dfu_download( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data );
int dfu_upload( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data );
int dfu_get_status( struct dfu_if *dif,
struct dfu_status *status );
int dfu_clear_status( libusb_device_handle *device,
const unsigned short interface );
int dfu_get_state( libusb_device_handle *device,
const unsigned short interface );
int dfu_abort( libusb_device_handle *device,
const unsigned short interface );
int dfu_abort_to_idle( struct dfu_if *dif);
const char *dfu_state_to_string( int state );
const char *dfu_status_to_string( int status );
#endif /* DFU_H */
/*
* dfu-programmer
*
* $Id: dfu.h,v 1.2 2005/09/25 01:27:42 schmidtw Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFU_H
#define DFU_H
#include <libusb.h>
#include "usb_dfu.h"
/* DFU states */
#define STATE_APP_IDLE 0x00
#define STATE_APP_DETACH 0x01
#define STATE_DFU_IDLE 0x02
#define STATE_DFU_DOWNLOAD_SYNC 0x03
#define STATE_DFU_DOWNLOAD_BUSY 0x04
#define STATE_DFU_DOWNLOAD_IDLE 0x05
#define STATE_DFU_MANIFEST_SYNC 0x06
#define STATE_DFU_MANIFEST 0x07
#define STATE_DFU_MANIFEST_WAIT_RESET 0x08
#define STATE_DFU_UPLOAD_IDLE 0x09
#define STATE_DFU_ERROR 0x0a
/* DFU status */
#define DFU_STATUS_OK 0x00
#define DFU_STATUS_ERROR_TARGET 0x01
#define DFU_STATUS_ERROR_FILE 0x02
#define DFU_STATUS_ERROR_WRITE 0x03
#define DFU_STATUS_ERROR_ERASE 0x04
#define DFU_STATUS_ERROR_CHECK_ERASED 0x05
#define DFU_STATUS_ERROR_PROG 0x06
#define DFU_STATUS_ERROR_VERIFY 0x07
#define DFU_STATUS_ERROR_ADDRESS 0x08
#define DFU_STATUS_ERROR_NOTDONE 0x09
#define DFU_STATUS_ERROR_FIRMWARE 0x0a
#define DFU_STATUS_ERROR_VENDOR 0x0b
#define DFU_STATUS_ERROR_USBR 0x0c
#define DFU_STATUS_ERROR_POR 0x0d
#define DFU_STATUS_ERROR_UNKNOWN 0x0e
#define DFU_STATUS_ERROR_STALLEDPKT 0x0f
/* DFU commands */
#define DFU_DETACH 0
#define DFU_DNLOAD 1
#define DFU_UPLOAD 2
#define DFU_GETSTATUS 3
#define DFU_CLRSTATUS 4
#define DFU_GETSTATE 5
#define DFU_ABORT 6
/* DFU interface */
#define DFU_IFF_DFU 0x0001 /* DFU Mode, (not Runtime) */
/* This is based off of DFU_GETSTATUS
*
* 1 unsigned byte bStatus
* 3 unsigned byte bwPollTimeout
* 1 unsigned byte bState
* 1 unsigned byte iString
*/
struct dfu_status {
unsigned char bStatus;
unsigned int bwPollTimeout;
unsigned char bState;
unsigned char iString;
};
struct dfu_if {
struct usb_dfu_func_descriptor func_dfu;
uint16_t quirks;
uint16_t busnum;
uint16_t devnum;
uint16_t vendor;
uint16_t product;
uint16_t bcdDevice;
uint8_t configuration;
uint8_t interface;
uint8_t altsetting;
uint8_t flags;
uint8_t bMaxPacketSize0;
char *alt_name;
char *serial_name;
libusb_device *dev;
libusb_device_handle *dev_handle;
struct dfu_if *next;
};
int dfu_detach( libusb_device_handle *device,
const unsigned short interface,
const unsigned short timeout );
int dfu_download( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data );
int dfu_upload( libusb_device_handle *device,
const unsigned short interface,
const unsigned short length,
const unsigned short transaction,
unsigned char* data );
int dfu_get_status( struct dfu_if *dif,
struct dfu_status *status );
int dfu_clear_status( libusb_device_handle *device,
const unsigned short interface );
int dfu_get_state( libusb_device_handle *device,
const unsigned short interface );
int dfu_abort( libusb_device_handle *device,
const unsigned short interface );
int dfu_abort_to_idle( struct dfu_if *dif);
const char *dfu_state_to_string( int state );
const char *dfu_status_to_string( int status );
#endif /* DFU_H */

View File

@ -1,444 +1,444 @@
/*
* Load or store DFU files including suffix and prefix
*
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
* Copyright 2012 Stefan Schmidt <stefan@datenfreihafen.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include "portable.h"
#include "dfu_file.h"
#define DFU_SUFFIX_LENGTH 16
#define LMDFU_PREFIX_LENGTH 8
#define LPCDFU_PREFIX_LENGTH 16
#define PROGRESS_BAR_WIDTH 25
#define STDIN_CHUNK_SIZE 65536
static const unsigned long crc32_table[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
static uint32_t crc32_byte(uint32_t accum, uint8_t delta)
{
return crc32_table[(accum ^ delta) & 0xff] ^ (accum >> 8);
}
static int probe_prefix(struct dfu_file *file)
{
uint8_t *prefix = file->firmware;
if (file->size.total < LMDFU_PREFIX_LENGTH)
return 1;
if ((prefix[0] == 0x01) && (prefix[1] == 0x00)) {
file->prefix_type = LMDFU_PREFIX;
file->size.prefix = LMDFU_PREFIX_LENGTH;
file->lmdfu_address = 1024 * ((prefix[3] << 8) | prefix[2]);
}
else if (((prefix[0] & 0x3f) == 0x1a) && ((prefix[1] & 0x3f)== 0x3f)) {
file->prefix_type = LPCDFU_UNENCRYPTED_PREFIX;
file->size.prefix = LPCDFU_PREFIX_LENGTH;
}
if (file->size.prefix + file->size.suffix > file->size.total)
return 1;
return 0;
}
void dfu_progress_bar(const char *desc, unsigned long long curr,
unsigned long long max)
{
static char buf[PROGRESS_BAR_WIDTH + 1];
static unsigned long long last_progress = -1;
static time_t last_time;
time_t curr_time = time(NULL);
unsigned long long progress;
unsigned long long x;
/* check for not known maximum */
if (max < curr)
max = curr + 1;
/* make none out of none give zero */
if (max == 0 && curr == 0)
max = 1;
/* compute completion */
progress = (PROGRESS_BAR_WIDTH * curr) / max;
if (progress > PROGRESS_BAR_WIDTH)
progress = PROGRESS_BAR_WIDTH;
if (progress == last_progress &&
curr_time == last_time)
return;
last_progress = progress;
last_time = curr_time;
for (x = 0; x != PROGRESS_BAR_WIDTH; x++) {
if (x < progress)
buf[x] = '=';
else
buf[x] = ' ';
}
buf[x] = 0;
printf("\r%s\t[%s] %3lld%% %12lld bytes", desc, buf,
(100ULL * curr) / max, curr);
if (progress == PROGRESS_BAR_WIDTH)
printf("\n%s done.\n", desc);
}
void *dfu_malloc(size_t size)
{
void *ptr = malloc(size);
if (ptr == NULL)
errx(EX_SOFTWARE, "Cannot allocate memory of size %d bytes", (int)size);
return (ptr);
}
uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size)
{
int x;
/* compute CRC */
for (x = 0; x != size; x++)
crc = crc32_byte(crc, ((uint8_t *)buf)[x]);
/* write data */
if (write(f, buf, size) != size)
err(EX_IOERR, "Could not write %d bytes to file %d", size, f);
return (crc);
}
void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix)
{
off_t offset;
int f;
int i;
int res;
file->size.prefix = 0;
file->size.suffix = 0;
/* default values, if no valid suffix is found */
file->bcdDFU = 0;
file->idVendor = 0xffff; /* wildcard value */
file->idProduct = 0xffff; /* wildcard value */
file->bcdDevice = 0xffff; /* wildcard value */
/* default values, if no valid prefix is found */
file->lmdfu_address = 0;
free(file->firmware);
if (!strcmp(file->name, "-")) {
int read_bytes;
#ifdef WIN32
_setmode( _fileno( stdin ), _O_BINARY );
#endif
file->firmware = (uint8_t*) dfu_malloc(STDIN_CHUNK_SIZE);
read_bytes = fread(file->firmware, 1, STDIN_CHUNK_SIZE, stdin);
file->size.total = read_bytes;
while (read_bytes == STDIN_CHUNK_SIZE) {
file->firmware = (uint8_t*) realloc(file->firmware, file->size.total + STDIN_CHUNK_SIZE);
if (!file->firmware)
err(EX_IOERR, "Could not allocate firmware buffer");
read_bytes = fread(file->firmware + file->size.total, 1, STDIN_CHUNK_SIZE, stdin);
file->size.total += read_bytes;
}
if (verbose)
printf("Read %i bytes from stdin\n", file->size.total);
/* Never require suffix when reading from stdin */
check_suffix = MAYBE_SUFFIX;
} else {
f = open(file->name, O_RDONLY | O_BINARY);
if (f < 0)
err(EX_IOERR, "Could not open file %s for reading", file->name);
offset = lseek(f, 0, SEEK_END);
if ((int)offset < 0 || (int)offset != offset)
err(EX_IOERR, "File size is too big");
if (lseek(f, 0, SEEK_SET) != 0)
err(EX_IOERR, "Could not seek to beginning");
file->size.total = offset;
file->firmware = dfu_malloc(file->size.total);
if (read(f, file->firmware, file->size.total) != file->size.total) {
err(EX_IOERR, "Could not read %d bytes from %s",
file->size.total, file->name);
}
close(f);
}
/* Check for possible DFU file suffix by trying to parse one */
{
uint32_t crc = 0xffffffff;
const uint8_t *dfusuffix;
int missing_suffix = 0;
const char *reason;
if (file->size.total < DFU_SUFFIX_LENGTH) {
reason = "File too short for DFU suffix";
missing_suffix = 1;
goto checked;
}
dfusuffix = file->firmware + file->size.total -
DFU_SUFFIX_LENGTH;
for (i = 0; i < file->size.total - 4; i++)
crc = crc32_byte(crc, file->firmware[i]);
if (dfusuffix[10] != 'D' ||
dfusuffix[9] != 'F' ||
dfusuffix[8] != 'U') {
reason = "Invalid DFU suffix signature";
missing_suffix = 1;
goto checked;
}
file->dwCRC = (dfusuffix[15] << 24) +
(dfusuffix[14] << 16) +
(dfusuffix[13] << 8) +
dfusuffix[12];
if (file->dwCRC != crc) {
reason = "DFU suffix CRC does not match";
missing_suffix = 1;
goto checked;
}
/* At this point we believe we have a DFU suffix
so we require further checks to succeed */
file->bcdDFU = (dfusuffix[7] << 8) + dfusuffix[6];
if (verbose)
printf("DFU suffix version %x\n", file->bcdDFU);
file->size.suffix = dfusuffix[11];
if (file->size.suffix < DFU_SUFFIX_LENGTH) {
errx(EX_IOERR, "Unsupported DFU suffix length %d",
file->size.suffix);
}
if (file->size.suffix > file->size.total) {
errx(EX_IOERR, "Invalid DFU suffix length %d",
file->size.suffix);
}
file->idVendor = (dfusuffix[5] << 8) + dfusuffix[4];
file->idProduct = (dfusuffix[3] << 8) + dfusuffix[2];
file->bcdDevice = (dfusuffix[1] << 8) + dfusuffix[0];
checked:
if (missing_suffix) {
if (check_suffix == NEEDS_SUFFIX) {
warnx("%s", reason);
errx(EX_IOERR, "Valid DFU suffix needed");
} else if (check_suffix == MAYBE_SUFFIX) {
warnx("%s", reason);
warnx("A valid DFU suffix will be required in "
"a future dfu-util release!!!");
}
} else {
if (check_suffix == NO_SUFFIX) {
errx(EX_SOFTWARE, "Please remove existing DFU suffix before adding a new one.\n");
}
}
}
res = probe_prefix(file);
if ((res || file->size.prefix == 0) && check_prefix == NEEDS_PREFIX)
errx(EX_IOERR, "Valid DFU prefix needed");
if (file->size.prefix && check_prefix == NO_PREFIX)
errx(EX_IOERR, "A prefix already exists, please delete it first");
if (file->size.prefix && verbose) {
uint8_t *data = file->firmware;
if (file->prefix_type == LMDFU_PREFIX)
printf("Possible TI Stellaris DFU prefix with "
"the following properties\n"
"Address: 0x%08x\n"
"Payload length: %d\n",
file->lmdfu_address,
data[4] | (data[5] << 8) |
(data[6] << 16) | (data[7] << 14));
else if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX)
printf("Possible unencrypted NXP LPC DFU prefix with "
"the following properties\n"
"Payload length: %d kiByte\n",
data[2] >>1 | (data[3] << 7) );
else
errx(EX_IOERR, "Unknown DFU prefix type");
}
}
void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix)
{
uint32_t crc = 0xffffffff;
int f;
f = open(file->name, O_WRONLY | O_BINARY | O_TRUNC | O_CREAT, 0666);
if (f < 0)
err(EX_IOERR, "Could not open file %s for writing", file->name);
/* write prefix, if any */
if (write_prefix) {
if (file->prefix_type == LMDFU_PREFIX) {
uint8_t lmdfu_prefix[LMDFU_PREFIX_LENGTH];
uint32_t addr = file->lmdfu_address / 1024;
/* lmdfu_dfu_prefix payload length excludes prefix and suffix */
uint32_t len = file->size.total -
file->size.prefix - file->size.suffix;
lmdfu_prefix[0] = 0x01; /* STELLARIS_DFU_PROG */
lmdfu_prefix[1] = 0x00; /* Reserved */
lmdfu_prefix[2] = (uint8_t)(addr & 0xff);
lmdfu_prefix[3] = (uint8_t)(addr >> 8);
lmdfu_prefix[4] = (uint8_t)(len & 0xff);
lmdfu_prefix[5] = (uint8_t)(len >> 8) & 0xff;
lmdfu_prefix[6] = (uint8_t)(len >> 16) & 0xff;
lmdfu_prefix[7] = (uint8_t)(len >> 24);
crc = dfu_file_write_crc(f, crc, lmdfu_prefix, LMDFU_PREFIX_LENGTH);
}
if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX) {
uint8_t lpcdfu_prefix[LPCDFU_PREFIX_LENGTH] = {0};
int i;
/* Payload is firmware and prefix rounded to 512 bytes */
uint32_t len = (file->size.total - file->size.suffix + 511) /512;
lpcdfu_prefix[0] = 0x1a; /* Unencypted*/
lpcdfu_prefix[1] = 0x3f; /* Reserved */
lpcdfu_prefix[2] = (uint8_t)(len & 0xff);
lpcdfu_prefix[3] = (uint8_t)((len >> 8) & 0xff);
for (i = 12; i < LPCDFU_PREFIX_LENGTH; i++)
lpcdfu_prefix[i] = 0xff;
crc = dfu_file_write_crc(f, crc, lpcdfu_prefix, LPCDFU_PREFIX_LENGTH);
}
}
/* write firmware binary */
crc = dfu_file_write_crc(f, crc, file->firmware + file->size.prefix,
file->size.total - file->size.prefix - file->size.suffix);
/* write suffix, if any */
if (write_suffix) {
uint8_t dfusuffix[DFU_SUFFIX_LENGTH];
dfusuffix[0] = file->bcdDevice & 0xff;
dfusuffix[1] = file->bcdDevice >> 8;
dfusuffix[2] = file->idProduct & 0xff;
dfusuffix[3] = file->idProduct >> 8;
dfusuffix[4] = file->idVendor & 0xff;
dfusuffix[5] = file->idVendor >> 8;
dfusuffix[6] = file->bcdDFU & 0xff;
dfusuffix[7] = file->bcdDFU >> 8;
dfusuffix[8] = 'U';
dfusuffix[9] = 'F';
dfusuffix[10] = 'D';
dfusuffix[11] = DFU_SUFFIX_LENGTH;
crc = dfu_file_write_crc(f, crc, dfusuffix,
DFU_SUFFIX_LENGTH - 4);
dfusuffix[12] = crc;
dfusuffix[13] = crc >> 8;
dfusuffix[14] = crc >> 16;
dfusuffix[15] = crc >> 24;
crc = dfu_file_write_crc(f, crc, dfusuffix + 12, 4);
}
close(f);
}
void show_suffix_and_prefix(struct dfu_file *file)
{
if (file->size.prefix == LMDFU_PREFIX_LENGTH) {
printf("The file %s contains a TI Stellaris DFU prefix with the following properties:\n", file->name);
printf("Address:\t0x%08x\n", file->lmdfu_address);
} else if (file->size.prefix == LPCDFU_PREFIX_LENGTH) {
uint8_t * prefix = file->firmware;
printf("The file %s contains a NXP unencrypted LPC DFU prefix with the following properties:\n", file->name);
printf("Size:\t%5d kiB\n", prefix[2]>>1|prefix[3]<<7);
} else if (file->size.prefix != 0) {
printf("The file %s contains an unknown prefix\n", file->name);
}
if (file->size.suffix > 0) {
printf("The file %s contains a DFU suffix with the following properties:\n", file->name);
printf("BCD device:\t0x%04X\n", file->bcdDevice);
printf("Product ID:\t0x%04X\n",file->idProduct);
printf("Vendor ID:\t0x%04X\n", file->idVendor);
printf("BCD DFU:\t0x%04X\n", file->bcdDFU);
printf("Length:\t\t%i\n", file->size.suffix);
printf("CRC:\t\t0x%08X\n", file->dwCRC);
}
}
/*
* Load or store DFU files including suffix and prefix
*
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
* Copyright 2012 Stefan Schmidt <stefan@datenfreihafen.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include "portable.h"
#include "dfu_file.h"
#define DFU_SUFFIX_LENGTH 16
#define LMDFU_PREFIX_LENGTH 8
#define LPCDFU_PREFIX_LENGTH 16
#define PROGRESS_BAR_WIDTH 25
#define STDIN_CHUNK_SIZE 65536
static const unsigned long crc32_table[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
static uint32_t crc32_byte(uint32_t accum, uint8_t delta)
{
return crc32_table[(accum ^ delta) & 0xff] ^ (accum >> 8);
}
static int probe_prefix(struct dfu_file *file)
{
uint8_t *prefix = file->firmware;
if (file->size.total < LMDFU_PREFIX_LENGTH)
return 1;
if ((prefix[0] == 0x01) && (prefix[1] == 0x00)) {
file->prefix_type = LMDFU_PREFIX;
file->size.prefix = LMDFU_PREFIX_LENGTH;
file->lmdfu_address = 1024 * ((prefix[3] << 8) | prefix[2]);
}
else if (((prefix[0] & 0x3f) == 0x1a) && ((prefix[1] & 0x3f)== 0x3f)) {
file->prefix_type = LPCDFU_UNENCRYPTED_PREFIX;
file->size.prefix = LPCDFU_PREFIX_LENGTH;
}
if (file->size.prefix + file->size.suffix > file->size.total)
return 1;
return 0;
}
void dfu_progress_bar(const char *desc, unsigned long long curr,
unsigned long long max)
{
static char buf[PROGRESS_BAR_WIDTH + 1];
static unsigned long long last_progress = -1;
static time_t last_time;
time_t curr_time = time(NULL);
unsigned long long progress;
unsigned long long x;
/* check for not known maximum */
if (max < curr)
max = curr + 1;
/* make none out of none give zero */
if (max == 0 && curr == 0)
max = 1;
/* compute completion */
progress = (PROGRESS_BAR_WIDTH * curr) / max;
if (progress > PROGRESS_BAR_WIDTH)
progress = PROGRESS_BAR_WIDTH;
if (progress == last_progress &&
curr_time == last_time)
return;
last_progress = progress;
last_time = curr_time;
for (x = 0; x != PROGRESS_BAR_WIDTH; x++) {
if (x < progress)
buf[x] = '=';
else
buf[x] = ' ';
}
buf[x] = 0;
printf("\r%s\t[%s] %3lld%% %12lld bytes", desc, buf,
(100ULL * curr) / max, curr);
if (progress == PROGRESS_BAR_WIDTH)
printf("\n%s done.\n", desc);
}
void *dfu_malloc(size_t size)
{
void *ptr = malloc(size);
if (ptr == NULL)
errx(EX_SOFTWARE, "Cannot allocate memory of size %d bytes", (int)size);
return (ptr);
}
uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size)
{
int x;
/* compute CRC */
for (x = 0; x != size; x++)
crc = crc32_byte(crc, ((uint8_t *)buf)[x]);
/* write data */
if (write(f, buf, size) != size)
err(EX_IOERR, "Could not write %d bytes to file %d", size, f);
return (crc);
}
void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix)
{
off_t offset;
int f;
int i;
int res;
file->size.prefix = 0;
file->size.suffix = 0;
/* default values, if no valid suffix is found */
file->bcdDFU = 0;
file->idVendor = 0xffff; /* wildcard value */
file->idProduct = 0xffff; /* wildcard value */
file->bcdDevice = 0xffff; /* wildcard value */
/* default values, if no valid prefix is found */
file->lmdfu_address = 0;
free(file->firmware);
if (!strcmp(file->name, "-")) {
int read_bytes;
#ifdef WIN32
_setmode( _fileno( stdin ), _O_BINARY );
#endif
file->firmware = (uint8_t*) dfu_malloc(STDIN_CHUNK_SIZE);
read_bytes = fread(file->firmware, 1, STDIN_CHUNK_SIZE, stdin);
file->size.total = read_bytes;
while (read_bytes == STDIN_CHUNK_SIZE) {
file->firmware = (uint8_t*) realloc(file->firmware, file->size.total + STDIN_CHUNK_SIZE);
if (!file->firmware)
err(EX_IOERR, "Could not allocate firmware buffer");
read_bytes = fread(file->firmware + file->size.total, 1, STDIN_CHUNK_SIZE, stdin);
file->size.total += read_bytes;
}
if (verbose)
printf("Read %i bytes from stdin\n", file->size.total);
/* Never require suffix when reading from stdin */
check_suffix = MAYBE_SUFFIX;
} else {
f = open(file->name, O_RDONLY | O_BINARY);
if (f < 0)
err(EX_IOERR, "Could not open file %s for reading", file->name);
offset = lseek(f, 0, SEEK_END);
if ((int)offset < 0 || (int)offset != offset)
err(EX_IOERR, "File size is too big");
if (lseek(f, 0, SEEK_SET) != 0)
err(EX_IOERR, "Could not seek to beginning");
file->size.total = offset;
file->firmware = dfu_malloc(file->size.total);
if (read(f, file->firmware, file->size.total) != file->size.total) {
err(EX_IOERR, "Could not read %d bytes from %s",
file->size.total, file->name);
}
close(f);
}
/* Check for possible DFU file suffix by trying to parse one */
{
uint32_t crc = 0xffffffff;
const uint8_t *dfusuffix;
int missing_suffix = 0;
const char *reason;
if (file->size.total < DFU_SUFFIX_LENGTH) {
reason = "File too short for DFU suffix";
missing_suffix = 1;
goto checked;
}
dfusuffix = file->firmware + file->size.total -
DFU_SUFFIX_LENGTH;
for (i = 0; i < file->size.total - 4; i++)
crc = crc32_byte(crc, file->firmware[i]);
if (dfusuffix[10] != 'D' ||
dfusuffix[9] != 'F' ||
dfusuffix[8] != 'U') {
reason = "Invalid DFU suffix signature";
missing_suffix = 1;
goto checked;
}
file->dwCRC = (dfusuffix[15] << 24) +
(dfusuffix[14] << 16) +
(dfusuffix[13] << 8) +
dfusuffix[12];
if (file->dwCRC != crc) {
reason = "DFU suffix CRC does not match";
missing_suffix = 1;
goto checked;
}
/* At this point we believe we have a DFU suffix
so we require further checks to succeed */
file->bcdDFU = (dfusuffix[7] << 8) + dfusuffix[6];
if (verbose)
printf("DFU suffix version %x\n", file->bcdDFU);
file->size.suffix = dfusuffix[11];
if (file->size.suffix < DFU_SUFFIX_LENGTH) {
errx(EX_IOERR, "Unsupported DFU suffix length %d",
file->size.suffix);
}
if (file->size.suffix > file->size.total) {
errx(EX_IOERR, "Invalid DFU suffix length %d",
file->size.suffix);
}
file->idVendor = (dfusuffix[5] << 8) + dfusuffix[4];
file->idProduct = (dfusuffix[3] << 8) + dfusuffix[2];
file->bcdDevice = (dfusuffix[1] << 8) + dfusuffix[0];
checked:
if (missing_suffix) {
if (check_suffix == NEEDS_SUFFIX) {
warnx("%s", reason);
errx(EX_IOERR, "Valid DFU suffix needed");
} else if (check_suffix == MAYBE_SUFFIX) {
warnx("%s", reason);
warnx("A valid DFU suffix will be required in "
"a future dfu-util release!!!");
}
} else {
if (check_suffix == NO_SUFFIX) {
errx(EX_SOFTWARE, "Please remove existing DFU suffix before adding a new one.\n");
}
}
}
res = probe_prefix(file);
if ((res || file->size.prefix == 0) && check_prefix == NEEDS_PREFIX)
errx(EX_IOERR, "Valid DFU prefix needed");
if (file->size.prefix && check_prefix == NO_PREFIX)
errx(EX_IOERR, "A prefix already exists, please delete it first");
if (file->size.prefix && verbose) {
uint8_t *data = file->firmware;
if (file->prefix_type == LMDFU_PREFIX)
printf("Possible TI Stellaris DFU prefix with "
"the following properties\n"
"Address: 0x%08x\n"
"Payload length: %d\n",
file->lmdfu_address,
data[4] | (data[5] << 8) |
(data[6] << 16) | (data[7] << 14));
else if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX)
printf("Possible unencrypted NXP LPC DFU prefix with "
"the following properties\n"
"Payload length: %d kiByte\n",
data[2] >>1 | (data[3] << 7) );
else
errx(EX_IOERR, "Unknown DFU prefix type");
}
}
void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix)
{
uint32_t crc = 0xffffffff;
int f;
f = open(file->name, O_WRONLY | O_BINARY | O_TRUNC | O_CREAT, 0666);
if (f < 0)
err(EX_IOERR, "Could not open file %s for writing", file->name);
/* write prefix, if any */
if (write_prefix) {
if (file->prefix_type == LMDFU_PREFIX) {
uint8_t lmdfu_prefix[LMDFU_PREFIX_LENGTH];
uint32_t addr = file->lmdfu_address / 1024;
/* lmdfu_dfu_prefix payload length excludes prefix and suffix */
uint32_t len = file->size.total -
file->size.prefix - file->size.suffix;
lmdfu_prefix[0] = 0x01; /* STELLARIS_DFU_PROG */
lmdfu_prefix[1] = 0x00; /* Reserved */
lmdfu_prefix[2] = (uint8_t)(addr & 0xff);
lmdfu_prefix[3] = (uint8_t)(addr >> 8);
lmdfu_prefix[4] = (uint8_t)(len & 0xff);
lmdfu_prefix[5] = (uint8_t)(len >> 8) & 0xff;
lmdfu_prefix[6] = (uint8_t)(len >> 16) & 0xff;
lmdfu_prefix[7] = (uint8_t)(len >> 24);
crc = dfu_file_write_crc(f, crc, lmdfu_prefix, LMDFU_PREFIX_LENGTH);
}
if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX) {
uint8_t lpcdfu_prefix[LPCDFU_PREFIX_LENGTH] = {0};
int i;
/* Payload is firmware and prefix rounded to 512 bytes */
uint32_t len = (file->size.total - file->size.suffix + 511) /512;
lpcdfu_prefix[0] = 0x1a; /* Unencypted*/
lpcdfu_prefix[1] = 0x3f; /* Reserved */
lpcdfu_prefix[2] = (uint8_t)(len & 0xff);
lpcdfu_prefix[3] = (uint8_t)((len >> 8) & 0xff);
for (i = 12; i < LPCDFU_PREFIX_LENGTH; i++)
lpcdfu_prefix[i] = 0xff;
crc = dfu_file_write_crc(f, crc, lpcdfu_prefix, LPCDFU_PREFIX_LENGTH);
}
}
/* write firmware binary */
crc = dfu_file_write_crc(f, crc, file->firmware + file->size.prefix,
file->size.total - file->size.prefix - file->size.suffix);
/* write suffix, if any */
if (write_suffix) {
uint8_t dfusuffix[DFU_SUFFIX_LENGTH];
dfusuffix[0] = file->bcdDevice & 0xff;
dfusuffix[1] = file->bcdDevice >> 8;
dfusuffix[2] = file->idProduct & 0xff;
dfusuffix[3] = file->idProduct >> 8;
dfusuffix[4] = file->idVendor & 0xff;
dfusuffix[5] = file->idVendor >> 8;
dfusuffix[6] = file->bcdDFU & 0xff;
dfusuffix[7] = file->bcdDFU >> 8;
dfusuffix[8] = 'U';
dfusuffix[9] = 'F';
dfusuffix[10] = 'D';
dfusuffix[11] = DFU_SUFFIX_LENGTH;
crc = dfu_file_write_crc(f, crc, dfusuffix,
DFU_SUFFIX_LENGTH - 4);
dfusuffix[12] = crc;
dfusuffix[13] = crc >> 8;
dfusuffix[14] = crc >> 16;
dfusuffix[15] = crc >> 24;
crc = dfu_file_write_crc(f, crc, dfusuffix + 12, 4);
}
close(f);
}
void show_suffix_and_prefix(struct dfu_file *file)
{
if (file->size.prefix == LMDFU_PREFIX_LENGTH) {
printf("The file %s contains a TI Stellaris DFU prefix with the following properties:\n", file->name);
printf("Address:\t0x%08x\n", file->lmdfu_address);
} else if (file->size.prefix == LPCDFU_PREFIX_LENGTH) {
uint8_t * prefix = file->firmware;
printf("The file %s contains a NXP unencrypted LPC DFU prefix with the following properties:\n", file->name);
printf("Size:\t%5d kiB\n", prefix[2]>>1|prefix[3]<<7);
} else if (file->size.prefix != 0) {
printf("The file %s contains an unknown prefix\n", file->name);
}
if (file->size.suffix > 0) {
printf("The file %s contains a DFU suffix with the following properties:\n", file->name);
printf("BCD device:\t0x%04X\n", file->bcdDevice);
printf("Product ID:\t0x%04X\n",file->idProduct);
printf("Vendor ID:\t0x%04X\n", file->idVendor);
printf("BCD DFU:\t0x%04X\n", file->bcdDFU);
printf("Length:\t\t%i\n", file->size.suffix);
printf("CRC:\t\t0x%08X\n", file->dwCRC);
}
}

View File

@ -1,60 +1,60 @@
#ifndef DFU_FILE_H
#define DFU_FILE_H
#include <stdint.h>
struct dfu_file {
/* File name */
const char *name;
/* Pointer to file loaded into memory */
uint8_t *firmware;
/* Different sizes */
struct {
int total;
int prefix;
int suffix;
} size;
/* From prefix fields */
uint32_t lmdfu_address;
/* From prefix fields */
uint32_t prefix_type;
/* From DFU suffix fields */
uint32_t dwCRC;
uint16_t bcdDFU;
uint16_t idVendor;
uint16_t idProduct;
uint16_t bcdDevice;
};
enum suffix_req {
NO_SUFFIX,
NEEDS_SUFFIX,
MAYBE_SUFFIX
};
enum prefix_req {
NO_PREFIX,
NEEDS_PREFIX,
MAYBE_PREFIX
};
enum prefix_type {
ZERO_PREFIX,
LMDFU_PREFIX,
LPCDFU_UNENCRYPTED_PREFIX
};
extern int verbose;
void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix);
void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix);
void dfu_progress_bar(const char *desc, unsigned long long curr,
unsigned long long max);
void *dfu_malloc(size_t size);
uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size);
void show_suffix_and_prefix(struct dfu_file *file);
#endif /* DFU_FILE_H */
#ifndef DFU_FILE_H
#define DFU_FILE_H
#include <stdint.h>
struct dfu_file {
/* File name */
const char *name;
/* Pointer to file loaded into memory */
uint8_t *firmware;
/* Different sizes */
struct {
int total;
int prefix;
int suffix;
} size;
/* From prefix fields */
uint32_t lmdfu_address;
/* From prefix fields */
uint32_t prefix_type;
/* From DFU suffix fields */
uint32_t dwCRC;
uint16_t bcdDFU;
uint16_t idVendor;
uint16_t idProduct;
uint16_t bcdDevice;
};
enum suffix_req {
NO_SUFFIX,
NEEDS_SUFFIX,
MAYBE_SUFFIX
};
enum prefix_req {
NO_PREFIX,
NEEDS_PREFIX,
MAYBE_PREFIX
};
enum prefix_type {
ZERO_PREFIX,
LMDFU_PREFIX,
LPCDFU_UNENCRYPTED_PREFIX
};
extern int verbose;
void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix);
void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix);
void dfu_progress_bar(const char *desc, unsigned long long curr,
unsigned long long max);
void *dfu_malloc(size_t size);
uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size);
void show_suffix_and_prefix(struct dfu_file *file);
#endif /* DFU_FILE_H */

View File

@ -1,196 +1,196 @@
/*
* DFU transfer routines
*
* This is supposed to be a general DFU implementation, as specified in the
* USB DFU 1.0 and 1.1 specification.
*
* The code was originally intended to interface with a USB device running the
* "sam7dfu" firmware (see http://www.openpcd.org/) on an AT91SAM7 processor.
*
* Copyright 2007-2008 Harald Welte <laforge@gnumonks.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "usb_dfu.h"
#include "dfu_file.h"
#include "dfu_load.h"
#include "quirks.h"
int dfuload_do_upload(struct dfu_if *dif, int xfer_size,
int expected_size, int fd)
{
int total_bytes = 0;
unsigned short transaction = 0;
unsigned char *buf;
int ret;
buf = dfu_malloc(xfer_size);
printf("Copying data from DFU device to PC\n");
dfu_progress_bar("Upload", 0, 1);
while (1) {
int rc;
rc = dfu_upload(dif->dev_handle, dif->interface,
xfer_size, transaction++, buf);
if (rc < 0) {
warnx("Error during upload");
ret = rc;
goto out_free;
}
dfu_file_write_crc(fd, 0, buf, rc);
total_bytes += rc;
if (total_bytes < 0)
errx(EX_SOFTWARE, "Received too many bytes (wraparound)");
if (rc < xfer_size) {
/* last block, return */
ret = total_bytes;
break;
}
dfu_progress_bar("Upload", total_bytes, expected_size);
}
ret = 0;
out_free:
dfu_progress_bar("Upload", total_bytes, total_bytes);
if (total_bytes == 0)
printf("\nFailed.\n");
free(buf);
if (verbose)
printf("Received a total of %i bytes\n", total_bytes);
if (expected_size != 0 && total_bytes != expected_size)
errx(EX_SOFTWARE, "Unexpected number of bytes uploaded from device");
return ret;
}
int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file)
{
int bytes_sent;
int expected_size;
unsigned char *buf;
unsigned short transaction = 0;
struct dfu_status dst;
int ret;
printf("Copying data from PC to DFU device\n");
buf = file->firmware;
expected_size = file->size.total - file->size.suffix;
bytes_sent = 0;
dfu_progress_bar("Download", 0, 1);
while (bytes_sent < expected_size) {
int bytes_left;
int chunk_size;
bytes_left = expected_size - bytes_sent;
if (bytes_left < xfer_size)
chunk_size = bytes_left;
else
chunk_size = xfer_size;
ret = dfu_download(dif->dev_handle, dif->interface,
chunk_size, transaction++, chunk_size ? buf : NULL);
if (ret < 0) {
warnx("Error during download");
goto out;
}
bytes_sent += chunk_size;
buf += chunk_size;
do {
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
errx(EX_IOERR, "Error during download get_status");
goto out;
}
if (dst.bState == DFU_STATE_dfuDNLOAD_IDLE ||
dst.bState == DFU_STATE_dfuERROR)
break;
/* Wait while device executes flashing */
milli_sleep(dst.bwPollTimeout);
} while (1);
if (dst.bStatus != DFU_STATUS_OK) {
printf(" failed!\n");
printf("state(%u) = %s, status(%u) = %s\n", dst.bState,
dfu_state_to_string(dst.bState), dst.bStatus,
dfu_status_to_string(dst.bStatus));
ret = -1;
goto out;
}
dfu_progress_bar("Download", bytes_sent, bytes_sent + bytes_left);
}
/* send one zero sized download request to signalize end */
ret = dfu_download(dif->dev_handle, dif->interface,
0, transaction, NULL);
if (ret < 0) {
errx(EX_IOERR, "Error sending completion packet");
goto out;
}
dfu_progress_bar("Download", bytes_sent, bytes_sent);
if (verbose)
printf("Sent a total of %i bytes\n", bytes_sent);
get_status:
/* Transition to MANIFEST_SYNC state */
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
warnx("unable to read DFU status after completion");
goto out;
}
printf("state(%u) = %s, status(%u) = %s\n", dst.bState,
dfu_state_to_string(dst.bState), dst.bStatus,
dfu_status_to_string(dst.bStatus));
milli_sleep(dst.bwPollTimeout);
/* FIXME: deal correctly with ManifestationTolerant=0 / WillDetach bits */
switch (dst.bState) {
case DFU_STATE_dfuMANIFEST_SYNC:
case DFU_STATE_dfuMANIFEST:
/* some devices (e.g. TAS1020b) need some time before we
* can obtain the status */
milli_sleep(1000);
goto get_status;
break;
case DFU_STATE_dfuIDLE:
break;
}
printf("Done!\n");
out:
return bytes_sent;
}
/*
* DFU transfer routines
*
* This is supposed to be a general DFU implementation, as specified in the
* USB DFU 1.0 and 1.1 specification.
*
* The code was originally intended to interface with a USB device running the
* "sam7dfu" firmware (see http://www.openpcd.org/) on an AT91SAM7 processor.
*
* Copyright 2007-2008 Harald Welte <laforge@gnumonks.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "usb_dfu.h"
#include "dfu_file.h"
#include "dfu_load.h"
#include "quirks.h"
int dfuload_do_upload(struct dfu_if *dif, int xfer_size,
int expected_size, int fd)
{
int total_bytes = 0;
unsigned short transaction = 0;
unsigned char *buf;
int ret;
buf = dfu_malloc(xfer_size);
printf("Copying data from DFU device to PC\n");
dfu_progress_bar("Upload", 0, 1);
while (1) {
int rc;
rc = dfu_upload(dif->dev_handle, dif->interface,
xfer_size, transaction++, buf);
if (rc < 0) {
warnx("Error during upload");
ret = rc;
goto out_free;
}
dfu_file_write_crc(fd, 0, buf, rc);
total_bytes += rc;
if (total_bytes < 0)
errx(EX_SOFTWARE, "Received too many bytes (wraparound)");
if (rc < xfer_size) {
/* last block, return */
ret = total_bytes;
break;
}
dfu_progress_bar("Upload", total_bytes, expected_size);
}
ret = 0;
out_free:
dfu_progress_bar("Upload", total_bytes, total_bytes);
if (total_bytes == 0)
printf("\nFailed.\n");
free(buf);
if (verbose)
printf("Received a total of %i bytes\n", total_bytes);
if (expected_size != 0 && total_bytes != expected_size)
errx(EX_SOFTWARE, "Unexpected number of bytes uploaded from device");
return ret;
}
int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file)
{
int bytes_sent;
int expected_size;
unsigned char *buf;
unsigned short transaction = 0;
struct dfu_status dst;
int ret;
printf("Copying data from PC to DFU device\n");
buf = file->firmware;
expected_size = file->size.total - file->size.suffix;
bytes_sent = 0;
dfu_progress_bar("Download", 0, 1);
while (bytes_sent < expected_size) {
int bytes_left;
int chunk_size;
bytes_left = expected_size - bytes_sent;
if (bytes_left < xfer_size)
chunk_size = bytes_left;
else
chunk_size = xfer_size;
ret = dfu_download(dif->dev_handle, dif->interface,
chunk_size, transaction++, chunk_size ? buf : NULL);
if (ret < 0) {
warnx("Error during download");
goto out;
}
bytes_sent += chunk_size;
buf += chunk_size;
do {
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
errx(EX_IOERR, "Error during download get_status");
goto out;
}
if (dst.bState == DFU_STATE_dfuDNLOAD_IDLE ||
dst.bState == DFU_STATE_dfuERROR)
break;
/* Wait while device executes flashing */
milli_sleep(dst.bwPollTimeout);
} while (1);
if (dst.bStatus != DFU_STATUS_OK) {
printf(" failed!\n");
printf("state(%u) = %s, status(%u) = %s\n", dst.bState,
dfu_state_to_string(dst.bState), dst.bStatus,
dfu_status_to_string(dst.bStatus));
ret = -1;
goto out;
}
dfu_progress_bar("Download", bytes_sent, bytes_sent + bytes_left);
}
/* send one zero sized download request to signalize end */
ret = dfu_download(dif->dev_handle, dif->interface,
0, transaction, NULL);
if (ret < 0) {
errx(EX_IOERR, "Error sending completion packet");
goto out;
}
dfu_progress_bar("Download", bytes_sent, bytes_sent);
if (verbose)
printf("Sent a total of %i bytes\n", bytes_sent);
get_status:
/* Transition to MANIFEST_SYNC state */
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
warnx("unable to read DFU status after completion");
goto out;
}
printf("state(%u) = %s, status(%u) = %s\n", dst.bState,
dfu_state_to_string(dst.bState), dst.bStatus,
dfu_status_to_string(dst.bStatus));
milli_sleep(dst.bwPollTimeout);
/* FIXME: deal correctly with ManifestationTolerant=0 / WillDetach bits */
switch (dst.bState) {
case DFU_STATE_dfuMANIFEST_SYNC:
case DFU_STATE_dfuMANIFEST:
/* some devices (e.g. TAS1020b) need some time before we
* can obtain the status */
milli_sleep(1000);
goto get_status;
break;
case DFU_STATE_dfuIDLE:
break;
}
printf("Done!\n");
out:
return bytes_sent;
}

View File

@ -1,7 +1,7 @@
#ifndef DFU_LOAD_H
#define DFU_LOAD_H
int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int expected_size, int fd);
int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file);
#endif /* DFU_LOAD_H */
#ifndef DFU_LOAD_H
#define DFU_LOAD_H
int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int expected_size, int fd);
int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file);
#endif /* DFU_LOAD_H */

View File

@ -1,346 +1,346 @@
/*
* Functions for detecting DFU USB entities
*
* Written by Harald Welte <laforge@openmoko.org>
* Copyright 2007-2008 by OpenMoko, Inc.
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
*
* Based on existing code of dfu-programmer-0.4
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "usb_dfu.h"
#include "dfu_file.h"
#include "dfu_load.h"
#include "dfu_util.h"
#include "dfuse.h"
#include "quirks.h"
#ifdef HAVE_USBPATH_H
#include <usbpath.h>
#endif
/*
* Look for a descriptor in a concatenated descriptor list. Will
* return upon the first match of the given descriptor type. Returns length of
* found descriptor, limited to res_size
*/
static int find_descriptor(const uint8_t *desc_list, int list_len,
uint8_t desc_type, void *res_buf, int res_size)
{
int p = 0;
if (list_len < 2)
return (-1);
while (p + 1 < list_len) {
int desclen;
desclen = (int) desc_list[p];
if (desclen == 0) {
warnx("Invalid descriptor list");
return -1;
}
if (desc_list[p + 1] == desc_type) {
if (desclen > res_size)
desclen = res_size;
if (p + desclen > list_len)
desclen = list_len - p;
memcpy(res_buf, &desc_list[p], desclen);
return desclen;
}
p += (int) desc_list[p];
}
return -1;
}
static void probe_configuration(libusb_device *dev, struct libusb_device_descriptor *desc)
{
struct usb_dfu_func_descriptor func_dfu;
libusb_device_handle *devh;
struct dfu_if *pdfu;
struct libusb_config_descriptor *cfg;
const struct libusb_interface_descriptor *intf;
const struct libusb_interface *uif;
char alt_name[MAX_DESC_STR_LEN + 1];
char serial_name[MAX_DESC_STR_LEN + 1];
int cfg_idx;
int intf_idx;
int alt_idx;
int ret;
int has_dfu;
for (cfg_idx = 0; cfg_idx != desc->bNumConfigurations; cfg_idx++) {
memset(&func_dfu, 0, sizeof(func_dfu));
has_dfu = 0;
ret = libusb_get_config_descriptor(dev, cfg_idx, &cfg);
if (ret != 0)
return;
if (match_config_index > -1 && match_config_index != cfg->bConfigurationValue) {
libusb_free_config_descriptor(cfg);
continue;
}
/*
* In some cases, noticably FreeBSD if uid != 0,
* the configuration descriptors are empty
*/
if (!cfg)
return;
ret = find_descriptor(cfg->extra, cfg->extra_length,
USB_DT_DFU, &func_dfu, sizeof(func_dfu));
if (ret > -1)
goto found_dfu;
for (intf_idx = 0; intf_idx < cfg->bNumInterfaces;
intf_idx++) {
uif = &cfg->interface[intf_idx];
if (!uif)
break;
for (alt_idx = 0; alt_idx < cfg->interface[intf_idx].num_altsetting;
alt_idx++) {
intf = &uif->altsetting[alt_idx];
ret = find_descriptor(intf->extra, intf->extra_length, USB_DT_DFU,
&func_dfu, sizeof(func_dfu));
if (ret > -1)
goto found_dfu;
if (intf->bInterfaceClass != 0xfe ||
intf->bInterfaceSubClass != 1)
continue;
has_dfu = 1;
}
}
if (has_dfu) {
/*
* Finally try to retrieve it requesting the
* device directly This is not supported on
* all devices for non-standard types
*/
if (libusb_open(dev, &devh) == 0) {
ret = libusb_get_descriptor(devh, USB_DT_DFU, 0,
(void *)&func_dfu, sizeof(func_dfu));
libusb_close(devh);
if (ret > -1)
goto found_dfu;
}
warnx("Device has DFU interface, "
"but has no DFU functional descriptor");
/* fake version 1.0 */
func_dfu.bLength = 7;
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
goto found_dfu;
}
libusb_free_config_descriptor(cfg);
continue;
found_dfu:
if (func_dfu.bLength == 7) {
printf("Deducing device DFU version from functional descriptor "
"length\n");
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
} else if (func_dfu.bLength < 9) {
printf("Error obtaining DFU functional descriptor\n");
printf("Please report this as a bug!\n");
printf("Warning: Assuming DFU version 1.0\n");
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
printf("Warning: Transfer size can not be detected\n");
func_dfu.wTransferSize = 0;
}
for (intf_idx = 0; intf_idx < cfg->bNumInterfaces;
intf_idx++) {
if (match_iface_index > -1 && match_iface_index != intf_idx)
continue;
uif = &cfg->interface[intf_idx];
if (!uif)
break;
for (alt_idx = 0;
alt_idx < uif->num_altsetting; alt_idx++) {
int dfu_mode;
intf = &uif->altsetting[alt_idx];
if (intf->bInterfaceClass != 0xfe ||
intf->bInterfaceSubClass != 1)
continue;
dfu_mode = (intf->bInterfaceProtocol == 2);
/* e.g. DSO Nano has bInterfaceProtocol 0 instead of 2 */
if (func_dfu.bcdDFUVersion == 0x011a && intf->bInterfaceProtocol == 0)
dfu_mode = 1;
if (dfu_mode &&
match_iface_alt_index > -1 && match_iface_alt_index != alt_idx)
continue;
if (dfu_mode) {
if ((match_vendor_dfu >= 0 && match_vendor_dfu != desc->idVendor) ||
(match_product_dfu >= 0 && match_product_dfu != desc->idProduct)) {
continue;
}
} else {
if ((match_vendor >= 0 && match_vendor != desc->idVendor) ||
(match_product >= 0 && match_product != desc->idProduct)) {
continue;
}
}
if (libusb_open(dev, &devh)) {
warnx("Cannot open DFU device %04x:%04x", desc->idVendor, desc->idProduct);
break;
}
if (intf->iInterface != 0)
ret = libusb_get_string_descriptor_ascii(devh,
intf->iInterface, (void *)alt_name, MAX_DESC_STR_LEN);
else
ret = -1;
if (ret < 1)
strcpy(alt_name, "UNKNOWN");
if (desc->iSerialNumber != 0)
ret = libusb_get_string_descriptor_ascii(devh,
desc->iSerialNumber, (void *)serial_name, MAX_DESC_STR_LEN);
else
ret = -1;
if (ret < 1)
strcpy(serial_name, "UNKNOWN");
libusb_close(devh);
if (dfu_mode &&
match_iface_alt_name != NULL && strcmp(alt_name, match_iface_alt_name))
continue;
if (dfu_mode) {
if (match_serial_dfu != NULL && strcmp(match_serial_dfu, serial_name))
continue;
} else {
if (match_serial != NULL && strcmp(match_serial, serial_name))
continue;
}
pdfu = dfu_malloc(sizeof(*pdfu));
memset(pdfu, 0, sizeof(*pdfu));
pdfu->func_dfu = func_dfu;
pdfu->dev = libusb_ref_device(dev);
pdfu->quirks = get_quirks(desc->idVendor,
desc->idProduct, desc->bcdDevice);
pdfu->vendor = desc->idVendor;
pdfu->product = desc->idProduct;
pdfu->bcdDevice = desc->bcdDevice;
pdfu->configuration = cfg->bConfigurationValue;
pdfu->interface = intf->bInterfaceNumber;
pdfu->altsetting = intf->bAlternateSetting;
pdfu->devnum = libusb_get_device_address(dev);
pdfu->busnum = libusb_get_bus_number(dev);
pdfu->alt_name = strdup(alt_name);
if (pdfu->alt_name == NULL)
errx(EX_SOFTWARE, "Out of memory");
pdfu->serial_name = strdup(serial_name);
if (pdfu->serial_name == NULL)
errx(EX_SOFTWARE, "Out of memory");
if (dfu_mode)
pdfu->flags |= DFU_IFF_DFU;
if (pdfu->quirks & QUIRK_FORCE_DFU11) {
pdfu->func_dfu.bcdDFUVersion =
libusb_cpu_to_le16(0x0110);
}
pdfu->bMaxPacketSize0 = desc->bMaxPacketSize0;
/* queue into list */
pdfu->next = dfu_root;
dfu_root = pdfu;
}
}
libusb_free_config_descriptor(cfg);
}
}
void probe_devices(libusb_context *ctx)
{
libusb_device **list;
ssize_t num_devs;
ssize_t i;
num_devs = libusb_get_device_list(ctx, &list);
for (i = 0; i < num_devs; ++i) {
struct libusb_device_descriptor desc;
struct libusb_device *dev = list[i];
if (match_bus > -1 && match_bus != libusb_get_bus_number(dev))
continue;
if (match_device > -1 && match_device != libusb_get_device_address(dev))
continue;
if (libusb_get_device_descriptor(dev, &desc))
continue;
probe_configuration(dev, &desc);
}
libusb_free_device_list(list, 0);
}
void disconnect_devices(void)
{
struct dfu_if *pdfu;
struct dfu_if *prev = NULL;
for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next) {
free(prev);
libusb_unref_device(pdfu->dev);
free(pdfu->alt_name);
free(pdfu->serial_name);
prev = pdfu;
}
free(prev);
dfu_root = NULL;
}
void print_dfu_if(struct dfu_if *dfu_if)
{
printf("Found %s: [%04x:%04x] ver=%04x, devnum=%u, cfg=%u, intf=%u, "
"alt=%u, name=\"%s\", serial=\"%s\"\n",
dfu_if->flags & DFU_IFF_DFU ? "DFU" : "Runtime",
dfu_if->vendor, dfu_if->product,
dfu_if->bcdDevice, dfu_if->devnum,
dfu_if->configuration, dfu_if->interface,
dfu_if->altsetting, dfu_if->alt_name,
dfu_if->serial_name);
}
/* Walk the device tree and print out DFU devices */
void list_dfu_interfaces(void)
{
struct dfu_if *pdfu;
for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next)
print_dfu_if(pdfu);
}
/*
* Functions for detecting DFU USB entities
*
* Written by Harald Welte <laforge@openmoko.org>
* Copyright 2007-2008 by OpenMoko, Inc.
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
*
* Based on existing code of dfu-programmer-0.4
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <libusb.h>
#include "portable.h"
#include "dfu.h"
#include "usb_dfu.h"
#include "dfu_file.h"
#include "dfu_load.h"
#include "dfu_util.h"
#include "dfuse.h"
#include "quirks.h"
#ifdef HAVE_USBPATH_H
#include <usbpath.h>
#endif
/*
* Look for a descriptor in a concatenated descriptor list. Will
* return upon the first match of the given descriptor type. Returns length of
* found descriptor, limited to res_size
*/
static int find_descriptor(const uint8_t *desc_list, int list_len,
uint8_t desc_type, void *res_buf, int res_size)
{
int p = 0;
if (list_len < 2)
return (-1);
while (p + 1 < list_len) {
int desclen;
desclen = (int) desc_list[p];
if (desclen == 0) {
warnx("Invalid descriptor list");
return -1;
}
if (desc_list[p + 1] == desc_type) {
if (desclen > res_size)
desclen = res_size;
if (p + desclen > list_len)
desclen = list_len - p;
memcpy(res_buf, &desc_list[p], desclen);
return desclen;
}
p += (int) desc_list[p];
}
return -1;
}
static void probe_configuration(libusb_device *dev, struct libusb_device_descriptor *desc)
{
struct usb_dfu_func_descriptor func_dfu;
libusb_device_handle *devh;
struct dfu_if *pdfu;
struct libusb_config_descriptor *cfg;
const struct libusb_interface_descriptor *intf;
const struct libusb_interface *uif;
char alt_name[MAX_DESC_STR_LEN + 1];
char serial_name[MAX_DESC_STR_LEN + 1];
int cfg_idx;
int intf_idx;
int alt_idx;
int ret;
int has_dfu;
for (cfg_idx = 0; cfg_idx != desc->bNumConfigurations; cfg_idx++) {
memset(&func_dfu, 0, sizeof(func_dfu));
has_dfu = 0;
ret = libusb_get_config_descriptor(dev, cfg_idx, &cfg);
if (ret != 0)
return;
if (match_config_index > -1 && match_config_index != cfg->bConfigurationValue) {
libusb_free_config_descriptor(cfg);
continue;
}
/*
* In some cases, noticably FreeBSD if uid != 0,
* the configuration descriptors are empty
*/
if (!cfg)
return;
ret = find_descriptor(cfg->extra, cfg->extra_length,
USB_DT_DFU, &func_dfu, sizeof(func_dfu));
if (ret > -1)
goto found_dfu;
for (intf_idx = 0; intf_idx < cfg->bNumInterfaces;
intf_idx++) {
uif = &cfg->interface[intf_idx];
if (!uif)
break;
for (alt_idx = 0; alt_idx < cfg->interface[intf_idx].num_altsetting;
alt_idx++) {
intf = &uif->altsetting[alt_idx];
ret = find_descriptor(intf->extra, intf->extra_length, USB_DT_DFU,
&func_dfu, sizeof(func_dfu));
if (ret > -1)
goto found_dfu;
if (intf->bInterfaceClass != 0xfe ||
intf->bInterfaceSubClass != 1)
continue;
has_dfu = 1;
}
}
if (has_dfu) {
/*
* Finally try to retrieve it requesting the
* device directly This is not supported on
* all devices for non-standard types
*/
if (libusb_open(dev, &devh) == 0) {
ret = libusb_get_descriptor(devh, USB_DT_DFU, 0,
(void *)&func_dfu, sizeof(func_dfu));
libusb_close(devh);
if (ret > -1)
goto found_dfu;
}
warnx("Device has DFU interface, "
"but has no DFU functional descriptor");
/* fake version 1.0 */
func_dfu.bLength = 7;
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
goto found_dfu;
}
libusb_free_config_descriptor(cfg);
continue;
found_dfu:
if (func_dfu.bLength == 7) {
printf("Deducing device DFU version from functional descriptor "
"length\n");
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
} else if (func_dfu.bLength < 9) {
printf("Error obtaining DFU functional descriptor\n");
printf("Please report this as a bug!\n");
printf("Warning: Assuming DFU version 1.0\n");
func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100);
printf("Warning: Transfer size can not be detected\n");
func_dfu.wTransferSize = 0;
}
for (intf_idx = 0; intf_idx < cfg->bNumInterfaces;
intf_idx++) {
if (match_iface_index > -1 && match_iface_index != intf_idx)
continue;
uif = &cfg->interface[intf_idx];
if (!uif)
break;
for (alt_idx = 0;
alt_idx < uif->num_altsetting; alt_idx++) {
int dfu_mode;
intf = &uif->altsetting[alt_idx];
if (intf->bInterfaceClass != 0xfe ||
intf->bInterfaceSubClass != 1)
continue;
dfu_mode = (intf->bInterfaceProtocol == 2);
/* e.g. DSO Nano has bInterfaceProtocol 0 instead of 2 */
if (func_dfu.bcdDFUVersion == 0x011a && intf->bInterfaceProtocol == 0)
dfu_mode = 1;
if (dfu_mode &&
match_iface_alt_index > -1 && match_iface_alt_index != alt_idx)
continue;
if (dfu_mode) {
if ((match_vendor_dfu >= 0 && match_vendor_dfu != desc->idVendor) ||
(match_product_dfu >= 0 && match_product_dfu != desc->idProduct)) {
continue;
}
} else {
if ((match_vendor >= 0 && match_vendor != desc->idVendor) ||
(match_product >= 0 && match_product != desc->idProduct)) {
continue;
}
}
if (libusb_open(dev, &devh)) {
warnx("Cannot open DFU device %04x:%04x", desc->idVendor, desc->idProduct);
break;
}
if (intf->iInterface != 0)
ret = libusb_get_string_descriptor_ascii(devh,
intf->iInterface, (void *)alt_name, MAX_DESC_STR_LEN);
else
ret = -1;
if (ret < 1)
strcpy(alt_name, "UNKNOWN");
if (desc->iSerialNumber != 0)
ret = libusb_get_string_descriptor_ascii(devh,
desc->iSerialNumber, (void *)serial_name, MAX_DESC_STR_LEN);
else
ret = -1;
if (ret < 1)
strcpy(serial_name, "UNKNOWN");
libusb_close(devh);
if (dfu_mode &&
match_iface_alt_name != NULL && strcmp(alt_name, match_iface_alt_name))
continue;
if (dfu_mode) {
if (match_serial_dfu != NULL && strcmp(match_serial_dfu, serial_name))
continue;
} else {
if (match_serial != NULL && strcmp(match_serial, serial_name))
continue;
}
pdfu = dfu_malloc(sizeof(*pdfu));
memset(pdfu, 0, sizeof(*pdfu));
pdfu->func_dfu = func_dfu;
pdfu->dev = libusb_ref_device(dev);
pdfu->quirks = get_quirks(desc->idVendor,
desc->idProduct, desc->bcdDevice);
pdfu->vendor = desc->idVendor;
pdfu->product = desc->idProduct;
pdfu->bcdDevice = desc->bcdDevice;
pdfu->configuration = cfg->bConfigurationValue;
pdfu->interface = intf->bInterfaceNumber;
pdfu->altsetting = intf->bAlternateSetting;
pdfu->devnum = libusb_get_device_address(dev);
pdfu->busnum = libusb_get_bus_number(dev);
pdfu->alt_name = strdup(alt_name);
if (pdfu->alt_name == NULL)
errx(EX_SOFTWARE, "Out of memory");
pdfu->serial_name = strdup(serial_name);
if (pdfu->serial_name == NULL)
errx(EX_SOFTWARE, "Out of memory");
if (dfu_mode)
pdfu->flags |= DFU_IFF_DFU;
if (pdfu->quirks & QUIRK_FORCE_DFU11) {
pdfu->func_dfu.bcdDFUVersion =
libusb_cpu_to_le16(0x0110);
}
pdfu->bMaxPacketSize0 = desc->bMaxPacketSize0;
/* queue into list */
pdfu->next = dfu_root;
dfu_root = pdfu;
}
}
libusb_free_config_descriptor(cfg);
}
}
void probe_devices(libusb_context *ctx)
{
libusb_device **list;
ssize_t num_devs;
ssize_t i;
num_devs = libusb_get_device_list(ctx, &list);
for (i = 0; i < num_devs; ++i) {
struct libusb_device_descriptor desc;
struct libusb_device *dev = list[i];
if (match_bus > -1 && match_bus != libusb_get_bus_number(dev))
continue;
if (match_device > -1 && match_device != libusb_get_device_address(dev))
continue;
if (libusb_get_device_descriptor(dev, &desc))
continue;
probe_configuration(dev, &desc);
}
libusb_free_device_list(list, 0);
}
void disconnect_devices(void)
{
struct dfu_if *pdfu;
struct dfu_if *prev = NULL;
for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next) {
free(prev);
libusb_unref_device(pdfu->dev);
free(pdfu->alt_name);
free(pdfu->serial_name);
prev = pdfu;
}
free(prev);
dfu_root = NULL;
}
void print_dfu_if(struct dfu_if *dfu_if)
{
printf("Found %s: [%04x:%04x] ver=%04x, devnum=%u, cfg=%u, intf=%u, "
"alt=%u, name=\"%s\", serial=\"%s\"\n",
dfu_if->flags & DFU_IFF_DFU ? "DFU" : "Runtime",
dfu_if->vendor, dfu_if->product,
dfu_if->bcdDevice, dfu_if->devnum,
dfu_if->configuration, dfu_if->interface,
dfu_if->altsetting, dfu_if->alt_name,
dfu_if->serial_name);
}
/* Walk the device tree and print out DFU devices */
void list_dfu_interfaces(void)
{
struct dfu_if *pdfu;
for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next)
print_dfu_if(pdfu);
}

View File

@ -1,36 +1,36 @@
#ifndef DFU_UTIL_H
#define DFU_UTIL_H
/* USB string descriptor should contain max 126 UTF-16 characters
* but 253 would even accomodate any UTF-8 encoding */
#define MAX_DESC_STR_LEN 253
enum mode {
MODE_NONE,
MODE_VERSION,
MODE_LIST,
MODE_DETACH,
MODE_UPLOAD,
MODE_DOWNLOAD
};
extern struct dfu_if *dfu_root;
extern int match_bus;
extern int match_device;
extern int match_vendor;
extern int match_product;
extern int match_vendor_dfu;
extern int match_product_dfu;
extern int match_config_index;
extern int match_iface_index;
extern int match_iface_alt_index;
extern const char *match_iface_alt_name;
extern const char *match_serial;
extern const char *match_serial_dfu;
void probe_devices(libusb_context *);
void disconnect_devices(void);
void print_dfu_if(struct dfu_if *);
void list_dfu_interfaces(void);
#endif /* DFU_UTIL_H */
#ifndef DFU_UTIL_H
#define DFU_UTIL_H
/* USB string descriptor should contain max 126 UTF-16 characters
* but 253 would even accomodate any UTF-8 encoding */
#define MAX_DESC_STR_LEN 253
enum mode {
MODE_NONE,
MODE_VERSION,
MODE_LIST,
MODE_DETACH,
MODE_UPLOAD,
MODE_DOWNLOAD
};
extern struct dfu_if *dfu_root;
extern int match_bus;
extern int match_device;
extern int match_vendor;
extern int match_product;
extern int match_vendor_dfu;
extern int match_product_dfu;
extern int match_config_index;
extern int match_iface_index;
extern int match_iface_alt_index;
extern const char *match_iface_alt_name;
extern const char *match_serial;
extern const char *match_serial_dfu;
void probe_devices(libusb_context *);
void disconnect_devices(void);
void print_dfu_if(struct dfu_if *);
void list_dfu_interfaces(void);
#endif /* DFU_UTIL_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,35 @@
/* This implements the ST Microsystems DFU extensions (DfuSe)
* as per the DfuSe 1.1a specification (Document UM0391)
*
* (C) 2010-2012 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFUSE_H
#define DFUSE_H
#include "dfu.h"
enum dfuse_command { SET_ADDRESS, ERASE_PAGE, MASS_ERASE, READ_UNPROTECT };
int dfuse_special_command(struct dfu_if *dif, unsigned int address,
enum dfuse_command command);
int dfuse_do_upload(struct dfu_if *dif, int xfer_size, int fd,
const char *dfuse_options);
int dfuse_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file,
const char *dfuse_options);
#endif /* DFUSE_H */
/* This implements the ST Microsystems DFU extensions (DfuSe)
* as per the DfuSe 1.1a specification (Document UM0391)
*
* (C) 2010-2012 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFUSE_H
#define DFUSE_H
#include "dfu.h"
enum dfuse_command { SET_ADDRESS, ERASE_PAGE, MASS_ERASE, READ_UNPROTECT };
int dfuse_special_command(struct dfu_if *dif, unsigned int address,
enum dfuse_command command);
int dfuse_do_upload(struct dfu_if *dif, int xfer_size, int fd,
const char *dfuse_options);
int dfuse_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file,
const char *dfuse_options);
#endif /* DFUSE_H */

View File

@ -1,198 +1,198 @@
/*
* Helper functions for reading the memory map of a device
* following the ST DfuSe 1.1a specification.
*
* Copyright 2011-2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "portable.h"
#include "dfu_file.h"
#include "dfuse_mem.h"
int add_segment(struct memsegment **segment_list, struct memsegment segment)
{
struct memsegment *new_element;
new_element = dfu_malloc(sizeof(struct memsegment));
*new_element = segment;
new_element->next = NULL;
if (*segment_list == NULL)
/* list can be empty on first call */
*segment_list = new_element;
else {
struct memsegment *next_element;
/* find last element in list */
next_element = *segment_list;
while (next_element->next != NULL)
next_element = next_element->next;
next_element->next = new_element;
}
return 0;
}
struct memsegment *find_segment(struct memsegment *segment_list,
unsigned int address)
{
while (segment_list != NULL) {
if (segment_list->start <= address &&
segment_list->end >= address)
return segment_list;
segment_list = segment_list->next;
}
return NULL;
}
void free_segment_list(struct memsegment *segment_list)
{
struct memsegment *next_element;
while (segment_list->next != NULL) {
next_element = segment_list->next;
free(segment_list);
segment_list = next_element;
}
free(segment_list);
}
/* Parse memory map from interface descriptor string
* encoded as per ST document UM0424 section 4.3.2.
*/
struct memsegment *parse_memory_layout(char *intf_desc)
{
char multiplier, memtype;
unsigned int address;
int sectors, size;
char *name, *typestring;
int ret;
int count = 0;
char separator;
int scanned;
struct memsegment *segment_list = NULL;
struct memsegment segment;
name = dfu_malloc(strlen(intf_desc));
ret = sscanf(intf_desc, "@%[^/]%n", name, &scanned);
if (ret < 1) {
free(name);
warnx("Could not read name, sscanf returned %d", ret);
return NULL;
}
printf("DfuSe interface name: \"%s\"\n", name);
intf_desc += scanned;
typestring = dfu_malloc(strlen(intf_desc));
while (ret = sscanf(intf_desc, "/0x%x/%n", &address, &scanned),
ret > 0) {
intf_desc += scanned;
while (ret = sscanf(intf_desc, "%d*%d%c%[^,/]%n",
&sectors, &size, &multiplier, typestring,
&scanned), ret > 2) {
intf_desc += scanned;
count++;
memtype = 0;
if (ret == 4) {
if (strlen(typestring) == 1
&& typestring[0] != '/')
memtype = typestring[0];
else {
warnx("Parsing type identifier '%s' "
"failed for segment %i",
typestring, count);
continue;
}
}
/* Quirk for STM32F4 devices */
if (strcmp(name, "Device Feature") == 0)
memtype = 'e';
switch (multiplier) {
case 'B':
break;
case 'K':
size *= 1024;
break;
case 'M':
size *= 1024 * 1024;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
if (!memtype) {
warnx("Non-valid multiplier '%c', "
"interpreted as type "
"identifier instead",
multiplier);
memtype = multiplier;
break;
}
/* fallthrough if memtype was already set */
default:
warnx("Non-valid multiplier '%c', "
"assuming bytes", multiplier);
}
if (!memtype) {
warnx("No valid type for segment %d\n", count);
continue;
}
segment.start = address;
segment.end = address + sectors * size - 1;
segment.pagesize = size;
segment.memtype = memtype & 7;
add_segment(&segment_list, segment);
if (verbose)
printf("Memory segment at 0x%08x %3d x %4d = "
"%5d (%s%s%s)\n",
address, sectors, size, sectors * size,
memtype & DFUSE_READABLE ? "r" : "",
memtype & DFUSE_ERASABLE ? "e" : "",
memtype & DFUSE_WRITEABLE ? "w" : "");
address += sectors * size;
separator = *intf_desc;
if (separator == ',')
intf_desc += 1;
else
break;
} /* while per segment */
} /* while per address */
free(name);
free(typestring);
return segment_list;
}
/*
* Helper functions for reading the memory map of a device
* following the ST DfuSe 1.1a specification.
*
* Copyright 2011-2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "portable.h"
#include "dfu_file.h"
#include "dfuse_mem.h"
int add_segment(struct memsegment **segment_list, struct memsegment segment)
{
struct memsegment *new_element;
new_element = dfu_malloc(sizeof(struct memsegment));
*new_element = segment;
new_element->next = NULL;
if (*segment_list == NULL)
/* list can be empty on first call */
*segment_list = new_element;
else {
struct memsegment *next_element;
/* find last element in list */
next_element = *segment_list;
while (next_element->next != NULL)
next_element = next_element->next;
next_element->next = new_element;
}
return 0;
}
struct memsegment *find_segment(struct memsegment *segment_list,
unsigned int address)
{
while (segment_list != NULL) {
if (segment_list->start <= address &&
segment_list->end >= address)
return segment_list;
segment_list = segment_list->next;
}
return NULL;
}
void free_segment_list(struct memsegment *segment_list)
{
struct memsegment *next_element;
while (segment_list->next != NULL) {
next_element = segment_list->next;
free(segment_list);
segment_list = next_element;
}
free(segment_list);
}
/* Parse memory map from interface descriptor string
* encoded as per ST document UM0424 section 4.3.2.
*/
struct memsegment *parse_memory_layout(char *intf_desc)
{
char multiplier, memtype;
unsigned int address;
int sectors, size;
char *name, *typestring;
int ret;
int count = 0;
char separator;
int scanned;
struct memsegment *segment_list = NULL;
struct memsegment segment;
name = dfu_malloc(strlen(intf_desc));
ret = sscanf(intf_desc, "@%[^/]%n", name, &scanned);
if (ret < 1) {
free(name);
warnx("Could not read name, sscanf returned %d", ret);
return NULL;
}
printf("DfuSe interface name: \"%s\"\n", name);
intf_desc += scanned;
typestring = dfu_malloc(strlen(intf_desc));
while (ret = sscanf(intf_desc, "/0x%x/%n", &address, &scanned),
ret > 0) {
intf_desc += scanned;
while (ret = sscanf(intf_desc, "%d*%d%c%[^,/]%n",
&sectors, &size, &multiplier, typestring,
&scanned), ret > 2) {
intf_desc += scanned;
count++;
memtype = 0;
if (ret == 4) {
if (strlen(typestring) == 1
&& typestring[0] != '/')
memtype = typestring[0];
else {
warnx("Parsing type identifier '%s' "
"failed for segment %i",
typestring, count);
continue;
}
}
/* Quirk for STM32F4 devices */
if (strcmp(name, "Device Feature") == 0)
memtype = 'e';
switch (multiplier) {
case 'B':
break;
case 'K':
size *= 1024;
break;
case 'M':
size *= 1024 * 1024;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
if (!memtype) {
warnx("Non-valid multiplier '%c', "
"interpreted as type "
"identifier instead",
multiplier);
memtype = multiplier;
break;
}
/* fallthrough if memtype was already set */
default:
warnx("Non-valid multiplier '%c', "
"assuming bytes", multiplier);
}
if (!memtype) {
warnx("No valid type for segment %d\n", count);
continue;
}
segment.start = address;
segment.end = address + sectors * size - 1;
segment.pagesize = size;
segment.memtype = memtype & 7;
add_segment(&segment_list, segment);
if (verbose)
printf("Memory segment at 0x%08x %3d x %4d = "
"%5d (%s%s%s)\n",
address, sectors, size, sectors * size,
memtype & DFUSE_READABLE ? "r" : "",
memtype & DFUSE_ERASABLE ? "e" : "",
memtype & DFUSE_WRITEABLE ? "w" : "");
address += sectors * size;
separator = *intf_desc;
if (separator == ',')
intf_desc += 1;
else
break;
} /* while per segment */
} /* while per address */
free(name);
free(typestring);
return segment_list;
}

View File

@ -1,44 +1,44 @@
/* Helper functions for reading the memory map in a device
* following the ST DfuSe 1.1a specification.
*
* (C) 2011 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFUSE_MEM_H
#define DFUSE_MEM_H
#define DFUSE_READABLE 1
#define DFUSE_ERASABLE 2
#define DFUSE_WRITEABLE 4
struct memsegment {
unsigned int start;
unsigned int end;
int pagesize;
int memtype;
struct memsegment *next;
};
int add_segment(struct memsegment **list, struct memsegment new_element);
struct memsegment *find_segment(struct memsegment *list, unsigned int address);
void free_segment_list(struct memsegment *list);
struct memsegment *parse_memory_layout(char *intf_desc_str);
#endif /* DFUSE_MEM_H */
/* Helper functions for reading the memory map in a device
* following the ST DfuSe 1.1a specification.
*
* (C) 2011 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DFUSE_MEM_H
#define DFUSE_MEM_H
#define DFUSE_READABLE 1
#define DFUSE_ERASABLE 2
#define DFUSE_WRITEABLE 4
struct memsegment {
unsigned int start;
unsigned int end;
int pagesize;
int memtype;
struct memsegment *next;
};
int add_segment(struct memsegment **list, struct memsegment new_element);
struct memsegment *find_segment(struct memsegment *list, unsigned int address);
void free_segment_list(struct memsegment *list);
struct memsegment *parse_memory_layout(char *intf_desc_str);
#endif /* DFUSE_MEM_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,72 +1,72 @@
#ifndef PORTABLE_H
#define PORTABLE_H
#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define PACKAGE "dfu-util"
# define PACKAGE_VERSION "0.8-msvc"
# define PACKAGE_STRING "dfu-util 0.8-msvc"
# define PACKAGE_BUGREPORT "dfu-util@lists.gnumonks.org"
#endif /* HAVE_CONFIG_H */
#ifdef HAVE_FTRUNCATE
# include <unistd.h>
#else
# include <io.h>
#endif /* HAVE_FTRUNCATE */
#ifdef HAVE_NANOSLEEP
# include <time.h>
# define milli_sleep(msec) do {\
if (msec) {\
struct timespec nanosleepDelay = { (msec) / 1000, ((msec) % 1000) * 1000000 };\
nanosleep(&nanosleepDelay, NULL);\
} } while (0)
#elif defined HAVE_WINDOWS_H
# define milli_sleep(msec) do {\
if (msec) {\
Sleep(msec);\
} } while (0)
#else
# error "Can't get no sleep! Please report"
#endif /* HAVE_NANOSLEEP */
#ifdef HAVE_ERR
# include <err.h>
#else
# include <errno.h>
# include <string.h>
# define warnx(...) do {\
fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, "\n"); } while (0)
# define errx(eval, ...) do {\
warnx(__VA_ARGS__);\
exit(eval); } while (0)
# define warn(...) do {\
fprintf(stderr, "%s: ", strerror(errno));\
warnx(__VA_ARGS__); } while (0)
# define err(eval, ...) do {\
warn(__VA_ARGS__);\
exit(eval); } while (0)
#endif /* HAVE_ERR */
#ifdef HAVE_SYSEXITS_H
# include <sysexits.h>
#else
# define EX_OK 0 /* successful termination */
# define EX_USAGE 64 /* command line usage error */
# define EX_SOFTWARE 70 /* internal software error */
# define EX_IOERR 74 /* input/output error */
#endif /* HAVE_SYSEXITS_H */
#ifndef O_BINARY
# define O_BINARY 0
#endif
#ifndef off_t
# define off_t long int
#endif
#endif /* PORTABLE_H */
#ifndef PORTABLE_H
#define PORTABLE_H
#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define PACKAGE "dfu-util"
# define PACKAGE_VERSION "0.8-msvc"
# define PACKAGE_STRING "dfu-util 0.8-msvc"
# define PACKAGE_BUGREPORT "dfu-util@lists.gnumonks.org"
#endif /* HAVE_CONFIG_H */
#ifdef HAVE_FTRUNCATE
# include <unistd.h>
#else
# include <io.h>
#endif /* HAVE_FTRUNCATE */
#ifdef HAVE_NANOSLEEP
# include <time.h>
# define milli_sleep(msec) do {\
if (msec) {\
struct timespec nanosleepDelay = { (msec) / 1000, ((msec) % 1000) * 1000000 };\
nanosleep(&nanosleepDelay, NULL);\
} } while (0)
#elif defined HAVE_WINDOWS_H
# define milli_sleep(msec) do {\
if (msec) {\
Sleep(msec);\
} } while (0)
#else
# error "Can't get no sleep! Please report"
#endif /* HAVE_NANOSLEEP */
#ifdef HAVE_ERR
# include <err.h>
#else
# include <errno.h>
# include <string.h>
# define warnx(...) do {\
fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, "\n"); } while (0)
# define errx(eval, ...) do {\
warnx(__VA_ARGS__);\
exit(eval); } while (0)
# define warn(...) do {\
fprintf(stderr, "%s: ", strerror(errno));\
warnx(__VA_ARGS__); } while (0)
# define err(eval, ...) do {\
warn(__VA_ARGS__);\
exit(eval); } while (0)
#endif /* HAVE_ERR */
#ifdef HAVE_SYSEXITS_H
# include <sysexits.h>
#else
# define EX_OK 0 /* successful termination */
# define EX_USAGE 64 /* command line usage error */
# define EX_SOFTWARE 70 /* internal software error */
# define EX_IOERR 74 /* input/output error */
#endif /* HAVE_SYSEXITS_H */
#ifndef O_BINARY
# define O_BINARY 0
#endif
#ifndef off_t
# define off_t long int
#endif
#endif /* PORTABLE_H */

View File

@ -1,176 +1,176 @@
/*
* dfu-prefix
*
* Copyright 2011-2012 Stefan Schmidt <stefan@datenfreihafen.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <getopt.h>
#include <string.h>
#include "portable.h"
#include "dfu_file.h"
enum mode {
MODE_NONE,
MODE_ADD,
MODE_DEL,
MODE_CHECK
};
int verbose;
static void help(void)
{
fprintf(stderr, "Usage: dfu-prefix [options] ...\n"
" -h --help\t\t\tPrint this help message\n"
" -V --version\t\t\tPrint the version number\n"
" -c --check <file>\t\tCheck DFU prefix of <file>\n"
" -D --delete <file>\t\tDelete DFU prefix from <file>\n"
" -a --add <file>\t\tAdd DFU prefix to <file>\n"
"In combination with -a:\n"
);
fprintf(stderr, " -s --stellaris-address <address> Add TI Stellaris address prefix to <file>\n"
"In combination with -D or -c:\n"
" -T --stellaris\t\tAct on TI Stellaris address prefix of <file>\n"
"In combination with -a or -D or -c:\n"
" -L --lpc-prefix\t\tUse NXP LPC DFU prefix format\n"
);
exit(EX_USAGE);
}
static void print_version(void)
{
printf("dfu-prefix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION);
printf("Copyright 2011-2012 Stefan Schmidt, 2014 Uwe Bonnes\n"
"This program is Free Software and has ABSOLUTELY NO WARRANTY\n"
"Please report bugs to %s\n\n", PACKAGE_BUGREPORT);
}
static struct option opts[] = {
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'V' },
{ "check", 1, 0, 'c' },
{ "add", 1, 0, 'a' },
{ "delete", 1, 0, 'D' },
{ "stellaris-address", 1, 0, 's' },
{ "stellaris", 0, 0, 'T' },
{ "LPC", 0, 0, 'L' },
};
int main(int argc, char **argv)
{
struct dfu_file file;
enum mode mode = MODE_NONE;
enum prefix_type type = ZERO_PREFIX;
uint32_t lmdfu_flash_address = 0;
char *end;
/* make sure all prints are flushed */
setvbuf(stdout, NULL, _IONBF, 0);
print_version();
memset(&file, 0, sizeof(file));
while (1) {
int c, option_index = 0;
c = getopt_long(argc, argv, "hVc:a:D:p:v:d:s:TL", opts,
&option_index);
if (c == -1)
break;
switch (c) {
case 'h':
help();
break;
case 'V':
exit(0);
break;
case 'D':
file.name = optarg;
mode = MODE_DEL;
break;
case 'c':
file.name = optarg;
mode = MODE_CHECK;
break;
case 'a':
file.name = optarg;
mode = MODE_ADD;
break;
case 's':
lmdfu_flash_address = strtoul(optarg, &end, 0);
if (*end) {
errx(EX_IOERR, "Invalid lmdfu "
"address: %s", optarg);
}
/* fall-through */
case 'T':
type = LMDFU_PREFIX;
break;
case 'L':
type = LPCDFU_UNENCRYPTED_PREFIX;
break;
default:
help();
break;
}
}
if (!file.name) {
fprintf(stderr, "You need to specify a filename\n");
help();
}
switch(mode) {
case MODE_ADD:
if (type == ZERO_PREFIX)
errx(EX_IOERR, "Prefix type must be specified");
dfu_load_file(&file, MAYBE_SUFFIX, NO_PREFIX);
file.lmdfu_address = lmdfu_flash_address;
file.prefix_type = type;
printf("Adding prefix to file\n");
dfu_store_file(&file, file.size.suffix != 0, 1);
break;
case MODE_CHECK:
dfu_load_file(&file, MAYBE_SUFFIX, MAYBE_PREFIX);
show_suffix_and_prefix(&file);
if (type > ZERO_PREFIX && file.prefix_type != type)
errx(EX_IOERR, "No prefix of requested type");
break;
case MODE_DEL:
dfu_load_file(&file, MAYBE_SUFFIX, NEEDS_PREFIX);
if (type > ZERO_PREFIX && file.prefix_type != type)
errx(EX_IOERR, "No prefix of requested type");
printf("Removing prefix from file\n");
/* if there was a suffix, rewrite it */
dfu_store_file(&file, file.size.suffix != 0, 0);
break;
default:
help();
break;
}
return (0);
}
/*
* dfu-prefix
*
* Copyright 2011-2012 Stefan Schmidt <stefan@datenfreihafen.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <getopt.h>
#include <string.h>
#include "portable.h"
#include "dfu_file.h"
enum mode {
MODE_NONE,
MODE_ADD,
MODE_DEL,
MODE_CHECK
};
int verbose;
static void help(void)
{
fprintf(stderr, "Usage: dfu-prefix [options] ...\n"
" -h --help\t\t\tPrint this help message\n"
" -V --version\t\t\tPrint the version number\n"
" -c --check <file>\t\tCheck DFU prefix of <file>\n"
" -D --delete <file>\t\tDelete DFU prefix from <file>\n"
" -a --add <file>\t\tAdd DFU prefix to <file>\n"
"In combination with -a:\n"
);
fprintf(stderr, " -s --stellaris-address <address> Add TI Stellaris address prefix to <file>\n"
"In combination with -D or -c:\n"
" -T --stellaris\t\tAct on TI Stellaris address prefix of <file>\n"
"In combination with -a or -D or -c:\n"
" -L --lpc-prefix\t\tUse NXP LPC DFU prefix format\n"
);
exit(EX_USAGE);
}
static void print_version(void)
{
printf("dfu-prefix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION);
printf("Copyright 2011-2012 Stefan Schmidt, 2014 Uwe Bonnes\n"
"This program is Free Software and has ABSOLUTELY NO WARRANTY\n"
"Please report bugs to %s\n\n", PACKAGE_BUGREPORT);
}
static struct option opts[] = {
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'V' },
{ "check", 1, 0, 'c' },
{ "add", 1, 0, 'a' },
{ "delete", 1, 0, 'D' },
{ "stellaris-address", 1, 0, 's' },
{ "stellaris", 0, 0, 'T' },
{ "LPC", 0, 0, 'L' },
};
int main(int argc, char **argv)
{
struct dfu_file file;
enum mode mode = MODE_NONE;
enum prefix_type type = ZERO_PREFIX;
uint32_t lmdfu_flash_address = 0;
char *end;
/* make sure all prints are flushed */
setvbuf(stdout, NULL, _IONBF, 0);
print_version();
memset(&file, 0, sizeof(file));
while (1) {
int c, option_index = 0;
c = getopt_long(argc, argv, "hVc:a:D:p:v:d:s:TL", opts,
&option_index);
if (c == -1)
break;
switch (c) {
case 'h':
help();
break;
case 'V':
exit(0);
break;
case 'D':
file.name = optarg;
mode = MODE_DEL;
break;
case 'c':
file.name = optarg;
mode = MODE_CHECK;
break;
case 'a':
file.name = optarg;
mode = MODE_ADD;
break;
case 's':
lmdfu_flash_address = strtoul(optarg, &end, 0);
if (*end) {
errx(EX_IOERR, "Invalid lmdfu "
"address: %s", optarg);
}
/* fall-through */
case 'T':
type = LMDFU_PREFIX;
break;
case 'L':
type = LPCDFU_UNENCRYPTED_PREFIX;
break;
default:
help();
break;
}
}
if (!file.name) {
fprintf(stderr, "You need to specify a filename\n");
help();
}
switch(mode) {
case MODE_ADD:
if (type == ZERO_PREFIX)
errx(EX_IOERR, "Prefix type must be specified");
dfu_load_file(&file, MAYBE_SUFFIX, NO_PREFIX);
file.lmdfu_address = lmdfu_flash_address;
file.prefix_type = type;
printf("Adding prefix to file\n");
dfu_store_file(&file, file.size.suffix != 0, 1);
break;
case MODE_CHECK:
dfu_load_file(&file, MAYBE_SUFFIX, MAYBE_PREFIX);
show_suffix_and_prefix(&file);
if (type > ZERO_PREFIX && file.prefix_type != type)
errx(EX_IOERR, "No prefix of requested type");
break;
case MODE_DEL:
dfu_load_file(&file, MAYBE_SUFFIX, NEEDS_PREFIX);
if (type > ZERO_PREFIX && file.prefix_type != type)
errx(EX_IOERR, "No prefix of requested type");
printf("Removing prefix from file\n");
/* if there was a suffix, rewrite it */
dfu_store_file(&file, file.size.suffix != 0, 0);
break;
default:
help();
break;
}
return (0);
}

View File

@ -1,56 +1,56 @@
/*
* Simple quirk system for dfu-util
*
* Copyright 2010-2014 Tormod Volden
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdint.h>
#include "quirks.h"
uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice)
{
uint16_t quirks = 0;
/* Device returns bogus bwPollTimeout values */
if ((vendor == VENDOR_OPENMOKO || vendor == VENDOR_FIC) &&
product >= PRODUCT_FREERUNNER_FIRST &&
product <= PRODUCT_FREERUNNER_LAST)
quirks |= QUIRK_POLLTIMEOUT;
if (vendor == VENDOR_VOTI &&
product == PRODUCT_OPENPCD)
quirks |= QUIRK_POLLTIMEOUT;
/* Reports wrong DFU version in DFU descriptor */
if (vendor == VENDOR_LEAFLABS &&
product == PRODUCT_MAPLE3 &&
bcdDevice == 0x0200)
quirks |= QUIRK_FORCE_DFU11;
/* old devices(bcdDevice == 0) return bogus bwPollTimeout values */
if (vendor == VENDOR_SIEMENS &&
(product == PRODUCT_PXM40 || product == PRODUCT_PXM50) &&
bcdDevice == 0)
quirks |= QUIRK_POLLTIMEOUT;
/* M-Audio Transit returns bogus bwPollTimeout values */
if (vendor == VENDOR_MIDIMAN &&
product == PRODUCT_TRANSIT)
quirks |= QUIRK_POLLTIMEOUT;
return (quirks);
}
/*
* Simple quirk system for dfu-util
*
* Copyright 2010-2014 Tormod Volden
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdint.h>
#include "quirks.h"
uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice)
{
uint16_t quirks = 0;
/* Device returns bogus bwPollTimeout values */
if ((vendor == VENDOR_OPENMOKO || vendor == VENDOR_FIC) &&
product >= PRODUCT_FREERUNNER_FIRST &&
product <= PRODUCT_FREERUNNER_LAST)
quirks |= QUIRK_POLLTIMEOUT;
if (vendor == VENDOR_VOTI &&
product == PRODUCT_OPENPCD)
quirks |= QUIRK_POLLTIMEOUT;
/* Reports wrong DFU version in DFU descriptor */
if (vendor == VENDOR_LEAFLABS &&
product == PRODUCT_MAPLE3 &&
bcdDevice == 0x0200)
quirks |= QUIRK_FORCE_DFU11;
/* old devices(bcdDevice == 0) return bogus bwPollTimeout values */
if (vendor == VENDOR_SIEMENS &&
(product == PRODUCT_PXM40 || product == PRODUCT_PXM50) &&
bcdDevice == 0)
quirks |= QUIRK_POLLTIMEOUT;
/* M-Audio Transit returns bogus bwPollTimeout values */
if (vendor == VENDOR_MIDIMAN &&
product == PRODUCT_TRANSIT)
quirks |= QUIRK_POLLTIMEOUT;
return (quirks);
}

View File

@ -1,27 +1,27 @@
#ifndef DFU_QUIRKS_H
#define DFU_QUIRKS_H
#define VENDOR_OPENMOKO 0x1d50 /* Openmoko Freerunner / GTA02 */
#define VENDOR_FIC 0x1457 /* Openmoko Freerunner / GTA02 */
#define VENDOR_VOTI 0x16c0 /* OpenPCD Reader */
#define VENDOR_LEAFLABS 0x1eaf /* Maple */
#define VENDOR_SIEMENS 0x0908 /* Siemens AG */
#define VENDOR_MIDIMAN 0x0763 /* Midiman */
#define PRODUCT_FREERUNNER_FIRST 0x5117
#define PRODUCT_FREERUNNER_LAST 0x5126
#define PRODUCT_OPENPCD 0x076b
#define PRODUCT_MAPLE3 0x0003 /* rev 3 and 5 */
#define PRODUCT_PXM40 0x02c4 /* Siemens AG, PXM 40 */
#define PRODUCT_PXM50 0x02c5 /* Siemens AG, PXM 50 */
#define PRODUCT_TRANSIT 0x2806 /* M-Audio Transit (Midiman) */
#define QUIRK_POLLTIMEOUT (1<<0)
#define QUIRK_FORCE_DFU11 (1<<1)
/* Fallback value, works for OpenMoko */
#define DEFAULT_POLLTIMEOUT 5
uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice);
#endif /* DFU_QUIRKS_H */
#ifndef DFU_QUIRKS_H
#define DFU_QUIRKS_H
#define VENDOR_OPENMOKO 0x1d50 /* Openmoko Freerunner / GTA02 */
#define VENDOR_FIC 0x1457 /* Openmoko Freerunner / GTA02 */
#define VENDOR_VOTI 0x16c0 /* OpenPCD Reader */
#define VENDOR_LEAFLABS 0x1eaf /* Maple */
#define VENDOR_SIEMENS 0x0908 /* Siemens AG */
#define VENDOR_MIDIMAN 0x0763 /* Midiman */
#define PRODUCT_FREERUNNER_FIRST 0x5117
#define PRODUCT_FREERUNNER_LAST 0x5126
#define PRODUCT_OPENPCD 0x076b
#define PRODUCT_MAPLE3 0x0003 /* rev 3 and 5 */
#define PRODUCT_PXM40 0x02c4 /* Siemens AG, PXM 40 */
#define PRODUCT_PXM50 0x02c5 /* Siemens AG, PXM 50 */
#define PRODUCT_TRANSIT 0x2806 /* M-Audio Transit (Midiman) */
#define QUIRK_POLLTIMEOUT (1<<0)
#define QUIRK_FORCE_DFU11 (1<<1)
/* Fallback value, works for OpenMoko */
#define DEFAULT_POLLTIMEOUT 5
uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice);
#endif /* DFU_QUIRKS_H */

View File

@ -1,176 +1,176 @@
/*
* dfu-suffix
*
* Copyright 2011-2012 Stefan Schmidt <stefan@datenfreihafen.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <getopt.h>
#include <string.h>
#include "portable.h"
#include "dfu_file.h"
enum mode {
MODE_NONE,
MODE_ADD,
MODE_DEL,
MODE_CHECK
};
int verbose;
static void help(void)
{
fprintf(stderr, "Usage: dfu-suffix [options] ...\n"
" -h --help\t\t\tPrint this help message\n"
" -V --version\t\t\tPrint the version number\n"
" -c --check <file>\t\tCheck DFU suffix of <file>\n"
" -a --add <file>\t\tAdd DFU suffix to <file>\n"
" -D --delete <file>\t\tDelete DFU suffix from <file>\n"
" -p --pid <productID>\t\tAdd product ID into DFU suffix in <file>\n"
" -v --vid <vendorID>\t\tAdd vendor ID into DFU suffix in <file>\n"
" -d --did <deviceID>\t\tAdd device ID into DFU suffix in <file>\n"
" -S --spec <specID>\t\tAdd DFU specification ID into DFU suffix in <file>\n"
);
exit(EX_USAGE);
}
static void print_version(void)
{
printf("dfu-suffix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION);
printf("Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden\n"
"This program is Free Software and has ABSOLUTELY NO WARRANTY\n"
"Please report bugs to %s\n\n", PACKAGE_BUGREPORT);
}
static struct option opts[] = {
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'V' },
{ "check", 1, 0, 'c' },
{ "add", 1, 0, 'a' },
{ "delete", 1, 0, 'D' },
{ "pid", 1, 0, 'p' },
{ "vid", 1, 0, 'v' },
{ "did", 1, 0, 'd' },
{ "spec", 1, 0, 'S' },
};
int main(int argc, char **argv)
{
struct dfu_file file;
int pid, vid, did, spec;
enum mode mode = MODE_NONE;
/* make sure all prints are flushed */
setvbuf(stdout, NULL, _IONBF, 0);
print_version();
pid = vid = did = 0xffff;
spec = 0x0100; /* Default to bcdDFU version 1.0 */
memset(&file, 0, sizeof(file));
while (1) {
int c, option_index = 0;
c = getopt_long(argc, argv, "hVc:a:D:p:v:d:S:s:T", opts,
&option_index);
if (c == -1)
break;
switch (c) {
case 'h':
help();
break;
case 'V':
exit(0);
break;
case 'D':
file.name = optarg;
mode = MODE_DEL;
break;
case 'p':
pid = strtol(optarg, NULL, 16);
break;
case 'v':
vid = strtol(optarg, NULL, 16);
break;
case 'd':
did = strtol(optarg, NULL, 16);
break;
case 'S':
spec = strtol(optarg, NULL, 16);
break;
case 'c':
file.name = optarg;
mode = MODE_CHECK;
break;
case 'a':
file.name = optarg;
mode = MODE_ADD;
break;
default:
help();
break;
}
}
if (!file.name) {
fprintf(stderr, "You need to specify a filename\n");
help();
}
if (spec != 0x0100 && spec != 0x011a) {
fprintf(stderr, "Only DFU specification 0x0100 and 0x011a supported\n");
help();
}
switch(mode) {
case MODE_ADD:
dfu_load_file(&file, NO_SUFFIX, MAYBE_PREFIX);
file.idVendor = vid;
file.idProduct = pid;
file.bcdDevice = did;
file.bcdDFU = spec;
/* always write suffix, rewrite prefix if there was one */
dfu_store_file(&file, 1, file.size.prefix != 0);
printf("Suffix successfully added to file\n");
break;
case MODE_CHECK:
dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX);
show_suffix_and_prefix(&file);
break;
case MODE_DEL:
dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX);
dfu_store_file(&file, 0, file.size.prefix != 0);
if (file.size.suffix) /* had a suffix */
printf("Suffix successfully removed from file\n");
break;
default:
help();
break;
}
return (0);
}
/*
* dfu-suffix
*
* Copyright 2011-2012 Stefan Schmidt <stefan@datenfreihafen.org>
* Copyright 2013 Hans Petter Selasky <hps@bitfrost.no>
* Copyright 2014 Tormod Volden <debian.tormod@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <getopt.h>
#include <string.h>
#include "portable.h"
#include "dfu_file.h"
enum mode {
MODE_NONE,
MODE_ADD,
MODE_DEL,
MODE_CHECK
};
int verbose;
static void help(void)
{
fprintf(stderr, "Usage: dfu-suffix [options] ...\n"
" -h --help\t\t\tPrint this help message\n"
" -V --version\t\t\tPrint the version number\n"
" -c --check <file>\t\tCheck DFU suffix of <file>\n"
" -a --add <file>\t\tAdd DFU suffix to <file>\n"
" -D --delete <file>\t\tDelete DFU suffix from <file>\n"
" -p --pid <productID>\t\tAdd product ID into DFU suffix in <file>\n"
" -v --vid <vendorID>\t\tAdd vendor ID into DFU suffix in <file>\n"
" -d --did <deviceID>\t\tAdd device ID into DFU suffix in <file>\n"
" -S --spec <specID>\t\tAdd DFU specification ID into DFU suffix in <file>\n"
);
exit(EX_USAGE);
}
static void print_version(void)
{
printf("dfu-suffix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION);
printf("Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden\n"
"This program is Free Software and has ABSOLUTELY NO WARRANTY\n"
"Please report bugs to %s\n\n", PACKAGE_BUGREPORT);
}
static struct option opts[] = {
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'V' },
{ "check", 1, 0, 'c' },
{ "add", 1, 0, 'a' },
{ "delete", 1, 0, 'D' },
{ "pid", 1, 0, 'p' },
{ "vid", 1, 0, 'v' },
{ "did", 1, 0, 'd' },
{ "spec", 1, 0, 'S' },
};
int main(int argc, char **argv)
{
struct dfu_file file;
int pid, vid, did, spec;
enum mode mode = MODE_NONE;
/* make sure all prints are flushed */
setvbuf(stdout, NULL, _IONBF, 0);
print_version();
pid = vid = did = 0xffff;
spec = 0x0100; /* Default to bcdDFU version 1.0 */
memset(&file, 0, sizeof(file));
while (1) {
int c, option_index = 0;
c = getopt_long(argc, argv, "hVc:a:D:p:v:d:S:s:T", opts,
&option_index);
if (c == -1)
break;
switch (c) {
case 'h':
help();
break;
case 'V':
exit(0);
break;
case 'D':
file.name = optarg;
mode = MODE_DEL;
break;
case 'p':
pid = strtol(optarg, NULL, 16);
break;
case 'v':
vid = strtol(optarg, NULL, 16);
break;
case 'd':
did = strtol(optarg, NULL, 16);
break;
case 'S':
spec = strtol(optarg, NULL, 16);
break;
case 'c':
file.name = optarg;
mode = MODE_CHECK;
break;
case 'a':
file.name = optarg;
mode = MODE_ADD;
break;
default:
help();
break;
}
}
if (!file.name) {
fprintf(stderr, "You need to specify a filename\n");
help();
}
if (spec != 0x0100 && spec != 0x011a) {
fprintf(stderr, "Only DFU specification 0x0100 and 0x011a supported\n");
help();
}
switch(mode) {
case MODE_ADD:
dfu_load_file(&file, NO_SUFFIX, MAYBE_PREFIX);
file.idVendor = vid;
file.idProduct = pid;
file.bcdDevice = did;
file.bcdDFU = spec;
/* always write suffix, rewrite prefix if there was one */
dfu_store_file(&file, 1, file.size.prefix != 0);
printf("Suffix successfully added to file\n");
break;
case MODE_CHECK:
dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX);
show_suffix_and_prefix(&file);
break;
case MODE_DEL:
dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX);
dfu_store_file(&file, 0, file.size.prefix != 0);
if (file.size.suffix) /* had a suffix */
printf("Suffix successfully removed from file\n");
break;
default:
help();
break;
}
return (0);
}

View File

@ -1,99 +1,99 @@
#ifndef USB_DFU_H
#define USB_DFU_H
/* USB Device Firmware Update Implementation for OpenPCD
* (C) 2006 by Harald Welte <hwelte@hmw-consulting.de>
*
* Protocol definitions for USB DFU
*
* This ought to be compliant to the USB DFU Spec 1.0 as available from
* http://www.usb.org/developers/devclass_docs/usbdfu10.pdf
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdint.h>
#define USB_DT_DFU 0x21
#ifdef _MSC_VER
# pragma pack(push)
# pragma pack(1)
#endif /* _MSC_VER */
struct usb_dfu_func_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bmAttributes;
#define USB_DFU_CAN_DOWNLOAD (1 << 0)
#define USB_DFU_CAN_UPLOAD (1 << 1)
#define USB_DFU_MANIFEST_TOL (1 << 2)
#define USB_DFU_WILL_DETACH (1 << 3)
uint16_t wDetachTimeOut;
uint16_t wTransferSize;
uint16_t bcdDFUVersion;
#ifdef _MSC_VER
};
# pragma pack(pop)
#elif defined __GNUC__
} __attribute__ ((packed));
#else
#warning "No way to pack struct on this compiler? This will break!"
#endif /* _MSC_VER */
#define USB_DT_DFU_SIZE 9
#define USB_TYPE_DFU (LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE)
/* DFU class-specific requests (Section 3, DFU Rev 1.1) */
#define USB_REQ_DFU_DETACH 0x00
#define USB_REQ_DFU_DNLOAD 0x01
#define USB_REQ_DFU_UPLOAD 0x02
#define USB_REQ_DFU_GETSTATUS 0x03
#define USB_REQ_DFU_CLRSTATUS 0x04
#define USB_REQ_DFU_GETSTATE 0x05
#define USB_REQ_DFU_ABORT 0x06
/* DFU_GETSTATUS bStatus values (Section 6.1.2, DFU Rev 1.1) */
#define DFU_STATUS_OK 0x00
#define DFU_STATUS_errTARGET 0x01
#define DFU_STATUS_errFILE 0x02
#define DFU_STATUS_errWRITE 0x03
#define DFU_STATUS_errERASE 0x04
#define DFU_STATUS_errCHECK_ERASED 0x05
#define DFU_STATUS_errPROG 0x06
#define DFU_STATUS_errVERIFY 0x07
#define DFU_STATUS_errADDRESS 0x08
#define DFU_STATUS_errNOTDONE 0x09
#define DFU_STATUS_errFIRMWARE 0x0a
#define DFU_STATUS_errVENDOR 0x0b
#define DFU_STATUS_errUSBR 0x0c
#define DFU_STATUS_errPOR 0x0d
#define DFU_STATUS_errUNKNOWN 0x0e
#define DFU_STATUS_errSTALLEDPKT 0x0f
enum dfu_state {
DFU_STATE_appIDLE = 0,
DFU_STATE_appDETACH = 1,
DFU_STATE_dfuIDLE = 2,
DFU_STATE_dfuDNLOAD_SYNC = 3,
DFU_STATE_dfuDNBUSY = 4,
DFU_STATE_dfuDNLOAD_IDLE = 5,
DFU_STATE_dfuMANIFEST_SYNC = 6,
DFU_STATE_dfuMANIFEST = 7,
DFU_STATE_dfuMANIFEST_WAIT_RST = 8,
DFU_STATE_dfuUPLOAD_IDLE = 9,
DFU_STATE_dfuERROR = 10
};
#endif /* USB_DFU_H */
#ifndef USB_DFU_H
#define USB_DFU_H
/* USB Device Firmware Update Implementation for OpenPCD
* (C) 2006 by Harald Welte <hwelte@hmw-consulting.de>
*
* Protocol definitions for USB DFU
*
* This ought to be compliant to the USB DFU Spec 1.0 as available from
* http://www.usb.org/developers/devclass_docs/usbdfu10.pdf
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdint.h>
#define USB_DT_DFU 0x21
#ifdef _MSC_VER
# pragma pack(push)
# pragma pack(1)
#endif /* _MSC_VER */
struct usb_dfu_func_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bmAttributes;
#define USB_DFU_CAN_DOWNLOAD (1 << 0)
#define USB_DFU_CAN_UPLOAD (1 << 1)
#define USB_DFU_MANIFEST_TOL (1 << 2)
#define USB_DFU_WILL_DETACH (1 << 3)
uint16_t wDetachTimeOut;
uint16_t wTransferSize;
uint16_t bcdDFUVersion;
#ifdef _MSC_VER
};
# pragma pack(pop)
#elif defined __GNUC__
} __attribute__ ((packed));
#else
#warning "No way to pack struct on this compiler? This will break!"
#endif /* _MSC_VER */
#define USB_DT_DFU_SIZE 9
#define USB_TYPE_DFU (LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE)
/* DFU class-specific requests (Section 3, DFU Rev 1.1) */
#define USB_REQ_DFU_DETACH 0x00
#define USB_REQ_DFU_DNLOAD 0x01
#define USB_REQ_DFU_UPLOAD 0x02
#define USB_REQ_DFU_GETSTATUS 0x03
#define USB_REQ_DFU_CLRSTATUS 0x04
#define USB_REQ_DFU_GETSTATE 0x05
#define USB_REQ_DFU_ABORT 0x06
/* DFU_GETSTATUS bStatus values (Section 6.1.2, DFU Rev 1.1) */
#define DFU_STATUS_OK 0x00
#define DFU_STATUS_errTARGET 0x01
#define DFU_STATUS_errFILE 0x02
#define DFU_STATUS_errWRITE 0x03
#define DFU_STATUS_errERASE 0x04
#define DFU_STATUS_errCHECK_ERASED 0x05
#define DFU_STATUS_errPROG 0x06
#define DFU_STATUS_errVERIFY 0x07
#define DFU_STATUS_errADDRESS 0x08
#define DFU_STATUS_errNOTDONE 0x09
#define DFU_STATUS_errFIRMWARE 0x0a
#define DFU_STATUS_errVENDOR 0x0b
#define DFU_STATUS_errUSBR 0x0c
#define DFU_STATUS_errPOR 0x0d
#define DFU_STATUS_errUNKNOWN 0x0e
#define DFU_STATUS_errSTALLEDPKT 0x0f
enum dfu_state {
DFU_STATE_appIDLE = 0,
DFU_STATE_appDETACH = 1,
DFU_STATE_dfuIDLE = 2,
DFU_STATE_dfuDNLOAD_SYNC = 3,
DFU_STATE_dfuDNBUSY = 4,
DFU_STATE_dfuDNLOAD_IDLE = 5,
DFU_STATE_dfuMANIFEST_SYNC = 6,
DFU_STATE_dfuMANIFEST = 7,
DFU_STATE_dfuMANIFEST_WAIT_RST = 8,
DFU_STATE_dfuUPLOAD_IDLE = 9,
DFU_STATE_dfuERROR = 10
};
#endif /* USB_DFU_H */

View File

@ -1,147 +1,147 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>Building dfu-util from source</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Tormod Volden" />
<meta name="keywords" content="dfu-util, build, compile" />
<meta name="description" content="How to build dfu-util from source" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>How to build dfu-util from source</h1>
<h2>Prerequisites for building from git</h2>
<h3>Mac OS X</h3>
<p>
First install MacPorts (and if you are on 10.6 or older, the Java Developer Package) and then run:
</p>
<pre>
sudo port install libusb-devel git-core
</pre>
<h3>FreeBSD</h3>
<pre>
sudo pkg_add -r git pkgconf
</pre>
<h3>Ubuntu and Debian and derivatives</h3>
<pre>
sudo apt-get build-dep dfu-util
sudo apt-get install libusb-1.0-0-dev
</pre>
<h2>Get the source code and build it</h2>
<p>
The first time you will have to clone the git repository:
</p>
<pre>
git clone git://gitorious.org/dfu-util/dfu-util.git
cd dfu-util
</pre>
<p>
If you later want to update to latest git version, just run this:
</p>
<pre>
make maintainer-clean
git pull
</pre>
<p>
To build the source:
</p>
<pre>
./autogen.sh
./configure # on most systems
make
</pre>
<p>
If you are building on Mac OS X, replace the ./configure command with:
</p>
<pre>
./configure --libdir=/opt/local/lib --includedir=/opt/local/include # on MacOSX only
</pre>
<p>
Your dfu-util binary will be inside the src folder. Use it from there, or install it to /usr/local/bin by running "sudo make install".
</p>
<h2>Cross-building for Windows</h2>
<p>
Windows binaries can be built in a <a href="http://mingw.org/">MinGW</a>
environment, on a Windows computer or cross-hosted in another OS.
To build it on a Debian or Ubuntu host, first install build dependencies:
</p>
<pre>
sudo apt-get build-dep libusb-1.0-0 dfu-util
sudo apt-get install mingw32
</pre>
<p>
The below example builds dfu-util 0.8 and libusb 1.0.19 from unpacked release
tarballs. If you instead build from git, you will have to run "./autogen.sh"
before running the "./configure" steps.
</p>
<pre>
mkdir -p build
cd libusb-1.0.19
PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
--host=i586-mingw32msvc --prefix=$PWD/../build
# WINVER workaround needed for 1.0.19 only
make CFLAGS="-DWINVER=0x0501"
make install
cd ..
cd dfu-util-0.8
PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
--host=i586-mingw32msvc --prefix=$PWD/../build
make
make install
cd ..
</pre>
The build files will now be in build/bin.
<p>
<h2>Building on Windows using MinGW</h2>
This assumes using release tarballs or having run ./autogen.sh on
the git sources.
<pre>
cd libusb-1.0.19
./configure --prefix=$HOME
# WINVER workaround needed for 1.0.19 only
# MKDIR_P setting should not really be needed...
make CFLAGS="-DWINVER=0x0501" MKDIR_P="mkdir -p"
make install
cd ..
cd dfu-util-0.8
./configure USB_CFLAGS="-I$HOME/include/libusb-1.0" \
USB_LIBS="-L $HOME/lib -lusb-1.0" PKG_CONFIG=true
make
make install
cd ..
</pre>
To link libusb statically into dfu-util.exe use instead of "make":
<pre>
make LDFLAGS=-static
</pre>
The built executables (and DLL) will now be under $HOME/bin.
<p>
[<a href="index.html">Back to dfu-util main page</a>]
</p>
<p id="footer">
&copy;2014 Tormod Volden &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>Building dfu-util from source</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Tormod Volden" />
<meta name="keywords" content="dfu-util, build, compile" />
<meta name="description" content="How to build dfu-util from source" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>How to build dfu-util from source</h1>
<h2>Prerequisites for building from git</h2>
<h3>Mac OS X</h3>
<p>
First install MacPorts (and if you are on 10.6 or older, the Java Developer Package) and then run:
</p>
<pre>
sudo port install libusb-devel git-core
</pre>
<h3>FreeBSD</h3>
<pre>
sudo pkg_add -r git pkgconf
</pre>
<h3>Ubuntu and Debian and derivatives</h3>
<pre>
sudo apt-get build-dep dfu-util
sudo apt-get install libusb-1.0-0-dev
</pre>
<h2>Get the source code and build it</h2>
<p>
The first time you will have to clone the git repository:
</p>
<pre>
git clone git://gitorious.org/dfu-util/dfu-util.git
cd dfu-util
</pre>
<p>
If you later want to update to latest git version, just run this:
</p>
<pre>
make maintainer-clean
git pull
</pre>
<p>
To build the source:
</p>
<pre>
./autogen.sh
./configure # on most systems
make
</pre>
<p>
If you are building on Mac OS X, replace the ./configure command with:
</p>
<pre>
./configure --libdir=/opt/local/lib --includedir=/opt/local/include # on MacOSX only
</pre>
<p>
Your dfu-util binary will be inside the src folder. Use it from there, or install it to /usr/local/bin by running "sudo make install".
</p>
<h2>Cross-building for Windows</h2>
<p>
Windows binaries can be built in a <a href="http://mingw.org/">MinGW</a>
environment, on a Windows computer or cross-hosted in another OS.
To build it on a Debian or Ubuntu host, first install build dependencies:
</p>
<pre>
sudo apt-get build-dep libusb-1.0-0 dfu-util
sudo apt-get install mingw32
</pre>
<p>
The below example builds dfu-util 0.8 and libusb 1.0.19 from unpacked release
tarballs. If you instead build from git, you will have to run "./autogen.sh"
before running the "./configure" steps.
</p>
<pre>
mkdir -p build
cd libusb-1.0.19
PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
--host=i586-mingw32msvc --prefix=$PWD/../build
# WINVER workaround needed for 1.0.19 only
make CFLAGS="-DWINVER=0x0501"
make install
cd ..
cd dfu-util-0.8
PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
--host=i586-mingw32msvc --prefix=$PWD/../build
make
make install
cd ..
</pre>
The build files will now be in build/bin.
<p>
<h2>Building on Windows using MinGW</h2>
This assumes using release tarballs or having run ./autogen.sh on
the git sources.
<pre>
cd libusb-1.0.19
./configure --prefix=$HOME
# WINVER workaround needed for 1.0.19 only
# MKDIR_P setting should not really be needed...
make CFLAGS="-DWINVER=0x0501" MKDIR_P="mkdir -p"
make install
cd ..
cd dfu-util-0.8
./configure USB_CFLAGS="-I$HOME/include/libusb-1.0" \
USB_LIBS="-L $HOME/lib -lusb-1.0" PKG_CONFIG=true
make
make install
cd ..
</pre>
To link libusb statically into dfu-util.exe use instead of "make":
<pre>
make LDFLAGS=-static
</pre>
The built executables (and DLL) will now be under $HOME/bin.
<p>
[<a href="index.html">Back to dfu-util main page</a>]
</p>
<p id="footer">
&copy;2014 Tormod Volden &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>

View File

@ -1,411 +1,411 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML><HEAD><TITLE>Man page of DFU-UTIL</TITLE>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</HEAD><BODY>
<H1>DFU-UTIL(1)</H1>
<A NAME="lbAB">&nbsp;</A>
<H2>NAME</H2>
dfu-util - Device firmware update (DFU) USB programmer
<A NAME="lbAC">&nbsp;</A>
<H2>SYNOPSIS</H2>
<DL COMPACT>
<DT>
<B>dfu-util</B>
<B>-l </B>
[<B>-v</B>]
[<B>-d</B>
<I>vid:pid</I>[,<I>vid:pid</I>]]
[<B>-p</B>
<I>path</I>]
[<B>-c</B>
<I>configuration</I>]
[<B>-i</B>
<I>interface</I>]
[<B>-a</B>
<I>alt-intf</I>]
[<B>-S</B>
<I>serial</I>[,<I>serial</I>]]
<DT>
<B>dfu-util</B>
[<B>-v</B>]
[<B>-d</B>
<I>vid:pid</I>[,<I>vid:pid</I>]]
[<B>-p</B>
<I>path</I>]
[<B>-c</B>
<I>configuration</I>]
[<B>-i</B>
<I>interface</I>]
[<B>-a</B>
<I>alt-intf</I>]
[<B>-S</B>
<I>serial</I>[,<I>serial</I>]]
[<B>-t</B>
<I>size</I>]
[<B>-Z</B>
<I>size</I>]
[<B>-s</B>
<I>address</I>]
[<B>-R</B>]
[<B>-D</B>|<B>-U</B>
<I>file</I>]
<DT>
<B>dfu-util</B>
[<B>-hV</B>]
</DL>
<A NAME="lbAD">&nbsp;</A>
<H2>DESCRIPTION</H2>
<B>dfu-util</B>
is a program that implements the host (computer) side of the USB DFU
(Universal Serial Bus Device Firmware Upgrade) protocol.
<P>
dfu-util communicates with devices that implement the device side of the
USB DFU protocol, and is often used to upgrade the firmware of such
devices.
<A NAME="lbAE">&nbsp;</A>
<H2>OPTIONS</H2>
<DL COMPACT>
<DT><B>-l, --list</B>
<DD>
List the currently attached DFU capable USB devices.
<DT><B>-d, --device</B> [<I>Run-Time VENDOR</I>]:[<I>Run-Time PRODUCT</I>][,[<I>DFU Mode VENDOR</I>]:[<I>DFU Mode PRODUCT</I>]]
<DD>
<DL COMPACT><DT><DD>
Specify run-time and/or DFU mode vendor and/or product IDs of the DFU device
to work with. <B>VENDOR</B> and <B>PRODUCT</B> are hexadecimal numbers (no prefix
needed), &quot;*&quot; (match any), or &quot;-&quot; (match nothing). By default, any DFU capable
device in either run-time or DFU mode will be considered.
<P>
If you only have one standards-compliant DFU device attached to your computer,
this parameter is optional. However, as soon as you have multiple DFU devices
connected, dfu-util will detect this and abort, asking you to specify which
device to use.
<P>
If only run-time IDs are specified (e.g. &quot;<B>--device 1457:51ab</B>&quot;), then in
addition to the specified run-time IDs, any DFU mode devices will also be
considered. This is beneficial to allow a DFU capable device to be found
again after a switch to DFU mode, since the vendor and/or product ID of a
device usually changes in DFU mode.
<P>
If only DFU mode IDs are specified (e.g. &quot;<B>--device ,951:26</B>&quot;), then all
run-time devices will be ignored, making it easy to target a specific device in
DFU mode.
<P>
If both run-time and DFU mode IDs are specified (e.g. &quot;<B>--device
1457:51ab,:2bc</B>&quot;), then unspecified DFU mode components will use the run-time
value specified.
<P>
Examples:
<DL COMPACT>
<DT><B>--device 1457:51ab,951:26</B>
<DD>
<BR>
Work with a device in run-time mode with
vendor ID 0x1457 and product ID 0x51ab, or in DFU mode with vendor ID 0x0951
and product ID 0x0026
<P>
<DT><B>--device 1457:51ab,:2bc</B>
<DD>
<BR>
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with vendor ID 0x1457 and product ID 0x02bc
<P>
<DT><B>--device 1457:51ab</B>
<DD>
<BR>
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with any vendor and product ID
<P>
<DT><B>--device ,951:26</B>
<DD>
<BR>
Work with a device in DFU mode with vendor ID 0x0951 and product ID 0x0026
<P>
<DT><B>--device *,-</B>
<DD>
<BR>
Work with any device in run-time mode, and ignore any device in DFU mode
<P>
<DT><B>--device ,</B>
<DD>
<BR>
Ignore any device in run-time mode, and Work with any device in DFU mode
</DL>
</DL>
<DT><B>-p, --path</B> BUS-PORT. ... .PORT
<DD>
Specify the path to the DFU device.
<DT><B>-c, --cfg</B> CONFIG-NR
<DD>
Specify the configuration of the DFU device. Note that this is only used for matching, the configuration is not set by dfu-util.
<DT><B>-i, --intf</B> INTF-NR
<DD>
Specify the DFU interface number.
<DT><B>-a, --alt</B> ALT
<DD>
Specify the altsetting of the DFU interface by name or by number.
<DT><B>-S, --serial</B> [<I>Run-Time SERIAL</I>][,[<I>DFU Mode SERIAL</I>]]
<DD>
Specify the run-time and DFU mode serial numbers used to further restrict
device matches. If multiple, identical DFU devices are simultaneously
connected to a system then vendor and product ID will be insufficient for
targeting a single device. In this situation, it may be possible to use this
parameter to specify a serial number which also must match.
<P>
If only a single serial number is specified, then the same serial number is
used in both run-time and DFU mode. An empty serial number will match any
serial number in the corresponding mode.
<DT><B>-t, --transfer-size SIZE</B>
<DD>
Specify the number of bytes per USB transfer. The optimal value is
usually determined automatically so this option is rarely useful. If
you need to use this option for a device, please report it as a bug.
<DT><B>-Z, --upload-size SIZE</B>
<DD>
Specify the expected upload size, in bytes.
<DT><B>-U, --upload</B> FILE
<DD>
Read firmware from device into
<B>FILE</B>.
<DT><B>-D, --download</B> FILE
<DD>
Write firmware from
<B>FILE</B>
into device.
<DT><B>-R, --reset</B>
<DD>
Issue USB reset signalling after upload or download has finished.
<DT><B>-s, --dfuse-address</B> address
<DD>
Specify target address for raw binary download/upload on DfuSe devices. Do
<B>not</B>
use this for downloading DfuSe (.dfu) files. Modifiers can be added
to the address, separated by a colon, to perform special DfuSE commands such
as &quot;leave&quot; DFU mode, &quot;unprotect&quot; and &quot;mass-erase&quot; flash memory.
<DT><B>-v, --verbose</B>
<DD>
Print more information about dfu-util's operation. A second
<B>-v</B>
will turn on verbose logging of USB requests. Repeat this option to further
increase verbosity.
<DT><B>-h, --help</B>
<DD>
Show a help text and exit.
<DT><B>-V, --version</B>
<DD>
Show version information and exit.
</DL>
<A NAME="lbAF">&nbsp;</A>
<H2>EXAMPLES</H2>
<A NAME="lbAG">&nbsp;</A>
<H3>Using dfu-util in the OpenMoko project</H3>
(with the Neo1973 hardware)
<P>
Flashing the rootfs:
<BR>
<B> $ dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2</B>
<P>
Flashing the kernel:
<BR>
<B> $ dfu-util -a kernel -R -D /path/to/uImage</B>
<P>
Flashing the bootloader:
<BR>
<B> $ dfu-util -a u-boot -R -D /path/to/u-boot.bin</B>
<P>
Copying a kernel into RAM:
<BR>
<B> $ dfu-util -a 0 -R -D /path/to/uImage</B>
<P>
Once this has finished, the kernel will be available at the default load
address of 0x32000000 in Neo1973 RAM.
<B>Note:</B>
You cannot transfer more than 2MB of data into RAM using this method.
<P>
<A NAME="lbAH">&nbsp;</A>
<H3>Using dfu-util with a DfuSe device</H3>
<P>
Flashing a
<B>.dfu</B>
(special DfuSe format) file to the device:
<BR>
<B> $ dfu-util -a 0 -D /path/to/dfuse-image.dfu</B>
<P>
Reading out 1 KB of flash starting at address 0x8000000:
<BR>
<B> $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin</B>
<P>
Flashing a binary file to address 0x8004000 of device memory and
ask the device to leave DFU mode:
<BR>
<B> $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin</B>
<A NAME="lbAI">&nbsp;</A>
<H2>BUGS</H2>
Please report any bugs to the dfu-util mailing list at
<B><A HREF="mailto:dfu-util@lists.gnumonks.org">dfu-util@lists.gnumonks.org</A></B>.
Please use the
<I>--verbose</I> option (repeated as necessary) to provide more
information in your bug report.
<A NAME="lbAJ">&nbsp;</A>
<H2>SEE ALSO</H2>
The dfu-util home page is
<B><A HREF="http://dfu-util.gnumonks.org">http://dfu-util.gnumonks.org</A></B>
<A NAME="lbAK">&nbsp;</A>
<H2>HISTORY</H2>
dfu-util was originally written for the OpenMoko project by
Weston Schmidt &lt;<A HREF="mailto:weston_schmidt@yahoo.com">weston_schmidt@yahoo.com</A>&gt; and
Harald Welte &lt;<A HREF="mailto:hwelte@hmw-consulting.de">hwelte@hmw-consulting.de</A>&gt;. Over time, nearly complete
support of DFU 1.0, DFU 1.1 and DfuSe (&quot;1.1a&quot;) has been added.
<A NAME="lbAL">&nbsp;</A>
<H2>LICENCE</H2>
<B>dfu-util</B>
is covered by the GNU General Public License (GPL), version 2 or later.
<A NAME="lbAM">&nbsp;</A>
<H2>COPYRIGHT</H2>
This manual page was originally written by Uwe Hermann &lt;<A HREF="mailto:uwe@hermann-uwe.de">uwe@hermann-uwe.de</A>&gt;,
and is now part of the dfu-util project.
<P>
<HR>
<A NAME="index">&nbsp;</A><H2>Index</H2>
<DL>
<DT><A HREF="#lbAB">NAME</A><DD>
<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
<DT><A HREF="#lbAE">OPTIONS</A><DD>
<DT><A HREF="#lbAF">EXAMPLES</A><DD>
<DL>
<DT><A HREF="#lbAG">Using dfu-util in the OpenMoko project</A><DD>
<DT><A HREF="#lbAH">Using dfu-util with a DfuSe device</A><DD>
</DL>
<DT><A HREF="#lbAI">BUGS</A><DD>
<DT><A HREF="#lbAJ">SEE ALSO</A><DD>
<DT><A HREF="#lbAK">HISTORY</A><DD>
<DT><A HREF="#lbAL">LICENCE</A><DD>
<DT><A HREF="#lbAM">COPYRIGHT</A><DD>
</DL>
<HR>
This document was created by man2html,
using the doc/dfu-util.1 manual page from dfu-util 0.8.<BR>
Time: 14:40:57 GMT, September 13, 2014
</BODY>
</HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML><HEAD><TITLE>Man page of DFU-UTIL</TITLE>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</HEAD><BODY>
<H1>DFU-UTIL(1)</H1>
<A NAME="lbAB">&nbsp;</A>
<H2>NAME</H2>
dfu-util - Device firmware update (DFU) USB programmer
<A NAME="lbAC">&nbsp;</A>
<H2>SYNOPSIS</H2>
<DL COMPACT>
<DT>
<B>dfu-util</B>
<B>-l </B>
[<B>-v</B>]
[<B>-d</B>
<I>vid:pid</I>[,<I>vid:pid</I>]]
[<B>-p</B>
<I>path</I>]
[<B>-c</B>
<I>configuration</I>]
[<B>-i</B>
<I>interface</I>]
[<B>-a</B>
<I>alt-intf</I>]
[<B>-S</B>
<I>serial</I>[,<I>serial</I>]]
<DT>
<B>dfu-util</B>
[<B>-v</B>]
[<B>-d</B>
<I>vid:pid</I>[,<I>vid:pid</I>]]
[<B>-p</B>
<I>path</I>]
[<B>-c</B>
<I>configuration</I>]
[<B>-i</B>
<I>interface</I>]
[<B>-a</B>
<I>alt-intf</I>]
[<B>-S</B>
<I>serial</I>[,<I>serial</I>]]
[<B>-t</B>
<I>size</I>]
[<B>-Z</B>
<I>size</I>]
[<B>-s</B>
<I>address</I>]
[<B>-R</B>]
[<B>-D</B>|<B>-U</B>
<I>file</I>]
<DT>
<B>dfu-util</B>
[<B>-hV</B>]
</DL>
<A NAME="lbAD">&nbsp;</A>
<H2>DESCRIPTION</H2>
<B>dfu-util</B>
is a program that implements the host (computer) side of the USB DFU
(Universal Serial Bus Device Firmware Upgrade) protocol.
<P>
dfu-util communicates with devices that implement the device side of the
USB DFU protocol, and is often used to upgrade the firmware of such
devices.
<A NAME="lbAE">&nbsp;</A>
<H2>OPTIONS</H2>
<DL COMPACT>
<DT><B>-l, --list</B>
<DD>
List the currently attached DFU capable USB devices.
<DT><B>-d, --device</B> [<I>Run-Time VENDOR</I>]:[<I>Run-Time PRODUCT</I>][,[<I>DFU Mode VENDOR</I>]:[<I>DFU Mode PRODUCT</I>]]
<DD>
<DL COMPACT><DT><DD>
Specify run-time and/or DFU mode vendor and/or product IDs of the DFU device
to work with. <B>VENDOR</B> and <B>PRODUCT</B> are hexadecimal numbers (no prefix
needed), &quot;*&quot; (match any), or &quot;-&quot; (match nothing). By default, any DFU capable
device in either run-time or DFU mode will be considered.
<P>
If you only have one standards-compliant DFU device attached to your computer,
this parameter is optional. However, as soon as you have multiple DFU devices
connected, dfu-util will detect this and abort, asking you to specify which
device to use.
<P>
If only run-time IDs are specified (e.g. &quot;<B>--device 1457:51ab</B>&quot;), then in
addition to the specified run-time IDs, any DFU mode devices will also be
considered. This is beneficial to allow a DFU capable device to be found
again after a switch to DFU mode, since the vendor and/or product ID of a
device usually changes in DFU mode.
<P>
If only DFU mode IDs are specified (e.g. &quot;<B>--device ,951:26</B>&quot;), then all
run-time devices will be ignored, making it easy to target a specific device in
DFU mode.
<P>
If both run-time and DFU mode IDs are specified (e.g. &quot;<B>--device
1457:51ab,:2bc</B>&quot;), then unspecified DFU mode components will use the run-time
value specified.
<P>
Examples:
<DL COMPACT>
<DT><B>--device 1457:51ab,951:26</B>
<DD>
<BR>
Work with a device in run-time mode with
vendor ID 0x1457 and product ID 0x51ab, or in DFU mode with vendor ID 0x0951
and product ID 0x0026
<P>
<DT><B>--device 1457:51ab,:2bc</B>
<DD>
<BR>
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with vendor ID 0x1457 and product ID 0x02bc
<P>
<DT><B>--device 1457:51ab</B>
<DD>
<BR>
Work with a device in run-time mode with vendor ID 0x1457 and product ID
0x51ab, or in DFU mode with any vendor and product ID
<P>
<DT><B>--device ,951:26</B>
<DD>
<BR>
Work with a device in DFU mode with vendor ID 0x0951 and product ID 0x0026
<P>
<DT><B>--device *,-</B>
<DD>
<BR>
Work with any device in run-time mode, and ignore any device in DFU mode
<P>
<DT><B>--device ,</B>
<DD>
<BR>
Ignore any device in run-time mode, and Work with any device in DFU mode
</DL>
</DL>
<DT><B>-p, --path</B> BUS-PORT. ... .PORT
<DD>
Specify the path to the DFU device.
<DT><B>-c, --cfg</B> CONFIG-NR
<DD>
Specify the configuration of the DFU device. Note that this is only used for matching, the configuration is not set by dfu-util.
<DT><B>-i, --intf</B> INTF-NR
<DD>
Specify the DFU interface number.
<DT><B>-a, --alt</B> ALT
<DD>
Specify the altsetting of the DFU interface by name or by number.
<DT><B>-S, --serial</B> [<I>Run-Time SERIAL</I>][,[<I>DFU Mode SERIAL</I>]]
<DD>
Specify the run-time and DFU mode serial numbers used to further restrict
device matches. If multiple, identical DFU devices are simultaneously
connected to a system then vendor and product ID will be insufficient for
targeting a single device. In this situation, it may be possible to use this
parameter to specify a serial number which also must match.
<P>
If only a single serial number is specified, then the same serial number is
used in both run-time and DFU mode. An empty serial number will match any
serial number in the corresponding mode.
<DT><B>-t, --transfer-size SIZE</B>
<DD>
Specify the number of bytes per USB transfer. The optimal value is
usually determined automatically so this option is rarely useful. If
you need to use this option for a device, please report it as a bug.
<DT><B>-Z, --upload-size SIZE</B>
<DD>
Specify the expected upload size, in bytes.
<DT><B>-U, --upload</B> FILE
<DD>
Read firmware from device into
<B>FILE</B>.
<DT><B>-D, --download</B> FILE
<DD>
Write firmware from
<B>FILE</B>
into device.
<DT><B>-R, --reset</B>
<DD>
Issue USB reset signalling after upload or download has finished.
<DT><B>-s, --dfuse-address</B> address
<DD>
Specify target address for raw binary download/upload on DfuSe devices. Do
<B>not</B>
use this for downloading DfuSe (.dfu) files. Modifiers can be added
to the address, separated by a colon, to perform special DfuSE commands such
as &quot;leave&quot; DFU mode, &quot;unprotect&quot; and &quot;mass-erase&quot; flash memory.
<DT><B>-v, --verbose</B>
<DD>
Print more information about dfu-util's operation. A second
<B>-v</B>
will turn on verbose logging of USB requests. Repeat this option to further
increase verbosity.
<DT><B>-h, --help</B>
<DD>
Show a help text and exit.
<DT><B>-V, --version</B>
<DD>
Show version information and exit.
</DL>
<A NAME="lbAF">&nbsp;</A>
<H2>EXAMPLES</H2>
<A NAME="lbAG">&nbsp;</A>
<H3>Using dfu-util in the OpenMoko project</H3>
(with the Neo1973 hardware)
<P>
Flashing the rootfs:
<BR>
<B> $ dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2</B>
<P>
Flashing the kernel:
<BR>
<B> $ dfu-util -a kernel -R -D /path/to/uImage</B>
<P>
Flashing the bootloader:
<BR>
<B> $ dfu-util -a u-boot -R -D /path/to/u-boot.bin</B>
<P>
Copying a kernel into RAM:
<BR>
<B> $ dfu-util -a 0 -R -D /path/to/uImage</B>
<P>
Once this has finished, the kernel will be available at the default load
address of 0x32000000 in Neo1973 RAM.
<B>Note:</B>
You cannot transfer more than 2MB of data into RAM using this method.
<P>
<A NAME="lbAH">&nbsp;</A>
<H3>Using dfu-util with a DfuSe device</H3>
<P>
Flashing a
<B>.dfu</B>
(special DfuSe format) file to the device:
<BR>
<B> $ dfu-util -a 0 -D /path/to/dfuse-image.dfu</B>
<P>
Reading out 1 KB of flash starting at address 0x8000000:
<BR>
<B> $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin</B>
<P>
Flashing a binary file to address 0x8004000 of device memory and
ask the device to leave DFU mode:
<BR>
<B> $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin</B>
<A NAME="lbAI">&nbsp;</A>
<H2>BUGS</H2>
Please report any bugs to the dfu-util mailing list at
<B><A HREF="mailto:dfu-util@lists.gnumonks.org">dfu-util@lists.gnumonks.org</A></B>.
Please use the
<I>--verbose</I> option (repeated as necessary) to provide more
information in your bug report.
<A NAME="lbAJ">&nbsp;</A>
<H2>SEE ALSO</H2>
The dfu-util home page is
<B><A HREF="http://dfu-util.gnumonks.org">http://dfu-util.gnumonks.org</A></B>
<A NAME="lbAK">&nbsp;</A>
<H2>HISTORY</H2>
dfu-util was originally written for the OpenMoko project by
Weston Schmidt &lt;<A HREF="mailto:weston_schmidt@yahoo.com">weston_schmidt@yahoo.com</A>&gt; and
Harald Welte &lt;<A HREF="mailto:hwelte@hmw-consulting.de">hwelte@hmw-consulting.de</A>&gt;. Over time, nearly complete
support of DFU 1.0, DFU 1.1 and DfuSe (&quot;1.1a&quot;) has been added.
<A NAME="lbAL">&nbsp;</A>
<H2>LICENCE</H2>
<B>dfu-util</B>
is covered by the GNU General Public License (GPL), version 2 or later.
<A NAME="lbAM">&nbsp;</A>
<H2>COPYRIGHT</H2>
This manual page was originally written by Uwe Hermann &lt;<A HREF="mailto:uwe@hermann-uwe.de">uwe@hermann-uwe.de</A>&gt;,
and is now part of the dfu-util project.
<P>
<HR>
<A NAME="index">&nbsp;</A><H2>Index</H2>
<DL>
<DT><A HREF="#lbAB">NAME</A><DD>
<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
<DT><A HREF="#lbAE">OPTIONS</A><DD>
<DT><A HREF="#lbAF">EXAMPLES</A><DD>
<DL>
<DT><A HREF="#lbAG">Using dfu-util in the OpenMoko project</A><DD>
<DT><A HREF="#lbAH">Using dfu-util with a DfuSe device</A><DD>
</DL>
<DT><A HREF="#lbAI">BUGS</A><DD>
<DT><A HREF="#lbAJ">SEE ALSO</A><DD>
<DT><A HREF="#lbAK">HISTORY</A><DD>
<DT><A HREF="#lbAL">LICENCE</A><DD>
<DT><A HREF="#lbAM">COPYRIGHT</A><DD>
</DL>
<HR>
This document was created by man2html,
using the doc/dfu-util.1 manual page from dfu-util 0.8.<BR>
Time: 14:40:57 GMT, September 13, 2014
</BODY>
</HTML>

View File

@ -1,135 +1,135 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>DfuSe and dfu-util</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Tormod Volden" />
<meta name="keywords" content="dfu-util, DfuSe, ST DFU extensions" />
<meta name="description" content="How to use dfu-util with DfuSe devices" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>Using dfu-util with DfuSe devices</h1>
<h2>DfuSe</h2>
<p>
DfuSe (DFU with ST Microsystems extensions) is a protocol based on
DFU 1.1. However, in expanding the functionality of the DFU protocol,
ST Microsystems broke all compatibility with the DFU 1.1 standard.
DfuSe devices report the DFU version as "1.1a".
</p>
<p>
DfuSe can be used to download firmware and other data
from a host computer to a conforming device (or upload in the
opposite direction) over USB similar to standard DFU.
</p>
<p>
The main difference from standard DFU is that the target address in
the device (flash) memory is specified by the host, so that a
download can be performed to parts of the device memory. The host
program is also responsible for erasing flash pages before they
are written to.
</p>
<h2>.dfu files</h2>
<p>
A special file format is defined by ST Microsystems to carry firmware
for DfuSe devices. The file contains target information such as address
and alternate interface information in addition to the binary data.
Several blocks of binary data can be combined in one .dfu file.
</p>
<h2>Alternate interfaces</h2>
<p>
Different memory locations of the device may have different
characteristics that the host program (dfu-util) has to take
into considerations, such as flash memory page size, read-only
versus read-write segments, the need to erase, and so on.
These parameters are reported by the device in the string
descriptors meant for describing the USB interfaces.
The host program decodes these strings to build a memory map of
the device. Different memory units or address spaces are listed
in separate alternate interface settings that must be selected
according to the memory unit to access.
</p>
<p>
Note that dfu-util leaves it to the user to select alternate
interface. When parsing a .dfu file it will skip file segments
not matching the selected alternate interface. Also, some
DfuSe device firmware implementations ignore the setting of
alternate interface and deduct the memory unit from the
address, since they have no address space overlap.
</p>
<h2>DfuSe special commands</h2>
<p>
DfuSe special commands are used by the host program during normal
downloads or uploads, such as SET_ADDRESS and ERASE_PAGE. Also
the normal DFU_DNLOAD and DFU_UPLOAD commands have special
implementations in DfuSe.
Many DfuSe devices also support commands to leave DFU mode,
read unprotect the flash memory or mass erase the flash memory.
dfu-util (from version 0.7)
supports adding "leave", "unprotect", or "mass-erase"
to the -s option argument to send such requests in combination
with a download request. These modifiers are separated with a colon.
</p>
<p>
Some DfuSe devices have their DfuSe bootloader running from flash
memory. Erasing the whole flash memory would therefore destroy
the DfuSe bootloader itself and practically brick the device
for most users. Any use of modifiers such as "unprotect"
and "mass-erase" therefore needs to be combined with the "force"
modifer. This is not included in the examples, to not encourage
ignorant users to copy and paste such instructions and shoot
themselves in the foot.
</p>
<p>
Devices based on for instance STM32F103 all run the bootloader
from flash, since there is no USB bootloader in ROM.
</p>
<p>
For instance STM32F107, STM32F2xx and STM32F4xx devices have a
DfuSe bootloader in ROM, so the flash can be erased while
keeping the device available for USB DFU transfers as long
as the device designers use this built-in bootloader and have
not implemented another DfuSe bootloader in flash that the user is
dependent upon.
</p>
<p>
Well-written bootloaders running from flash will report their
own memory region as read-only and not eraseable, but this does
not prevent dfu-util from sending a "unprotect" or "mass-erase"
request which overrides this, if the user insists.
</p>
<h2>Example usage</h2>
<p>
Flashing a .dfu (special DfuSe format) file to the device:
</p>
<pre>
$ dfu-util -a 0 -D /path/to/dfuse-image.dfu
</pre>
<p>
Reading out 1 KB of flash starting at address 0x8000000:
</p>
<pre>
$ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin
</pre>
<p>
Flashing a binary file to address 0x8004000 of device memory and ask
the device to leave DFU mode:
</p>
<pre>
$ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin
</pre>
<p>
[<a href="index.html">Back to dfu-util main page</a>]
</p>
<p id="footer">
&copy;2012 Tormod Volden &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>DfuSe and dfu-util</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Tormod Volden" />
<meta name="keywords" content="dfu-util, DfuSe, ST DFU extensions" />
<meta name="description" content="How to use dfu-util with DfuSe devices" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>Using dfu-util with DfuSe devices</h1>
<h2>DfuSe</h2>
<p>
DfuSe (DFU with ST Microsystems extensions) is a protocol based on
DFU 1.1. However, in expanding the functionality of the DFU protocol,
ST Microsystems broke all compatibility with the DFU 1.1 standard.
DfuSe devices report the DFU version as "1.1a".
</p>
<p>
DfuSe can be used to download firmware and other data
from a host computer to a conforming device (or upload in the
opposite direction) over USB similar to standard DFU.
</p>
<p>
The main difference from standard DFU is that the target address in
the device (flash) memory is specified by the host, so that a
download can be performed to parts of the device memory. The host
program is also responsible for erasing flash pages before they
are written to.
</p>
<h2>.dfu files</h2>
<p>
A special file format is defined by ST Microsystems to carry firmware
for DfuSe devices. The file contains target information such as address
and alternate interface information in addition to the binary data.
Several blocks of binary data can be combined in one .dfu file.
</p>
<h2>Alternate interfaces</h2>
<p>
Different memory locations of the device may have different
characteristics that the host program (dfu-util) has to take
into considerations, such as flash memory page size, read-only
versus read-write segments, the need to erase, and so on.
These parameters are reported by the device in the string
descriptors meant for describing the USB interfaces.
The host program decodes these strings to build a memory map of
the device. Different memory units or address spaces are listed
in separate alternate interface settings that must be selected
according to the memory unit to access.
</p>
<p>
Note that dfu-util leaves it to the user to select alternate
interface. When parsing a .dfu file it will skip file segments
not matching the selected alternate interface. Also, some
DfuSe device firmware implementations ignore the setting of
alternate interface and deduct the memory unit from the
address, since they have no address space overlap.
</p>
<h2>DfuSe special commands</h2>
<p>
DfuSe special commands are used by the host program during normal
downloads or uploads, such as SET_ADDRESS and ERASE_PAGE. Also
the normal DFU_DNLOAD and DFU_UPLOAD commands have special
implementations in DfuSe.
Many DfuSe devices also support commands to leave DFU mode,
read unprotect the flash memory or mass erase the flash memory.
dfu-util (from version 0.7)
supports adding "leave", "unprotect", or "mass-erase"
to the -s option argument to send such requests in combination
with a download request. These modifiers are separated with a colon.
</p>
<p>
Some DfuSe devices have their DfuSe bootloader running from flash
memory. Erasing the whole flash memory would therefore destroy
the DfuSe bootloader itself and practically brick the device
for most users. Any use of modifiers such as "unprotect"
and "mass-erase" therefore needs to be combined with the "force"
modifer. This is not included in the examples, to not encourage
ignorant users to copy and paste such instructions and shoot
themselves in the foot.
</p>
<p>
Devices based on for instance STM32F103 all run the bootloader
from flash, since there is no USB bootloader in ROM.
</p>
<p>
For instance STM32F107, STM32F2xx and STM32F4xx devices have a
DfuSe bootloader in ROM, so the flash can be erased while
keeping the device available for USB DFU transfers as long
as the device designers use this built-in bootloader and have
not implemented another DfuSe bootloader in flash that the user is
dependent upon.
</p>
<p>
Well-written bootloaders running from flash will report their
own memory region as read-only and not eraseable, but this does
not prevent dfu-util from sending a "unprotect" or "mass-erase"
request which overrides this, if the user insists.
</p>
<h2>Example usage</h2>
<p>
Flashing a .dfu (special DfuSe format) file to the device:
</p>
<pre>
$ dfu-util -a 0 -D /path/to/dfuse-image.dfu
</pre>
<p>
Reading out 1 KB of flash starting at address 0x8000000:
</p>
<pre>
$ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin
</pre>
<p>
Flashing a binary file to address 0x8004000 of device memory and ask
the device to leave DFU mode:
</p>
<pre>
$ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin
</pre>
<p>
[<a href="index.html">Back to dfu-util main page</a>]
</p>
<p id="footer">
&copy;2012 Tormod Volden &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>

View File

@ -1,119 +1,119 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>dfu-util Homepage</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Stefan Schmidt" />
<meta name="keywords" content="dfu-util, DFU, Device Firmware Upgrade, linux" />
<meta name="description" content="dfu-util Project Homepage" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>dfu-util - Device Firmware Upgrade Utilities</h1>
<h2>Description</h2>
<p>
dfu-util is a host side implementation of the <a
href="http://www.usb.org/developers/devclass_docs/usbdfu10.pdf"
title="DFU revision 1.0"> DFU 1.0</a> and <a
href="http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf"
title="DFU revision 1.1">DFU 1.1</a> specifications of the USB forum.
DFU is intended to download and upload firmware to/from devices connected
over USB. It ranges from small devices like micro-controller boards
to mobile phones. Using dfu-util you can download firmware to your
DFU-enabled device or upload firmware from it. dfu-util has been
tested with the Openmoko Neo1973 and Freerunner and many other devices.
</p>
<p>
See the <a href="dfu-util.1.html">manual page</a> for examples of use.
</p>
<h2>Supported Devices</h2>
<ul>
<li><a href="http://wiki.openmoko.org/wiki/Neo_1973">Openmoko Neo1973</a></li>
<li><a href="http://wiki.openmoko.org/wiki/Neo_FreeRunner">Openmoko Freerunner</a></li>
<li><a href="http://leaflabs.com/Maple">Leaflabs Maple</a></li>
<li><a href="http://www.openpcd.org/">OpenPCD and OpenPICC</a></li>
<li><a href="http://downloads.qi-hardware.com/people/werner/wpan/web/">Qi Hardware ATUSB</a> (use dfu-util 0.7)</li>
<li><a href="http://bb.osmocom.org/trac/wiki/SIMtrace">Osmocom SIMtrace</a></li>
<li>Many devices using the <a href="dfuse.html">DfuSe DFU extension</a> from ST, for instance:
<ul>
<li><a
href="http://www.seeedstudio.com/depot/micro-digital-storage-oscilloscopedso-nano-p-512.html">DSO nano</a></li>
<li><a href="https://www.spark.io/">Spark Core</a></li>
<li>STM32F2/F3/F4 built-in bootloader</li>
<li>Some STR750-based devices, e.g. USB2CAN</li>
</ul></li>
</ul>
<h2>Releases</h2>
<p>
Releases of the dfu-util software can be found in the <a
href="http://dfu-util.gnumonks.org/releases/" title="Releases">
releases</a> folder.
The current release is 0.8.
</p>
<p>
We offer binaries for Microsoft Windows and some other platforms.
dfu-util uses libusb 1.0 to access your device, so
on Windows you have to register the device with the WinUSB driver
(alternatively libusb-win32 or libusbK), please see the <a
href="https://github.com/libusbx/libusbx/wiki/Windows-Backend">libusbx wiki</a>
for more details.
</p>
<p>
Mac OS X users can also get dfu-util from <a href="http://brew.sh/">Homebrew</a> with "brew install dfu-util" or from <a href="http://www.macports.org/">MacPorts</a>.
</p>
<p>
Most Linux distributions ship dfu-util in binary packages for those
who do not want to compile dfu-util from source.
On Debian, Ubuntu, Fedora and Gentoo you can install it through the
normal software package tools. For other distributions
(namely OpenSuSe, Mandriva, and CentOS) Holger Freyther was kind enough to
provide binary packages through the <a
href="https://build.opensuse.org/package/show?package=dfu-util&amp;project=home%3Azecke23">Open Build Service</a>.
</p>
<h2>Development</h2>
<p>
Development happens in a GIT repository. Browse it via the <a
href="https://gitorious.org/dfu-util" title="Git repository">web
interface</a> or clone it with:
</p>
<pre>
git clone git://gitorious.org/dfu-util/dfu-util.git
</pre>
<p>
See our <a href="build.html">build instructions</a> for how to
build the source on different platforms.
</p>
<h2>License</h2>
<p>
This software is licensed under the <a
href="http://www.gnu.org/licenses/gpl-2.0.html"> GPL version 2</a>.
</p>
<h2>Contact</h2>
<p>
If you have questions about the development or use of dfu-util please
send an e-mail to our dedicated <a
href="https://lists.gnumonks.org/mailman/listinfo/dfu-util">
mailing list for dfu-util</a>.
</p>
<h2>People</h2>
<p>
dfu-util was originally written by <a href="http://gnumonks.org/users/laforge/">
Harald Welte</a> partially based on code from <a
href="http://dfu-programmer.sourceforge.net/">
dfu-programmer 0.4</a> and is currently maintained by <a
href="http://www.datenfreihafen.org/">Stefan Schmidt</a> and
Tormod Volden.
</p>
<p id="footer">
&copy;2010-2012 Stefan Schmidt &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-US">
<head>
<title>dfu-util Homepage</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Stefan Schmidt" />
<meta name="keywords" content="dfu-util, DFU, Device Firmware Upgrade, linux" />
<meta name="description" content="dfu-util Project Homepage" />
<link rel="icon" type="image/png" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="simple.css" media="screen, print" />
</head>
<body>
<div id="middlebox">
<h1>dfu-util - Device Firmware Upgrade Utilities</h1>
<h2>Description</h2>
<p>
dfu-util is a host side implementation of the <a
href="http://www.usb.org/developers/devclass_docs/usbdfu10.pdf"
title="DFU revision 1.0"> DFU 1.0</a> and <a
href="http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf"
title="DFU revision 1.1">DFU 1.1</a> specifications of the USB forum.
DFU is intended to download and upload firmware to/from devices connected
over USB. It ranges from small devices like micro-controller boards
to mobile phones. Using dfu-util you can download firmware to your
DFU-enabled device or upload firmware from it. dfu-util has been
tested with the Openmoko Neo1973 and Freerunner and many other devices.
</p>
<p>
See the <a href="dfu-util.1.html">manual page</a> for examples of use.
</p>
<h2>Supported Devices</h2>
<ul>
<li><a href="http://wiki.openmoko.org/wiki/Neo_1973">Openmoko Neo1973</a></li>
<li><a href="http://wiki.openmoko.org/wiki/Neo_FreeRunner">Openmoko Freerunner</a></li>
<li><a href="http://leaflabs.com/Maple">Leaflabs Maple</a></li>
<li><a href="http://www.openpcd.org/">OpenPCD and OpenPICC</a></li>
<li><a href="http://downloads.qi-hardware.com/people/werner/wpan/web/">Qi Hardware ATUSB</a> (use dfu-util 0.7)</li>
<li><a href="http://bb.osmocom.org/trac/wiki/SIMtrace">Osmocom SIMtrace</a></li>
<li>Many devices using the <a href="dfuse.html">DfuSe DFU extension</a> from ST, for instance:
<ul>
<li><a
href="http://www.seeedstudio.com/depot/micro-digital-storage-oscilloscopedso-nano-p-512.html">DSO nano</a></li>
<li><a href="https://www.spark.io/">Spark Core</a></li>
<li>STM32F2/F3/F4 built-in bootloader</li>
<li>Some STR750-based devices, e.g. USB2CAN</li>
</ul></li>
</ul>
<h2>Releases</h2>
<p>
Releases of the dfu-util software can be found in the <a
href="http://dfu-util.gnumonks.org/releases/" title="Releases">
releases</a> folder.
The current release is 0.8.
</p>
<p>
We offer binaries for Microsoft Windows and some other platforms.
dfu-util uses libusb 1.0 to access your device, so
on Windows you have to register the device with the WinUSB driver
(alternatively libusb-win32 or libusbK), please see the <a
href="https://github.com/libusbx/libusbx/wiki/Windows-Backend">libusbx wiki</a>
for more details.
</p>
<p>
Mac OS X users can also get dfu-util from <a href="http://brew.sh/">Homebrew</a> with "brew install dfu-util" or from <a href="http://www.macports.org/">MacPorts</a>.
</p>
<p>
Most Linux distributions ship dfu-util in binary packages for those
who do not want to compile dfu-util from source.
On Debian, Ubuntu, Fedora and Gentoo you can install it through the
normal software package tools. For other distributions
(namely OpenSuSe, Mandriva, and CentOS) Holger Freyther was kind enough to
provide binary packages through the <a
href="https://build.opensuse.org/package/show?package=dfu-util&amp;project=home%3Azecke23">Open Build Service</a>.
</p>
<h2>Development</h2>
<p>
Development happens in a GIT repository. Browse it via the <a
href="https://gitorious.org/dfu-util" title="Git repository">web
interface</a> or clone it with:
</p>
<pre>
git clone git://gitorious.org/dfu-util/dfu-util.git
</pre>
<p>
See our <a href="build.html">build instructions</a> for how to
build the source on different platforms.
</p>
<h2>License</h2>
<p>
This software is licensed under the <a
href="http://www.gnu.org/licenses/gpl-2.0.html"> GPL version 2</a>.
</p>
<h2>Contact</h2>
<p>
If you have questions about the development or use of dfu-util please
send an e-mail to our dedicated <a
href="https://lists.gnumonks.org/mailman/listinfo/dfu-util">
mailing list for dfu-util</a>.
</p>
<h2>People</h2>
<p>
dfu-util was originally written by <a href="http://gnumonks.org/users/laforge/">
Harald Welte</a> partially based on code from <a
href="http://dfu-programmer.sourceforge.net/">
dfu-programmer 0.4</a> and is currently maintained by <a
href="http://www.datenfreihafen.org/">Stefan Schmidt</a> and
Tormod Volden.
</p>
<p id="footer">
&copy;2010-2012 Stefan Schmidt &mdash; Valid <a href="http://validator.w3.org/check?uri=referer" title="validate XHTML">XHTML</a> &amp; <a href="http://jigsaw.w3.org/css-validator" title="validate CSS">CSS</a>
</p>
</div>
</body>
</html>

View File

@ -1,56 +1,56 @@
body {
margin: 10px;
font-size: 0.82em;
background-color: #EEE;
}
h1 {
clear: both;
padding: 0 0 12px 0;
margin: 0;
font-size: 2em;
font-weight: bold;
}
h2 {
clear: both;
margin: 0;
font-size: 1.5em;
font-weight: normal;
}
h3 {
clear: both;
margin: 15px 0 0 0;
font-size: 1.0em;
font-weight: bold;
}
p {
line-height: 20px;
padding: 8px 0 8px 0;
margin: 0;
font-size: 1.1em;
}
pre {
white-space: pre-wrap;
background-color: #CCC;
padding: 3px;
}
a:hover {
background-color: #DDD;
}
#middlebox {
width: 600px;
margin: 0px auto;
text-align: left;
}
#footer {
height: 100px;
padding: 28px 3px 0 0;
margin: 20px 0 20px 0;
}
body {
margin: 10px;
font-size: 0.82em;
background-color: #EEE;
}
h1 {
clear: both;
padding: 0 0 12px 0;
margin: 0;
font-size: 2em;
font-weight: bold;
}
h2 {
clear: both;
margin: 0;
font-size: 1.5em;
font-weight: normal;
}
h3 {
clear: both;
margin: 15px 0 0 0;
font-size: 1.0em;
font-weight: bold;
}
p {
line-height: 20px;
padding: 8px 0 8px 0;
margin: 0;
font-size: 1.1em;
}
pre {
white-space: pre-wrap;
background-color: #CCC;
padding: 3px;
}
a:hover {
background-color: #DDD;
}
#middlebox {
width: 600px;
margin: 0px auto;
text-align: left;
}
#footer {
height: 100px;
padding: 28px 3px 0 0;
margin: 20px 0 20px 0;
}

View File

@ -1,73 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="maple_loader" default="default" basedir=".">
<description>Builds, tests, and runs the project maple_loader.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="maple_loader-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="maple_loader" default="default" basedir=".">
<description>Builds, tests, and runs the project maple_loader.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="maple_loader-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>

View File

@ -1,4 +1,4 @@
#Mon, 20 Jul 2015 11:21:26 +1000
C\:\\Users\\rclark\\Desktop\\maple-asp-master\\installer\\maple_loader=
#Mon, 20 Jul 2015 11:21:26 +1000
C\:\\Users\\rclark\\Desktop\\maple-asp-master\\installer\\maple_loader=

View File

@ -29,4 +29,4 @@ the projects runtime path.
* To set a main class in a standard Java project, right-click the project node
in the Projects window and choose Properties. Then click Run and enter the
class name in the Main Class field. Alternatively, you can manually type the
class name in the manifest Main-Class element.
class name in the manifest Main-Class element.

View File

@ -1,8 +1,8 @@
build.xml.data.CRC32=2e6a03ba
build.xml.script.CRC32=4676ee6b
build.xml.stylesheet.CRC32=8064a381@1.75.2.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=2e6a03ba
nbproject/build-impl.xml.script.CRC32=392b3f79
nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48
build.xml.data.CRC32=2e6a03ba
build.xml.script.CRC32=4676ee6b
build.xml.stylesheet.CRC32=8064a381@1.75.2.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=2e6a03ba
nbproject/build-impl.xml.script.CRC32=392b3f79
nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48

View File

@ -1,6 +1,6 @@
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\rclark\\AppData\\Roaming\\NetBeans\\8.0.2\\build.properties
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\rclark\\AppData\\Roaming\\NetBeans\\8.0.2\\build.properties

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/CliMain.java</file>
<file>file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/DFUUploader.java</file>
</group>
</open-files>
</project-private>
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/CliMain.java</file>
<file>file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/DFUUploader.java</file>
</group>
</open-files>
</project-private>

View File

@ -1,79 +1,79 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=maple_loader
application.vendor=bob
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/maple_loader.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.jssc.jar=dist/lib/jssc.jar
file.reference.jssc.jar-1=jars/jssc.jar
includes=**
jar.compress=false
javac.classpath=\
${file.reference.jssc.jar}:\
${file.reference.jssc.jar-1}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.7
javac.target=1.7
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
main.class=CliTemplate.CliMain
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=maple_loader
application.vendor=bob
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/maple_loader.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.jssc.jar=dist/lib/jssc.jar
file.reference.jssc.jar-1=jars/jssc.jar
includes=**
jar.compress=false
javac.classpath=\
${file.reference.jssc.jar}:\
${file.reference.jssc.jar-1}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.7
javac.target=1.7
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
main.class=CliTemplate.CliMain
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>maple_loader</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
</configuration>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>maple_loader</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
</configuration>
</project>

Some files were not shown because too many files have changed in this diff Show More