├── .gitignore ├── LGPL.txt ├── LICENSE ├── README.md ├── __init__.py ├── funtionality.txt ├── hex_bin ├── EFM8LB1_Blinky.bin ├── EFM8LB1_Blinky.hex ├── EFM8UB1_Blinky_Simple.hex ├── F850_Blinky.hex ├── SLSTK3401A_blink.bin ├── SLSTK3401A_blink.hex ├── SLSTK3701A_blink.bin ├── SLSTK3701A_blink.hex ├── STK3700_blink.bin └── STK3700_blink.hex ├── img ├── about.png ├── browse-file.png ├── programmer.png ├── pycharm.png ├── pyprogrammer.png ├── pyside-doc.png ├── qt-creator.png └── segger-jlink-download.png ├── jlink.py ├── jlink_constants.py ├── jlinkarm.dll ├── mainwindow.py └── programmer.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /LGPL.txt: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 489 | 490 | Also add information on how to contact you by electronic and paper mail. 491 | 492 | You should also get your employer (if you work as a programmer) or your 493 | school, if any, to sign a "copyright disclaimer" for the library, if 494 | necessary. Here is a sample; alter the names: 495 | 496 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 497 | library `Frob' (a library for tweaking knobs) written by James Random Hacker. 498 | 499 | , 1 April 1990 500 | Ty Coon, President of Vice 501 | 502 | That's all there is to it! 503 | 504 | 505 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Mark Ding 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Jlink Python Programming GUI Tool 2 | =============== 3 | 4 | ## 1 Introduction 5 | We use Python+Pyside make a GUI programming tool. By calling JLinkARM.Dll, it can access the device via C2 and SWD interface. The EFM8 and EFM32 which are C8051 and ARM cortex M0/M3/M4 core are in the latest Segger JLinkARM.dll support list. It can download hex file, and also binary file with offset setting. 6 | 7 | ## 2 Preparation 8 | ### 2.1 Install Python 2.7 32-bit 9 | The reason for 32-bit python is because many dll file is 32-bit version. 10 | 11 | Goto https://www.python.org/downloads/release/python-2712/ and install the python 2.7 32-bit. 12 | 13 | And also install enum package 14 | 15 | ``` 16 | $pip install enum 17 | ``` 18 | 19 | ### 2.2 Install Pyside 20 | Goto https://info.qt.io/download-qt-for-application-development, install QT creator. 21 | 22 | using following command to convert .ui file into .py file. 23 | $ pyside-uic mainwindow.ui -o mainwindow.py 24 | 25 | ### 2.3 Pyside API 26 | All Pyside API can be found in http://pyside.github.io/docs/pyside/ It is very good place for Pyside brand new developer. 27 | 28 | ![PySide Doc][PySide_doc] 29 | 30 | 31 | ### 2.4 Install Pycharm 32 | Goto http://www.jetbrains.com/pycharm/download/, download community version. 33 | 34 | ![PyCharm][PyCharm] 35 | 36 | It is an awesome Python development IDE. 37 | 38 | ### 2.5 Get JlinkARM.Dll 39 | The JLinkARM.dll is the key file to access EFM8 and EFM32 through on board segger Jlink controller in Silicon Labs STK board. 40 | 41 | Goto https://www.segger.com/downloads/jlink/, download latest J-link Software and Documentation Pack. 42 | 43 | ![Segger jlink download][Segger_jlink_download] 44 | 45 | After installation, the JLinkARM.dll can be found in following path: 46 | C:\Program Files (x86)\SEGGER\JLink_V618c\JLinkARM.dll 47 | 48 | ## 3 Guide on Coding 49 | Now we need to know elements that the programming tool required. It requires a GUI frame mainwindow.py for what the tools looks like; JlinkARM.dll for communication with device; main control routine programmer.py; jlink.py take response on communication between main control routine and JLinkARM.dll. 50 | 51 | ### 3.1 GUI frame 52 | Here is the final view of the programmer tool 53 | 54 | ![Programmer view][Programmer] 55 | 56 | It is convenient to make a GUI frame using PySide. 57 | The GUI contains Window Title, Menu, Status Bar and Central Widget. 58 | 59 | #### 3.1.1 Window Title 60 | Define Window Title and Fixed size. 61 | 62 | ```python 63 | self.setWindowTitle("PyProgrammer") 64 | self.setFixedSize(640, 260) 65 | ``` 66 | 67 | #### 3.1.2 Menu 68 | Create Help Menu and About dialog. 69 | 70 | ```python 71 | def createMenu(self): 72 | self.aboutAct = QtGui.QAction("&About", self, 73 | statusTip="Show the PyProgrammer's About box", 74 | triggered=self.about) 75 | self.helpMenu = self.menuBar().addMenu("&Help") 76 | self.helpMenu.addAction(self.aboutAct) 77 | 78 | def about(self): 79 | QtGui.QMessageBox.about(self, "About PyProgrammer", 80 | "Copyright Silicon Laboratories, Inc 2018. All rights reserved.\n\n\r" 81 | "PyProgrammer v1.0 is based on Qt Pyside and SEGGER JlinkARM.\n\n\r" 82 | "The PyProgrammer example demonstrates how to write a " 83 | "modern GUI flash programmer applications using Qt Pyside.\n\n\r" 84 | "This program uses third party libraries covered by the LGPL.\n\r" 85 | "See the file LGPL.txt for details.") 86 | ``` 87 | 88 | #### 3.1.3 Status Bar 89 | Create Status Bar. 90 | 91 | ```python 92 | def createStatusBar(self): 93 | self.statusBar().showMessage("Ready") 94 | ``` 95 | 96 | #### 3.1.4 Central Widget 97 | The main layout of Central Widget includes two main groups - "Connection" and "Flash MCU". The "Flash MCU" includes two subgroups - "Browse" and "Flash". 98 | 99 | __Main Group Layout__ 100 | 101 | ```python 102 | mainLayout = QtGui.QVBoxLayout(self.centralWidget) 103 | mainLayout.addWidget(self.createConnectGroup()) 104 | mainLayout.addWidget(self.createFlashMCUGroup()) 105 | self.setLayout(mainLayout) 106 | ``` 107 | 108 | __Sub Group Layout__ 109 | 110 | ```python 111 | def createFlashMCUGroup(self): 112 | groupBox = QtGui.QGroupBox("Flash MCU 113 | ",self.centralWidget) 114 | 115 | layout = QtGui.QVBoxLayout() 116 | layout.addWidget(self.createBrowseGroup()) 117 | layout.addWidget(self.createFlashGroup()) 118 | 119 | groupBox.setLayout(layout) 120 | return groupBox 121 | ``` 122 | 123 | 124 | ### 3.2 Main Control 125 | The purpose of the tool is to select a image file, connect to device, flash the image into device, response on any event that pop up with the operation. 126 | 127 | #### 3.2.1 Push Button Events 128 | The Pyside provides interface to connect button press event to dedicate function. 129 | The tool has four buttons - Browse, Connect, Erase and Flash. 130 | 131 | ```python 132 | self.browseButton.pressed.connect(self.browse_file) 133 | self.connectButton.pressed.connect(self.connect_mcu) 134 | self.flashButton.pressed.connect(self.flash_mcu) 135 | self.eraseButton.pressed.connect(self.erase_mcu) 136 | 137 | def browse_file(self): 138 | ... 139 | return 140 | 141 | def connect_mcu(self): 142 | ... 143 | return 144 | 145 | def flash_mcu(self): 146 | ... 147 | return 148 | 149 | def erase_mcu(self): 150 | ... 151 | return 152 | ``` 153 | 154 | According above code, the four button pressed event was connected to the dedicate functions. Once user click on the button, it will call the connected function. 155 | 156 | #### 3.2.2 File Browser 157 | The QtGui provides QFileDialog.getOpenFileName to browse the image file. User can define the window name, file default location, file extension. etc 158 | 159 | ```python 160 | def browse_file(self): 161 | file_name, file_filter = QtGui.QFileDialog.getOpenFileName( 162 | self, 'Open Download file', "./hex_bin", 163 | 'Intel Hex Files(*.hex);;Binary Files(*.bin);;All Files (*)') 164 | if file_name: 165 | self.pathLineEdit.setText(file_name) 166 | # Set start address editable with bin file only. 167 | split_name = file_name.split(".") 168 | if split_name[-1].lower() == "hex": 169 | self.startAddrLineEdit.setText("00000000") 170 | self.startAddrLineEdit.setReadOnly(True) 171 | if split_name[-1].lower() == "bin": 172 | self.startAddrLineEdit.setReadOnly(False) 173 | return 174 | ``` 175 | 176 | The above codes open a file dialog, looking for hex, bin and all files. 177 | 178 | ![Browse file][Browse_file] 179 | 180 | Once choose a file, the full path file name displayed in pathLineEdit component. 181 | 182 | #### 3.2.3 Adapter and Debug IF list 183 | The Combox is used here for a list of adapter and debug interface. 184 | Adding item into Combox as follows: 185 | 186 | ```python 187 | # Adding debug interface into Debug IF Combox 188 | self.debugIFCombo.addItems("SWD C2".split()) 189 | 190 | # Adding new adapter into Adapter Combox list 191 | self.jlinkDeviceCombo.addItem(unicode(adapter.SerialNumber)) 192 | ``` 193 | 194 | We set two type of debug interface into combox, use choose which interface to connect to the device. For EFM8, it is C2 interface; for EFM32, it is SWD interface. 195 | Other common usage of Combox as follows: 196 | 197 | ```python 198 | # Get current selected Combox item. 199 | serial_number = self.debugIFCombo.currentText() 200 | 201 | # Checking if any adapter exist by count Combox items. 202 | if self.jlinkDeviceCombo.count() == 0: 203 | return 204 | 205 | # Clear all Combox items. 206 | self.jlinkDeviceCombo.clear() 207 | 208 | # Set current Combo index 209 | self.jlinkDeviceCombo.setCurrentIndex(index) 210 | ``` 211 | 212 | #### 3.2.4 Part Number and Status Display 213 | The Label and Status Bar components made for the purpose. 214 | 215 | ```python 216 | # Show message on status bar 217 | msg = "Please connect to device." 218 | self.statusBar().showMessage(msg) 219 | 220 | # Show detect part number on device Label 221 | self.deviceLabel.setText(self._jlink._part_number) 222 | ``` 223 | 224 | #### 3.2.5 Flash Offset Format and Reset MCU Check Box 225 | The QtGui provides CheckBox component can be used as reset MCU check box. And LineEdit has function setInputMask to limit hex number input only. 226 | 227 | ```python 228 | # Checking if user check to option 229 | if self.resetMCUCheckBox.checkState(): 230 | self._jlink.reset(False) 231 | 232 | # Make hex number input only and with initial value 00000000. 233 | self.startAddrLineEdit.setInputMask(">HHHHHHHH; ") 234 | self.startAddrLineEdit.setText("00000000") 235 | 236 | ``` 237 | 238 | #### 3.2.6 Scan Adapter Automatic 239 | The dynamic scan adapter is basic requirement of a programmer tool. Using Python QTimer can achieve the purpose. 240 | 241 | ```python 242 | def scan_adapter(self): 243 | num_adapters, adapter_list = self._jlink.get_usb_adapter_list() 244 | ... 245 | return 246 | 247 | def init_timer(self): 248 | self.timer = QtCore.QTimer(self) 249 | self.timer.timeout.connect(self.scan_adapter) 250 | self.timer.start(1000) 251 | ``` 252 | 253 | ### 3.3 JLink function 254 | In order to communicate with STK on board Segger JLink controller, the Python script needs to talk with JLinkARM.DLL, and the JLinkARM.DLL pass the command to the STK JLink controller. 255 | 256 | The Jlink.py act as interpret layer between JLinkARM.DLL and Main Control routine. 257 | There are several useful interface functions used in this programmer tool. 258 | 259 | ```python 260 | # Loading JLinkARM.DLL 261 | self._jlink = jlink.JLinkDll() 262 | 263 | # Connect jLink device with serial_number, debug interface ifc 264 | result = self._jlink.connect(long(serial_number), None, ifc) 265 | 266 | # Close JLink connection 267 | self._jlink.close() 268 | 269 | # Erase device and download file into device 270 | self._jlink.erase_chip() 271 | self._jlink.download(file_name, offset) 272 | 273 | # Reset the device 274 | self._jlink.reset(False) 275 | 276 | # Get attached USB adapter list 277 | num_adapters, adapter_list = self._jlink.get_usb_adapter_list() 278 | 279 | ``` 280 | 281 | 282 | [Segger_jlink_download]:img/segger-jlink-download.png 283 | [PyCharm]:img/pycharm.png 284 | [PySide_doc]:img/pyside-doc.png 285 | [Programmer]:img/programmer.png 286 | [Browse_file]:img/browse-file.png 287 | 288 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/__init__.py -------------------------------------------------------------------------------- /funtionality.txt: -------------------------------------------------------------------------------- 1 | 2 | Comparison between Commander and PyProgrammer on functionalities. 3 | 4 | J-Link general: 5 | --ip 6 | --serialno -s 7 | --usb -u 8 | 9 | Debugger parameters: 10 | --speed 11 | --targetif (PyProgrammer) 12 | 13 | flash 14 | J-Link general 15 | Debugger parameters 16 | --file -f (support multiple) (PyProgrammer) 17 | --reset (PyProgrammer) 18 | --verify 19 | --address (PyProgrammer) 20 | --patch 0x00001234=A5 (support multiple) 21 | --masserase (PyProgrammer) 22 | --token 23 | --tokenfile 24 | 25 | readmem 26 | J-Link general 27 | Debugger parameters 28 | --outfile -o 29 | --print 30 | --patch 0x00001234=A5 (support multiple) 31 | 32 | --region @mainflash (support multiple) 33 | or 34 | --address 0x0000000 35 | --length 0x1000 36 | or 37 | --range 0x0000000-0x0001000 (support multiple) 38 | 39 | tokendump 40 | J-Link general 41 | Debugger parameters 42 | --outfile -o 43 | --print 44 | --token 45 | 46 | convert 47 | --infile -i (support multiple) 48 | --address 49 | --outfile -o 50 | --patch 0x00001234=A5 (support multiple) 51 | --token 52 | --tokenfile 53 | 54 | keygen 55 | 56 | readprotect 57 | J-Link general 58 | Debugger parameters 59 | 60 | writeprotect 61 | J-Link general 62 | Debugger parameters 63 | 64 | --region @mainflash (support multiple) 65 | or 66 | --address 0x0000000 67 | --length 0x1000 68 | or 69 | --range 0x0000000-0x0001000 (support multiple) 70 | or 71 | --page n (support multiple) 72 | 73 | pageerase 74 | J-Link general 75 | Debugger parameters 76 | 77 | --region @userpage (support multiple) 78 | or 79 | --address 0x0000000 80 | --length 0x1000 81 | or 82 | --range 0x0000000-0x0001000 (support multiple) 83 | or 84 | --page n (support multiple) 85 | 86 | masserase (PyProgrammer) 87 | J-Link general 88 | Debugger parameters 89 | 90 | lock 91 | J-Link general 92 | Debugger parameters 93 | 94 | Exx32 types: 95 | debug 96 | masserase 97 | AAP-warning-will-permanently-disable-debug-access 98 | 99 | chipconfig 100 | EFR32 types: 101 | bootloader [enable|disable] 102 | pinresettype [soft|hard] 103 | 104 | recover 105 | J-Link general 106 | 107 | installfw 108 | J-Link general 109 | 110 | --boardoverride 111 | --variantoverride 112 | 113 | kitinfo 114 | J-Link general 115 | 116 | mcuinfo (PyProgrammer) 117 | J-Link general 118 | Debugger parameters 119 | 120 | kitconfig 121 | J-Link general 122 | 123 | --dbgmode [mode] 124 | --ipconfig 125 | --cdc [enable|disable] 126 | --msd [enable|disable] 127 | 128 | pinreset 129 | J-Link general 130 | -------------------------------------------------------------------------------- /hex_bin/EFM8LB1_Blinky.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/hex_bin/EFM8LB1_Blinky.bin -------------------------------------------------------------------------------- /hex_bin/EFM8LB1_Blinky.hex: -------------------------------------------------------------------------------- 1 | :020000040000FA 2 | :1000000002002E85A70A12001912002312016312A2 3 | :100010000142120167850AA722E4F5A77597DE75EC 4 | :0A00200097AD2275A57075D570220A 5 | :10002B000200BA787FE4F6D8FD75810A02007502EA 6 | :10003B000155E493A3F8E493A34003F68001F2087F 7 | :10004B00DFF48029E493A3F85407240CC8C333C40A 8 | :10005B00540F4420C8834004F456800146F6DFE475 9 | :10006B00800B010204081020408090015EE47E01A9 10 | :10007B009360BCA3FF543F30E509541FFEE493A3E8 11 | :10008B0060010ECF54C025E060A840B8E493A3FAFA 12 | :10009B00E493A3F8E493A3C8C582C8CAC583CAF086 13 | :1000AB00A3C8C582C8CAC583CADFE9DEE780BEC064 14 | :1000BB00E0C083C082C0D075D000C000C2CFE508BD 15 | :1000CB00704DE509B4070050469000DBF828287303 16 | :1000DB000200F00200F80200FC020100020108021B 17 | :1000EB00010C020114D294C295C2968022C2948054 18 | :1000FB0006C294800ED294D295C2968012C294807E 19 | :10010B000AD294C295D2968006D294D295D296D327 20 | :10011B00E5099406E50864809480500A0509E50911 21 | :10012B00700A05088006750800750900D000D0D04C 22 | :10013B00D082D083D0E032E5C8540453C8FB75CBD2 23 | :10014B003875CA9E43C80442C822120003C2B4D2F7 24 | :10015B00AF80FE020800000075E3402275A8A022C4 25 | :00000001FF 26 | -------------------------------------------------------------------------------- /hex_bin/EFM8UB1_Blinky_Simple.hex: -------------------------------------------------------------------------------- 1 | :020000040000FA 2 | :1000000002001DE4F5C8538E9FC39FFFE49EF5CB0D 3 | :100010008FCA74FFF5CDF5CCD2ADD2CA22787FE479 4 | :09002000F6D8FD75810702002EDF 5 | :10002B0002004EE4F5A77597DE7597AD1200477F7A 6 | :10003B00D47E30120003D2AFD29480FE43A510754C 7 | :08004B00E34022C2CFB294325F 8 | :00000001FF 9 | -------------------------------------------------------------------------------- /hex_bin/F850_Blinky.hex: -------------------------------------------------------------------------------- 1 | :10002E007597DE7597AD1200427FB07E63120003A6 2 | :04003E00D2AF80FEBF 3 | :0A00420043A50175E34075A94022B3 4 | :10000300E4F5C8538E9FC39FFFE49EF5CB8FCA745C 5 | :0A001300FFF5CDF5CCD2ADD2CA2224 6 | :03002B0002004C84 7 | :05004C00C2CFB29032AA 8 | :0300000002001DDE 9 | :0C001D00787FE4F6D8FD75810702002E04 10 | :00000001FF 11 | -------------------------------------------------------------------------------- /hex_bin/SLSTK3401A_blink.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/hex_bin/SLSTK3401A_blink.bin -------------------------------------------------------------------------------- /hex_bin/SLSTK3401A_blink.hex: -------------------------------------------------------------------------------- 1 | :1000000000800020C1040000ED040000ED040000A9 2 | :10001000ED040000ED040000ED040000ED0400001C 3 | :10002000ED040000ED040000ED040000ED0400000C 4 | :10003000ED040000ED040000ED04000019270000AD 5 | :10004000ED040000ED040000ED040000ED040000EC 6 | :10005000ED040000ED040000ED040000ED040000DC 7 | :10006000ED040000ED040000ED040000ED040000CC 8 | :10007000ED040000ED040000ED040000ED040000BC 9 | :10008000ED040000ED040000ED040000ED040000AC 10 | :10009000ED040000ED040000ED040000ED0400009C 11 | :1000A000ED040000ED040000ED040000ED0400008C 12 | :1000B000ED040000ED040000ED040000ED0400007C 13 | :1000C000ED040000ED04000010B5054C237833B9B1 14 | :1000D000044B13B10448AFF300800123237010BD1B 15 | :1000E0008000002000000000A02B0000084B10B58D 16 | :1000F0001BB108480849AFF300800848036803B9FA 17 | :1001000010BD074B002BFBD0BDE81040184700BFC7 18 | :1001100000000000A02B0000840000207C000020D4 19 | :1001200000000000154B002B08BF134B9D46A3F5A4 20 | :10013000803A00218B460F461348144A121A02F0E7 21 | :100140009DFB0F4B002B00D098470E4B002B00D08F 22 | :1001500098470020002104000D000D48002802D01F 23 | :100160000C48AFF3008002F063FB2000290002F08E 24 | :10017000F7FA02F049FB00BF0000080000800020F1 25 | :10018000000000000000000080000020A800002007 26 | :10019000000000000000000080B485B000AF78606F 27 | :1001A00039607B6803F1C063FB60FB683A681A60E2 28 | :1001B0001437BD465DF8047B704700BF80B485B03E 29 | :1001C00000AF786039607B6803F18063FB60FB6897 30 | :1001D0003A681A601437BD465DF8047B704700BF6B 31 | :1001E00080B582B000AF03463960FB71FB79002B0C 32 | :1001F0001DD0FB79012B17D0FB79022B11D0FB7995 33 | :10020000032B0BD0FB79042B06D0FB79052B01D1F6 34 | :10021000FF230DE000230BE0002309E04FF47E43B1 35 | :1002200006E04FF47C6303E04FF4784300E03F23A3 36 | :100230003A68134103F00103002B04D10C4840F24B 37 | :10024000593100F0F5F9FA7913465B0013441B01AC 38 | :100250000C3303F1804303F520433A68012101FA8E 39 | :1002600002F218461146FFF7A9FF0837BD4680BDC8 40 | :10027000A828000080B582B000AF03463960FB714A 41 | :10028000FB79002B1DD0FB79012B17D0FB79022BBA 42 | :1002900011D0FB79032B0BD0FB79042B06D0FB7913 43 | :1002A000052B01D1FF230DE000230BE0002309E023 44 | :1002B0004FF47E4306E04FF47C6303E04FF4784351 45 | :1002C00000E03F233A68134103F00103002B04D1FF 46 | :1002D0000C4840F2863100F0ABF9FA7913465B0026 47 | :1002E00013441B010C3303F1804303F520433A68A8 48 | :1002F000012101FA02F218461146FFF74DFF0837B7 49 | :10030000BD4680BDA828000080B582B000AF03467E 50 | :100310003960FB71FB79002B1DD0FB79012B17D0C5 51 | :10032000FB79022B11D0FB79032B0BD0FB79042B2B 52 | :1003300006D0FB79052B01D1FF230DE000230BE054 53 | :10034000002309E04FF47E4306E04FF47C6303E0B2 54 | :100350004FF4784300E03F233A68134103F0010370 55 | :10036000002B04D10A4840F29F3100F061F909499D 56 | :10037000FA793B68012000FA03F3184613465B0044 57 | :1003800013441B010B44183318600837BD4680BD69 58 | :10039000A828000000A0004080B582B000AF12483D 59 | :1003A000012100F07FFB1148012100F07BFB0023BD 60 | :1003B0007B6011E00E4A7B6812F833100C4A7B68B0 61 | :1003C000DB0013445B68084619460422002302F050 62 | :1003D00011F87B6801337B607B68012BEADD002329 63 | :1003E00018460837BD4680BD40410500002508007D 64 | :1003F0000C29000080B582B000AF78607B68002BCC 65 | :1004000011DB7B68012B0EDC0A4A7B6812F8331083 66 | :10041000084A7B68DB0013445B6808461946FFF70F 67 | :10042000DFFE002301E04FF0FF3318460837BD46DA 68 | :1004300080BD00BF0C29000080B582B000AF78609D 69 | :100440007B68002B11DB7B68012B0EDC0A4A7B6882 70 | :1004500012F83310084A7B68DB0013445B680846D7 71 | :100460001946FFF707FF002301E04FF0FF3318465E 72 | :100470000837BD4680BD00BF0C29000080B582B0A2 73 | :1004800000AF78607B68002B11DB7B68012B0EDCF2 74 | :100490000A4A7B6812F83310084A7B68DB00134471 75 | :1004A0005B6808461946FFF72FFF002301E04FF075 76 | :1004B000FF3318460837BD4680BD00BF0C29000039 77 | :1004C000064880470649074A074B9A42BEBF51F883 78 | :1004D000040B42F8040BF8E7FFF724FED1050000F7 79 | :1004E000AC2B00000000002080000020FEE700BFD1 80 | :1004F00080B582B000AF00F027F878600A4BD3F8DF 81 | :1005000008210A4B13401B0A3B603B6801337A68A1 82 | :10051000B2FBF3F37B60064A7B6813607B68184686 83 | :100520000837BD4680BD00BF00400E4000FF0100FF 84 | :100530000800002080B400AF024B1846BD465DF8AD 85 | :10054000047B7047005A620280B483B000AF164B40 86 | :10055000D3F8943003F00703032B08D0042B02D008 87 | :10056000022B08D00BE0114B1B687B600BE04FF4B3 88 | :1005700000437B6007E00E4B1B687B6003E00D4B84 89 | :100580001B687B6000BF084BD3F8003103F4F853BD 90 | :100590001B0A01337A68B2FBF3F318460C37BD46E9 91 | :1005A0005DF8047B704700BF00400E40040000204F 92 | :1005B000000000200C00002080B400AF034B1B683B 93 | :1005C0001846BD465DF8047B704700BF0000002060 94 | :1005D00080B400AF054A054BD3F8883043F470036C 95 | :1005E000C2F88830BD465DF8047B704700ED00E03E 96 | :1005F00080B400AF4FF400431846BD465DF8047B5D 97 | :10060000704700BF80B400AF4FF47A731846BD4600 98 | :100610005DF8047B704700BF80B400AF034B1B68DC 99 | :100620001846BD465DF8047B704700BF04000020FB 100 | :1006300080B483B000AF78603960FEE780B487B0E3 101 | :1006400000AFF860B9607A60FB6803F10473DA0008 102 | :10065000BB6813449B007B617B697A681A601C3716 103 | :10066000BD465DF8047B704780B485B000AF78600C 104 | :1006700039607B6803F10473DA003B6813449B0024 105 | :10068000FB60FB681B6818461437BD465DF8047BA9 106 | :10069000704700BF80B483B000AF78607B680122F0 107 | :1006A00002FA03F318460C37BD465DF8047B704729 108 | :1006B00080B584B000AF78600123FB607B68124A8C 109 | :1006C000934204D80023FB600023BB6008E07B68F2 110 | :1006D0000E4A934202D80123BB6001E00223BB60B3 111 | :1006E0000B481021FA68FFF7A9FF0949084BD3F816 112 | :1006F000003123F08072BB681B061343C1F8003140 113 | :100700001037BD4680BD00BF0048E8010090D0030F 114 | :1007100000400E4080B483B000AF054B1B687B6087 115 | :100720007B6818460C37BD465DF8047B704700BFF8 116 | :100730001000002080B582B000AFFFF705FF7860A1 117 | :10074000064BD3F8003103F4F8531B0A01337A68DF 118 | :1007500002FB03F318460837BD4680BD00400E403B 119 | :1007600080B582B000AF0F4800F0DAFA0346FB70A4 120 | :10077000FB78072B05D0092B07D1FFF7E5FE786042 121 | :100780000BE0FFF7C7FF786007E007484FF4E3711D 122 | :10079000FFF74EFF00237B6000BF7B6818460837D9 123 | :1007A000BD4680BD06000C008029000080B584B0E5 124 | :1007B00000AF78607B68002B1CD1204800F0B0FAB5 125 | :1007C0000346FB7200BFFB7A013B072B28D801A22E 126 | :1007D00052F823F00308000021080000210800005F 127 | :1007E000110800002108000021080000090800008D 128 | :1007F00019080000124840F2E711FFF719FF002323 129 | :1008000017E00023FB6013E0FFF784FFF8600FE0C0 130 | :10081000FFF7D2FEF8600BE0FFF78CFFF86007E00F 131 | :10082000074840F2FD11FFF703FF0023FB6000BF04 132 | :10083000FB6818461037BD4680BD00BF98002E00EB 133 | :100840008029000080B485B000AF78603960194B12 134 | :100850001B6C002B14BF01230023FB72154B41F6C8 135 | :1008600071321A64134B5B6803F04073FB607B6862 136 | :10087000114A934202D80023FB6005E07B680F4ACF 137 | :10088000934201D80123FB60FB681B06FB6009490A 138 | :10089000084B5B6823F04072FB6813434B60FB7AA4 139 | :1008A000002B02D0034B00221A641437BD465DF8BA 140 | :1008B000047B704700000E4080BA8C01005A62022F 141 | :1008C00080B500AFFFF736FE034618460021FFF75C 142 | :1008D000B9FF80BD80B582B000AF786039607868BC 143 | :1008E0003968FFF7AFFF0837BD4680BD80B487B0D9 144 | :1008F00000AF78600F237B617B6803333B617B69CA 145 | :10090000FB60FA683B69934228BF1346BB60BB6833 146 | :100910001B07BB60BB6818461C37BD465DF8047BEF 147 | :10092000704700BF80B400AF044B5B6A03F0300334 148 | :100930001846BD465DF8047B704700BF00400E407E 149 | :1009400080B483B000AF78600649064B5B6A23F041 150 | :1009500030027B6813434B620C37BD465DF8047B65 151 | :10096000704700BF00400E4090B585B000AF786082 152 | :100970000023BB607B68384A93420BD0374A9342CE 153 | :1009800008D0374A934205D0364840F2B531FFF7D8 154 | :100990004FFE00E000BF786800F0C2F90346FB603C 155 | :1009A0007B682D4A93420CD02C4A934210D02C4A9B 156 | :1009B000934214D12C4BD3F8803003F00703FB6033 157 | :1009C00013E0294BD3F8843003F00703FB600CE0FD 158 | :1009D000254BD3F8883003F00703FB6005E021487E 159 | :1009E0004FF47971FFF724FE00BFFB68042B2ED86B 160 | :1009F00001A252F823F000BF490A00000D0A0000CE 161 | :100A0000150A0000250A00001D0A0000FFF7F0FD8E 162 | :100A1000B8601CE0FFF700FEB86018E0FFF7F2FDD9 163 | :100A2000B86014E0FFF764FD04460F4BD3F80031C3 164 | :100A300003F080731B0E01331846FFF72BFE0346AD 165 | :100A4000B4FBF3F3BB6002E00023BB6000BFBB68F4 166 | :100A500018461437BD4690BD03001C000500200059 167 | :100A600002001A008029000000400E4080B483B0CC 168 | :100A700000AF78600A4BD3F8443103F00103002B38 169 | :100A800000D007E000BF064BD3F840217B6813403D 170 | :100A9000002BF8D10C37BD465DF8047B704700BFD2 171 | :100AA00000400E4080B586B000AF78600B46FB700A 172 | :100AB00000233B617B681B0A03F00F03013B092BFA 173 | :100AC00032D801A252F823F0F10A0000FD0A00001A 174 | :100AD000290B0000290B0000F70A0000030B00009F 175 | :100AE0000D0B0000290B0000170B0000230B00006A 176 | :100AF0001A4B7B611EE01A4B7B611BE0194B7B613B 177 | :100B000018E0194B7B6101233B6113E0174B7B61BC 178 | :100B100010233B610EE0164B7B614FF480333B6149 179 | :100B200008E0144B7B6105E013484FF4FB61FFF7CD 180 | :100B30007FFD10E07B681B0B03F01F03FB603B692C 181 | :100B4000002B02D03869FFF791FFFB787869F968CC 182 | :100B50001A46FFF773FD1837BD4680BD00400E40B2 183 | :100B6000B0400E40C0400E40E0400E40E8400E4015 184 | :100B7000F0400E4050410E408029000080B584B006 185 | :100B800000AF78607B6803F47813B3F5602F00F052 186 | :100B9000A580B3F5602F16D8B3F5802F31D0B3F50B 187 | :100BA000802F05D8002B28D0B3F5003F3CD09EE025 188 | :100BB000B3F5202F47D0B3F5402F00F08B80B3F56D 189 | :100BC000002F2DD093E0B3F5D01F4BD0B3F5D01F3D 190 | :100BD00009D8B3F5A01F4FD0B3F5B01F63D0B3F55C 191 | :100BE000901F44D083E0B3F5001F6ED0B3F5381FDB 192 | :100BF00078D0B3F5E01F51D079E0FFF7A5FCF8609D 193 | :100C00007DE0FFF7A1FCF8603F4BD3F80C213F4B90 194 | :100C100013401B0A0133FA68B2FBF3F3FB606EE08A 195 | :100C2000FFF792FCF8606AE0FFF78EFCF860364B45 196 | :100C3000D3F80821354B13401B0A0133FA68B2FB85 197 | :100C4000F3F3FB605BE0FFF77FFCF8602E4BD3F81B 198 | :100C5000143103F4F8531B0A0133FA68B2FBF3F3BF 199 | :100C6000FB604CE02A48FFF77FFEF86047E0294828 200 | :100C7000FFF77AFEF86042E02548FFF775FEF8605E 201 | :100C8000214BD3F8203103F00F031846FFF702FD84 202 | :100C90000246FB68B3FBF2F3FB6030E01E48FFF74F 203 | :100CA00063FEF8602BE01C48FFF75EFEF860164B11 204 | :100CB000D3F8283103F003031846FFF7EBFC024694 205 | :100CC000FB68B3FBF2F3FB6019E01248FFF74CFE40 206 | :100CD000F86014E0FFF744FDF86010E0FFF71AFD3C 207 | :100CE000F8600CE00020FFF761FDF86007E00B48BA 208 | :100CF00040F6CC01FFF79CFC0023FB6000BFFB68C3 209 | :100D000018461037BD4680BD00400E4000FF010070 210 | :100D100002001A000500200003001C0080290000CA 211 | :100D200080B584B000AF78600123FB737B6803F06B 212 | :100D30000F03BB60BB68013B072B00F2AD8001A233 213 | :100D400052F823F0650D0000970D0000C70D00005C 214 | :100D5000990E00000D0E00003D0E0000990E0000DF 215 | :100D60005D0E0000534BD3F8943003F00703032BC0 216 | :100D700007D0042B02D0022B06D008E00223FB731D 217 | :100D800008E00323FB7305E00423FB7302E0052363 218 | :100D9000FB7300BF88E0474BD3F8803003F00703B4 219 | :100DA000022B06D0042B07D0012B08D10323FB73A1 220 | :100DB00008E00223FB7305E00A23FB7302E0012332 221 | :100DC000FB7300BF70E03B4BD3F8843003F00703A4 222 | :100DD000013B032B16D801A252F823F0ED0D0000C1 223 | :100DE000F30D0000FF0D0000F90D00000323FB735D 224 | :100DF0000BE00223FB7308E00A23FB7305E00623E4 225 | :100E0000FB7302E00123FB7300BF4DE0294BD3F8D5 226 | :100E1000883003F00703022B06D0042B07D0012BE8 227 | :100E200008D10323FB7308E00223FB7305E00A23C8 228 | :100E3000FB7302E00123FB7300BF35E01D4B1B6F0A 229 | :100E400003F00103002B05D0012B00D02CE0092377 230 | :100E5000FB7302E00723FB7300BF25E0154BD3F8BB 231 | :100E60005C3103F03003102B0CD0102B02D8002B78 232 | :100E700005D019E0202B08D0302B09D014E0012335 233 | :100E8000FB7308E00723FB7305E00423FB7302E018 234 | :100E90000823FB7300BF07E007484FF44761FFF7E3 235 | :100EA000C7FB0023FB7300BFFB7B18461037BD4612 236 | :100EB00080BD00BF00400E408029000080B588B092 237 | :100EC00000AF78600B46FB700323FB610323FB76C6 238 | :100ED00000233B617B6803F00F03FB60FB68013B71 239 | :100EE000072B00F22F8101A252F823F00D0F000012 240 | :100EF000C10F0000FD0F000045110000DF0F0000D2 241 | :100F00009D10000045110000C7100000FB78023B57 242 | :100F1000082B35D801A252F823F000BF410F000082 243 | :100F20004B0F0000550F0000650F0000810F0000FF 244 | :100F3000810F0000810F0000810F0000750F00007D 245 | :100F40000423FB610023FB7620E00323FB610123E4 246 | :100F5000FB761BE00223FB610223FB767E48FFF752 247 | :100F6000A7FB13E00123FB610323FB767A48FFF71D 248 | :100F70009FFB0BE0794840F61451FFF759FBE7E07F 249 | :100F8000764840F61951FFF753FBE1E0FB7E184627 250 | :100F90000121012200F078F9FFF792FC704AFB6909 251 | :100FA00053677048FFF7EAFD03461846FFF780FBDA 252 | :100FB000FFF79EFAB860B8680021FFF78BFCC7E026 253 | :100FC0003B69002B01D03B6900E0674B3B61FB783C 254 | :100FD000062B04D1614840F64B51FFF729FB3B69D2 255 | :100FE000002B01D03B6900E0604B3B61FB78062B96 256 | :100FF00004D15A4840F65D51FFF71AFB3B69002BBC 257 | :1010000001D03B6900E05A4B3B61FB78013B092B67 258 | :101010003AD801A252F823F0411000004710000016 259 | :1010200057100000891000008910000067100000B0 260 | :101030008910000089100000891000008310000052 261 | :1010400000237B6126E000200121012200F01CF931 262 | :1010500002237B611EE001200121012200F014F92E 263 | :1010600001237B6116E0FFF743FA03461846FFF7BA 264 | :101070001FFB404800210122FFF7E0FA03237B61B8 265 | :1010800008E004237B6105E0344840F68951FFF70E 266 | :10109000CFFA5DE03B697A691A6059E0FB78072B6B 267 | :1010A00002D0092B04D007E02D4B00221A6709E07B 268 | :1010B0002B4B01221A6705E0284840F61361FFF721 269 | :1010C000B7FA45E044E0FB78013B072B28D801A2A2 270 | :1010D00052F823F0F510000021110000211100004A 271 | :1010E0000B1100002111000021110000FB10000075 272 | :1010F0001B11000000237B6118E004200121012264 273 | :1011000000F0C2F801237B6110E0022001210122DE 274 | :1011100000F0BAF802237B6108E003237B6105E05D 275 | :101120000E4840F67161FFF783FA11E00C490C4B51 276 | :10113000D3F85C3123F030027B691B011343C1F803 277 | :101140005C3105E0054840F62771FFF771FA00BFF2 278 | :101150002037BD4680BD00BF0148E801802900005E 279 | :1011600000400E400005080080400E4088400E40C0 280 | :1011700084400E40B0400E40B0B584B000AF7860FF 281 | :101180001120FFF7CDFD0346042B04D13B4841F26B 282 | :101190009C11FFF74DFA02200021012200F074F8A3 283 | :1011A0007B685B78002B07D17B689B78002B03D191 284 | :1011B0007B68DB78002B04D0304841F2CE11FFF77A 285 | :1011C00037FA0023FB607B681B7C012B04D12B4882 286 | :1011D00041F2D311FFF72CFA7B681B7C022B01D163 287 | :1011E0000123FB602649264B5B6A23F00102FB6862 288 | :1011F00013434B627B681B78224808211A46FFF78D 289 | :101200001DFA1F491E4B9B6A23F007037A68D27AA6 290 | :1012100013438B621A497B689B88DB027A68527A97 291 | :101220001343CB62164D164B1B6B03F07F637A683A 292 | :10123000D288D20213437A68927A13437A68127A78 293 | :10124000D20143EA02047B681B7A1846FFF74EFB83 294 | :10125000034623432B630A497B685B7B1A037B6845 295 | :101260009B7B1B0113437A68D27B1A437B681B7BF1 296 | :101270001B0413434B631037BD46B0BD80290000EB 297 | :1012800000400E4024400E4080B588B000AF0346B9 298 | :10129000FB710B46BB7113467B71FB79042B3CD869 299 | :1012A00001A252F823F000BF05130000F312000062 300 | :1012B000CF120000BD120000E112000001237B618B 301 | :1012C00002233B610123FB610023BB612BE004236C 302 | :1012D0007B6108233B610323FB610223BB6122E0A6 303 | :1012E00010237B6120233B610523FB610423BB6149 304 | :1012F00019E040237B6180233B610723FB610623C8 305 | :10130000BB6110E04FF480737B614FF400733B616D 306 | :101310000923FB610823BB6105E0384841F2CC2179 307 | :10132000FFF786F967E0BB79002B59D00023FB73E8 308 | :10133000FB79022B0FD1FFF7F5FA0346002B0AD1F8 309 | :101340000123FB732E4B5B6A03F00103002B02D0D9 310 | :101350000120FFF7F5FA2A4A7B69136600BF294886 311 | :10136000B969FFF781F90346002BF8D07B79002B90 312 | :1013700035D000BF2348F969FFF776F90346002B03 313 | :10138000F8D0FB79022B2AD1FB7B002B27D01C4BFA 314 | :101390005B6A03F00103002B05D00220202101220B 315 | :1013A00000F070F903E00220002100F013F90220A0 316 | :1013B00000F02AF8B860022000210122FFF764FF44 317 | :1013C0000220B96800F05EF80D4A7B69136600BF21 318 | :1013D0000C48F969FFF748F90346002BF8D00AE0FA 319 | :1013E000074A3B69136600BF0648B969FFF73CF935 320 | :1013F0000346002BF8D12037BD4680BD8029000070 321 | :1014000000400E4090400E4080B584B000AF0346CF 322 | :10141000FB71FB79013B032B23D801A252F823F087 323 | :1014200031140000551400003D1400004914000060 324 | :10143000124B1B6AC3F30803FB601AE00F4B1B69D6 325 | :1014400003F07F03FB6014E00C4B9B6903F07F0308 326 | :10145000FB600EE0094BD3F89C30C3F30A03FB603A 327 | :1014600007E0074841F24931FFF7E2F80023FB604B 328 | :1014700000BFFB6818461037BD4680BD00400E40D7 329 | :101480008029000080B584B000AF03463960FB714D 330 | :10149000FB79013B032B00F28C8001A252F823F070 331 | :1014A000B114000065150000F11400002B150000B8 332 | :1014B0003B68B3F5007F04D3424841F27031FFF737 333 | :1014C000B7F83B68C3F308033B6000BF3E481A21EE 334 | :1014D000FFF7CAF80346002BF8D13C493B4B1B6A87 335 | :1014E00023F4FF7323F001033A6813430B6266E0B1 336 | :1014F0003B687F2B04D9334841F27B31FFF798F8E2 337 | :101500003B6803F07F033B6000BF2F481821FFF7C3 338 | :10151000ABF80346002BF8D12C492C4B1B6923F068 339 | :101520007F023B6813430B6149E03B687F2B04D982 340 | :10153000244841F29531FFF77BF83B6803F07F03C5 341 | :101540003B6000BF20481921FFF78EF80346002BAF 342 | :10155000F8D11E491D4B9B6923F07F023B68134362 343 | :101560008B612CE0194BD3F8903003F00403002B6F 344 | :1015700004D0144841F2A331FFF75AF8134A134B31 345 | :101580005B6A23F0300343F0100353623B6803F4BB 346 | :10159000F063DB091846FFF7A9F9F8600B490B4B1C 347 | :1015A0001A6B0B4B13403A681A43FB6813430B63E7 348 | :1015B00005E0044841F2BD31FFF73AF800BF1037AB 349 | :1015C000BD4680BD8029000040410E4000400E40D5 350 | :1015D00000F8FF0F80B584B000AF03460A46FB71E8 351 | :1015E0001346BB71FB79022B04D0234841F2D5315D 352 | :1015F000FFF71EF8FFF796F90346002B03D14FF4CF 353 | :101600004003FB601AE0BB79202B04D0302B0AD0BA 354 | :10161000002B04D00BE04FF40003FB600EE04FF40E 355 | :101620004003FB600AE04FF44003FB6006E0134B0D 356 | :10163000FB60114841F2F031FEF7FAFF00BF104B9A 357 | :10164000D3F89020FB681A40FB689A42F7D1FB68F8 358 | :1016500003F48003002B0AD0094BD3F8A03003F425 359 | :101660008063002B14BF01230023DBB200E00123C1 360 | :1016700018461037BD4680BD80290000FF03E107F2 361 | :1016800000400E4080B582B000AF0346FB710B46B0 362 | :10169000BB7113467B71FB79022B16D1BB79002BF2 363 | :1016A00007D00F4B4FF48062C3F8A8200C4ABB79D7 364 | :1016B00053667B79002B07D0FA79BB79104619461F 365 | :1016C000FFF788FF034606E004E0064841F22441A4 366 | :1016D000FEF7AEFF012318460837BD4680BD00BFA8 367 | :1016E00000400E408029000080B487B000AFF86051 368 | :1016F000B9607A60FB6803F10473DA00BB681344D5 369 | :101700009B007B617B697A681A601C37BD465DF877 370 | :10171000047B704780B485B000AF786039607B6827 371 | :1017200003F10473DA003B6813449B00FB60FB6821 372 | :101730001B6818461437BD465DF8047B704700BF30 373 | :1017400080B400AF034B1B6DDBB21846BD465DF89D 374 | :10175000047B7047B081E00F80B588B000AF2A4BA2 375 | :10176000FB612A4BBB612A4B7B612A4B3B612A4BB5 376 | :10177000FB602A4BBB602A4BD3F86C31B3F1FF3FBF 377 | :1017800037D0FB695B687B60FB691B683B603B682B 378 | :101790007A681A60BB695B687B60BB691B683B60E9 379 | :1017A0003B687A681A607B695B687B607B691B6851 380 | :1017B0003B603B687A681A603B695B687B603B69A9 381 | :1017C0001B683B603B687A681A60FB685B687B60FB 382 | :1017D000FB681B683B603B687A681A60BB685B68A3 383 | :1017E0007B60BB681B683B603B687A681A600123BA 384 | :1017F00005E00C484FF4A861FEF71AFF00231846D5 385 | :101800002037BD4680BD00BF3880E00F4080E00F2C 386 | :101810004880E00F5080E00F5880E00F6080E00FBC 387 | :10182000B081E00FE429000080B584B000AF244A05 388 | :10183000234BDB6E43F08073D36622480021FFF711 389 | :1018400069FFF860FB68002B03D0042000F0EAFC7D 390 | :1018500002E0002000F0E6FC194A194B1B6E23F051 391 | :10186000C0431366164A164BDB6C43F00603D36481 392 | :101870003B1D184600F062FE7B79012B1DD13B79A0 393 | :10188000022B1AD8104B1B78002B16D10F4A0F4B86 394 | :101890001B6843F001031360094B1B6EBB60BA6801 395 | :1018A0000B4B1340BB60BA680A4B1343BB60044A3E 396 | :1018B000BB681366044B01221A701037BD4680BD09 397 | :1018C00000300E404C300E409C00002044300E4052 398 | :1018D000000F0EF0B4C0400B80B58AB000AF0123FA 399 | :1018E0007B627B6A1B053B62414BDB6C03F47063DC 400 | :1018F0001B0AFB613F4B1B8803F128023D4B1B88F1 401 | :101900002833D90F0B445B1013441946FB695A1C4A 402 | :1019100013469B001344B1FBF3F3013BBB61BB696E 403 | :101920007B6107233B613A697B69934228BF134679 404 | :10193000BB61BB691B06BB61BB6923F0E063002B85 405 | :1019400004D02D4840F2B351FEF772FE3B6A23F4F7 406 | :10195000E003002B04D0284840F2B451FEF768FEA3 407 | :101960002348234BDB6C23F0EE62B9693B6A0B43DF 408 | :101970001343C364214B1B881BB2002B35DB1F4B69 409 | :101980001B88FB81FB8903F12802FB892833D90FCF 410 | :101990000B445B1013441946FB6901335A00FB6981 411 | :1019A00001335B081344B1FBF3F3BB60BB687B609E 412 | :1019B00007233B603A687B68934228BF1346BB60AD 413 | :1019C000BB681B01BB60BB6823F07003002B04D015 414 | :1019D000094840F2CB51FEF72BFE0549044B1B6D25 415 | :1019E00023F07002BB6813430B652837BD4680BDEA 416 | :1019F00000300E409E000020E4290000A2000020DC 417 | :101A000080B483B000AF78600B467B807B689AB26D 418 | :101A1000044B1A80044A7B8813800C37BD465DF85E 419 | :101A2000047B70479E000020A200002080B582B099 420 | :101A300000AF0346FB71FB79002B02D0012B04D0D1 421 | :101A400007E0084B084A9A6509E0064B074A9A6581 422 | :101A500005E0074840F2F751FEF7EAFD00BF0837FE 423 | :101A6000BD4680BD00300E4077402057372110B76B 424 | :101A7000E429000080B584B000AF0346FB710B463B 425 | :101A8000BB7113467B71FFF75BFE0346FB72FB7A6B 426 | :101A9000032B10D82E4BD3F87C31FB60FB79002B45 427 | :101AA00005D0FB6803F47F431B0AFB6031E0FB6851 428 | :101AB000DBB2FB602DE0264BD3F88031FB60BB79B5 429 | :101AC000032B1FD801A252F823F000BFDD1A00003B 430 | :101AD000E51A0000F11A0000FD1A0000FB68DBB2F5 431 | :101AE000FB6016E0FB6803F47F431B0AFB6010E019 432 | :101AF000FB6803F47F031B0CFB600AE0FB681B0E12 433 | :101B0000FB6006E0134840F23B61FEF791FD0023C5 434 | :101B10001AE07B79002B16D1FB681B03FB60FB6886 435 | :101B200023F47043002B06D00A4840F24661FEF7CA 436 | :101B30007FFD002308E00849074BDB6E23F4704269 437 | :101B4000FB681343CB66012318461037BD4680BDA2 438 | :101B5000B081E00FE429000000300E4080B588B06D 439 | :101B600000AFF860B96011461A460B46FB71134688 440 | :101B7000BB710023FB610023BB61BB791A02FB79B7 441 | :101B800013437B617B6940F2011293422BD0B3F582 442 | :101B9000817F07D2012B19D0012B4BD3B3F5807F66 443 | :101BA00055D07BE040F20122934229D040F201223D 444 | :101BB000934203D8B3F5007F56D06FE0B3F5407F72 445 | :101BC0005FD040F20132934227D067E03B4BD3F81D 446 | :101BD0007431FB61FB6903F47F431B0ABB61FB6942 447 | :101BE000DBB2FB6160E0354BD3F87431FB61FB691C 448 | :101BF0001B0EBB61FB6903F47F031B0CFB6153E00D 449 | :101C00002E4BD3F87831FB61FB6903F47F431B0A49 450 | :101C1000BB61FB69DBB2FB6146E0284BD3F878314E 451 | :101C2000FB61FB691B0EBB61FB6903F47F031B0CAB 452 | :101C3000FB6139E0214BD3F86C31FB61FB6903F4A4 453 | :101C40007F431B0ABB61FB69DBB2FB612CE01B4BD2 454 | :101C5000D3F86C31FB61FB691B0EBB61FB6903F4BC 455 | :101C60007F031B0CFB611FE0144BD3F87031FB6149 456 | :101C7000FB6903F47F431B0ABB61FB69DBB2FB61B9 457 | :101C800012E00E4BD3F87031FB61FB691B0EBB6198 458 | :101C9000FB6903F47F031B0CFB6105E0084840F27D 459 | :101CA000B761FEF7C5FC00BFFB68FA691A60BB6844 460 | :101CB000BA691A602037BD4680BD00BFB081E00F11 461 | :101CC000E429000080B584B000AF0346FB7100BF7B 462 | :101CD000274B9B6F03F00103002BF9D1244B1B6CA6 463 | :101CE00003F00303FB60FB68002B04D021480D21A7 464 | :101CF0000122FFF7F9FCFB68DBB2FA799A4209D1BD 465 | :101D0000FB79002B05D11B480D210022FFF7ECFCCD 466 | :101D10002AE029E0FB68002B05D1FB79012B02D1D9 467 | :101D2000154B02221A7000BF114B9B6F03F0010389 468 | :101D3000002BF9D10E490E4B1B6C23F00302FB79EB 469 | :101D400013430B6400BF0A4B9B6F03F00103002B8E 470 | :101D5000F9D1FB79002B14BF01230023DBB2054826 471 | :101D60000D211A46FFF7C0FC1037BD4680BD00BFED 472 | :101D700000300E4054300E409C00002080B584B0EE 473 | :101D800000AF78605D4B02229A635C4B9B6B03F063 474 | :101D90000F03022B06D05A4840F24571FEF748FC6B 475 | :101DA0000023A7E0FFF7D8FC7B681B89C82B04D968 476 | :101DB000534840F24F71FEF73BFC7B689A887B6882 477 | :101DC0001B899A4204D94E484FF4EA61FEF730FC71 478 | :101DD0007B689B891BB2C82B04DD494840F25171D6 479 | :101DE000FEF726FC7B685B78012B08D17B689B881B 480 | :101DF000C82B04D9424840F25571FEF719FC7B68A4 481 | :101E0000DB8842F21072934204D93D4840F25F7180 482 | :101E1000FEF70EFC7B68DB884A2B02D80023FB60B0 483 | :101E200015E07B68DB88B3F5FA7F03D24FF080536F 484 | :101E3000FB600CE07B68DB8840F6C312934203D85A 485 | :101E40004FF00053FB6002E04FF04053FB602B4823 486 | :101E50002A4BDB6C23F0405323F001037A6892890C 487 | :101E600012B2002A01DB012100E00021FA680A43D6 488 | :101E70001343C364FFF7D8FC7B681B891A467B6851 489 | :101E80009B891BB210461946FFF7BAFD7B689A88FA 490 | :101E90001C4B1A807B689B88184600F04FF97B68C2 491 | :101EA0009B7B1846FFF7C2FD7B685B8818460121C3 492 | :101EB000012200F02BF8034683F00103DBB2002B74 493 | :101EC00006D00F4840F29671FEF7B2FB002311E0F6 494 | :101ED0007B689B7A002B14BF01230023DBB20A48E6 495 | :101EE00005211A46FFF700FC7B685B781846FFF770 496 | :101EF000E9FE012318461037BD4680BD00300E4074 497 | :101F0000E4290000A00000203C300E4080B590B0D5 498 | :101F100000AF78600B46FB701346BB700023FB6379 499 | :101F200000237B6300233B6200237B620023BB61B1 500 | :101F30000023FB6100233B6100237B610023BB8105 501 | :101F40007B68B3F5E16F06D37B6840F6B832934205 502 | :101F500001D8012300E0002387F8333097F83330AD 503 | :101F600003F0010387F8333097F8333083F001032F 504 | :101F7000DBB2002B06D06E4840F2DA71FEF758FB58 505 | :101F80000023D0E07B68B3F5E16F8CBF0123002311 506 | :101F900087F8323097F83230002B0AD04FF4E163E3 507 | :101FA000FB6340F6B8337B637A6BFB6BD31ABB637E 508 | :101FB00009E04FF49663FB634FF4E1637B637A6B54 509 | :101FC000FB6BD31ABB6397F83230002B0CD0594B04 510 | :101FD000D3F86831FB61FB691B0E7B61FB6903F47D 511 | :101FE0007F031B0CFB610BE0524BD3F86831FB61A4 512 | :101FF000FB6903F47F431B0A7B61FB69DBB2FB6176 513 | :102000004D4BDB6C03F040531B0FDBB23B733B7B50 514 | :1020100007F1180007F1100197F83220FFF79EFD35 515 | :102020007A68FB6BD31A7969FA698A1A02FB03F2A0 516 | :10203000BB6BB2FBF3F37B627A6AFB6913447B628E 517 | :102040007A68FB6BD31A3969BA698A1A02FB03F200 518 | :10205000BB6BB2FBF3F33B623A6ABB6913443B626E 519 | :102060007A6A7B699A420BD87A6AFB699A4207D3EB 520 | :102070003A6A3B699A4203D83A6ABB699A4206D2E5 521 | :102080002B4840F62601FEF7D3FA00234BE0BB783D 522 | :10209000002B12D02849284BDB6D23F4FE4323F09C 523 | :1020A00002037A6A12021A4397F83230002B01D0E9 524 | :1020B000022300E000231343CB65FB78002B31D0D3 525 | :1020C0003B7B97F83220104619460022FFF7D2FCDE 526 | :1020D000034683F00103DBB2002B06D0144840F620 527 | :1020E0003501FEF7A5FA00231DE03B6AFB62E723FA 528 | :1020F000BB62BA6AFB6A934228BF13463B620E4931 529 | :102100000D4B5B6E23F4FF7323F001033A6A520018 530 | :102110001A4397F83230002B01D0012300E000234E 531 | :1021200013434B66012318464037BD4680BD00BFB0 532 | :10213000E4290000B081E00F00300E4080B584B08B 533 | :1021400000AF78600023FB60344B1B6F03F0070384 534 | :10215000BB60324BDB6C03F00103002B15D0BB6876 535 | :10216000012B12D97B68132B02D80423FB600BE0F0 536 | :102170007B68132B05D97B68272B02D80823FB60CB 537 | :1021800002E01023FB6033E032E0244BDB6C03F011 538 | :102190000103002B15D1BB68012B12D87B68092BDA 539 | :1021A00002D80423FB600BE07B68092B05D97B6810 540 | :1021B000132B02D80823FB6002E01023FB6017E01A 541 | :1021C00016E0164BDB6C03F00103002B0BD0BB6851 542 | :1021D000012B08D87B68272B02D80823FB6007E077 543 | :1021E0001023FB6004E00E4840F67801FEF720FA69 544 | :1021F000FB68013BFB60FB681A02FB681B0313438F 545 | :10220000FB600649054BDB6C23F47F42FB681343FC 546 | :10221000CB64FFF761FB1037BD4680BD00300E4038 547 | :10222000E429000080B584B000AF0346FB7111487B 548 | :102230000021FFF76FFAF860FB68002B02D1FB79F1 549 | :10224000012B07D9FB68002B04D10B4840F69601FF 550 | :10225000FEF7EEF90949094B1B6F23F00702FB79E2 551 | :1022600013430B67064B1B881846FFF767FF1037B1 552 | :10227000BD4680BD4C300E40E429000000300E40C9 553 | :10228000A000002080B485B000AF786039607B6822 554 | :1022900003F1C063FB60FB683A681A601437BD46FF 555 | :1022A0005DF8047B704700BF80B485B000AF7860F4 556 | :1022B00039607B6803F18063FB60FB683A681A60F1 557 | :1022C0001437BD465DF8047B704700BF80B582B00F 558 | :1022D00000AF03463960FB71FB79002B1DD0FB7901 559 | :1022E000012B17D0FB79022B11D0FB79032B0BD0DC 560 | :1022F000FB79042B06D0FB79052B01D1FF230DE0E0 561 | :1023000000230BE0002309E04FF47E4306E04FF486 562 | :102310007C6303E04FF4784300E03F233A681341C5 563 | :1023200003F00103002B04D10C4840F25931FEF7B1 564 | :102330007FF9FA7913465B0013441B010C3303F158 565 | :10234000804303F520433A68012101FA02F218465E 566 | :102350001146FFF7A9FF0837BD4680BD482A000097 567 | :1023600080B582B000AF03463960FB71FB79002B6A 568 | :102370001DD0FB79012B17D0FB79022B11D0FB79F3 569 | :10238000032B0BD0FB79042B06D0FB79052B01D155 570 | :10239000FF230DE000230BE0002309E04FF47E4310 571 | :1023A00006E04FF47C6303E04FF4784300E03F2302 572 | :1023B0003A68134103F00103002B04D10C4840F2AA 573 | :1023C0008631FEF735F9FA7913465B0013441B0199 574 | :1023D0000C3303F1804303F520433A68012101FAED 575 | :1023E00002F218461146FFF74DFF0837BD4680BD83 576 | :1023F000482A000090B585B000AFB9607B60034605 577 | :10240000FB731346BB73FB7B002B1DD0FB7B012BA7 578 | :1024100017D0FB7B022B11D0FB7B032B0BD0FB7B5C 579 | :10242000042B06D0FB7B052B01D1FF230DE00023FD 580 | :102430000BE0002309E04FF47E4306E04FF47C6399 581 | :1024400003E04FF4784300E03F23BA68134103F000 582 | :102450000103002B04D137484FF48571FEF7E8F8EB 583 | :10246000BB7B002B0DD07B68002B05D0FB7B184677 584 | :10247000B968FFF775FF04E0FB7B1846B968FFF702 585 | :1024800025FFBB68072B1CD82B4CFA7B2A48F97B0D 586 | :102490000B465B000B441B0103445968BB689B005F 587 | :1024A00018460F238340DB430B40B97BB86880009C 588 | :1024B0008140194313465B0013441B0123445960B8 589 | :1024C00024E01D4CFA7B1C48F97B0B465B000B4457 590 | :1024D0001B01034408331968BB6803F18043083BC0 591 | :1024E0009B0018460F238340DB431940B87BBB6831 592 | :1024F00003F18043083B9B0000FA03F319431346A2 593 | :102500005B0013441B01234408331960BB7B002B81 594 | :102510000DD17B68002B05D0FB7B1846B968FFF70F 595 | :102520001FFF04E0FB7B1846B968FFF7CFFE1437A6 596 | :10253000BD4690BDAC2A000000A0004080B584B02C 597 | :1025400000AF78607B68002B03D11A483E21FEF76C 598 | :102550006FF8194B5B69DBB203F00F03DBB29B0032 599 | :10256000FB73154B1B6903F0C0039B09DAB2FB7BBD 600 | :102570001343FB737B68FA7B9A700F4B1B69DBB2CA 601 | :1025800003F03F03DAB27B685A700B4B9B69DBB2F6 602 | :1025900023F00F03FB73084BDB6903F0F0031B0907 603 | :1025A000DAB2FB7B1343FB737B68FA7B1A7010373C 604 | :1025B000BD4680BD102B0000D0FF0FE080B483B07B 605 | :1025C00000AF03463960FB7197F90730002B0BDA37 606 | :1025D0000D49FB7903F00F03043B3A68D2B2520174 607 | :1025E000D2B20B441A7609E0084997F907303A68E5 608 | :1025F000D2B25201D2B20B4483F800230C37BD464D 609 | :102600005DF8047B704700BF00ED00E000E100E0F2 610 | :1026100080B582B000AF78607B68013BB3F1807F0A 611 | :1026200001D301230FE00A4A7B68013B53604FF05E 612 | :10263000FF300721FFF7C2FF054B00229A60044BD1 613 | :1026400007221A60002318460837BD4680BD00BF28 614 | :1026500010E000E080B400AF044BDB6C1B0EDBB27B 615 | :102660001846BD465DF8047B704700BFB081E00F9F 616 | :1026700080B586B000AF4FF050133B610023FB6084 617 | :10268000FFF7E8FF0346FB723B461846FFF756FF8D 618 | :10269000FB7A8E2B22D81D4BD3F8B0307B601B4ABF 619 | :1026A0007B6843F00403C2F8B03000237B610EE086 620 | :1026B00017483A69FB6842EA03017A6913465B00EE 621 | :1026C00013441B01034419607B6901337B617B69FF 622 | :1026D000052BEDD90D4A7B68C2F8B030FB7A8F2B01 623 | :1026E00007D80A4A094BDB6A23F07F0343F0200333 624 | :1026F000D3627B78012B05D1064A064B1B6843F059 625 | :10270000040313601837BD4680BD00BF00400E4073 626 | :1027100000A0004064310E4080B400AF044B1B6841 627 | :102720000133034A1360BD465DF8047B704700BF68 628 | :10273000A400002080B485B000AF7860074B1B6810 629 | :10274000FB6000BF054B1A68FB68D21A7B689A428F 630 | :10275000F8D31437BD465DF8047B7047A400002011 631 | :10276000B0B58AB000AF244B07F118041868596857 632 | :102770009A68DB680FC4214B3C1D1D4628686968B8 633 | :10278000AA68EB680FC42B8A2380FFF771FF07F15B 634 | :1027900018031846FFF7F2FA3B1D1846FEF7ECFC4B 635 | :1027A00011200421FEF78AFB032000210022FEF7FE 636 | :1027B0006BFD1348FEF7E2F90246124BA3FB02231E 637 | :1027C0009B091846FFF724FF0346002B00D0FEE7C5 638 | :1027D000FDF7E2FD0020FDF72FFE0120FDF70AFEC8 639 | :1027E0000020FDF74BFE0120FDF748FE4FF47A7004 640 | :1027F000FFF7A0FFF4E700BF782B0000882B000054 641 | :1028000050000200D34D621008B5074B044613B1C7 642 | :102810000021AFF30080054B1868836A03B1984725 643 | :10282000204600F033F800BF000000009C2B0000A1 644 | :1028300070B50E4B0E4CE41AA41000251E46A5429E 645 | :1028400004D056F8253098470135F8E700F020F815 646 | :10285000084C094BE41AA41000251E46A54204D0DA 647 | :1028600056F8253098470135F8E770BD7400002010 648 | :102870007400002078000020740000200244034609 649 | :10288000934202D003F8011BFAE77047FEE700BF4E 650 | :10289000F8B500BFF8BC08BC9E467047F8B500BF4D 651 | :1028A000F8BC08BC9E467047633A5C73696C696308 652 | :1028B0006F6E6C6162735C73696D706C696369746F 653 | :1028C0007973747564696F5C76345C646576656C85 654 | :1028D0006F7065725C73646B735C6765636B6F5F6D 655 | :1028E00073646B5F73756974655C76312E315C70EF 656 | :1028F0006C6174666F726D5C656D6C69625C696E4B 657 | :10290000635C656D5F6770696F2E6800050000008D 658 | :10291000040000000500000005000000633A5C733D 659 | :10292000696C69636F6E6C6162735C73696D706C06 660 | :10293000696369747973747564696F5C76345C6417 661 | :102940006576656C6F7065725C73646B735C6765EC 662 | :10295000636B6F5F73646B5F73756974655C76310D 663 | :102960002E315C706C6174666F726D5C656D6C6944 664 | :10297000625C696E635C656D5F636D752E680000F7 665 | :10298000433A2F53696C69636F6E4C6162732F53C6 666 | :10299000696D706C696369747953747564696F2FBC 667 | :1029A00076342F646576656C6F7065722F73646B17 668 | :1029B000732F6765636B6F5F73646B5F73756974A7 669 | :1029C000652F76312E312F706C6174666F726D2FAA 670 | :1029D000656D6C69622F7372632F656D5F636D75D2 671 | :1029E0002E630000433A2F53696C69636F6E4C612C 672 | :1029F00062732F53696D706C696369747953747570 673 | :102A000064696F2F76342F646576656C6F706572BC 674 | :102A10002F73646B732F6765636B6F5F73646B5F9A 675 | :102A200073756974652F76312E312F706C61746601 676 | :102A30006F726D2F656D6C69622F7372632F656D98 677 | :102A40005F656D752E630000633A5C73696C696342 678 | :102A50006F6E6C6162735C73696D706C69636974CD 679 | :102A60007973747564696F5C76345C646576656CE3 680 | :102A70006F7065725C73646B735C6765636B6F5FCB 681 | :102A800073646B5F73756974655C76312E315C704D 682 | :102A90006C6174666F726D5C656D6C69625C696EA9 683 | :102AA000635C656D5F6770696F2E6800433A2F53F2 684 | :102AB000696C69636F6E4C6162732F53696D706CE2 685 | :102AC000696369747953747564696F2F76342F6400 686 | :102AD0006576656C6F7065722F73646B732F6765B5 687 | :102AE000636B6F5F73646B5F73756974652F7631A9 688 | :102AF0002E312F706C6174666F726D2F656D6C690D 689 | :102B0000622F7372632F656D5F6770696F2E63004C 690 | :102B1000433A2F53696C69636F6E4C6162732F5334 691 | :102B2000696D706C696369747953747564696F2F2A 692 | :102B300076342F646576656C6F7065722F73646B85 693 | :102B4000732F6765636B6F5F73646B5F7375697415 694 | :102B5000652F76312E312F706C6174666F726D2F18 695 | :102B6000656D6C69622F7372632F656D5F73797326 696 | :102B700074656D2E630000000001080705000A005F 697 | :102B8000C8002000FFFF000001000000A00042017B 698 | :102B90000A200706020A0407000043001400002070 699 | :042BA0000000000031 700 | :082BA40080D5FF7F0100000055 701 | :102BAC00005A620200800000C0EA2101C0EA210143 702 | :102BBC00C0EA21010000000000000000000000003D 703 | :102BCC0000000000000000000000000000000000F9 704 | :102BDC00000000009A2B0000000000000000000024 705 | :102BEC0000000000000000000000000000000000D9 706 | :102BFC0000000000000000000000000000000000C9 707 | :102C0C0000000000000000000000000000000000B8 708 | :102C1C0000000000ED000000C900000000000000F2 709 | :04000003000004C134 710 | :00000001FF 711 | -------------------------------------------------------------------------------- /hex_bin/SLSTK3701A_blink.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/hex_bin/SLSTK3701A_blink.bin -------------------------------------------------------------------------------- /hex_bin/SLSTK3701A_blink.hex: -------------------------------------------------------------------------------- 1 | :1000000000000820A5080000D1080000D108000069 2 | :10001000D1080000D1080000D1080000D10800007C 3 | :10002000D1080000D1080000D1080000D10800006C 4 | :10003000D1080000D1080000D1080000952500007B 5 | :10004000D1080000D1080000D1080000D10800004C 6 | :10005000D1080000D1080000D1080000D10800003C 7 | :10006000D1080000D1080000D1080000D10800002C 8 | :10007000D1080000D1080000D1080000D10800001C 9 | :10008000D1080000D1080000D1080000D10800000C 10 | :10009000D1080000D1080000D1080000D1080000FC 11 | :1000A000D1080000D1080000D1080000D1080000EC 12 | :1000B000D1080000D1080000D1080000D1080000DC 13 | :1000C000D1080000D1080000D1080000D1080000CC 14 | :1000D000D1080000D1080000D1080000D1080000BC 15 | :1000E000D1080000D1080000D1080000D1080000AC 16 | :1000F000D1080000D1080000D1080000D10800009C 17 | :10010000D1080000D1080000D1080000D10800008B 18 | :10011000D1080000D1080000D1080000D10800007B 19 | :10012000D1080000D1080000D1080000D10800006B 20 | :10013000D1080000D1080000D1080000D10800005B 21 | :10014000D1080000D1080000D1080000D10800004B 22 | :1001500010B5054C237833B9044B13B10448AFF301 23 | :1001600000800123237010BD8400002000000000E7 24 | :1001700094290000084B10B51BB108480849AFF39B 25 | :1001800000800848036803B910BD074B002BFBD063 26 | :10019000BDE81040184700BF00000000942900008F 27 | :1001A000880000208000002000000000154B002B7C 28 | :1001B00008BF134B9D46A3F5803A00218B460F469E 29 | :1001C0001348144A121A02F07BFA0F4B002B00D08E 30 | :1001D00098470E4B002B00D09847002000210400C8 31 | :1001E0000D000D48002802D00C48AFF3008002F04B 32 | :1001F00041FA2000290002F0F1F902F027FA00BFCD 33 | :1002000000000800000008200000000000000000BE 34 | :1002100084000020AC00002000000000000000006E 35 | :1002200080B485B000AF786039607B6803F10473F7 36 | :10023000DA003B6813449B00FB60FB681B681846B0 37 | :100240001437BD465DF8047B704700BF80B485B0AD 38 | :1002500000AF786039607B6803F1C063FB60FB68C6 39 | :100260003A681A601437BD465DF8047B704700BFDA 40 | :1002700080B485B000AF786039607B6803F180633B 41 | :10028000FB60FB683A681A601437BD465DF8047B72 42 | :10029000704700BF80B582B000AF03463960FB7184 43 | :1002A000FB79002B31D0FB79012B2BD0FB79022B72 44 | :1002B00025D0FB79032B1FD0FB79042B19D0FB79B8 45 | :1002C000052B13D0FB79062B0DD0FB79072B07D01C 46 | :1002D000FB79082B02D14FF6FF7318E0002316E0DC 47 | :1002E0004FF6FF7313E04FF6FF7310E04FF6FF7306 48 | :1002F0000DE04FF6FF730AE04FF6FF7307E04FF68D 49 | :10030000FF7304E04FF6FF7301E04FF6FF733A68A6 50 | :10031000134103F00103002B04D10D4840F2593181 51 | :1003200000F06EFBFA7913465B0013441B010C339B 52 | :1003300003F1804303F508233A68012101FA02F230 53 | :1003400018461146FFF794FF0837BD4680BD00BF31 54 | :10035000EC26000080B582B000AF03463960FB7127 55 | :10036000FB79002B31D0FB79012B2BD0FB79022BB1 56 | :1003700025D0FB79032B1FD0FB79042B19D0FB79F7 57 | :10038000052B13D0FB79062B0DD0FB79072B07D05B 58 | :10039000FB79082B02D14FF6FF7318E0002316E01B 59 | :1003A0004FF6FF7313E04FF6FF7310E04FF6FF7345 60 | :1003B0000DE04FF6FF730AE04FF6FF7307E04FF6CC 61 | :1003C000FF7304E04FF6FF7301E04FF6FF733A68E6 62 | :1003D000134103F00103002B04D10C4840F27131AA 63 | :1003E00000F00EFBFA7913465B0013441B010C333B 64 | :1003F00003F1804303F5082318463968FFF710FF1F 65 | :10040000034618460837BD4680BD00BFEC260000F5 66 | :1004100080B582B000AF03463960FB71FB79002BD9 67 | :1004200031D0FB79012B2BD0FB79022B25D0FB7926 68 | :10043000032B1FD0FB79042B19D0FB79052B13D08C 69 | :10044000FB79062B0DD0FB79072B07D0FB79082B06 70 | :1004500002D14FF6FF7318E0002316E04FF6FF734A 71 | :1004600013E04FF6FF7310E04FF6FF730DE04FF609 72 | :10047000FF730AE04FF6FF7307E04FF6FF7304E0E7 73 | :100480004FF6FF7301E04FF6FF733A68134103F034 74 | :100490000103002B04D10D4840F2863100F0B0FA80 75 | :1004A000FA7913465B0013441B010C3303F18043BC 76 | :1004B00003F508233A68012101FA02F218461146B1 77 | :1004C000FFF7C4FE0837BD4680BD00BFEC26000024 78 | :1004D00090B587B000AF786000237B6101233B615A 79 | :1004E0007B68002B48DB7B68012B45DC0023FB602D 80 | :1004F00036E02448FB687A68D9001346DB009B1A73 81 | :100500009B000B4403441C791E48FB687A68D900A1 82 | :100510001346DB009B1A9B000B4403449B68204658 83 | :100520001946FFF717FF0346002B14BF01230023D2 84 | :10053000FB7214497A681346DB009B1A9B000B443C 85 | :100540001B78FA7A9A4201D13B6900E000237A696C 86 | :1005500013447B613B695B003B61FB680133FB60DB 87 | :1005600008497A681346DB009B1A9B000B445B78B2 88 | :100570001A46FB689A42BCDC7B6918461C37BD46AC 89 | :1005800090BD00BF5027000090B585B000AF7860E7 90 | :1005900039600123BB607B68002B60DB7B68012B2B 91 | :1005A0005DDC0023FB604EE03A68BB681A40BB6824 92 | :1005B0009A420CBF01230023DBB2184629497A680E 93 | :1005C0001346DB009B1A9B000B441B7898421AD100 94 | :1005D0002448FB687A68D9001346DB009B1A9B000D 95 | :1005E0000B4403441C791F48FB687A68D900134602 96 | :1005F000DB009B1A9B000B4403449B682046194672 97 | :10060000FFF706FF19E01748FB687A68D900134620 98 | :10061000DB009B1A9B000B4403441C791148FB68C8 99 | :100620007A68D9001346DB009B1A9B000B440344F5 100 | :100630009B6820461946FFF72DFEBB685B00BB6038 101 | :10064000FB680133FB6007497A681346DB009B1A9D 102 | :100650009B000B445B781A46FB689A42A4DC143773 103 | :10066000BD4690BD50270000B0B582B000AF28480D 104 | :10067000012100F02DFC2748012100F029FC002376 105 | :100680007B603CE000233B602AE023483B687A68BB 106 | :10069000D9001346DB009B1A9B000B4403441D79D1 107 | :1006A0001D483B687A68D9001346DB009B1A9B0003 108 | :1006B0000B4403449C6818497A681346DB009B1A74 109 | :1006C0009B000B441B78002B01D0002300E001238A 110 | :1006D00028462146042201F051FE3B6801333B606D 111 | :1006E0000D497A681346DB009B1A9B000B445B782C 112 | :1006F0001A463B689A42C8DC7B6801337B607B68A2 113 | :10070000012BBFDD002318460837BD46B0BD00BF32 114 | :1007100040410500005508005027000080B584B016 115 | :1007200000AF78607B68002B13DB7B68012B10DC4B 116 | :100730007868FFF7CDFEF860FB68002B02D14FF020 117 | :10074000FF3300E0002378681946FFF71DFF002300 118 | :1007500001E04FF0FF3318461037BD4680BD00BFA3 119 | :1007600080B582B000AF3B4A3A4BD3F8B03043F08B 120 | :100770002003C2F8B030384A374BD3F8403443F046 121 | :100780001003C2F84034344A334BD3F8443423F0D6 122 | :100790000303C2F84434304A2F4BD3F8F43023F427 123 | :1007A0007063C2F8F4302C4A2B4BD3F8F43043F486 124 | :1007B0008063C2F8F430274B10221A6600BF254B25 125 | :1007C000D3F8903003F02003002BF8D0234A234BBA 126 | :1007D0001B6843F001031360204A204BDB6843F0A1 127 | :1007E0008073D3601E4B1F4A1A601F4800F01EFC26 128 | :1007F000034603F5D52303F2FC437B607B68DB08EB 129 | :100800001A4AA2FB03239B0A3B60194A3B68013B3F 130 | :100810001361174B0222C3F8F020154B4FF480727E 131 | :10082000C3F804234FF06043124AC3F8B02F4FF0CF 132 | :100830006043114AC3F8802E4FF060424FF060438E 133 | :10084000D3F8003E43F00103C2F8003E0837BD462E 134 | :1008500080BD00BF00400E4000800840F0ED00E089 135 | :10086000001000E0FF13014006000C001791650224 136 | :10087000000004E055CEACC50900010080B582B08F 137 | :1008800000AF4FF07E637B607B681B68002B01D15B 138 | :10089000002302E0FFF764FF012318460837BD4636 139 | :1008A00080BD00BF064880470649074A074B9A4269 140 | :1008B000BEBF51F8040B42F8040BF8E7FFF776FCD3 141 | :1008C000A1090000A02900000000002084000020F1 142 | :1008D000FEE700BF80B582B000AF00F01DF8786081 143 | :1008E0000A4BD3F808210A4B13401B0A3B603B68B4 144 | :1008F00001337A68B2FBF3F37B60064A7B681360CE 145 | :100900007B6818460837BD4680BD00BF00400E40DA 146 | :1009100000FF01000800002080B483B000AF164B38 147 | :10092000D3F8943003F00703032B08D0042B02D034 148 | :10093000022B08D00BE0114B1B687B600BE04FF4DF 149 | :1009400000437B6007E00E4B1B687B6003E00D4BB0 150 | :100950001B687B6000BF084BD3F8003103F4F853E9 151 | :100960001B0A01337A68B2FBF3F318460C37BD4615 152 | :100970005DF8047B704700BF00400E40040000207B 153 | :10098000000000200C00002080B400AF034B1B6867 154 | :100990001846BD465DF8047B704700BF000000208C 155 | :1009A00080B400AF054A054BD3F8883043F4700398 156 | :1009B000C2F88830BD465DF8047B704700ED00E06A 157 | :1009C00080B400AF4FF400431846BD465DF8047B89 158 | :1009D000704700BF80B400AF4FF47A731846BD462D 159 | :1009E0005DF8047B704700BF80B400AF034B1B6809 160 | :1009F0001846BD465DF8047B704700BF0400002028 161 | :100A000080B483B000AF78603960FEE780B487B00F 162 | :100A100000AFF860B9607A60FB6803F10473DA0034 163 | :100A2000BB6813449B007B617B697A681A601C3742 164 | :100A3000BD465DF8047B704780B483B000AF78603A 165 | :100A40007B68012202FA03F318460C37BD465DF8B5 166 | :100A5000047B704780B483B000AF054B1B687B609C 167 | :100A60007B6818460C37BD465DF8047B704700BFB5 168 | :100A70001000002080B582B000AFFFF74DFF786016 169 | :100A8000064BD3F8003103F4F8531B0A01337A689C 170 | :100A900002FB03F318460837BD4680BD00400E40F8 171 | :100AA00080B582B000AF0F4800F04AFC0346FB70EF 172 | :100AB000FB78072B05D0092B07D1FFF72DFF7860B6 173 | :100AC0000BE0FFF7C7FF786007E007484FF4E371DA 174 | :100AD000FFF796FF00237B6000BF7B68184608374E 175 | :100AE000BD4680BD06000C00EC27000080B584B038 176 | :100AF00000AF78607B68002B02D0012B06D00BE0A2 177 | :100B0000224800F01DFC0346FB720CE0204800F078 178 | :100B100017FC0346FB7206E01E4840F2E711FFF7A0 179 | :100B20006FFF00232EE0FB7A013B072B21D801A2A7 180 | :100B300052F823F0550B0000730B0000730B0000FC 181 | :100B4000630B0000730B0000730B00005B0B0000D5 182 | :100B50006B0B00000023FB6013E0FFF77BFFF860E6 183 | :100B60000FE0FFF711FFF8600BE0FFF783FFF8607D 184 | :100B700007E0084840F2FD11FFF742FF0023FB6049 185 | :100B800000BFFB6818461037BD4680BD98002E0098 186 | :100B900099003000EC27000080B582B000AF1C48FF 187 | :100BA00000F0CEFB0346FB70FB78043B062B21D8FC 188 | :100BB00001A252F823F000BFDD0B0000D50B0000AE 189 | :100BC000F50B0000E50B0000F50B0000F50B000035 190 | :100BD000ED0B00000F4B1B687B6013E0FFF7D4FEAA 191 | :100BE00078600FE0FFF736FF78600BE00A4B1B6878 192 | :100BF0007B6007E0094840F22721FFF701FF00234F 193 | :100C00007B6000BF7B6818460837BD4680BD00BFCB 194 | :100C10000A7B32000C00002014000020EC270000AA 195 | :100C200080B584B000AF78607B68002B1AD11F4874 196 | :100C300000F086FB0346FB7200BFFB7A043B062BE9 197 | :100C400027D801A252F823F07B0C0000730C00009F 198 | :100C5000930C0000830C0000930C0000930C000028 199 | :100C60008B0C0000124840F24321FFF7C9FE00231D 200 | :100C700018E0104B1B68FB6013E0FFF785FEF8607F 201 | :100C80000FE0FFF7E7FEF8600BE00B4B1B68FB6023 202 | :100C900007E0074840F25921FFF7B2FE0023FB604E 203 | :100CA00000BFFB6818461037BD4680BD0B7C340082 204 | :100CB000EC2700000C0000201400002080B582B05A 205 | :100CC00000AF244800F03CFB0346FB70FB78023B7E 206 | :100CD000092B31D801A252F823F000BF290D0000E2 207 | :100CE000310D00000D0D0000210D0000390D000038 208 | :100CF000390D0000390D0000390D0000050D000010 209 | :100D0000150D0000144B1B687B601DE0FFF73CFED7 210 | :100D1000786019E0FFF738FE03465B007B6013E064 211 | :100D20000E4B1B687B600FE0FFF75EFE78600BE008 212 | :100D3000FFF746FE786007E0094840F28A21FFF796 213 | :100D40005FFE00237B6000BF7B6818460837BD4606 214 | :100D500080BD00BF0C7F3600140000200C00002076 215 | :100D6000EC27000090B585B000AF78600023BB6031 216 | :100D70007B68434A934212D0414A934203D8414A86 217 | :100D800093420CD005E0404A934208D03F4A934238 218 | :100D900005D03F4840F2B531FFF732FE00E000BF1A 219 | :100DA000786800F0CDFA0346FB607B68344A9342D2 220 | :100DB00014D0334A934203D8324A934207D022E0F8 221 | :100DC000314A934211D0314A934215D01BE0314B46 222 | :100DD000D3F8803003F00703FB601AE02D4BD3F803 223 | :100DE000843003F00703FB6013E02A4BD3F88C3008 224 | :100DF00003F00703FB600CE0264BD3F8883003F0C8 225 | :100E00000703FB6005E022484FF47971FFF7F8FD16 226 | :100E100000BFFB68042B2ED801A252F823F000BFBC 227 | :100E2000710E0000350E00003D0E00004D0E00005A 228 | :100E3000450E0000FFF7C4FDB8601CE0FFF7D4FDCD 229 | :100E4000B86018E0FFF7C6FDB86014E0FFF742FD98 230 | :100E50000446104BD3F8003103F040731B0E0133EE 231 | :100E60001846FFF7E9FD0346B4FBF3F3BB6002E06D 232 | :100E70000023BB6000BFBB6818461437BD4690BD59 233 | :100E800003001C0002001A0004001E0005002000E0 234 | :100E9000EC27000000400E4080B483B000AF7860C3 235 | :100EA0000A4BD3F8443103F00103002B00D007E0D4 236 | :100EB00000BF064BD3F840217B681340002BF8D1CC 237 | :100EC0000C37BD465DF8047B704700BF00400E4004 238 | :100ED00080B586B000AF78600B46FB7000233B61A5 239 | :100EE0007B681B0A03F00F03013B0E2B6AD801A29B 240 | :100EF00052F823F0310F00003D0F0000C50F000035 241 | :100F0000C50F0000370F0000490F0000530F00000D 242 | :100F10005D0F0000690F0000BF0F0000750F00009B 243 | :100F2000970F0000C50F0000430F0000B90F00002D 244 | :100F3000314B7B614CE0314B7B6149E0304B7B6155 245 | :100F400046E0304B7B6143E02F4B7B6101233B61EB 246 | :100F50003EE02E4B7B6110233B6139E02C4B7B61E3 247 | :100F60004FF480733B6133E02A4B7B614FF4803355 248 | :100F70003B612DE0284B7B61FB78002B14BF0123E4 249 | :100F80000023DBB283F00103DBB2FB70FB7803F0DC 250 | :100F90000103FB701CE0214B7B61FB78002B14BF2D 251 | :100FA00001230023DBB283F00103DBB2FB70FB788B 252 | :100FB00003F00103FB700BE0194B7B6108E0194B58 253 | :100FC0007B6105E018484FF4FB61FFF719FD10E065 254 | :100FD0007B681B0B03F01F03FB603B69002B02D0F7 255 | :100FE0003869FFF759FFFB787869F9681A46FFF707 256 | :100FF0000DFD1837BD4680BD00400E40B0400E408C 257 | :10100000C0400E40C4400E40E0400E40E8400E405C 258 | :10101000EC400E40F0400E4060410E4064410E40F6 259 | :10102000F0410E4050410E40EC27000080B584B0E6 260 | :1010300000AF78607B6803F47813B3F5C01F00F04D 261 | :101040000581B3F5C01F31D8B3F5402F00F02A81D8 262 | :10105000B3F5402F12D8B3F5802F62D0B3F5802FAF 263 | :1010600005D8002B59D0B3F5003F6DD04EE1B3F554 264 | :10107000002F65D0B3F5202F75D047E1B3F5901F51 265 | :1010800000F09480B3F5901F07D8B3F5602F00F0FF 266 | :101090000D81B3F5801F7AD038E1B3F5A01F00F0C1 267 | :1010A0008A80B3F5B01F00F0BF802FE1B3F5301F89 268 | :1010B00000F0DF80B3F5301F16D8B3F5001F00F045 269 | :1010C000EC80B3F5001F07D8B3F5D01F5AD0B3F5A5 270 | :1010D000E01F00F0A48019E1B3F5181F7DD0B3F52F 271 | :1010E000281F00F08D8011E1B3F5481F00F0018149 272 | :1010F000B3F5481F08D8B3F5381F00F0DB80B3F50F 273 | :10110000401F00F0E68001E1B3F5501F00F0F580CC 274 | :10111000B3F5581F00F0F680F8E0FFF7FDFBF8602C 275 | :10112000FCE0FFF7F9FBF8607F4BD3F80C217F4B15 276 | :1011300013401B0A0133FA68B2FBF3F3FB60EDE0E6 277 | :10114000FFF7EAFBF860E9E0FFF7E6FBF860764BB3 278 | :10115000D3F80821754B13401B0A0133FA68B2FB20 279 | :10116000F3F3FB60DAE0FFF7D7FBF8606E4BD3F8E0 280 | :10117000143103F4F8531B0A0133FA68B2FBF3F39A 281 | :10118000FB60CBE06A48FFF7EDFDF860C6E0684819 282 | :10119000FFF7E8FDF860644BD3F8203103F47023C7 283 | :1011A0001B0C1A46FB68D340FB60B7E06148FFF7B1 284 | :1011B000D9FDF860B2E05E48FFF7D4FDF8605A4B05 285 | :1011C000D3F8203103F00F031846FFF735FC024631 286 | :1011D000FB68B3FBF2F3FB60A0E05548FFF7C2FDEC 287 | :1011E000F860514BD3F8203103F4E0431B0B184651 288 | :1011F000FFF722FC0246FB68B3FBF2F3FB608DE0D5 289 | :101200004B48FFF7AFFDF860474BD3F8203103F4AC 290 | :1012100040731B0A1A46FB68D340FB607EE04648D9 291 | :10122000FFF7A0FDF86079E04348FFF79BFDF86009 292 | :101230003D4BD3F8283103F003031846FFF7FCFBBE 293 | :101240000246FB68B3FBF2F3FB6067E03A48FFF746 294 | :1012500089FDF860344BD3F8283103F030031B09C3 295 | :101260001846FFF7E9FB0246FB68B3FBF2F3FB60AD 296 | :1012700054E03148FFF776FDF8602B4BD3F8283166 297 | :1012800003F440531B0B04331846FFF7D5FB02460B 298 | :10129000FB68B3FBF2F3FB6040E02648FFF762FD1A 299 | :1012A000F8603BE0FFF7FCFBF86037E0FFF7D2FBAC 300 | :1012B000F86033E00020FFF719FCF8601A4BD3F810 301 | :1012C0005C3103F003030133FA68B2FBF3F3FB6014 302 | :1012D00024E00120FFF70AFCF860134BD3F85C31DF 303 | :1012E00003F440331B0C0133FA68B2FBF3F3FB60E9 304 | :1012F00014E0FFF751FCF86010E00020FFF790FCCD 305 | :10130000F8600BE0FFF7DAFCF86007E00B4840F606 306 | :10131000CC01FFF775FB0023FB6000BFFB6818469C 307 | :101320001037BD4680BD00BF00400E4000FF0100E9 308 | :1013300002001A000500200003001C00EC2700003A 309 | :1013400080B584B000AF78600123FB737B6803F045 310 | :101350000F03BB60BB68013B0B2B00F2408101A275 311 | :1013600052F823F095130000C7130000F713000094 312 | :10137000DF1500003D1400006D140000DF150000B3 313 | :101380008D140000C91400000D1500004B1500005D 314 | :101390008B1500009B4BD3F8943003F00703032B0D 315 | :1013A00007D0042B02D0022B06D008E00223FB73E7 316 | :1013B00008E00323FB7305E00423FB7302E005232D 317 | :1013C000FB7300BF18E18F4BD3F8803003F00703A5 318 | :1013D000022B06D0042B07D0012B08D10323FB736B 319 | :1013E00008E00223FB7305E00C23FB7302E00123FA 320 | :1013F000FB7300BF00E1834BD3F8843003F0070395 321 | :10140000013B032B16D801A252F823F01D14000053 322 | :10141000231400002F140000291400000323FB7381 323 | :101420000BE00223FB7308E00C23FB7305E00623AB 324 | :10143000FB7302E00123FB7300BFDDE0714BD3F8C7 325 | :10144000883003F00703022B06D0042B07D0012BB2 326 | :1014500008D10323FB7308E00223FB7305E00C2390 327 | :10146000FB7302E00123FB7300BFC5E0654B1B6FFC 328 | :1014700003F00303002B05D0012B00D0BCE00923AF 329 | :10148000FB7302E00723FB7300BFB5E05D4BD3F8AD 330 | :101490005C3103F03003102B0CD0102B02D8002B42 331 | :1014A00005D0A9E0202B08D0302B09D0A4E00123DF 332 | :1014B000FB7308E00723FB7305E00423FB7302E0E2 333 | :1014C0000823FB7300BF97E04E4BD3F85C3103F465 334 | :1014D0004013B3F5801F0FD0B3F5801F02D8002B47 335 | :1014E00007D089E0B3F5001F09D0B3F5401F09D03C 336 | :1014F00082E00123FB7308E00723FB7305E004236C 337 | :10150000FB7302E00823FB7300BF75E03D4BD3F88B 338 | :10151000603103F00303032B69D801A252F823F0D2 339 | :1015200031150000371500003D150000431500007F 340 | :101530000523FB7308E00423FB7305E00723FB731B 341 | :1015400002E00A23FB7300BF51E02E4BD3F8643155 342 | :1015500003F00303032B4CD801A252F823F000BF81 343 | :1015600071150000771500007D150000831500003F 344 | :101570000523FB7308E00423FB7305E00723FB73DB 345 | :1015800002E00A23FB7300BF33E01E4BD3F8F031B7 346 | :1015900003F00703052B2ED801A252F823F000BF59 347 | :1015A000B9150000BF150000C5150000CB150000DF 348 | :1015B000D1150000D71500000A23FB730EE00423A9 349 | :1015C000FB730BE00B23FB7308E00523FB7305E0C3 350 | :1015D0000223FB7302E00323FB7300BF0BE00A4806 351 | :1015E0004FF44761FFF70CFA0023FB7304E000BFE0 352 | :1015F00002E000BF00E000BFFB7B18461037BD468D 353 | :1016000080BD00BF00400E40EC27000080B487B0D2 354 | :1016100000AFF860B9607A60FB6803F10473DA0028 355 | :10162000BB6813449B007B617B697A681A601C3736 356 | :10163000BD465DF8047B704780B485B000AF78602C 357 | :1016400039607B6803F10473DA003B6813449B0044 358 | :10165000FB60FB681B6818461437BD465DF8047BC9 359 | :10166000704700BF80B483B000AF7860034A7B68E6 360 | :10167000D3620C37BD465DF8047B704700300E40E6 361 | :1016800080B400AF034B5B6A1846BD465DF8047B2F 362 | :10169000704700BF00300E4080B400AF01231846F1 363 | :1016A000BD465DF8047B704780B582B000AF0C4A40 364 | :1016B0000B4BDB6E43F08073D3660A480021FFF7C3 365 | :1016C000BBFF78607B68002B03D0042000F042FD54 366 | :1016D00002E0002000F03EFD0837BD4680BD00BF9F 367 | :1016E00000300E404C300E4080B58AB000AF012370 368 | :1016F0007B627B6A1B053B62414BDB6C03F47063CE 369 | :101700001B0AFB613F4B1B8803F128023D4B1B88E2 370 | :101710002833D90F0B445B1013441946FB695A1C3C 371 | :1017200013469B001344B1FBF3F3013BBB61BB6960 372 | :101730007B6107233B613A697B69934228BF13466B 373 | :10174000BB61BB691B06BB61BB6923F0E063002B77 374 | :1017500004D02D4840F2B351FFF752F93B6A23F40D 375 | :10176000E003002B04D0284840F2B451FFF748F9B9 376 | :101770002348234BDB6C23F0EE62B9693B6A0B43D1 377 | :101780001343C364214B1B881BB2002B35DB1F4B5B 378 | :101790001B88FB81FB8903F12802FB892833D90FC1 379 | :1017A0000B445B1013441946FB6901335A00FB6973 380 | :1017B00001335B081344B1FBF3F3BB60BB687B6090 381 | :1017C00007233B603A687B68934228BF1346BB609F 382 | :1017D000BB681B01BB60BB6823F07003002B04D007 383 | :1017E000094840F2CB51FFF70BF90549044B1B6D3B 384 | :1017F00023F07002BB6813430B652837BD4680BDDC 385 | :1018000000300E40A000002050280000A40000205E 386 | :1018100080B483B000AF78600B467B807B689AB25F 387 | :10182000044B1A80044A7B8813800C37BD465DF850 388 | :10183000047B7047A0000020A400002080B582B087 389 | :1018400000AF0346FB71FB79002B02D0012B04D0C3 390 | :1018500007E0084B084A9A6509E0064B074A9A6573 391 | :1018600005E0074840F2F751FFF7CAF800BF083714 392 | :10187000BD4680BD00300E4077402057372110B75D 393 | :101880005028000080B584B000AF0346FB710B46C2 394 | :10189000BB7113467B71344BD3F88031FB60BB794D 395 | :1018A000032B1FD801A252F823F000BFBD1800007F 396 | :1018B000C5180000D1180000DD180000FB68DBB27D 397 | :1018C000FB6016E0FB6803F47F431B0AFB6010E03B 398 | :1018D000FB6803F47F031B0CFB600AE0FB681B0E34 399 | :1018E000FB6006E0214840F23B61FFF789F80023E6 400 | :1018F00036E07B79002B16D1FB681B03FB60FB688D 401 | :1019000023F47043002B06D0184840F24661FFF7DD 402 | :1019100077F8002324E01649154BDB6E23F4704260 403 | :10192000FB681343CB667B79012B18D1FB681B0343 404 | :10193000FB60FB6823F47043002B06D00B4840F299 405 | :101940005261FFF75DF800230AE00949084BD3F81C 406 | :10195000EC3023F47042FB681343C1F8EC300123F0 407 | :1019600018461037BD4680BDB081E00F50280000FA 408 | :1019700000300E4080B588B000AFF860B960114605 409 | :101980001A460B46FB711346BB710023FB61002313 410 | :10199000BB61BB791A02FB7913437B617B6940F21F 411 | :1019A000011293422BD0B3F5817F07D2012B19D0BE 412 | :1019B000012B4BD3B3F5807F55D07BE040F2012261 413 | :1019C000934229D040F20122934203D8B3F5007F1D 414 | :1019D00056D06FE0B3F5407F5FD040F201329342C2 415 | :1019E00027D067E03B4BD3F87431FB61FB6903F40C 416 | :1019F0007F431B0ABB61FB69DBB2FB6160E0354BD7 417 | :101A0000D3F87431FB61FB691B0EBB61FB6903F406 418 | :101A10007F031B0CFB6153E02E4BD3F87831FB6145 419 | :101A2000FB6903F47F431B0ABB61FB69DBB2FB610B 420 | :101A300046E0284BD3F87831FB61FB691B0EBB6194 421 | :101A4000FB6903F47F031B0CFB6139E0214BD3F8E6 422 | :101A50006C31FB61FB6903F47F431B0ABB61FB69CB 423 | :101A6000DBB2FB612CE01B4BD3F86C31FB61FB69F3 424 | :101A70001B0EBB61FB6903F47F031B0CFB611FE0C2 425 | :101A8000144BD3F87031FB61FB6903F47F431B0AED 426 | :101A9000BB61FB69DBB2FB6112E00E4BD3F8703126 427 | :101AA000FB61FB691B0EBB61FB6903F47F031B0C2D 428 | :101AB000FB6105E0084840F2B761FEF7A1FF00BFF7 429 | :101AC000FB68FA691A60BB68BA691A602037BD46BC 430 | :101AD00080BD00BFB081E00F5028000080B584B009 431 | :101AE00000AF0346FB7100BF364B9B6F03F0010351 432 | :101AF000002BF9D1334B1B6C03F00303FB60FB6835 433 | :101B0000002B04D030480D210122FFF77FFDFB6838 434 | :101B1000DBB2FA799A4209D1FB79002B05D12A4828 435 | :101B20000D210022FFF772FD48E047E0FB68032B20 436 | :101B300002D0FB68002B20D1FB79022B02D0FB796D 437 | :101B4000012B1AD14FF40020FFF78CFD00BF1D4B75 438 | :101B50009B6F03F00103002BF9D11A4A194B1B6C40 439 | :101B600023F0030343F00103136400BFFFF788FD74 440 | :101B7000034603F40023002BF8D000BF114B9B6FEA 441 | :101B800003F00103002BF9D10E490E4B1B6C23F01F 442 | :101B90000302FB7913430B6400BF0A4B9B6F03F0F6 443 | :101BA0000103002BF9D1FB79002B14BF0123002383 444 | :101BB000DBB205480D211A46FFF728FD1037BD4658 445 | :101BC00080BD00BF00300E4054300E4080B584B060 446 | :101BD00000AF7860FFF760FD7B681B89C82B04D9D4 447 | :101BE000604840F24F71FEF70BFF7B689A887B6874 448 | :101BF0001B899A4204D95B484FF4EA61FEF700FF63 449 | :101C00007B689B891BB2C82B04DD564840F251719A 450 | :101C1000FEF7F6FE7B685B78012B09D17B689B8819 451 | :101C2000C82B12D94F4840F25571FEF7E9FE0CE07F 452 | :101C30007B685B78022B08D17B689B880A2B04D9D0 453 | :101C4000484840F25A71FEF7DBFE7B68DB8842F2BF 454 | :101C50001072934204D9434840F25F71FEF7D0FE00 455 | :101C60007B68DB884A2B02D80023FB6015E07B6889 456 | :101C7000DB88B3F5FA7F03D24FF08053FB600CE0B2 457 | :101C80007B68DB8840F6C312934203D84FF00053C1 458 | :101C9000FB6002E04FF04053FB603348324BDB6C9B 459 | :101CA00023F0405323F001037A68928912B2002A8C 460 | :101CB00001DB012100E00021FA680A431343C364F9 461 | :101CC000294A294BD3F8EC3043F44073C2F8EC3086 462 | :101CD000FFF7EAFC7B681B891A467B689B891BB26D 463 | :101CE00010461946FFF794FD7B689A881F4B1A80AF 464 | :101CF0007B689B88184600F0B9F97B689B7B184687 465 | :101D0000FFF79CFD7B685B8818460121012200F0EB 466 | :101D100031F8034683F00103DBB2002B06D01148F3 467 | :101D200040F29671FEF76CFE002317E00E4A0E4B50 468 | :101D3000DB6B43F48063D3637B685B781846FFF703 469 | :101D4000CDFE7B689B7A002B14BF01230023DBB2FE 470 | :101D5000074805211A46FFF759FC0123184610379A 471 | :101D6000BD4680BD5028000000300E40A20000207B 472 | :101D70003C300E4090B595B000AF78600B46FB70DC 473 | :101D80001346BB700023FB6400237B6407F124032C 474 | :101D900000221A60043300221A60043300221A6001 475 | :101DA000043307F1180300221A60043300221A607A 476 | :101DB000043300221A60043307F10C0300221A6076 477 | :101DC000043300221A60043300221A600433002313 478 | :101DD0003B810023BB727B68B3F5E16F06D37B6860 479 | :101DE00040F6B832934201D8012300E0002387F87F 480 | :101DF000433097F8433003F0010387F8433097F8F6 481 | :101E0000433083F00103DBB2002B06D0944840F24C 482 | :101E1000DA71FEF7F5FD00231EE17B68B3F5E16F93 483 | :101E20008CBF0123002387F8423097F84230002B03 484 | :101E30000AD04FF4E163FB6440F6B8337B647A6CFC 485 | :101E4000FB6CD31ABB6409E04FF49663FB644FF458 486 | :101E5000E1637B647A6CFB6CD31ABB6497F8423005 487 | :101E6000002B0CD07F4BD3F868313B623B6A1B0ED2 488 | :101E70007B613B6A03F47F031B0C3B620BE0794BF5 489 | :101E8000D3F868313B623B6A03F47F431B0A7B61F2 490 | :101E90003B6ADBB23B62744BDB6C03F040531B0FBD 491 | :101EA000DBB23B723B7A07F1180007F10C0197F89F 492 | :101EB0004220FFF75FFD6C4BD3F8EC3003F4407326 493 | :101EC0001B0ADBB27B727C7A07F11803191D07F13C 494 | :101ED0000C031A1D97F84230084611461A4623464D 495 | :101EE000FFF748FD7A68FB6CD31A79693A6A8A1A57 496 | :101EF00002FB03F2BB6CB2FBF3F3FB62FA6A3B6AD0 497 | :101F00001344FB627A68FB6CD31AF968BA698A1ABF 498 | :101F100002FB03F2BB6CB2FBF3F37B627A6ABB6930 499 | :101F200013447B627A68FB6CD31A3969FA698A1A9E 500 | :101F300002FB03F2BB6CB2FBF3F3BB62BA6AFB6950 501 | :101F40001344BB62FA6A7B699A4213D8FA6A3B6A05 502 | :101F50009A420FD3BA6A3B699A420BD8BA6AFB69B4 503 | :101F60009A4207D37A6AFB689A4203D87A6ABB69B5 504 | :101F70009A4206D23A4840F62601FEF741FD002378 505 | :101F80006AE0BB78002B12D03749374BDB6D23F466 506 | :101F9000FE4323F00203FA6A12021A4397F8423012 507 | :101FA000002B01D0022300E000231343CB65FB7814 508 | :101FB000002B50D03B7A97F8422010461946002259 509 | :101FC000FFF760FC034683F00103DBB2002B06D071 510 | :101FD000234840F63501FEF713FD00233CE07B7AF1 511 | :101FE00097F84220104619460122FFF74BFC0346A2 512 | :101FF00083F00103DBB2002B06D0194840F63D0107 513 | :10200000FEF7FEFC002327E07B6AFB63BB6ABB6331 514 | :10201000BA6BFB6B934238BF13467B627B6A7B6370 515 | :10202000E7233B633A6B7B6B934228BF13467B628B 516 | :102030000D490D4B5B6E23F4FF7323F001037A6AA5 517 | :1020400052001A4397F84230002B01D0012300E0E0 518 | :10205000002313434B66012318465437BD4690BDF9 519 | :1020600050280000B081E00F00300E4080B584B0F1 520 | :1020700000AF78600023FB60344B1B6F03F0070355 521 | :10208000BB60324BDB6C03F00103002B15D0BB6847 522 | :10209000012B12D97B68132B02D80423FB600BE0C1 523 | :1020A0007B68132B05D97B68272B02D80823FB609C 524 | :1020B00002E01023FB6033E032E0244BDB6C03F0E2 525 | :1020C0000103002B15D1BB68012B12D87B68092BAB 526 | :1020D00002D80423FB600BE07B68092B05D97B68E1 527 | :1020E000132B02D80823FB6002E01023FB6017E0EB 528 | :1020F00016E0164BDB6C03F00103002B0BD0BB6822 529 | :10210000012B08D87B68272B02D80823FB6007E047 530 | :102110001023FB6004E00E4840F67801FEF770FCE7 531 | :10212000FB68013BFB60FB681A02FB681B0313435F 532 | :10213000FB600649054BDB6C23F47F42FB681343CD 533 | :10214000CB64FFF7D1FA1037BD4680BD00300E409A 534 | :102150005028000080B584B000AF0346FB711148E1 535 | :102160000021FFF769FAF860FB68002B02D1FB79C8 536 | :10217000012B07D9FB68002B04D10B4840F69601D0 537 | :10218000FEF73EFC0949094B1B6F23F00702FB7960 538 | :1021900013430B67064B1B881846FFF767FF103782 539 | :1021A000BD4680BD4C300E405028000000300E402F 540 | :1021B000A200002080B485B000AF786039607B68F1 541 | :1021C00003F1C063FB60FB683A681A601437BD46D0 542 | :1021D0005DF8047B704700BF80B485B000AF7860C5 543 | :1021E00039607B6803F18063FB60FB683A681A60C2 544 | :1021F0001437BD465DF8047B704700BF80B582B0E0 545 | :1022000000AF03463960FB71FB79002B31D0FB79BD 546 | :10221000012B2BD0FB79022B25D0FB79032B1FD070 547 | :10222000FB79042B19D0FB79052B13D0FB79062BF6 548 | :102230000DD0FB79072B07D0FB79082B02D14FF685 549 | :10224000FF7318E0002316E04FF6FF7313E04FF61C 550 | :10225000FF7310E04FF6FF730DE04FF6FF730AE0D7 551 | :102260004FF6FF7307E04FF6FF7304E04FF6FF737E 552 | :1022700001E04FF6FF733A68134103F00103002BAE 553 | :1022800004D10D4840F25931FEF7BAFBFA791346F2 554 | :102290005B0013441B010C3303F1804303F5082357 555 | :1022A0003A68012101FA02F218461146FFF794FF3D 556 | :1022B0000837BD4680BD00BFB428000080B582B09D 557 | :1022C00000AF03463960FB71FB79002B31D0FB79FD 558 | :1022D000012B2BD0FB79022B25D0FB79032B1FD0B0 559 | :1022E000FB79042B19D0FB79052B13D0FB79062B36 560 | :1022F0000DD0FB79072B07D0FB79082B02D14FF6C5 561 | :10230000FF7318E0002316E04FF6FF7313E04FF65B 562 | :10231000FF7310E04FF6FF730DE04FF6FF730AE016 563 | :102320004FF6FF7307E04FF6FF7304E04FF6FF73BD 564 | :1023300001E04FF6FF733A68134103F00103002BED 565 | :1023400004D10D4840F28631FEF75AFBFA79134664 566 | :102350005B0013441B010C3303F1804303F5082396 567 | :102360003A68012101FA02F218461146FFF722FFEE 568 | :102370000837BD4680BD00BFB428000090B585B0C9 569 | :1023800000AFB9607B600346FB731346BB73FB7BF6 570 | :10239000002B31D0FB7B012B2BD0FB7B022B25D0DC 571 | :1023A000FB7B032B1FD0FB7B042B19D0FB7B052B66 572 | :1023B00013D0FB7B062B0DD0FB7B072B07D0FB7BC1 573 | :1023C000082B02D14FF6FF7318E0002316E04FF6FA 574 | :1023D000FF7313E04FF6FF7310E04FF6FF730DE04D 575 | :1023E0004FF6FF730AE04FF6FF7307E04FF6FF73F7 576 | :1023F00004E04FF6FF7301E04FF6FF73BA68134134 577 | :1024000003F00103002B04D137484FF48571FEF728 578 | :10241000F7FABB7B002B0DD07B68002B05D0FB7B34 579 | :102420001846B968FFF74AFF04E0FB7B1846B96815 580 | :10243000FFF7E4FEBB68072B1CD82C4CFA7B2B481B 581 | :10244000F97B0B465B000B441B0103445968BB68D6 582 | :102450009B0018460F238340DB430B40B97BB868D1 583 | :1024600080008140194313465B0013441B01234441 584 | :10247000596024E01D4CFA7B1C48F97B0B465B003D 585 | :102480000B441B01034408331968BB6803F1804304 586 | :10249000083B9B0018460F238340DB431940B87B61 587 | :1024A000BB6803F18043083B9B0000FA03F3194328 588 | :1024B00013465B0013441B01234408331960BB7BA4 589 | :1024C000002B0DD17B68002B05D0FB7B1846B9682B 590 | :1024D000FFF7F4FE04E0FB7B1846B968FFF78EFEB9 591 | :1024E0001437BD4690BD00BF182900000080084089 592 | :1024F00080B483B000AF03463960FB7197F90730B1 593 | :10250000002B0BDA0D49FB7903F00F03043B3A680B 594 | :10251000D2B25201D2B20B441A7609E0084997F9B7 595 | :1025200007303A68D2B25201D2B20B4483F800238A 596 | :102530000C37BD465DF8047B704700BF00ED00E03E 597 | :1025400000E100E080B582B000AF78607B68013BBD 598 | :10255000B3F1807F01D301230FE00A4A7B68013B7E 599 | :1025600053604FF0FF300721FFF7C2FF054B0022F9 600 | :102570009A60044B07221A60002318460837BD46AC 601 | :1025800080BD00BF10E000E080B400AFBD465DF844 602 | :10259000047B704780B400AF044B1B680133034ACF 603 | :1025A0001360BD465DF8047B704700BFA8000020A3 604 | :1025B00080B485B000AF7860074B1B68FB6000BF3C 605 | :1025C000054B1A68FB68D21A7B689A42F8D3143715 606 | :1025D000BD465DF8047B7047A800002090B585B02B 607 | :1025E00000AF174B3C46186859689A68DB680FC4FF 608 | :1025F000FFF7CAFF3B461846FFF7E8FAFEF73EF939 609 | :102600001048FEF713FD02460F4BA3FB02239B0964 610 | :102610001846FFF797FF0346002B00D0FEE7FEF7B2 611 | :1026200023F80120FEF77AF84FF47A70FFF7C0FF25 612 | :102630000020FEF773F80120FEF770F8F4E700BF02 613 | :102640007C29000050000200D34D621008B5074BF2 614 | :10265000044613B10021AFF30080054B1868836A6C 615 | :1026600003B19847204600F033F800BF0000000097 616 | :102670009029000070B50E4B0E4CE41AA4100025F2 617 | :102680001E46A54204D056F8253098470135F8E794 618 | :1026900000F020F8084C094BE41AA41000251E464F 619 | :1026A000A54204D056F8253098470135F8E770BDAB 620 | :1026B00078000020780000207C00002078000020B6 621 | :1026C00002440346934202D003F8011BFAE7704725 622 | :1026D000FEE700BFF8B500BFF8BC08BC9E467047D7 623 | :1026E000F8B500BFF8BC08BC9E467047633A5C73FF 624 | :1026F000696C69636F6E6C6162735C73696D706C39 625 | :10270000696369747973747564696F5C76345C6449 626 | :102710006576656C6F7065725C73646B735C67651E 627 | :10272000636B6F5F73646B5F73756974655C76313F 628 | :102730002E315C706C6174666F726D5C656D6C6976 629 | :10274000625C696E635C656D5F6770696F2E6800BF 630 | :1027500000030000070000000A000000070000005E 631 | :102760000B000000070000000C0000000003000048 632 | :10277000070000000D000000070000000E00000030 633 | :10278000070000000F000000633A5C73696C696326 634 | :102790006F6E6C6162735C73696D706C6963697490 635 | :1027A0007973747564696F5C76345C646576656CA6 636 | :1027B0006F7065725C73646B735C6765636B6F5F8E 637 | :1027C00073646B5F73756974655C76312E315C7010 638 | :1027D0006C6174666F726D5C656D6C69625C696E6C 639 | :1027E000635C656D5F636D752E680000433A2F531F 640 | :1027F000696C69636F6E4C6162732F53696D706CA5 641 | :10280000696369747953747564696F2F76342F64C2 642 | :102810006576656C6F7065722F73646B732F676577 643 | :10282000636B6F5F73646B5F73756974652F76316B 644 | :102830002E312F706C6174666F726D2F656D6C69CF 645 | :10284000622F7372632F656D5F636D752E63000079 646 | :10285000433A2F53696C69636F6E4C6162732F53F7 647 | :10286000696D706C696369747953747564696F2FED 648 | :1028700076342F646576656C6F7065722F73646B48 649 | :10288000732F6765636B6F5F73646B5F73756974D8 650 | :10289000652F76312E312F706C6174666F726D2FDB 651 | :1028A000656D6C69622F7372632F656D5F656D7501 652 | :1028B0002E630000633A5C73696C69636F6E6C61D0 653 | :1028C00062735C73696D706C696369747973747534 654 | :1028D00064696F5C76345C646576656C6F70657294 655 | :1028E0005C73646B735C6765636B6F5F73646B5F72 656 | :1028F00073756974655C76312E315C706C617466D9 657 | :102900006F726D5C656D6C69625C696E635C656D50 658 | :102910005F6770696F2E6800433A2F53696C696373 659 | :102920006F6E4C6162732F53696D706C696369746B 660 | :102930007953747564696F2F76342F646576656C8E 661 | :102940006F7065722F73646B732F6765636B6F5F56 662 | :1029500073646B5F73756974652F76312E312F70D8 663 | :102960006C6174666F726D2F656D6C69622F737226 664 | :10297000632F656D5F6770696F2E63000002080743 665 | :1029800005000A00C8002000FFFF0100430000000E 666 | :08299000180000200000000007 667 | :0829980014D8FF7F01000000CC 668 | :1029A00080F0FA0200800000C0EA2101C0EA2101A3 669 | :1029B000C0EA2101006CDC02000000000000000001 670 | :1029C0000000000000000000000000000000000007 671 | :1029D00000000000000000008C2900000000000042 672 | :1029E00000000000000000000000000000000000E7 673 | :1029F00000000000000000000000000000000000D7 674 | :102A000000000000000000000000000000000000C6 675 | :102A100000000000000000007501000051010000EE 676 | :042A200000000000B2 677 | :04000003000008A54C 678 | :00000001FF 679 | -------------------------------------------------------------------------------- /hex_bin/STK3700_blink.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/hex_bin/STK3700_blink.bin -------------------------------------------------------------------------------- /hex_bin/STK3700_blink.hex: -------------------------------------------------------------------------------- 1 | :1000000000000220FD040000290500002905000071 2 | :100010002905000029050000290500002905000028 3 | :100020002905000029050000290500002905000018 4 | :1000300029050000290500002905000059130000CA 5 | :1000400029050000290500002905000029050000F8 6 | :1000500029050000290500002905000029050000E8 7 | :1000600029050000290500002905000029050000D8 8 | :1000700029050000290500002905000029050000C8 9 | :1000800029050000290500002905000029050000B8 10 | :1000900029050000290500002905000029050000A8 11 | :1000A0002905000029050000290500002905000098 12 | :1000B0002905000029050000290500002905000088 13 | :1000C0002905000029050000290500002905000078 14 | :1000D00029050000290500002905000010B5054C80 15 | :1000E000237833B9044B13B10448AFF300800123E4 16 | :1000F000237010BD780000200000000004170000ED 17 | :10010000084B10B51BB108480849AFF300800848F8 18 | :10011000036803B910BD074B002BFBD0BDE81040AE 19 | :10012000184700BF00000000041700007C000020FA 20 | :100130007400002000000000154B002B08BF134B7B 21 | :100140009D46A3F5803A00218B460F461348144A7A 22 | :10015000121A01F089F90F4B002B00D098470E4B73 23 | :10016000002B00D098470020002104000D000D480E 24 | :10017000002802D00C48AFF3008001F04FF92000B6 25 | :10018000290001F00DF901F035F900BF0000080069 26 | :1001900000000220000000000000000078000020A5 27 | :1001A00098000020000000000000000080B582B030 28 | :1001B00000AF03463960FB71FB79002B1FD0FB7940 29 | :1001C000012B19D0FB79022B13D0FB79032B0DD017 30 | :1001D000FB79042B07D0FB79052B02D141F6FF7385 31 | :1001E0000FE000230DE04FF6FF730AE04FF6FF73B8 32 | :1001F00007E04FF6FF7304E04FF6FF7301E04FF6A0 33 | :10020000FF733A68134103F00103002B04D10B483C 34 | :1002100040F2863100F058FA0949FA793B6801202A 35 | :1002200000FA03F318461346DB0013449B000B440B 36 | :10023000103318600837BD4680BD00BF941400001D 37 | :100240000060004080B582B000AF03463960FB71AA 38 | :10025000FB79002B1FD0FB79012B19D0FB79022BE6 39 | :1002600013D0FB79032B0DD0FB79042B07D0FB793E 40 | :10027000052B02D141F6FF730FE000230DE04FF68E 41 | :10028000FF730AE04FF6FF7307E04FF6FF7304E0D9 42 | :100290004FF6FF7301E04FF6FF733A68134103F026 43 | :1002A0000103002B04D10B4840F29F3100F00CFAFF 44 | :1002B0000949FA793B68012000FA03F3184613460E 45 | :1002C000DB0013449B000B44183318600837BD460D 46 | :1002D00080BD00BF941400000060004080B582B073 47 | :1002E00000AF1248012100F02BFC1148012100F061 48 | :1002F00027FC00237B6011E00E4A7B6812F8331064 49 | :100300000C4A7B68DB0013445B68084619460422EC 50 | :10031000002300F0C1FE7B6801337B607B68012B0A 51 | :10032000EADD002318460837BD4680BD4081040041 52 | :1003300000D20400F814000080B582B000AF7860ED 53 | :100340007B68002B11DB7B68012B0EDC0A4A7B6883 54 | :1003500012F83310084A7B68DB0013445B680846D8 55 | :100360001946FFF723FF002301E04FF0FF33184643 56 | :100370000837BD4680BD00BFF814000080B582B0CC 57 | :1003800000AF78607B68002B11DB7B68012B0EDCF3 58 | :100390000A4A7B6812F83310084A7B68DB00134472 59 | :1003A0005B6808461946FFF74DFF002301E04FF058 60 | :1003B000FF3318460837BD4680BD00BFF814000063 61 | :1003C00080B582B000AF394A384B5B6C43F40053C0 62 | :1003D0005364374A364BD3F8203143F00403C2F854 63 | :1003E0002031334A324BD3F8203123F44073C2F822 64 | :1003F00020312F4A2E4BD3F8B83023F47063C2F863 65 | :10040000B8302B4A2A4BD3F8B83043F48063C2F893 66 | :10041000B830264B10221A6200BF244BDB6A03F06F 67 | :100420002003002BF9D0234A224B1B6843F0010321 68 | :100430001360204A1F4BDB6843F08073D3601E4B70 69 | :100440001E4A1A601E4800F0E9FB034603F5D52357 70 | :1004500003F2FC437B607B68DB081A4AA2FB0323A0 71 | :100460009B0A3B60184A3B68013B1361164B022212 72 | :10047000C3F8F020144B4FF48072C3F804234FF0FC 73 | :100480006043124AC3F8B02F4FF06043104AC3F8DC 74 | :10049000802E4FF060424FF06043D3F8003E43F0AF 75 | :1004A0000103C2F8003E0837BD4680BD00800C4005 76 | :1004B00000600040F0ED00E0001000E0FF1301409C 77 | :1004C00006000C0017916502000004E055CEACC593 78 | :1004D0000900010080B582B000AF4FF07E637B6001 79 | :1004E0007B681B68002B01D1002302E0FFF768FF47 80 | :1004F000012318460837BD4680BD00BF0648804727 81 | :100500000649074A074B9A42BEBF51F8040B42F80E 82 | :10051000040BF8E7FFF710FE7D060000101700003F 83 | :100520000000002078000020FEE700BF80B400AF8C 84 | :10053000044BDB6C1B0EDBB21846BD465DF8047B3A 85 | :10054000704700BFB081E00F80B582B000AF00F00F 86 | :1005500015F87860074B5B6803F00F031A467B6859 87 | :10056000D3407B60044A7B6813607B681846083779 88 | :10057000BD4680BD00800C400800002080B582B0E0 89 | :1005800000AF334BDB6A03F47053B3F5805F0AD0DE 90 | :10059000B3F5005F03D0B3F5006F08D00BE02D4B2F 91 | :1005A0001B687B6047E04FF400437B6043E02A4BCD 92 | :1005B0001B687B603FE0264BDB6803F4E063B3F528 93 | :1005C000007F1BD0B3F5007F05D8002B24D0B3F5F6 94 | :1005D000807F16D02BE0B3F5806F09D0B3F5A06F04 95 | :1005E00003D0B3F5407F06D021E01C4B7B6021E0B7 96 | :1005F0001B4B7B601EE01B4B7B601BE01A4B7B6040 97 | :1006000018E0FFF793FF0346122B02D9174B7B60CC 98 | :1006100010E0174B7B600DE0FFF788FF0346122BBD 99 | :1006200002D9144B7B6005E0134B7B6002E0002392 100 | :100630007B6000BF00BF064B1B6803F4E0339B0BDD 101 | :1006400001337A68B2FBF3F318460837BD4680BD24 102 | :1006500000800C400400002000000020003FAB019F 103 | :10066000406F4001809FD500C0D8A70040B564000E 104 | :10067000C0CF6A00804F120040420F0080B400AF2C 105 | :10068000BD465DF8047B704780B400AF4FF4004373 106 | :100690001846BD465DF8047B704700BF80B400AFCC 107 | :1006A0004FF47A731846BD465DF8047B704700BF6F 108 | :1006B00080B400AF034B1B681846BD465DF8047B51 109 | :1006C000704700BF0400002080B483B000AF7860A2 110 | :1006D0003960FEE780B487B000AFF860B9607A6037 111 | :1006E000FB6803F10473DA00BB6813449B007B6171 112 | :1006F0007B697A681A601C37BD465DF8047B7047D9 113 | :1007000080B485B000AF786039607B6803F1047312 114 | :10071000DA003B6813449B00FB60FB681B681846CB 115 | :100720001437BD465DF8047B704700BF80B584B0C8 116 | :1007300000AF78607B68002B03D07B68B3F5004F77 117 | :1007400004D9084840F29661FFF7BEFF7B68B3FA10 118 | :1007500083F3C3F11F03FB60FB6818461037BD46E7 119 | :1007600080BD00BF0815000080B400AF044BDB6CF7 120 | :100770001B0EDBB21846BD465DF8047B704700BF18 121 | :10078000B081E00F80B400AF054BDB6C03F47F0356 122 | :100790001B0CDBB21846BD465DF8047B704700BFFA 123 | :1007A000B081E00F80B582B000AFFFF7EBFF0346EA 124 | :1007B0004A2B04D0792B02D0482B21D022E0164BB3 125 | :1007C0001B699BB203F03F039BB21B02FB80124BE1 126 | :1007D0009B6903F0F0039AB2FB881343FB800E4B36 127 | :1007E000DB6903F0F0031B099AB2FB881343FB801B 128 | :1007F000FB88B3F5017F01D3084B09E0084B07E004 129 | :10080000074B05E007484FF48771FFF75DFF0023B2 130 | :1008100018460837BD4680BDD0FF0FE000366E0198 131 | :100820000048E8016C15000080B584B000AF786026 132 | :100830000123FB60FFF7B6FF02467B689A4204D3B0 133 | :100840000023FB600023BB600BE0FFF7ABFF034618 134 | :100850005A007B689A4202D30123BB6001E0022365 135 | :10086000BB6008481E21FA68FFF734FF0549054BB5 136 | :100870005B6823F48072BB681B0213434B60103724 137 | :10088000BD4680BD00800C4080B582B000AF0548F9 138 | :100890001E21FFF735FF78607B6818460837BD4694 139 | :1008A00080BD00BF00800C4080B582B000AF244BFB 140 | :1008B0005B6903F4E063B3F5007F1CD0B3F5007F00 141 | :1008C00005D8002B25D0B3F5807F1FD02AE0B3F5E3 142 | :1008D000C06F24D0B3F5E06F1ED0B3F5407F21D1B7 143 | :1008E000FFF742FF0346122B02D9164B7B6021E033 144 | :1008F000154B7B601EE0FFF737FF0346122B02D932 145 | :10090000124B7B6016E0124B7B6013E0114B7B6057 146 | :1009100010E0114B7B600DE0104B7B600AE0104B48 147 | :100920007B6007E00F484FF4C671FFF7CDFE002350 148 | :100930007B6000BF7B6818460837BD4680BD00BF9E 149 | :1009400000800C40804F120040420F0040B5640010 150 | :10095000C0CF6A00C0D8A700809FD500406F40017B 151 | :10096000003FAB016C15000080B582B000AF0F48AE 152 | :1009700000F046FA0346FB70FB78072B05D0092BE5 153 | :1009800007D1FFF7FBFD78600BE0FFF78DFF786084 154 | :1009900007E007484FF4E371FFF796FE00237B6002 155 | :1009A00000BF7B6818460837BD4680BD06000C00B6 156 | :1009B0006C15000090B585B000AF78600023BB6077 157 | :1009C0007B683B4A934208D03A4A934205D03A4862 158 | :1009D00040F2B531FFF778FE00E000BF786800F024 159 | :1009E0000FFA0346FB607B68314A934203D0314AD9 160 | :1009F000934206D00CE0314B9B6A03F00303FB608B 161 | :100A00000CE02E4B9B6A03F00C039B08FB6005E097 162 | :100A100029484FF47971FFF757FE00BFFB68032B9D 163 | :100A200039D801A252F823F05F0A0000390A000009 164 | :100A3000410A0000490A0000FFF726FEB86032E0D4 165 | :100A4000FFF736FEB8602EE0FFF77EFD0446FFF7A5 166 | :100A50001BFF0346013324FA03F3BB6023E00023AA 167 | :100A6000BB607B68124A934203D07B68114A934271 168 | :100A700010D1124B9A6A7B680D498B4201D1102329 169 | :100A800000E0142322FA03F3002B03D0FFF706FE45 170 | :100A9000B86008E007E0084840F20E41FFF714FE96 171 | :100AA0000023BB6000BFBB6818461437BD4690BD2D 172 | :100AB00002001A0003001C006C15000000800C40AE 173 | :100AC00080B483B000AF7860094B5B6D03F0010325 174 | :100AD000002B00D006E000BF054B1A6D7B68134069 175 | :100AE000002BF9D10C37BD465DF8047B704700BF81 176 | :100AF00000800C4080B582B000AF104800F080F953 177 | :100B00000346FB70FB78032B07D0092B09D0022B7F 178 | :100B10000BD1FFF7CDFD78600AE0FFF7B5FD7860F7 179 | :100B200006E0FFF72BFD786002E000237B6000BF4A 180 | :100B30007B6818460837BD4680BD00BF07232200EA 181 | :100B400080B586B000AF78600B46FB7000233B6138 182 | :100B50007B681B0A03F00F03013B092B33D801A26A 183 | :100B600052F823F0A10B0000A70B00008D0B000032 184 | :100B7000C70B0000C70B0000AD0B0000B70B000057 185 | :100B8000C70B0000C70B0000C10B00001B4B7B61B3 186 | :100B90001B4800F043F803461846FFF745FE18E0EF 187 | :100BA000184B7B6115E0184B7B6112E0174B7B61A2 188 | :100BB00001233B610DE0164B7B6110233B6108E094 189 | :100BC000144B7B6105E014484FF4FB61FFF77CFD9B 190 | :100BD00010E07B681B0B03F01F03FB603B69002BDD 191 | :100BE00002D03869FFF76CFFFB787869F9681A461C 192 | :100BF000FFF770FD1837BD4680BD00BF40800C4038 193 | :100C00000043020008800C4044800C4058800C4097 194 | :100C100060800C4078800C406C15000090B585B069 195 | :100C200000AF78607B6803F47813B3F5B01F00F071 196 | :100C3000AB80B3F5B01F1AD8B3F5402F00F0BF80DA 197 | :100C4000B3F5402F08D8B3F5003F3CD0B3F5802F63 198 | :100C50002DD0002B27D0BEE0B3F5801F3CD0B3F5DC 199 | :100C6000A01F47D0B3F5602F00F0AD80B3E0B3F51F 200 | :100C7000081F00F0AC80B3F5081F0AD8B3F5D01FE9 201 | :100C800025D0B3F5E01F7AD0B3F5C01F00F08980FE 202 | :100C9000A1E0B3F5201F4ED0B3F5281F62D0B3F505 203 | :100CA000181F35D097E0FFF769FCF8609BE0FFF76D 204 | :100CB00065FCF8604E4B9B6803F00F031A46FB6817 205 | :100CC000D340FB608FE0FFF73FFCF8608BE04948C2 206 | :100CD000FFF770FEF86086E04648FFF76BFEF860AD 207 | :100CE000434B9B6E03F0F0031B091A46FB68D3408D 208 | :100CF000FB6078E03F48FFF75DFEF8603C4B9B6E81 209 | :100D000003F470631B0A1A46FB68D340FB606AE079 210 | :100D10003848FFF74FFEF860354B9B6E03F44053A5 211 | :100D20001C0B1020FFF702FD034623441A46FB6804 212 | :100D3000D340FB6057E02F48FFF73CFEF8602C4B98 213 | :100D40009B6E03F440531B0B1A46FB68D340FB60B9 214 | :100D5000274BDB6F03F007030133FA68B2FBF3F3B1 215 | :100D6000FB6040E02348FFF725FEF860204B9B6EB8 216 | :100D700003F003031A46FB68D340FB6033E01E48D0 217 | :100D8000FFF718FEF8602EE01B48FFF713FEF8602F 218 | :100D9000174B1B6F03F003031A46FB68D340FB603D 219 | :100DA00021E01548FFF706FEF860114B1B6F03F0BA 220 | :100DB00030031B091A46FB68D340FB6013E0FFF7C2 221 | :100DC000D3FDF8600FE0FFF76FFDF8600BE0FFF771 222 | :100DD00091FEF86007E0094840F6CC01FFF774FC8B 223 | :100DE0000023FB6000BFFB6818461437BD4690BD6A 224 | :100DF00000800C4002001A0003001C006C1500006B 225 | :100E000080B584B000AF78600123FB737B6803F08A 226 | :100E10000F03BB60BB68013B062B00F2938001A26D 227 | :100E200052F823F0410E0000770E0000B30E0000D0 228 | :100E3000450F0000450F0000EF0E0000110F0000ED 229 | :100E4000474BDB6A03F47053B3F5805F09D0B3F509 230 | :100E5000005F03D0B3F5006F06D008E00223FB73F8 231 | :100E600008E00323FB7305E00423FB7302E0052382 232 | :100E7000FB7300BF6EE03A4B9B6A03F00303022B47 233 | :100E800006D0032B07D0012B08D10323FB730FE0FF 234 | :100E90000223FB730CE00623FB7309E0304B9B6AD3 235 | :100EA00003F48033002B02D00A23FB7300E000BF61 236 | :100EB00050E02B4B9B6A03F00C03082B06D00C2B45 237 | :100EC00007D0042B08D10323FB730FE00223FB732D 238 | :100ED0000CE00623FB7309E0214B9B6A03F48013AB 239 | :100EE000002B02D00A23FB7300E000BF32E01C4B52 240 | :100EF0001B6803F08053002B03D0B3F1805F03D055 241 | :100F000028E00723FB7302E00923FB7300BF21E005 242 | :100F1000134BDB6A03F46033B3F5803F08D0B3F5BD 243 | :100F2000003F08D0B3F5004F08D10923FB7308E058 244 | :100F30000223FB7305E00323FB7302E00123FB7331 245 | :100F400000BF07E007484FF44761FFF7BDFB0023F0 246 | :100F5000FB7300BFFB7B18461037BD4680BD00BF4A 247 | :100F600000800C406C15000080B582B000AF0346D5 248 | :100F70003960FB71FB79002B1FD0FB79012B19D055 249 | :100F8000FB79022B13D0FB79032B0DD0FB79042BBB 250 | :100F900007D0FB79052B02D141F6FF730FE0002348 251 | :100FA0000DE04FF6FF730AE04FF6FF7307E04FF6D0 252 | :100FB000FF7304E04FF6FF7301E04FF6FF733A68EA 253 | :100FC000134103F00103002B04D10B4840F25931C7 254 | :100FD000FFF77AFB0949FA793B68012000FA03F32D 255 | :100FE00018461346DB0013449B000B441033586033 256 | :100FF0000837BD4680BD00BFD0150000006000402E 257 | :1010000080B582B000AF03463960FB71FB79002BDD 258 | :101010001FD0FB79012B19D0FB79022B13D0FB7960 259 | :10102000032B0DD0FB79042B07D0FB79052B02D1C4 260 | :1010300041F6FF730FE000230DE04FF6FF730AE067 261 | :101040004FF6FF7307E04FF6FF7304E04FF6FF73B0 262 | :1010500001E04FF6FF733A68134103F00103002BE0 263 | :1010600004D10B4840F28631FFF72EFB0949FA798B 264 | :101070003B68012000FA03F318461346DB001344D3 265 | :101080009B000B44103318600837BD4680BD00BF7D 266 | :10109000D01500000060004090B585B000AFB96089 267 | :1010A0007B600346FB731346BB73FB7B002B1FD097 268 | :1010B000FB7B012B19D0FB7B022B13D0FB7B032B7B 269 | :1010C0000DD0FB7B042B07D0FB7B052B02D141F617 270 | :1010D000FF730FE000230DE04FF6FF730AE04FF6B9 271 | :1010E000FF7307E04FF6FF7304E04FF6FF7301E074 272 | :1010F0004FF6FF73BA68134103F00103002B04D1CC 273 | :1011000037484FF48571FFF7DFFABB7B002B0DD01A 274 | :101110007B68002B05D0FB7B1846B968FFF770FF92 275 | :1011200004E0FB7B1846B968FFF71EFFBB68072B7E 276 | :101130001CD82C4CFA7B2B48F97B0B46DB000B446C 277 | :101140009B0003445968BB689B0018460F238340EB 278 | :10115000DB430B40B97BB8688000814019431346DC 279 | :10116000DB0013449B002344596024E01D4CFA7BB0 280 | :101170001C48F97B0B46DB000B449B0003440833FF 281 | :101180001968BB6803F18043083B9B0018460F2396 282 | :101190008340DB431940B87BBB6803F18043083BC5 283 | :1011A0009B0000FA03F319431346DB0013449B0032 284 | :1011B000234408331960BB7B002B0DD17B68002BC7 285 | :1011C00005D0FB7B1846B968FFF71AFF04E0FB7BEC 286 | :1011D0001846B968FFF7C8FE1437BD4690BD00BF7A 287 | :1011E000341600000060004080B584B000AF786025 288 | :1011F0007B68002B03D11A483E21FFF765FA194B93 289 | :101200005B69DBB203F00F03DBB29B00FB73154B92 290 | :101210001B6903F0C0039B09DAB2FB7B1343FB732A 291 | :101220007B68FA7B9A700F4B1B69DBB203F03F03BC 292 | :10123000DAB27B685A700B4B9B69DBB223F00F0369 293 | :10124000FB73084BDB6903F0F0031B09DAB2FB7B8D 294 | :101250001343FB737B68FA7B1A701037BD4680BD61 295 | :1012600098160000D0FF0FE080B483B000AF0346B3 296 | :101270003960FB7197F90730002B0BDA0D49FB79C8 297 | :1012800003F00F03043B3A68D2B25201D2B20B44CE 298 | :101290001A7609E0084997F907303A68D2B2520144 299 | :1012A000D2B20B4483F800230C37BD465DF8047BB3 300 | :1012B000704700BF00ED00E000E100E080B582B0C3 301 | :1012C00000AF78607B68013BB3F1807F01D30123DD 302 | :1012D0000FE00A4A7B68013B53604FF0FF30072163 303 | :1012E000FFF7C2FF054B00229A60044B07221A60E9 304 | :1012F000002318460837BD4680BD00BF10E000E05F 305 | :1013000080B400AF044BDB6C1B0EDBB21846BD464D 306 | :101310005DF8047B704700BFB081E00F80B582B0FC 307 | :1013200000AFFFF7EDFF0346FB713B1D1846FFF7CB 308 | :101330005BFFFB790F2B0AD93B79022B07D9054AB2 309 | :10134000044B1B6823F0500343F01003136008376D 310 | :10135000BD4680BDC0800C4080B400AF044B1B680C 311 | :101360000133034A1360BD465DF8047B704700BF3C 312 | :101370009400002080B485B000AF7860074B1B68F4 313 | :10138000FB6000BF054B1A68FB68D21A7B689A4263 314 | :10139000F8D31437BD465DF8047B704794000020F5 315 | :1013A00080B500AFFFF7BAFFFFF794F80F48FFF7DB 316 | :1013B00035FC02460E4BA3FB02239B091846FFF7A0 317 | :1013C0007DFF0346002B00D0FEE7FEF787FF0020DD 318 | :1013D000FEF7B2FF0020FEF7D1FF0120FEF7CEFF9F 319 | :1013E0004FF47A70FFF7C6FFF4E700BF5000020029 320 | :1013F000D34D621008B5074B044613B10021AFF37B 321 | :101400000080054B1868836A03B19847204600F0B6 322 | :1014100033F800BF00000000001700000E4B70B54D 323 | :101420001E460E4C0025E41AA410A54204D056F81E 324 | :10143000253098470135F8E700F020F8084B094CB3 325 | :101440001E46E41AA4100025A54204D056F8253003 326 | :1014500098470135F8E770BD6C0000206C00002053 327 | :101460006C0000207000002003460244934202D02A 328 | :1014700003F8011BFAE77047FEE700BFF8B500BFAD 329 | :10148000F8BC08BC9E467047F8B500BFF8BC08BC65 330 | :101490009E467047633A5C73696C69636F6E6C61FA 331 | :1014A00062735C73696D706C696369747973747568 332 | :1014B00064696F5C76345C646576656C6F706572C8 333 | :1014C0005C73646B735C6765636B6F5F73646B5FA6 334 | :1014D00073756974655C76312E315C706C6174660D 335 | :1014E0006F726D5C656D6C69625C696E635C656D85 336 | :1014F0005F6770696F2E6800040000000200000042 337 | :101500000400000003000000633A5C73696C6963C7 338 | :101510006F6E6C6162735C73696D706C6963697422 339 | :101520007973747564696F5C76345C646576656C38 340 | :101530006F7065725C73646B735C6765636B6F5F20 341 | :1015400073646B5F73756974655C76312E315C70A2 342 | :101550006C6174666F726D5C656D6C69625C696EFE 343 | :10156000635C656D5F636D752E680000433A2F53B1 344 | :10157000696C69636F6E4C6162732F53696D706C37 345 | :10158000696369747953747564696F2F76342F6455 346 | :101590006576656C6F7065722F73646B732F67650A 347 | :1015A000636B6F5F73646B5F73756974652F7631FE 348 | :1015B0002E312F706C6174666F726D2F656D6C6962 349 | :1015C000622F7372632F656D5F636D752E6300000C 350 | :1015D000633A5C73696C69636F6E6C6162735C73B0 351 | :1015E000696D706C696369747973747564696F5C33 352 | :1015F00076345C646576656C6F7065725C73646B81 353 | :10160000735C6765636B6F5F73646B5F737569743D 354 | :10161000655C76312E315C706C6174666F726D5CE6 355 | :10162000656D6C69625C696E635C656D5F6770694E 356 | :101630006F2E6800433A2F53696C69636F6E4C617B 357 | :1016400062732F53696D706C696369747953747533 358 | :1016500064696F2F76342F646576656C6F70657280 359 | :101660002F73646B732F6765636B6F5F73646B5F5E 360 | :1016700073756974652F76312E312F706C617466C5 361 | :101680006F726D2F656D6C69622F7372632F656D5C 362 | :101690005F6770696F2E6300433A2F53696C69630B 363 | :1016A0006F6E4C6162732F53696D706C69636974FE 364 | :1016B0007953747564696F2F76342F646576656C21 365 | :1016C0006F7065722F73646B732F6765636B6F5FE9 366 | :1016D00073646B5F73756974652F76312E312F706B 367 | :1016E0006C6174666F726D2F656D6C69622F7372B9 368 | :1016F000632F656D5F73797374656D2E63004300AE 369 | :081700000C00002000000000B5 370 | :0817080030EAFF7F0100000040 371 | :10171000006CDC0200800000809FD500000000000B 372 | :1017200000000000000000000000000000000000B9 373 | :10173000000000000000000000000000FE16000095 374 | :101740000000000000000000000000000000000099 375 | :101750000000000000000000000000000000000089 376 | :101760000000000000000000000000000000000079 377 | :101770000000000000000000000000000101000067 378 | :08178000DD0000000000000084 379 | :04000003000004FDF8 380 | :00000001FF 381 | -------------------------------------------------------------------------------- /img/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/about.png -------------------------------------------------------------------------------- /img/browse-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/browse-file.png -------------------------------------------------------------------------------- /img/programmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/programmer.png -------------------------------------------------------------------------------- /img/pycharm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/pycharm.png -------------------------------------------------------------------------------- /img/pyprogrammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/pyprogrammer.png -------------------------------------------------------------------------------- /img/pyside-doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/pyside-doc.png -------------------------------------------------------------------------------- /img/qt-creator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/qt-creator.png -------------------------------------------------------------------------------- /img/segger-jlink-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/img/segger-jlink-download.png -------------------------------------------------------------------------------- /jlink.py: -------------------------------------------------------------------------------- 1 | """ 2 | jlink.py: JLinkARM.dll Wrapper - Python Edition 3 | 4 | This module provides access to all functions of JLinkARM.dll. 5 | 6 | """ 7 | import ctypes as ct 8 | import os 9 | import sys 10 | import logging 11 | from enum import Enum, unique 12 | 13 | from jlink_constants import * 14 | 15 | @unique 16 | class JLINKARM_GLOBAL_ERROR(Enum): 17 | JLINK_ERR_EMU_NO_CONNECTION = -256 18 | JLINK_ERR_EMU_COMM_ERROR = -257 19 | JLINK_ERR_DLL_NOT_OPEN = -258 20 | JLINK_ERR_VCC_FAILURE = -259 21 | JLINK_ERR_INVALID_HANDLE = -260 22 | JLINK_ERR_NO_CPU_FOUND = -261 23 | JLINK_ERR_EMU_FEATURE_NOT_SUPPORTED = -262 24 | JLINK_ERR_EMU_NO_MEMORY = -263 25 | JLINK_ERR_TIF_STATUS_ERROR = -264 26 | JLINK_ERR_FLASH_PROG_COMPARE_FAILED = -265 27 | JLINK_ERR_FLASH_PROG_PROGRAM_FAILED = -266 28 | JLINK_ERR_FLASH_PROG_VERIFY_FAILED = -267 29 | JLINK_ERR_OPEN_FILE_FAILED = -268 30 | JLINK_ERR_UNKNOWN_FILE_FORMAT = -269 31 | JLINK_ERR_WRITE_TARGET_MEMORY_FAILED = -270 32 | 33 | JLINKARM_GLOBAL_ERROR_DESC = { 34 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_EMU_NO_CONNECTION : "No connection to emulator / Connection to emulator lost", 35 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_EMU_COMM_ERROR : "Emulator communication error (host-interface module reproted error)", 36 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_DLL_NOT_OPEN : "DLL has not been opened but needs to be (JLINKARM_Open() needs to be called first)", 37 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_VCC_FAILURE : "Target system has no power (Measured VTref < 1V)", 38 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_INVALID_HANDLE : "File handle / memory area handle needed for operation, but given handle is not valid", 39 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_NO_CPU_FOUND : "Could not find supported CPU", 40 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_EMU_FEATURE_NOT_SUPPORTED : "Emulator does not support the selected feature (Usually returned by functions which need specific emulator capabilities)", 41 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_EMU_NO_MEMORY : "Emulator does not have enough memory to perform the requested operation", 42 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_TIF_STATUS_ERROR : "Things such as 'TCK is low but should be high'", 43 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_FLASH_PROG_COMPARE_FAILED : "Flash program compare failure", 44 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_FLASH_PROG_PROGRAM_FAILED : "Flash program operation failure", 45 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_FLASH_PROG_VERIFY_FAILED : "Flash program verify failure", 46 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_OPEN_FILE_FAILED : "Config file open failure", 47 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_UNKNOWN_FILE_FORMAT : "Config file unknown format", 48 | JLINKARM_GLOBAL_ERROR.JLINK_ERR_WRITE_TARGET_MEMORY_FAILED : "Write target memory failure", 49 | } 50 | 51 | def GetErrorDesc(error): 52 | try: 53 | errStr = JLINKARM_GLOBAL_ERROR_DESC[JLINKARM_GLOBAL_ERROR(error)] 54 | except (ValueError, KeyError) as err: 55 | errStr = "Unsupported error code '{}' triggered {}".format(error, err) 56 | return errStr 57 | 58 | 59 | class JLinkDll: 60 | """ 61 | Object for accessing and controlling a JLink adapter 62 | """ 63 | # Maximum number of adapters this wrapper can find. 64 | MAX_NUM_ADAPTERS = 32 65 | logger = None 66 | def __init__(self): 67 | try: 68 | # Get the path to slab8051.dll in the Studio installation 69 | cwd = os.getcwd() 70 | # Load JLinkARM.dll 71 | self._dll = ct.cdll.LoadLibrary("JLinkARM.dll") 72 | self._windll = ct.windll.LoadLibrary("JLinkARM.dll") 73 | os.chdir(cwd) 74 | except: 75 | print("Unable to load JLinkDll class") 76 | 77 | # Keep a list of all adapters 78 | self._num_adapters, self._adapter_list = self.get_usb_adapter_list() 79 | 80 | # Initialize all properties of the connected MCU 81 | self._initialize_mcu_properties() 82 | 83 | # Suppress dialog from the DLL 84 | self._suppress_usb_dialog() 85 | 86 | self._init_logger() 87 | 88 | def _init_logger(self): 89 | logging.basicConfig(level=logging.INFO, 90 | format='%(asctime)s - %(levelname)s: %(message)s') 91 | self.logger = logging.getLogger() 92 | 93 | def abort(self, errMsg): 94 | self.logger.error(errMsg) 95 | self._dll.JLINKARM_Close() 96 | self._initialize_mcu_properties() 97 | 98 | def _jlink_arm_execute_command_string(self, command_string): 99 | """ 100 | Execute a JLink command string. 101 | 102 | Keyword arguments: 103 | command_string -- the string to execute with JLINKARM_ExecCommand() 104 | 105 | Returns the return value of the executed command. 106 | """ 107 | command_string = ct.c_char_p(command_string) 108 | error = ct.create_string_buffer(256) 109 | buffer_size = ct.c_int(256) 110 | retval = self._dll.JLINKARM_ExecCommand(command_string, 111 | error, 112 | buffer_size) 113 | 114 | # If error has a value, report that value as an exception 115 | if error[0] != "\0": 116 | errMsg = "JLINKARM_ExecCommand() returned error {}".format(error.raw) 117 | self.abort(errMsg) 118 | return False 119 | 120 | return retval 121 | 122 | def _initialize_mcu_properties(self): 123 | """ 124 | Resest all internal variables tracking the properties of the 125 | attached MCU. 126 | """ 127 | self._mcu_interface_type = None 128 | self._mcu_core = None 129 | self._id_code = None 130 | self._part_family = None 131 | self._part_number = None 132 | self._part_number_id = None 133 | self._flash_size = None 134 | 135 | def _suppress_usb_dialog(self): 136 | """ 137 | Suppresses dialog message from JLinkARM.dll. 138 | """ 139 | result = self._jlink_arm_execute_command_string("SuppressEmuUSBDialog") 140 | if result != 0: 141 | errMsg = "Connect: JLINKARM_ExecCommand({}): {}".format("SuppressEmuUSBDialog", GetErrorDesc(result)) 142 | self.abort(errMsg) 143 | 144 | def _locked_part_callback(self, sTitle, sMessage, Flags): 145 | """ 146 | Callback function called if attached part is locked. 147 | This prevents pop-up dialog from JLINK DLL. 148 | """ 149 | JLINK_DLG_BUTTON_NO = (1 << 1) 150 | 151 | return JLINK_DLG_BUTTON_NO 152 | 153 | def get_usb_adapter_list(self): 154 | """ 155 | Returns a list of all adapters connected to the host via USB. 156 | """ 157 | host_ifs = ct.c_int(JLINKARM_HOSTIF_USB) 158 | connect_info = \ 159 | (JLinkArmEmuConnectInfo_CStruct * self.MAX_NUM_ADAPTERS)() 160 | max_info = ct.c_int(self.MAX_NUM_ADAPTERS) 161 | 162 | num_adapters = self._dll.JLINKARM_EMU_GetList(host_ifs, 163 | ct.byref(connect_info), 164 | max_info) 165 | # Create a list of information for each adapter 166 | adapter_list = [] 167 | for i in range(num_adapters): 168 | adapter_list.append(connect_info[i]) 169 | self._num_adapters = num_adapters 170 | self._adapter_list = adapter_list 171 | return num_adapters, adapter_list 172 | 173 | def get_tcp_ip_adapter_list(self): 174 | """ 175 | Returns a list of all adapters connected to the host via TCP/IP. 176 | """ 177 | host_ifs = ct.c_int(JLINKARM_HOSTIF_IP) 178 | connect_info = \ 179 | (JLinkArmEmuConnectInfo_CStruct * self.MAX_NUM_ADAPTERS)() 180 | max_info = ct.c_int(self.MAX_NUM_ADAPTERS) 181 | 182 | num_adapters = self._dll.JLINKARM_EMU_GetList(host_ifs, 183 | ct.byref(connect_info), 184 | max_info) 185 | # Create a list of information for each adapter 186 | adapter_list = [] 187 | for i in range(num_adapters): 188 | adapter_list.append(connect_info[i]) 189 | 190 | return num_adapters, adapter_list 191 | 192 | def get_adapter_list(self): 193 | """ 194 | Returns a list of all adapters connected to the host via TCP/IP or USB. 195 | """ 196 | host_ifs = ct.c_int(JLINKARM_HOSTIF_USB | JLINKARM_HOSTIF_IP) 197 | connect_info = \ 198 | (JLinkArmEmuConnectInfo_CStruct * self.MAX_NUM_ADAPTERS)() 199 | max_info = ct.c_int(self.MAX_NUM_ADAPTERS) 200 | 201 | num_adapters = self._dll.JLINKARM_EMU_GetList(host_ifs, 202 | ct.byref(connect_info), 203 | max_info) 204 | # Create a list of information for each adapter 205 | adapter_list = [] 206 | for i in range(num_adapters): 207 | adapter_list.append(connect_info[i]) 208 | 209 | return num_adapters, adapter_list 210 | 211 | def connect(self, 212 | serial_number, 213 | ifc): 214 | # First, look for the adapter in the adapter list 215 | # num_adapters, adapter_list = self.get_usb_adapter_list() 216 | found_adapter = False 217 | for adapter in self._adapter_list: 218 | if adapter.SerialNumber == serial_number: 219 | found_adapter = True 220 | break 221 | 222 | if not found_adapter: 223 | errMsg = "Unable to find adapter with serial number {}".format(serial_number) 224 | self.abort(errMsg) 225 | return False 226 | 227 | self._suppress_usb_dialog() 228 | # serial_number = ct.c_uint32(serial_number) 229 | 230 | # USB Adapter 231 | if adapter.Connection == JLINKARM_HOSTIF_USB: 232 | error = self._dll.JLINKARM_EMU_SelectByUSBSN(serial_number) 233 | if error < 0: 234 | errMsg = "Connect: {} Unable to select {} on USB interface".format(error, serial_number) 235 | self.abort(errMsg) 236 | return False 237 | else: 238 | print("TCP/IP support currently not implemented in jlink.py.") 239 | return False 240 | 241 | # register local error handler to suppress blocking dialog pop-up errors 242 | # _REF_ErrorOutHandler = self._dll.JLINKARM_LOG(self.ErrorOutHandler) 243 | # self._dll.JLINKARM_SetErrorOutHandler(_REF_ErrorOutHandler) 244 | 245 | # register local error handler to suppress blocking dialog pop-up errors 246 | # _REF_WarnOutHandler = self._dll.JLINKARM_LOG(self.WarnOutHandler) 247 | # self._dll.JLINKARM_SetWarnOutHandler(_REF_WarnOutHandler) 248 | 249 | self._initialize_mcu_properties() 250 | result = self._dll.JLINKARM_Open() 251 | if result: 252 | errMsg = "Connect: JLINKARM_Open: {}".format(result) 253 | self.abort(errMsg) 254 | return False 255 | 256 | result = self._dll.JLINKARM_HasError() 257 | if result: 258 | errMsg = "Connect: JLINKARM_HasError: {}".format(result) 259 | self.abort(errMsg) 260 | return False 261 | 262 | if ifc.upper() == "C2": 263 | interface = JLINKARM_TIF_C2 264 | self._dll.JLINKARM_TIF_Select(interface) 265 | self.set_device("EFM8SB20F64G") 266 | elif ifc.upper() == "SWD": 267 | interface = JLINKARM_TIF_SWD 268 | self._dll.JLINKARM_TIF_Select(interface) 269 | self.set_device("EFM32GG990F1024") 270 | else: 271 | errMsg = "Unkown Debug Interface: {}".format(ifc) 272 | self.abort(errMsg) 273 | return False 274 | 275 | # self._windll.JLINK_SetHookUnsecureDialog( 276 | # JLINK_UNSECURE_DIALOG_CB_FUNC_TYPE(self._locked_part_callback)) 277 | 278 | # self._dll.JLINKARM_TIF_Select(interface) 279 | 280 | # Set to maximum speed 281 | speed_info = self.get_speed_info() 282 | self._dll.JLINKARM_SetSpeed(ct.c_uint32(speed_info["BaseFreq"] / 283 | speed_info["MinDiv"] / 1000)) 284 | 285 | result = self._dll.JLINKARM_ExecCommand("SuppressEmuUSBDialog", 0, 0) 286 | if result < 0: 287 | errMsg = "Connect: JLINKARM_ExecCommand({}): {}".format( 288 | "SuppressEmuUSBDialog", GetErrorDesc(result)) 289 | self.abort(errMsg) 290 | return False 291 | self._suppress_usb_dialog() 292 | 293 | # Connect, halt, and get the Part ID 294 | result = self._dll.JLINKARM_Connect() 295 | if result < 0: 296 | errMsg = "Connect: JLINKARM_Connect: {}".format(GetErrorDesc(result)) 297 | self.abort(errMsg) 298 | return False 299 | 300 | self._dll.JLINKARM_Halt() 301 | 302 | id_data = self.get_id_data() 303 | 304 | SWD_PREFIXES = ["EFM32", "EFR32"] 305 | C2_PREFIXES = ["EFM8", "C8051", "Si"] 306 | 307 | if interface == JLINKARM_TIF_SWD: 308 | # self.reset() 309 | # Get the ID code in the correct format 310 | self._idcode = id_data.aId[0] / 0x10000 + id_data.aId[1] * 0x10000 311 | if self._idcode == 0x0BC11477: 312 | self._core = MCU_CORE_M0 313 | core_string = "M0+" 314 | elif self._idcode == 0x2BA01477: 315 | self._core = MCU_CORE_M3_M4 316 | core_string = "M3/M4" 317 | # Get the part number 318 | self._part_number_id = self.read_ram_arm_16(0x0FE081FC, 1)[0] 319 | self._part_family = self.read_ram_arm_8(0x0FE081FE, 1)[0] 320 | self._flash_size = self.read_ram_arm_16(0x0FE081F8, 1)[0] 321 | # self._temp_grade = self.read_ram_arm_8(0x0FE081E4, 1)[0] 322 | # self._pkg_type = self.read_ram_arm_8(0x0FE081E5, 1)[0] 323 | self._pin_count = self.read_ram_arm_8(0x0FE081E6, 1)[0] 324 | 325 | self._part_number = EFM32_PART_PREFIX[self._part_family] + \ 326 | str(self._part_number_id) + 'F' + str(self._flash_size) 327 | 328 | # For now, only EFM32JG and EFM32PG needs pin count. And "GM" 329 | # only for the current support list. 330 | if EFM32_PART_PREFIX[self._part_family] == "EFM32JG1B" or \ 331 | EFM32_PART_PREFIX[self._part_family] == "EFM32PG1B": 332 | self._part_number += "GM" + str(self._pin_count) 333 | 334 | elif interface == JLINKARM_TIF_C2: 335 | self._idcode = id_data.aId[0] / 0x10000 336 | self._part_family = self._idcode 337 | self._core = MCU_CORE_8051 338 | core_string = "8051" 339 | self._part_number_id = self.read_mem( 340 | JLINK_EFM8_START_ADDR_DSR + JLINK_EFM8_OFF_REG_DSR_DERIVATIVE, 341 | 1)[0] 342 | self._part_number = MCU_EFM8_DERIVS[self._part_family][self._part_number_id] 343 | 344 | self.set_device(self._part_number) 345 | # self._dll.JLINKARM_Connect() 346 | 347 | # print("Adapter Connection Information:") 348 | # print(" Connection Type: %s" % connection_type_string) 349 | # print(" MCU Core: %s" % core_string) 350 | # if self._core == MCU_CORE_8051: 351 | # print(" Hardware Family: %s, (0x%X)" % 352 | # (MCU_8051_FAMILY[self._idcode], self._part_family)) 353 | # elif self._core == MCU_CORE_M0 or self._core == MCU_CORE_M3_M4: 354 | # print(" Hardware Family: %s (0x%X)" % 355 | # (MCU_EFM32_FAMILY[self._part_family], self._part_family)) 356 | # else: 357 | # print(" ID: 0x%X" % self._idcode) 358 | # print(" Part Number: %s (0x%X)" % 359 | # (self._part_number, self._part_number_id)) 360 | return True 361 | 362 | def close(self): 363 | """ 364 | Closes the connection to the JLink adapter. 365 | """ 366 | self._dll.JLINKARM_Close() 367 | self._initialize_mcu_properties() 368 | 369 | def get_speed(self): 370 | """ 371 | Returns the current JTAG connection speed. 372 | """ 373 | speed = self._dll.JLINKARM_GetSpeed() 374 | return speed 375 | 376 | def set_max_speed(self): 377 | """ 378 | Sets the JTAG connection speed to its maximum value. 379 | """ 380 | self._dll.JLINKARM_SetMaxSpeed() 381 | 382 | def set_speed(self, speed=4000): 383 | """ 384 | Sets the JTAG connection speed. 385 | 386 | Keyword arguments: 387 | speed -- speed of JTAG connection in kHz. 388 | """ 389 | self._dll.JLINKARM_SetSpeed(ct.c_uint32(speed)) 390 | 391 | def get_speed_info(self): 392 | """ 393 | Gets the target interface speed information. 394 | 395 | Returns a dictionary containing the speed information. 396 | """ 397 | speed_info = JlinkArm_Speed_Info_CStruct() 398 | speed_info.SizeOfStruct = ct.c_uint32(ct.sizeof(speed_info)) 399 | self._dll.JLINKARM_GetSpeedInfo(ct.pointer(speed_info)) 400 | 401 | return {"BaseFreq": speed_info.BaseFreq, 402 | "MinDiv": speed_info.MinDiv, 403 | "SupportAdaptive": bool(speed_info.SupportAdaptive)} 404 | 405 | def get_id(self): 406 | """ 407 | Retrives ID of the core. 408 | """ 409 | id = self._dll.JLINKARM_GetId() 410 | return id 411 | 412 | def get_id_data(self): 413 | """ 414 | Retrives detailed info of the device on the JTAG bus. 415 | """ 416 | id_data = JLinkJtagIdData_CStruct() 417 | self._dll.JLINKARM_GetIdData(ct.pointer(id_data)) 418 | return id_data 419 | 420 | def run(self): 421 | self._dll.JLINKARM_Go() 422 | 423 | def go_ex(self): 424 | """ 425 | Runs the currently connected device, skipping over any breakpoint at the current instruction. 426 | """ 427 | self._dll.JLINKARM_GoEx(ct.c_uint32(JLINKARM_GO_MAX_EMUL_INSTS_DEFAULT), 428 | ct.c_uint32(JLINKARM_GO_FLAG_OVERSTEP_BP)) 429 | 430 | def step(self): 431 | self._dll.JLINKARM_Step() 432 | 433 | def halt(self): 434 | self._dll.JLINKARM_Halt() 435 | 436 | def reset(self, halt=True): 437 | """ 438 | Resets the currently connected device. 439 | 440 | Keyword arguments: 441 | halt -- if true, the part will be halted before reset 442 | if false, the part will not be halted before reset 443 | """ 444 | if halt: 445 | self._dll.JLINKARM_Reset() 446 | else: 447 | self._dll.JLINKARM_ResetNoHalt() 448 | 449 | def get_device_family(self): 450 | return self._dll.JLINKARM_GetDeviceFamily() 451 | 452 | def set_device(self, device): 453 | result = self._jlink_arm_execute_command_string("device = %s" % device) 454 | if result != 0: 455 | errMsg = "Connect: JLINKARM_ExecCommand(\"{}\"): {}".format("device = {}".format(device.upper()), 456 | GetErrorDesc(result)) 457 | self.abort(errMsg) 458 | 459 | def read_mem(self, address, num_bytes): 460 | data = ct.create_string_buffer(num_bytes) 461 | status = ct.create_string_buffer(256) 462 | result = self._dll.JLINKARM_ReadMem(ct.c_uint32(address), 463 | ct.c_uint32(num_bytes), 464 | ct.pointer(data), 465 | ct.pointer(status)) 466 | if result: 467 | errMsg = "ReadMem: Failure result {} reading {} bytes at '{:#010x}'".format(result, num_bytes, address) 468 | self.abort(errMsg) 469 | # Convert to a list of integers 470 | ret_buffer = [] 471 | for byte in data.raw: 472 | ret_buffer.append(ord(byte)) 473 | 474 | return ret_buffer 475 | 476 | def read_ram_arm_8(self, address, num_bytes): 477 | data = ct.create_string_buffer(num_bytes) 478 | status = ct.create_string_buffer(256) 479 | self._dll.JLINKARM_ReadMemU8(ct.c_uint32(address), 480 | ct.c_uint32(num_bytes), 481 | ct.pointer(data), 482 | ct.pointer(status)) 483 | # Convert to a list of 8-bit integers 484 | ret_buffer = [] 485 | for byte in data.raw: 486 | ret_buffer.append(ord(byte)) 487 | 488 | return ret_buffer 489 | 490 | def read_ram_arm_16(self, address, num_words): 491 | data = ct.create_string_buffer(num_words * 2) 492 | status = ct.create_string_buffer(256) 493 | self._dll.JLINKARM_ReadMemU16(ct.c_uint32(address), 494 | ct.c_uint32(num_words), 495 | ct.pointer(data), 496 | ct.pointer(status)) 497 | # Convert to a list of 16-bit integers 498 | ret_buffer = [] 499 | for i in range(num_words): 500 | ret_buffer.append( 501 | (ord(data[(i * 2) + 1]) * 256) + ord(data[i * 2])) 502 | 503 | return ret_buffer 504 | 505 | def read_ram_arm_32(self, address, num_words): 506 | data = ct.create_string_buffer(num_words * 4) 507 | status = ct.create_string_buffer(256) 508 | self._dll.JLINKARM_ReadMemU32(ct.c_uint32(address), 509 | ct.c_uint32(num_words), 510 | ct.pointer(data), 511 | ct.pointer(status)) 512 | # Convert to a list of 32-bit integers 513 | ret_buffer = [] 514 | for i in range(num_words): 515 | ret_buffer.append((ord(data[(i * 2) + 3]) * 0x1000000) + 516 | (ord(data[(i * 2) + 2]) * 0x10000) + 517 | (ord(data[(i * 2) + 1]) * 0x100) + 518 | ord(data[i * 2])) 519 | 520 | return ret_buffer 521 | 522 | def read_ram_arm_64(self, address, num_words): 523 | """ 524 | Reads a block of RAM in 64-bit words. 525 | 526 | Keyword arguments: 527 | address -- starting address to read 528 | num_words -- number of 64-bit words to read 529 | """ 530 | data = ct.create_string_buffer(num_words * 8) 531 | status = ct.create_string_buffer(256) 532 | self._dll.JLINKARM_ReadMemU64(ct.c_uint32(address), 533 | ct.c_uint32(num_words), 534 | ct.pointer(data), 535 | ct.pointer(status)) 536 | # Convert to a list of 64-bit integers 537 | ret_buffer = [] 538 | for i in range(num_words): 539 | ret_buffer.append((ord(data[(i * 2) + 7]) * 0x100000000000000) + 540 | (ord(data[(i * 2) + 6]) * 0x1000000000000) + 541 | (ord(data[(i * 2) + 5]) * 0x10000000000) + 542 | (ord(data[(i * 2) + 4]) * 0x100000000) + 543 | (ord(data[(i * 2) + 3]) * 0x1000000) + 544 | (ord(data[(i * 2) + 2]) * 0x10000) + 545 | (ord(data[(i * 2) + 1]) * 0x100) + 546 | ord(data[i * 2])) 547 | 548 | return ret_buffer 549 | 550 | def clear_breakpoint(self, bp_to_clear): 551 | ''' 552 | Clears breakpoint on the connected device. 553 | 554 | Keyword arguments: 555 | bp_to_clear - Handle of the breakpoint to clear. 556 | Pass JLINKARM_BP_HANDLE_ALL to clear all breakpoints. 557 | ''' 558 | result = self._dll.JLINKARM_ClrBPEx(ct.c_int32(bp_to_clear)) 559 | if result: 560 | errMsg = "JLINKARM_ClrBPEx command failed with return code {}".format(GetErrorDesc(result)) 561 | self.abort(errMsg) 562 | 563 | def clear_all_breakpoints(self): 564 | result = self._dll.JLINKARM_ClrBPEx( 565 | ct.c_uint32(JLINKARM_BP_HANDLE_ALL)) 566 | if result: 567 | errMsg = "JLINKARM_ClrBPEx clear all failed with return code {}".format(GetErrorDesc(result)) 568 | self.abort(errMsg) 569 | 570 | def read_reg(self, register): 571 | ''' 572 | Read an architectural register in the CPU. 573 | 574 | register - Register number (ie in JLINK_EFM8_REG) 575 | 576 | Returns value of register. 577 | Does not return error message on failure. 578 | ''' 579 | return self._dll.JLINKARM_ReadReg(ct.c_int32(register)) 580 | 581 | def set_breakpoint(self, address, typeflags): 582 | ''' 583 | Set a breakpoint within the CPU. 584 | 585 | address - Address for the breakpoint. 586 | typeflags - Flags for the breakpoint. Ignored for EFM8 devices. 587 | ''' 588 | result = self._dll.JLINKARM_SetBPEx(ct.c_uint32(address), 589 | ct.c_uint32(typeflags)) 590 | if result: 591 | errMsg = "JLINKARM_SetBPEx clear all failed with return code {}".format(GetErrorDesc(result)) 592 | self.abort(errMsg) 593 | return result 594 | 595 | def write_mem(self, address, count, data): 596 | data_buffer = ct.create_string_buffer(len(data)) 597 | for idx, byte in enumerate(data): 598 | data_buffer[idx] = chr(byte) 599 | 600 | result = self._dll.JLINKARM_WriteMem(ct.c_uint32(address), 601 | ct.c_uint32(count), 602 | ct.byref(data_buffer)) 603 | if result < 0: 604 | errMsg = "WriteMem: Failure result {} when writing {} bytes to address {:#010x}".format(GetErrorDesc(result), count, address) 605 | self.abort(errMsg) 606 | elif result != byteCnt: 607 | errMsg = "WriteMem: Incomplete write of {} bytes (expected {}) to address {:#010x}".format(result, count, address) 608 | self.abort(errMsg) 609 | 610 | return result 611 | 612 | def write_reg(self, register, value): 613 | result = self._dll.JLINKARM_WriteReg(ct.c_int32(register), 614 | ct.c_uint32(data)) 615 | if result != 0: 616 | self.abort("WriteReg failure with result '{}'".format(result)) 617 | 618 | def write_u8(self, address, data): 619 | retval = self._dll.JLINKARM_WriteU8(ct.c_uint32(address), 620 | ct.c_uint8(data)) 621 | 622 | def write_u16(self, address, data): 623 | retval = self._dll.JLINKARM_WriteU16(ct.c_uint32(address), 624 | ct.c_uint16(data)) 625 | 626 | def write_u32(self, address, data): 627 | retval = self._dll.JLINKARM_WriteU32(ct.c_uint32(address), 628 | ct.c_uint32(data)) 629 | 630 | def write_u64(self, address, data): 631 | retval = self._dll.JLINKARM_WriteU64(ct.c_uint32(address), 632 | ct.c_uint64(data)) 633 | 634 | def erase_chip(self): 635 | """ 636 | Erases all user flash on the connected device. 637 | """ 638 | result = self._windll.JLINK_EraseChip() 639 | if result < 0: 640 | errMsg = "Erase Chip Failed with Error code {}".format(result) 641 | self.abort(errMsg) 642 | return False 643 | return True 644 | 645 | def download(self, image, offset=0): 646 | if not os.path.isfile(image): 647 | print('Could not find image file %s' % image) 648 | 649 | file_name = ct.c_char_p(image) 650 | retval = self._windll.JLINK_DownloadFile( 651 | file_name, ct.c_uint32(offset)) 652 | self.reset() 653 | 654 | @classmethod 655 | def ErrorOutHandler(cls, errorMsg): 656 | """ 657 | Log error from the DLL. 658 | 659 | :param errorMsg: The DLL error message. 660 | """ 661 | if cls.logger: 662 | cls.logger.error(errorMsg.data) 663 | 664 | cls.library_error_list.append(errorMsg.data) 665 | 666 | @classmethod 667 | def WarnOutHandler(cls, warnMsg): 668 | """ 669 | Log warning from the DLL. 670 | 671 | :param warnMsg: The DLL error message. 672 | """ 673 | if cls.logger: 674 | cls.logger.warn(warnMsg.data) -------------------------------------------------------------------------------- /jlink_constants.py: -------------------------------------------------------------------------------- 1 | """ 2 | jlink_constants.py: Constants for JLinkARM.dll Wrapper - Python Edition 3 | 4 | This module provides constants used by the JLinkARM.dll wrapper jlink.py. 5 | """ 6 | import ctypes as ct 7 | 8 | # Adapter Interfaces 9 | JLINKARM_HOSTIF_USB = 0x01 10 | JLINKARM_HOSTIF_IP = 0x02 11 | 12 | # Debug Interfaces 13 | JLINKARM_TIF_JTAG = 0 14 | JLINKARM_TIF_SWD = 1 15 | JLINKARM_TIF_BDM3 = 2 16 | JLINKARM_TIF_FINE = 3 17 | JLINKARM_TIF_2_WIRE_JTAG_PIC32 = 4 18 | JLINKARM_TIF_SPI = 5 19 | JLINKARM_TIF_C2 = 6 20 | 21 | # MCU Cores 22 | MCU_CORE_M0 = 0 23 | MCU_CORE_M3_M4 = 1 24 | MCU_CORE_8051 = 2 25 | 26 | # EFM32 MCU's 27 | MCU_EFM32_FAMILY = { 16 : "EFR32 Mighty Gecko", 28 | 17 : "EFR32 Mighty Gecko", 29 | 18 : "EFR32 Mighty Gecko", 30 | 19 : "EFR32 Blue Gecko", 31 | 20 : "EFR32 Blue Gecko", 32 | 21 : "EFR32 Blue Gecko", 33 | 22 : "EFR32 Zappy Gecko", 34 | 23 : "EFR32 Zappy Gecko", 35 | 24 : "EFR32 Zappy Gecko", 36 | 25 : "EFR32 Flex Gecko", 37 | 26 : "EFR32 Flex Gecko", 38 | 27 : "EFR32 Flex Gecko", 39 | 71 : "EFM32 Gecko", 40 | 72 : "EFM32 Giant Gecko", 41 | 73 : "EFM32 Tiny Gecko", 42 | 74 : "EFM32 Leopard Gecko", 43 | 75 : "EFM32 Wonder Gecko", 44 | 76 : "EFM32 Zero Gecko", 45 | 77 : "EFM32 Happy Gecko", 46 | 81 : "EFM32 Pearl Gecko", 47 | 83 : "EFM32 Jade Gecko", 48 | 120 : "EZR32 Leopard Gecko", 49 | 121 : "EZR32 Wonder Gecko", 50 | 122 : "EZR32 Happy Gecko", 51 | } 52 | 53 | # 8051 MCU's 54 | MCU_8051_FAMILY = { 0x00 : "C8051F0xx (Cindy)", 55 | 0x01 : "C8051F2xx (Twiggy)", 56 | 0x02 : "C8051F0xx (Cindy Plus)", 57 | 0x03 : "C8051F02x (Dot/YAC)", 58 | 0x04 : "C8051F30x (Minnie)", 59 | 0x05 : "C8051F04x (Candy)", 60 | 0x06 : "C8051F06x (Ginger)", 61 | 0x07 : "C8051F12x/13x (CindyGT)", 62 | 0x08 : "C8051F31x (Barbie)", 63 | 0x09 : "C8051F320/1 (Uma)", 64 | 0x0A : "C8051F33x (Kellie)", 65 | 0x0B : "C8051F35x (Chloe)", 66 | 0x0C : "C8051F41x/42x (Lola)", 67 | 0x0D : "C8051F326/7 (Ernie)", 68 | 0x0E : "Si825x (Tonya)", 69 | 0x0F : "C8051F34x (Umami)", 70 | 0x10 : "C8051T60x (Piccolo)", 71 | 0x11 : "C8051F52x/53x (Samson)", 72 | 0x12 : "C8051F36x (Juno)", 73 | 0x13 : "C8051T61x (Fife)", 74 | 0x14 : "C8051F336/7/8/9 (Merlion)", 75 | 0x15 : "Si81xx (Eliza)", 76 | 0x16 : "EFM8SB2, C8051F92x/93x (Henry)", 77 | 0x17 : "C8051T63x (Flute)", 78 | 0x18 : "C8051T620/1 (Whistle)", 79 | 0x19 : "C8051T622/3 (Harmonica)", 80 | 0x1A : "C8051T624/5 (Kazoo)", 81 | 0x1B : "C8051T606 (Piccolino)", 82 | 0x1C : "C8051F50x/51x (Hammer)", 83 | 0x1D : "Si3456F336 (MerlionPOE)", 84 | 0x1E : "C8051F70x/71x (Centipede)", 85 | 0x1F : "C8051F901/02/11/12 (Henrietta)", 86 | 0x20 : "C8051F58x/59x (Cayenne)", 87 | 0x21 : "C8051F54x", 88 | 0x22 : "C8051F54x/55x/56x/57x (Boxman)", 89 | 0x23 : "C8051F8xx", 90 | 0x24 : "Si401x", 91 | 0x25 : "EFM8SB1, C8051F99x (Etta)", 92 | 0x26 : "C8051F610POE", 93 | 0x27 : "Si114x", 94 | 0x28 : "EFM8UB2, C8051F38x (Taya)", 95 | 0x29 : "C8051F75x (Quickdraw)", 96 | 0x2A : "C8051F96x (Metron)", 97 | 0x2B : "C8051F37x/39x (Kylin)", 98 | 0x2C : "WhistlePOE", 99 | 0x2D : "Si2178", 100 | 0x2E : "C8051F77x (Roadrunner)", 101 | 0x2F : "Si7010 (Humidity Sensor)", 102 | 0x30 : "EFM8BB1, C8051F85x (ULC8)", 103 | 0x31 : "Si7030", 104 | 0x32 : "EFM8UB1/BB2 (Shanghai)", 105 | 0x33 : "POE", 106 | 0x34 : "EFM8LB1/BB3 (Sydney)", 107 | 0x35 : "Si1150", 108 | 0x36 : "EFM8UB3/UB4 (Delphi)", 109 | 0x37 : "Si5332", 110 | 0x38 : "Si1170", 111 | } 112 | 113 | # EFM8UB1/BB2 Derivatives 114 | MCU_EFM8UB1_BB2_DERIVS = { 0x01 : "EFM8BB22F16G", 115 | 0x02 : "EFM8BB21F16G", 116 | 0x03 : "EFM8BB21F16G", 117 | 0x11 : "EFM8BB22F16I", 118 | 0x12 : "EFM8BB21F16I", 119 | 0x13 : "EFM8BB21F16I", 120 | 0x21 : "EFM8BB22F16A", 121 | 0x22 : "EFM8BB21F16A", 122 | 0x23 : "EFM8BB21F16A", 123 | 0x41 : "EFM8UB10F16G", 124 | 0x43 : "EFM8UB10F16G", 125 | 0x45 : "EFM8UB11F16G", 126 | 0x49 : "EFM8UB10F8G", 127 | 0x4A : "EFM8UB11F16G", 128 | } 129 | 130 | # EFM8UB2 Derivatives 131 | MCU_EFM8UB2_DERIVS = { 0x60 : "EFM8UB20F64G", 132 | 0x61 : "EFM8UB20F64G", 133 | 0x62 : "EFM8UB20F64G", 134 | 0x63 : "EFM8UB20F32G", 135 | 0x64 : "EFM8UB20F32G", 136 | 0x65 : "EFM8UB20F32G", 137 | 0xD0 : "C8051F380", 138 | 0xD1 : "C8051F381", 139 | 0xD2 : "C8051F382", 140 | 0xD3 : "C8051F383", 141 | 0xD4 : "C8051F384", 142 | 0xD5 : "C8051F385", 143 | 0xD6 : "C8051F386", 144 | 0xD7 : "C8051F387", 145 | 0xD8 : "C8051F388", 146 | 0xD9 : "C8051F389", 147 | 0xDA : "C8051F38A", 148 | 0xDB : "C8051F38B", 149 | 0xDC : "C8051F38C", 150 | 0xE8 : "C8051F388U", 151 | 0xE9 : "C8051F389U", 152 | 0xEA : "C8051F38AU", 153 | 0xEB : "C8051F38BU", 154 | 0xEC : "C8051F38CU", 155 | } 156 | 157 | # EFM8SB1 Derivatives 158 | MCU_EFM8SB1_DERIVS = { 0xD0 : "C8051F990", 159 | 0xD1 : "C8051F991", 160 | 0xD2 : "C8051F997", 161 | 0xD3 : "C8051F980", 162 | 0xD4 : "C8051F981", 163 | 0xD5 : "C8051F982", 164 | 0xD6 : "C8051F996", 165 | 0xD7 : "C8051F983", 166 | 0xD8 : "C8051F985", 167 | 0xD9 : "C8051F986", 168 | 0xDA : "C8051F987", 169 | 0xDB : "C8051F988", 170 | 0xDC : "C8051F989", 171 | 0xE0 : "C8051F990-B1", 172 | 0xE1 : "C8051F991-B1", 173 | 0xE2 : "C8051F997-B1", 174 | 0xE3 : "C8051F980-B1", 175 | 0xE4 : "C8051F981-B1", 176 | 0xE5 : "C8051F982-B1", 177 | 0xE6 : "C8051F996-B1", 178 | 0xE7 : "C8051F983-B1", 179 | 0xE8 : "C8051F985-B1", 180 | 0xE9 : "C8051F986-B1", 181 | 0xEA : "C8051F987-B1", 182 | 0xEB : "C8051F988-B1", 183 | 0xEC : "C8051F989-B1", 184 | 0x01 : "EFM8SB10F8G", 185 | 0x02 : "EFM8SB10F8G", 186 | 0x03 : "EFM8SB10F8G", 187 | 0x04 : "EFM8SB10F4G", 188 | 0x05 : "EFM8SB10F4G", 189 | 0x06 : "EFM8SB10F4G", 190 | 0x07 : "EFM8SB10F2G", 191 | 0x08 : "EFM8SB10F2G", 192 | 0x09 : "EFM8SB10F2G", 193 | 0x0A : "EFM8SB10F8G", 194 | } 195 | 196 | # EFM8SB2 Derivatives 197 | MCU_EFM8SB2_DERIVS = { 0x01 : "EFM8SB20F64G", 198 | 0x02 : "EFM8SB20F64G", 199 | 0x03 : "EFM8SB20F64G", 200 | 0x04 : "EFM8SB20F32G", 201 | 0x05 : "EFM8SB20F32G", 202 | 0x06 : "EFM8SB20F32G", 203 | 0x09 : "EFM8SB20F16G", 204 | 0xB1 : "C8051F920", 205 | 0xB3 : "C8051F921", 206 | 0x56 : "C8051F930", 207 | 0x5E : "C8051F931", 208 | 0xD0 : "Si1000", 209 | 0xD1 : "Si1001", 210 | 0xD2 : "Si1002", 211 | 0xD3 : "Si1003", 212 | 0xD4 : "Si1004", 213 | 0xD5 : "Si1005", 214 | 0xE0 : "Si1060", 215 | 0xE1 : "Si1061", 216 | 0xE2 : "Si1062", 217 | 0xE3 : "Si1063", 218 | 0xE4 : "Si1064", 219 | 0xE5 : "Si1065", 220 | } 221 | 222 | # EFM8BB1 Derivatives 223 | MCU_EFM8BB1_DERIVS = { 0x01 : "EFM8BB10F8G", 224 | 0x02 : "EFM8BB10F8G", 225 | 0x03 : "EFM8BB10F8G", 226 | 0x04 : "EFM8BB10F4G", 227 | 0x05 : "EFM8BB10F4G", 228 | 0x06 : "EFM8BB10F4G", 229 | 0x07 : "EFM8BB10F2G", 230 | 0x08 : "EFM8BB10F2G", 231 | 0x09 : "EFM8BB10F2G", 232 | 0x11 : "EFM8BB10F8I", 233 | 0x12 : "EFM8BB10F8I", 234 | 0x13 : "EFM8BB10F8I", 235 | 0x14 : "EFM8BB10F4I", 236 | 0x15 : "EFM8BB10F4I", 237 | 0x16 : "EFM8BB10F4I", 238 | 0x17 : "EFM8BB10F2I", 239 | 0x18 : "EFM8BB10F2I", 240 | 0x19 : "EFM8BB10F2I", 241 | 0x21 : "EFM8BB10F8Y", 242 | 0x22 : "EFM8BB10F8Y", 243 | 0x23 : "EFM8BB10F8Y", 244 | 0x24 : "EFM8BB10F4Y", 245 | 0x25 : "EFM8BB10F4Y", 246 | 0x26 : "EFM8BB10F4Y", 247 | 0x27 : "EFM8BB10F2Y", 248 | 0x28 : "EFM8BB10F2Y", 249 | 0x29 : "EFM8BB10F2Y", 250 | 0x31 : "EFM8BB10F8A", 251 | 0x32 : "EFM8BB10F8A", 252 | 0x33 : "EFM8BB10F8A", 253 | 0x34 : "EFM8BB10F4A", 254 | 0x35 : "EFM8BB10F4A", 255 | 0x36 : "EFM8BB10F4A", 256 | 0x37 : "EFM8BB10F2A", 257 | 0x38 : "EFM8BB10F2A", 258 | 0x39 : "EFM8BB10F2A", 259 | 0xD0 : "C8051850-GU", 260 | 0xD1 : "C8051851-GU", 261 | 0xD2 : "C8051852-GU", 262 | 0xD3 : "C8051853-GU", 263 | 0xD4 : "C8051854-GU", 264 | 0xD5 : "C8051855-GU", 265 | 0xE0 : "C8051860-GS", 266 | 0xE1 : "C8051861-GS", 267 | 0xE2 : "C8051862-GS", 268 | 0xE3 : "C8051863-GS", 269 | 0xE4 : "C8051864-GS", 270 | 0xE5 : "C8051865-GS", 271 | 0xF0 : "C8051850-GM", 272 | 0xF1 : "C8051851-GM", 273 | 0xF2 : "C8051852-GM", 274 | 0xF3 : "C8051853-GM", 275 | 0xF4 : "C8051854-GM", 276 | 0xF5 : "C8051855-GM", 277 | } 278 | 279 | # EFM8LB1/BB3 Derivatives 280 | MCU_EFM8LB1_BB3_DERIVS = { 0x01 : "EFM8BB31F64G", 281 | 0x02 : "EFM8BB31F64G", 282 | 0x03 : "EFM8BB31F64G", 283 | 0x04 : "EFM8BB31F64G", 284 | 0x05 : "EFM8BB31F32G", 285 | 0x06 : "EFM8BB31F32G", 286 | 0x07 : "EFM8BB31F32G", 287 | 0x08 : "EFM8BB31F32G", 288 | 0x09 : "EFM8BB31F16G", 289 | 0x0A : "EFM8BB31F16G", 290 | 0x0B : "EFM8BB31F16G", 291 | 0x0C : "EFM8BB31F16G", 292 | 0x11 : "EFM8BB31F64I", 293 | 0x12 : "EFM8BB31F64I", 294 | 0x13 : "EFM8BB31F64I", 295 | 0x14 : "EFM8BB31F64I", 296 | 0x15 : "EFM8BB31F32I", 297 | 0x16 : "EFM8BB31F32I", 298 | 0x17 : "EFM8BB31F32I", 299 | 0x18 : "EFM8BB31F32I", 300 | 0x19 : "EFM8BB31F16I", 301 | 0x1A : "EFM8BB31F16I", 302 | 0x1B : "EFM8BB31F16I", 303 | 0x1C : "EFM8BB31F16I", 304 | 0x21 : "EFM8BB31F64A", 305 | 0x22 : "EFM8BB31F64A", 306 | 0x23 : "EFM8BB31F64A", 307 | 0x24 : "EFM8BB31F64A", 308 | 0x25 : "EFM8BB31F32A", 309 | 0x26 : "EFM8BB31F32A", 310 | 0x27 : "EFM8BB31F32A", 311 | 0x28 : "EFM8BB31F32A", 312 | 0x29 : "EFM8BB31F16A", 313 | 0x2A : "EFM8BB31F16A", 314 | 0x2B : "EFM8BB31F16A", 315 | 0x2C : "EFM8BB31F16A", 316 | 0x41 : "EFM8LB12F64E", 317 | 0x42 : "EFM8LB12F64E", 318 | 0x43 : "EFM8LB12F64E", 319 | 0x44 : "EFM8LB12F64E", 320 | 0x45 : "EFM8LB12F32E", 321 | 0x46 : "EFM8LB12F32E", 322 | 0x47 : "EFM8LB12F32E", 323 | 0x48 : "EFM8LB12F32E", 324 | 0x49 : "EFM8LB11F32E", 325 | 0x4A : "EFM8LB11F32E", 326 | 0x4B : "EFM8LB11F32E", 327 | 0x4C : "EFM8LB11F32E", 328 | 0x4D : "EFM8LB11F16E", 329 | 0x4E : "EFM8LB11F16E", 330 | 0x4F : "EFM8LB11F16E", 331 | 0x50 : "EFM8LB11F16E", 332 | 0x51 : "EFM8LB10F16E", 333 | 0x52 : "EFM8LB10F16E", 334 | 0x53 : "EFM8LB10F16E", 335 | 0x54 : "EFM8LB10F16E", 336 | 337 | 0x61 : "EFM8LB12F64E-S", 338 | 0x62 : "EFM8LB12F64E-S", 339 | 0x63 : "EFM8LB12F64E-S", 340 | 0x64 : "EFM8LB12F64E-S", 341 | 0x65 : "EFM8LB12F32E-S", 342 | 0x66 : "EFM8LB12F32E-S", 343 | 0x67 : "EFM8LB12F32E-S", 344 | 0x68 : "EFM8LB12F32E-S", 345 | 0x69 : "EFM8LB11F32E-S", 346 | 0x6A : "EFM8LB11F32E-S", 347 | 0x6B : "EFM8LB11F32E-S", 348 | 0x6C : "EFM8LB11F32E-S", 349 | 0x6D : "EFM8LB11F16E-S", 350 | 0x6E : "EFM8LB11F16E-S", 351 | 0x6F : "EFM8LB11F16E-S", 352 | 0x70 : "EFM8LB11F16E-S", 353 | 0x71 : "EFM8LB10F16E-S", 354 | 0x72 : "EFM8LB10F16E-S", 355 | 0x73 : "EFM8LB10F16E-S", 356 | 0x74 : "EFM8LB10F16E-S", 357 | } 358 | # EFM8 Derivatives Table 359 | MCU_EFM8_DERIVS = { 0x16 : MCU_EFM8SB2_DERIVS, 360 | 0x25 : MCU_EFM8SB1_DERIVS, 361 | 0x28 : MCU_EFM8UB2_DERIVS, 362 | 0x30 : MCU_EFM8BB1_DERIVS, 363 | 0x32 : MCU_EFM8UB1_BB2_DERIVS, 364 | 0x34 : MCU_EFM8LB1_BB3_DERIVS, 365 | } 366 | 367 | # EFM8-Specific Constants 368 | JLINK_EFM8_VIRTUAL_AREA_SIZE = 0x1000000 369 | 370 | # 64KB. First 32KB are fixed, the other 32KB are the current bank 371 | JLINK_EFM8_START_ADDR_CODE = 0x0000000 372 | 373 | # 256 bytes 374 | JLINK_EFM8_START_ADDR_IDATA = JLINK_EFM8_START_ADDR_CODE + JLINK_EFM8_VIRTUAL_AREA_SIZE 375 | 376 | # 256 bytes 00-7F is RAM, with register banks as usual. 80-FF is the sfr area 377 | # of the currently selected bank 378 | # WARNING: Because of how the debugger (DSR) interface works, DDATA ranges 0x00 - 0x7f should be referenced as IDATA. 379 | # See Jeff or Rich for details. 380 | JLINK_EFM8_START_ADDR_DDATA = JLINK_EFM8_START_ADDR_IDATA + JLINK_EFM8_VIRTUAL_AREA_SIZE 381 | JLINK_EFM8_START_ADDR_XDATA = JLINK_EFM8_START_ADDR_DDATA + JLINK_EFM8_VIRTUAL_AREA_SIZE 382 | 383 | # Virtually 64 KB. Maps non-memory mapped DSR registers to virtual memory, 384 | # to allow easy access to them 385 | JLINK_EFM8_START_ADDR_DSR = JLINK_EFM8_START_ADDR_XDATA + JLINK_EFM8_VIRTUAL_AREA_SIZE 386 | 387 | # 388 | # Explicit access to different DDATA pages 389 | # 390 | 391 | # 256 bytes. Same as DDATA, only sfrs are page-0 sfrs (no matter what SFRPAGE 392 | # register currently selects) 393 | JLINK_EFM8_START_ADDR_DDATA_PAGE0 = JLINK_EFM8_START_ADDR_DDATA + 0x00100 394 | 395 | # 256 bytes. Same as DDATA, only sfrs are page-1 sfrs (no matter what SFRPAGE 396 | # register currently selects) 397 | JLINK_EFM8_START_ADDR_DDATA_PAGE1 = JLINK_EFM8_START_ADDR_DDATA + 0x00200 398 | 399 | # 256 bytes. Same as DDATA, only sfrs are page-2 sfrs (no matter what SFRPAGE 400 | # register currently selects) 401 | JLINK_EFM8_START_ADDR_DDATA_PAGE2 = JLINK_EFM8_START_ADDR_DDATA + 0x00300 402 | 403 | # [...] DDATA_PAGE2-xxx 404 | # 405 | # Explicit access to different flash areas 406 | # Allows debugger to perform a continuous flash download via a single memory-write 407 | # 408 | 409 | # 32KB, Always visible at 0x30000. Also be visible at 0x38000 if PSBANK == 0x00 410 | JLINK_EFM8_START_ADDR_CODE_BANK0 = JLINK_EFM8_START_ADDR_CODE + 0x10000 411 | 412 | # 32KB, Also be visible at 0x38000 if PSBANK == 0x11 413 | JLINK_EFM8_START_ADDR_CODE_BANK1 = JLINK_EFM8_START_ADDR_CODE + 0x18000 414 | 415 | # // 32KB, Also visible at 0x38000 if PSBANK register == 0x22 416 | JLINK_EFM8_START_ADDR_CODE_BANK2 = JLINK_EFM8_START_ADDR_CODE + 0x20000 417 | 418 | # [...] CODE_BANK3-xxx 419 | 420 | # 421 | # Virtual offsets of non-memory mapped DSR registers, into DSR zone 422 | # 423 | JLINK_EFM8_OFF_REG_DSR_VERSION = 0x00 424 | JLINK_EFM8_OFF_REG_DSR_DERIVATIVE = 0x01 425 | 426 | # // 427 | # // Flags for JLINKARM_BP_ 428 | # // 429 | JLINKARM_BP_MODE0 = (0 << 0) # // Meaning depends on CPU type 430 | JLINKARM_BP_MODE1 = (1 << 0) # // Meaning depends on CPU type 431 | JLINKARM_BP_MODE2 = (2 << 0) # // Meaning depends on CPU type 432 | JLINKARM_BP_MODE3 = (3 << 0) # // Meaning depends on CPU type 433 | JLINKARM_BP_MODE_MASK = (0x0000000F) 434 | 435 | JLINKARM_BP_IMP_SW_RAM = (1 << 4) 436 | JLINKARM_BP_IMP_SW_FLASH = (1 << 5) 437 | JLINKARM_BP_IMP_SW = (0x000000F0) 438 | JLINKARM_BP_IMP_HW = (0xFFFFFF00) 439 | JLINKARM_BP_IMP_ANY = (JLINKARM_BP_IMP_HW | JLINKARM_BP_IMP_SW) 440 | JLINKARM_BP_IMP_MASK = (JLINKARM_BP_IMP_ANY) 441 | 442 | JLINKARM_BP_HANDLE_ALL = (0xFFFFFFFF) 443 | JLINKARM_WP_HANDLE_ALL = (0xFFFFFFFF) 444 | 445 | JLINKARM_GO_FLAG_OVERSTEP_BP = (1 << 0) # // Overstep the current instruction if it is breakpointed 446 | 447 | JLINKARM_GO_MAX_EMUL_INSTS_DEFAULT = (-1) # // Use the same settings as JLINKARM_Go() 448 | 449 | # // 450 | # // Do NEVER change the numeric value of the register description, as certain parts of the DLL rely on this 451 | # // 452 | JLINK_EFM8_REG = { 453 | # // 454 | # // R0-R7 of each bank 455 | # // 456 | 'JLINK_EFM8_R0_B0' : 0, # // Index 0: R0, bank 0 457 | 'JLINK_EFM8_R1_B0' : 1, 458 | 'JLINK_EFM8_R2_B0' : 2, 459 | 'JLINK_EFM8_R3_B0' : 3, 460 | 'JLINK_EFM8_R4_B0' : 4, 461 | 'JLINK_EFM8_R5_B0' : 5, 462 | 'JLINK_EFM8_R6_B0' : 6, 463 | 'JLINK_EFM8_R7_B0' : 7, 464 | 'JLINK_EFM8_R0_B1' : 8, # // Index 8: R0, bank 1 465 | 'JLINK_EFM8_R1_B1' : 9, 466 | 'JLINK_EFM8_R2_B1' : 10, 467 | 'JLINK_EFM8_R3_B1' : 11, 468 | 'JLINK_EFM8_R4_B1' : 12, 469 | 'JLINK_EFM8_R5_B1' : 13, 470 | 'JLINK_EFM8_R6_B1' : 14, 471 | 'JLINK_EFM8_R7_B1' : 15, 472 | 'JLINK_EFM8_R0_B2' : 16, # // Index 16: R0, bank 2 473 | 'JLINK_EFM8_R1_B2' : 17, 474 | 'JLINK_EFM8_R2_B2' : 18, 475 | 'JLINK_EFM8_R3_B2' : 19, 476 | 'JLINK_EFM8_R4_B2' : 20, 477 | 'JLINK_EFM8_R5_B2' : 21, 478 | 'JLINK_EFM8_R6_B2' : 22, 479 | 'JLINK_EFM8_R7_B2' : 23, 480 | 'JLINK_EFM8_R0_B3' : 24, # // Index 24: R0, bank 3 481 | 'JLINK_EFM8_R1_B3' : 25, 482 | 'JLINK_EFM8_R2_B3' : 26, 483 | 'JLINK_EFM8_R3_B3' : 27, 484 | 'JLINK_EFM8_R4_B3' : 28, 485 | 'JLINK_EFM8_R5_B3' : 29, 486 | 'JLINK_EFM8_R6_B3' : 30, 487 | 'JLINK_EFM8_R7_B3' : 31, 488 | # // 489 | # // Special registers like PC, stackpointer etc. 490 | # // 491 | 'JLINK_EFM8_PC' : 32, # // Index 32: PC, 16-bit 492 | 'JLINK_EFM8_A' : 33, # // Accumulator 493 | 'JLINK_EFM8_B' : 34, 494 | 'JLINK_EFM8_DPTR' : 35, # // Data pointer register (16-bit) 495 | 'JLINK_EFM8_SP' : 36, 496 | 'JLINK_EFM8_PSW' : 37, 497 | # // 498 | # // Pseudo regs. Mapped to currenttly selected register bank 499 | # // Bank is selected via PSW 500 | # // 501 | 'JLINK_EFM8_R0' : 38, # // Index 38: Current R0 (pseudo reg) 502 | 'JLINK_EFM8_R1' : 39, 503 | 'JLINK_EFM8_R2' : 40, 504 | 'JLINK_EFM8_R3' : 41, 505 | 'JLINK_EFM8_R4' : 42, 506 | 'JLINK_EFM8_R5' : 43, 507 | 'JLINK_EFM8_R6' : 44, 508 | 'JLINK_EFM8_R7' : 45, 509 | # // 510 | # // End of list 511 | # // 512 | 'JLINK_EFM8_NUM_REGS' : 46, 513 | } 514 | 515 | # Prefixes to use when generating EFM32 part numbers 516 | EFM32_PART_PREFIX = { 16 : "EFR32MG1P", 517 | 17 : "EFR32MG1B", 518 | 18 : "EFR32MG1V", 519 | 19 : "EFR32BG1P", 520 | 20 : "EFR32BG1B", 521 | 21 : "EFR32BG1V", 522 | 25 : "EFR32FG1P", 523 | 26 : "EFR32FG1B", 524 | 27 : "EFR32FG1V", 525 | 28 : "EFR32MG12P", 526 | 29 : "EFR32MG12B", 527 | 30 : "EFR32MG12V", 528 | 31 : "EFR32BG12P", 529 | 32 : "EFR32BG12B", 530 | 37 : "EFR32FG12P", 531 | 38 : "EFR32FG12B", 532 | 39 : "EFR32FG12V", 533 | 40 : "EFR32MG13P", 534 | 41 : "EFR32MG13B", 535 | 42 : "EFR32MG13V", 536 | 43 : "EFR32BG13P", 537 | 44 : "EFR32BG13B", 538 | 45 : "EFR32BG13V", 539 | 49 : "EFR32FG13P", 540 | 50 : "EFR32FG13B", 541 | 51 : "EFR32FG13V", 542 | 52 : "EFR32MG14P", 543 | 53 : "EFR32MG14B", 544 | 54 : "EFR32MG14V", 545 | 55 : "EFR32BG14P", 546 | 56 : "EFR32BG14B", 547 | 57 : "EFR32BG14V", 548 | 61 : "EFR32FG14P", 549 | 62 : "EFR32FG14B", 550 | 63 : "EFR32FG14V", 551 | 71 : "EFM32G", 552 | 72 : "EFM32GG", 553 | 73 : "EFM32TG", 554 | 74 : "EFM32LG", 555 | 75 : "EFM32WG", 556 | 76 : "EFM32ZG", 557 | 77 : "EFM32HG", 558 | 81 : "EFM32PG1B", 559 | 83 : "EFM32JG1B", 560 | 85 : "EFM32PG12B", 561 | 87 : "EFM32JG12B", 562 | 89 : "EFM32PG13B", 563 | 91 : "EFM32JG13B", 564 | 100 : "EFM32GG11B", 565 | 103 : "EFM32TG11B", 566 | 120 : "EZR32LG", 567 | 121 : "EZR32WG", 568 | 122 : "EZR32HG", 569 | } 570 | 571 | JLINK_DLL_ERROR_CODES = { 572 | # (0xFFFFFF00) No connection to emulator / Connection to emulator lost 573 | -256 : "JLINK_ERR_EMU_NO_CONNECTION", 574 | # (0xFFFFFEFF) Emulator communication error 575 | # (host-interface module repORted error) 576 | -257 : "JLINK_ERR_EMU_COMM_ERROR", 577 | # (0xFFFFFEFE) DLL has not been opened but needs to be 578 | # (JLINKARM_Open() needs to be called first) 579 | -258 : "JLINK_ERR_DLL_NOT_OPEN", 580 | # (0xFFFFFEFD) Target system has no power (Measured VTref < 1V) 581 | -259 : "JLINK_ERR_VCC_FAILURE", 582 | # (0xFFFFFEFC) File handle / memory area handle needed for operation, 583 | # but given handle is not valid 584 | -260 : "JLINK_ERR_INVALID_HANDLE", 585 | # (0xFFFFFEFB) Could not find supported CPU 586 | -261 : "JLINK_ERR_NO_CPU_FOUND", 587 | # (0xFFFFFEFA) Emulator does not support the selected feature 588 | # (Usually returned by functions which need specific emulator capabilities) 589 | -262 : "JLINK_ERR_EMU_FEATURE_NOT_SUPPORTED", 590 | # (0xFFFFFEF9) Emulator does not have enough memory to perform 591 | # the requested operation 592 | -263 : "JLINK_ERR_EMU_NO_MEMORY", 593 | # (0xFFFFFEF8) Things such as "TCK is low but should be high" 594 | -264 : "JLINK_ERR_TIF_STATUS_ERROR", 595 | -265 : "JLINK_ERR_FLASH_PROG_COMPARE_FAILED", 596 | -266 : "JLINK_ERR_FLASH_PROG_PROGRAM_FAILED", 597 | -267 : "JLINK_ERR_FLASH_PROG_VERIFY_FAILED", 598 | -268 : "JLINK_ERR_OPEN_FILE_FAILED", 599 | -269 : "JLINK_ERR_UNKNOWN_FILE_FORMAT", 600 | -270 : "JLINK_ERR_WRITE_TARGET_MEMORY_FAILED", 601 | } 602 | 603 | JLINK_UNSECURE_DIALOG_CB_FUNC_TYPE = ct.WINFUNCTYPE(ct.c_int, # Return 604 | ct.c_char_p, # sTitle 605 | ct.c_char_p, # sMsg 606 | ct.c_uint32) # Flags 607 | 608 | 609 | class JLinkArmEmuConnectInfo_CStruct(ct.Structure): 610 | """ JLINKARM_EMU_CONNECT_INFO struct """ 611 | _pack_ = 1 612 | _fields_ = [("SerialNumber", ct.c_uint32), 613 | ("Connection", ct.c_uint), 614 | ("USBAddr", ct.c_uint32), 615 | ("aIPAddr", ct.c_uint8 * 16), 616 | ("Time", ct.c_int), 617 | ("Time_us", ct.c_uint64), 618 | ("HWVersion", ct.c_uint32), 619 | ("abMACAddr", ct.c_uint8 * 6), 620 | ("acProduct", ct.c_char * 32), 621 | ("acNickName", ct.c_char * 32), 622 | ("acFWString", ct.c_char * 112), 623 | ("IsDHCPAssignedIP", ct.c_char), 624 | ("IsDHCPAssignedIPIsValid", ct.c_char), 625 | ("NumIPConnections", ct.c_char), 626 | ("NumIPConnectionsIsValid", ct.c_char), 627 | ("aPadding", ct.c_uint8 * 34)] 628 | 629 | 630 | class JLinkJtagIdData_CStruct(ct.Structure): 631 | """ JLINKARM_EMU_CONNECT_INFO struct """ 632 | _pack_ = 1 633 | _fields_ = [("NumDevices", ct.c_int), 634 | ("ScanLen", ct.c_uint16), 635 | ("aId", ct.c_uint32 * 3), 636 | ("aScanLen", ct.c_uint8 * 3), 637 | ("aIrRead", ct.c_uint8 * 3), 638 | ("aScanRead", ct.c_uint8 * 3)] 639 | 640 | 641 | class JlinkArm_Speed_Info_CStruct(ct.Structure): 642 | """ JLINKARM_SPEED_INFO struct """ 643 | _pack_ = 1 644 | _fields_ = [("SizeOfStruct", ct.c_uint32), 645 | ("BaseFreq", ct.c_uint32), 646 | ("MinDiv", ct.c_uint16), 647 | ("SupportAdaptive", ct.c_uint16)] 648 | -------------------------------------------------------------------------------- /jlinkarm.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkDing/pyprogrammer/a2b1b063cfc87139f3a7f0351d1964f6ee1bff0a/jlinkarm.dll -------------------------------------------------------------------------------- /mainwindow.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2017 Silicon Laboratories, Inc. 2 | # http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt 3 | # 4 | # This file is part of Programmer Tool. 5 | # 6 | # PyProgrammer Tool is a free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Lesser General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # PyProgrammer Tool is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Lesser General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Lesser General Public License 17 | # along with Programmer Tool. If not, see . 18 | 19 | 20 | from PySide import QtCore, QtGui 21 | 22 | class MainWindow(QtGui.QMainWindow): 23 | def __init__(self): 24 | super(MainWindow, self).__init__() 25 | 26 | self.setObjectName("MainWindow") 27 | 28 | # Setup Window display icon 29 | icon = QtGui.QIcon() 30 | icon.addPixmap(QtGui.QPixmap("img/pyprogrammer.png"),QtGui.QIcon.Normal) 31 | self.setWindowIcon(icon) 32 | 33 | self.centralWidget = QtGui.QWidget(self) 34 | self.centralWidget.setObjectName("centralWidget") 35 | self.setCentralWidget(self.centralWidget) 36 | 37 | self.createMenu() 38 | self.createStatusBar() 39 | 40 | mainLayout = QtGui.QVBoxLayout(self.centralWidget) 41 | mainLayout.addWidget(self.createConnectGroup()) 42 | mainLayout.addWidget(self.createFlashMCUGroup()) 43 | self.setLayout(mainLayout) 44 | 45 | self.setWindowTitle("PyProgrammer") 46 | self.setFixedSize(640, 260) 47 | 48 | def createMenu(self): 49 | self.aboutAct = QtGui.QAction("&About", self, 50 | statusTip="Show the PyProgrammer's About box", 51 | triggered=self.about) 52 | self.helpMenu = self.menuBar().addMenu("&Help") 53 | self.helpMenu.addAction(self.aboutAct) 54 | 55 | def createStatusBar(self): 56 | self.statusBar().showMessage("Ready") 57 | 58 | def createConnectGroup(self): 59 | groupBox = QtGui.QGroupBox("Connection",self.centralWidget) 60 | 61 | self.adapterLabel = QtGui.QLabel("Adpater") 62 | self.connectButton = QtGui.QPushButton("Connect") 63 | self.jlinkDeviceLabel = QtGui.QLabel("J-Link Device S/N") 64 | self.jlinkDeviceCombo = QtGui.QComboBox() 65 | self.debugIFLabel = QtGui.QLabel("Debug Interface") 66 | self.debugIFCombo = QtGui.QComboBox() 67 | self.deviceLabel = QtGui.QLabel("Device:") 68 | 69 | # Config each widget 70 | self.debugIFCombo.addItems("SWD C2".split()) 71 | 72 | layout = QtGui.QHBoxLayout() 73 | layout.addWidget(self.adapterLabel) 74 | layout.addWidget(self.connectButton) 75 | layout.addWidget(self.jlinkDeviceLabel) 76 | layout.addWidget(self.jlinkDeviceCombo) 77 | layout.addWidget(self.debugIFLabel) 78 | layout.addWidget(self.debugIFCombo) 79 | layout.addWidget(self.deviceLabel) 80 | 81 | # Set stretch factor for each widget 82 | layout.setStretchFactor(self.jlinkDeviceCombo, 1.5) 83 | layout.setStretchFactor(self.deviceLabel, 2) 84 | 85 | groupBox.setLayout(layout) 86 | return groupBox 87 | 88 | def createBrowseGroup(self): 89 | groupBox = QtGui.QGroupBox(self.centralWidget) 90 | 91 | self.downloadFileLabel = QtGui.QLabel("Download File") 92 | self.pathLineEdit = QtGui.QLineEdit() 93 | self.browseButton = QtGui.QPushButton("Browse") 94 | 95 | layout = QtGui.QHBoxLayout() 96 | layout.addWidget(self.downloadFileLabel) 97 | layout.addWidget(self.pathLineEdit) 98 | layout.addWidget(self.browseButton) 99 | 100 | groupBox.setLayout(layout) 101 | return groupBox 102 | 103 | def createFlashGroup(self): 104 | groupBox = QtGui.QGroupBox(self.centralWidget) 105 | 106 | self.startAddrLabel = QtGui.QLabel("Flash Start Address(hex):") 107 | self.startAddrLineEdit = QtGui.QLineEdit() 108 | self.resetMCUCheckBox = QtGui.QCheckBox("Reset MCU After Flashing") 109 | self.eraseButton = QtGui.QPushButton("Erase") 110 | self.flashButton = QtGui.QPushButton("Flash") 111 | 112 | # Config each widget 113 | self.startAddrLineEdit.setInputMask(">HHHHHHHH; ") 114 | self.startAddrLineEdit.setText("00000000") 115 | self.startAddrLineEdit.setAlignment(QtCore.Qt.AlignRight) 116 | self.startAddrLineEdit.setReadOnly(True) 117 | self.resetMCUCheckBox.setChecked(True) 118 | 119 | layout = QtGui.QHBoxLayout() 120 | layout.addWidget(self.startAddrLabel) 121 | layout.addWidget(self.startAddrLineEdit) 122 | layout.addStretch() 123 | layout.addWidget(self.resetMCUCheckBox) 124 | layout.addStretch() 125 | layout.addWidget(self.eraseButton) 126 | layout.addWidget(self.flashButton) 127 | 128 | groupBox.setLayout(layout) 129 | return groupBox 130 | 131 | def createFlashMCUGroup(self): 132 | groupBox = QtGui.QGroupBox("Flash MCU",self.centralWidget) 133 | 134 | layout = QtGui.QVBoxLayout() 135 | layout.addWidget(self.createBrowseGroup()) 136 | layout.addWidget(self.createFlashGroup()) 137 | 138 | groupBox.setLayout(layout) 139 | return groupBox 140 | 141 | def about(self): 142 | QtGui.QMessageBox.about(self, "About PyProgrammer", 143 | "Copyright Silicon Laboratories, Inc 2018. All rights reserved.\n\n\r" 144 | "PyProgrammer v1.0 is based on Qt Pyside and SEGGER JlinkARM.\n\n\r" 145 | "The PyProgrammer example demonstrates how to write a " 146 | "modern GUI flash programmer applications using Qt Pyside.\n\n\r" 147 | "This program uses third party libraries covered by the LGPL.\n\r" 148 | "See the file LGPL.txt for details.") 149 | 150 | # Main Function 151 | # if __name__ == '__main__': 152 | # import sys 153 | 154 | # app = QtGui.QApplication(sys.argv) 155 | # mainWin = MainWindow() 156 | # mainWin.show() 157 | # sys.exit(app.exec_()) 158 | 159 | -------------------------------------------------------------------------------- /programmer.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2017 Silicon Laboratories, Inc. 2 | # http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt 3 | # 4 | # This file is part of Programmer Tool. 5 | # 6 | # Programmer Tool is a free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Lesser General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # Programmer Tool is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Lesser General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Lesser General Public License 17 | # along with Programmer Tool. If not, see . 18 | 19 | import sys 20 | import os 21 | 22 | from PySide import QtGui, QtCore 23 | from mainwindow import MainWindow 24 | 25 | import jlink 26 | 27 | 28 | class Programmer(MainWindow): 29 | 30 | def __init__(self): 31 | MainWindow.__init__(self) 32 | 33 | self._jlink = jlink.JLinkDll() 34 | self._is_connected = False 35 | self._adapter_serial_number = "0" 36 | self._initialize() 37 | self.init_timer() 38 | 39 | 40 | def _initialize(self): 41 | self._adapter_list = self._jlink._adapter_list 42 | 43 | self.browseButton.pressed.connect(self.browse_file) 44 | self.connectButton.pressed.connect(self.connect_mcu) 45 | self.flashButton.pressed.connect(self.flash_mcu) 46 | self.eraseButton.pressed.connect(self.erase_mcu) 47 | self.statusBar().showMessage("Ready") 48 | return None 49 | 50 | def browse_file(self): 51 | file_name, file_filter = QtGui.QFileDialog.getOpenFileName( 52 | self, 'Open Download file', "", 53 | 'Intel Hex Files(*.hex);;Binary Files(*.bin);;All Files (*)', 54 | None, 55 | QtGui.QFileDialog.DontUseNativeDialog) 56 | if file_name: 57 | self.pathLineEdit.setText(file_name) 58 | # Set start address editable with bin file only. 59 | split_name = file_name.split(".") 60 | if split_name[-1].lower() == "hex": 61 | self.startAddrLineEdit.setText("00000000") 62 | self.startAddrLineEdit.setReadOnly(True) 63 | if split_name[-1].lower() == "bin": 64 | self.startAddrLineEdit.setReadOnly(False) 65 | return 66 | 67 | def init_connect_group(self): 68 | self.connectButton.setText("Connect") 69 | self.deviceLabel.setText("Device: ") 70 | self._is_connected = False 71 | self._adapter_serial_number = "0" 72 | 73 | def connect_mcu(self): 74 | if self._is_connected: 75 | self.init_connect_group() 76 | self._jlink.close() 77 | msg = "Disconnected" 78 | else: 79 | if self.jlinkDeviceCombo.count() == 0: 80 | return 81 | serial_number = self.jlinkDeviceCombo.currentText() 82 | ifc = self.debugIFCombo.currentText() 83 | result = self._jlink.connect(long(serial_number), ifc) 84 | if not result: 85 | msg = "Connect failed." 86 | else: 87 | msg = "Connected" 88 | self.connectButton.setText("Disconnect") 89 | self.deviceLabel.setText(self._jlink._part_number) 90 | self._is_connected = True 91 | self._adapter_serial_number = serial_number 92 | self.statusBar().showMessage(msg) 93 | return 94 | 95 | def flash_mcu(self): 96 | if self._is_connected: 97 | file_name = self.pathLineEdit.text() 98 | if os.path.isfile(file_name): 99 | offset = int("0x" + self.startAddrLineEdit.text(), 16) 100 | result = self._jlink.erase_chip() 101 | if not result: 102 | self.init_connect_group() 103 | self._jlink.close() 104 | msg = "Erase failed." 105 | self.statusBar().showMessage(msg) 106 | return 107 | self._jlink.download(file_name, offset) 108 | if self.resetMCUCheckBox.checkState(): 109 | self._jlink.reset(False) 110 | msg = "Program done." 111 | else: 112 | msg = "Please select a file to download." 113 | else: 114 | msg = "Please connect to device." 115 | self.statusBar().showMessage(msg) 116 | return 117 | 118 | def erase_mcu(self): 119 | if self._is_connected: 120 | result = self._jlink.erase_chip() 121 | if not result: 122 | self.init_connect_group() 123 | self._jlink.close() 124 | msg = "Erase failed." 125 | else: 126 | msg = "Erase done." 127 | else: 128 | msg = "Please connect to device." 129 | self.statusBar().showMessage(msg) 130 | return 131 | 132 | def scan_adapter(self): 133 | num_adapters, adapter_list = self._jlink.get_usb_adapter_list() 134 | combo_list = self.jlinkDeviceCombo.count() 135 | 136 | if (combo_list == 0) and (num_adapters == 0): 137 | return 138 | 139 | selected_adapter_sn = "0" 140 | if combo_list != 0: 141 | if self._is_connected: 142 | selected_adapter_sn = self._adapter_serial_number 143 | else: 144 | selected_adapter_sn = self.jlinkDeviceCombo.currentText() 145 | self.jlinkDeviceCombo.clear() 146 | 147 | index = -1 148 | for i in range(num_adapters): 149 | adapter = adapter_list[i] 150 | if unicode(adapter.SerialNumber) == selected_adapter_sn: 151 | index = i 152 | self.jlinkDeviceCombo.addItem(unicode(adapter.SerialNumber)) 153 | 154 | # Original device is removed 155 | if index == -1: 156 | if self._is_connected: 157 | self.connect_mcu() 158 | if num_adapters != 0: 159 | index = 0 160 | self.jlinkDeviceCombo.setCurrentIndex(index) 161 | return 162 | 163 | def init_timer(self): 164 | self.timer = QtCore.QTimer(self) 165 | self.timer.timeout.connect(self.scan_adapter) 166 | self.timer.start(1000) 167 | 168 | 169 | # Main Function 170 | if __name__ == '__main__': 171 | app = QtGui.QApplication(sys.argv) 172 | mainWin = Programmer() 173 | mainWin.show() 174 | os._exit(app.exec_()) --------------------------------------------------------------------------------