├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── screenshots
├── 1.png
└── 2.png
└── src
├── Canaan.Kendryte.Flash.Cli
├── Canaan.Kendryte.Flash.Cli.csproj
├── Canaan.Kendryte.Flash.Cli.csproj.user
├── Controls
│ ├── ConsoleProgressBar.cs
│ └── ProgressAnimations.cs
├── Program.cs
├── Properties
│ ├── PublishProfiles
│ │ ├── FolderProfile.pubxml
│ │ ├── FolderProfile.pubxml.user
│ │ └── FolderProfile1.pubxml
│ └── launchSettings.json
└── Services
│ ├── FlashService.cs
│ └── ProgressIndicator.cs
├── Canaan.Kendryte.Flash.Shell
├── App.config
├── App.xaml
├── App.xaml.cs
├── AppBootstrapper.cs
├── Assets
│ ├── Styles.xaml
│ ├── k-flash.png
│ └── plink.exe.gz
├── Canaan.Kendryte.Flash.Shell.csproj
├── Canaan.Kendryte.Flash.Shell.csproj.user
├── FodyWeavers.xml
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── Resources
│ └── LICENSE.txt
├── Services
│ ├── SerialPortEnumerator.cs
│ └── TerminalService.cs
├── ViewModels
│ ├── FlashViewModel.cs
│ ├── IShell.cs
│ └── ShellViewModel.cs
├── Views
│ ├── FlashView.xaml
│ ├── FlashView.xaml.cs
│ └── ShellView.xaml
├── k-flash.ico
└── packages.config
├── Canaan.Kendryte.Flash.sln
├── Canaan.Kendryte.Flash
├── Canaan.Kendryte.Flash.csproj
├── FlashModeResponse.cs
├── FlashPackage.cs
├── ISPResponse.cs
├── KendryteLoader.cs
└── Resources
│ └── isp_flash.bin
└── NuGet.config
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | autom4te.cache
2 | build
3 | build_i
4 | config.log
5 | config.status
6 | Makefile
7 | .DS_Store
8 | !/regression/Makefile
9 | .vs
10 | .vscode
11 | CMakeSettings.json
12 | *.dtb
13 | bin
14 | obj
15 | packages/
16 | *.user
17 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright 2018 Canaan Inc.
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Kendryte Flash
2 | ===
3 |
4 | ## Introduction
5 |
6 | Kendryte flash utility.
7 |
8 | ## Requirements
9 |
10 | ### GUI
11 | Microsoft [.NET Framework 4.7.1](https://www.microsoft.com/net/download/thank-you/net471) or higher.
12 |
13 | 
14 |
15 | ### CLI
16 |
17 | 
--------------------------------------------------------------------------------
/screenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kendryte/kendryte-flash-windows/4d5d11b236646b9eea4805c33241873c17463039/screenshots/1.png
--------------------------------------------------------------------------------
/screenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kendryte/kendryte-flash-windows/4d5d11b236646b9eea4805c33241873c17463039/screenshots/2.png
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Canaan.Kendryte.Flash.Cli.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp3.0
6 | win-x86;linux-x64
7 | K-Flash
8 | 0.3.3.0
9 | K-Flash
10 | Kendryte flash utility
11 | Copyright 2018 Canaan Inc.
12 | latest
13 | k-flash
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Canaan.Kendryte.Flash.Cli.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | <_LastSelectedProfileId>D:\Work\Repository\kendryte-flash-windows\src\Canaan.Kendryte.Flash.Cli\Properties\PublishProfiles\FolderProfile1.pubxml
5 |
6 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Controls/ConsoleProgressBar.cs:
--------------------------------------------------------------------------------
1 | namespace AaronLuna.ConsoleProgressBar
2 | {
3 | using System;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading;
7 |
8 | public class ConsoleProgressBar : IDisposable, IProgress
9 | {
10 | private readonly TimeSpan _animationInterval = TimeSpan.FromSeconds(1.0 / 8);
11 |
12 | private string _currentText = string.Empty;
13 | internal int AnimationIndex;
14 | internal double CurrentProgress;
15 | internal bool Disposed;
16 |
17 | internal Timer Timer;
18 |
19 | public ConsoleProgressBar()
20 | {
21 | Console.OutputEncoding = Encoding.UTF8;
22 |
23 | NumberOfBlocks = 10;
24 | StartBracket = "[";
25 | EndBracket = "]";
26 | CompletedBlock = "#";
27 | IncompleteBlock = "-";
28 | AnimationSequence = ProgressAnimations.Default;
29 |
30 | DisplayBar = true;
31 | DisplayPercentComplete = true;
32 | DisplayAnimation = true;
33 |
34 | Timer = new Timer(TimerHandler);
35 |
36 | // A progress bar is only for temporary display in a console window.
37 | // If the console output is redirected to a file, draw nothing.
38 | // Otherwise, we'll end up with a lot of garbage in the target file.
39 | if (!Console.IsOutputRedirected) ResetTimer();
40 | }
41 |
42 | public int NumberOfBlocks { get; set; }
43 | public string StartBracket { get; set; }
44 | public string EndBracket { get; set; }
45 | public string CompletedBlock { get; set; }
46 | public string IncompleteBlock { get; set; }
47 | public string AnimationSequence { get; set; }
48 | public bool DisplayBar { get; set; }
49 | public bool DisplayPercentComplete { get; set; }
50 | public bool DisplayAnimation { get; set; }
51 |
52 | public void Dispose()
53 | {
54 | Dispose(true);
55 | GC.SuppressFinalize(this);
56 | }
57 |
58 | public void Report(double value)
59 | {
60 | // Make sure value is in [0..1] range
61 | value = Math.Max(0, Math.Min(1, value));
62 | Interlocked.Exchange(ref CurrentProgress, value);
63 | }
64 |
65 | private void TimerHandler(object state)
66 | {
67 | lock (Timer)
68 | {
69 | if (Disposed) return;
70 | UpdateText(GetProgressBarText(CurrentProgress));
71 | ResetTimer();
72 | }
73 | }
74 |
75 | private string GetProgressBarText(double currentProgress)
76 | {
77 | const string singleSpace = " ";
78 |
79 | var numBlocksCompleted = (int)(currentProgress * NumberOfBlocks);
80 |
81 | var completedBlocks =
82 | Enumerable.Range(0, numBlocksCompleted).Aggregate(
83 | string.Empty,
84 | (current, _) => current + CompletedBlock);
85 |
86 | var incompleteBlocks =
87 | Enumerable.Range(0, NumberOfBlocks - numBlocksCompleted).Aggregate(
88 | string.Empty,
89 | (current, _) => current + IncompleteBlock);
90 |
91 | var progressBar = $"{StartBracket}{completedBlocks}{incompleteBlocks}{EndBracket}";
92 | var percent = $"{currentProgress:P0}".PadLeft(4, '\u00a0');
93 | var animationFrame = AnimationSequence[AnimationIndex++ % AnimationSequence.Length];
94 | var animation = $"{animationFrame}";
95 |
96 | progressBar = DisplayBar
97 | ? progressBar + singleSpace
98 | : string.Empty;
99 |
100 | percent = DisplayPercentComplete
101 | ? percent + singleSpace
102 | : string.Empty;
103 |
104 | if (!DisplayAnimation || currentProgress is 1)
105 | {
106 | animation = string.Empty;
107 | }
108 |
109 | return (progressBar + percent + animation).TrimEnd();
110 | }
111 |
112 | internal void UpdateText(string text)
113 | {
114 | // Get length of common portion
115 | var commonPrefixLength = 0;
116 | var commonLength = Math.Min(_currentText.Length, text.Length);
117 | while (commonPrefixLength < commonLength && text[commonPrefixLength] == _currentText[commonPrefixLength])
118 | commonPrefixLength++;
119 |
120 | // Backtrack to the first differing character
121 | var outputBuilder = new StringBuilder();
122 | outputBuilder.Append('\b', _currentText.Length - commonPrefixLength);
123 |
124 | // Output new suffix
125 | outputBuilder.Append(text.Substring(commonPrefixLength));
126 |
127 | // If the new text is shorter than the old one: delete overlapping characters
128 | var overlapCount = _currentText.Length - text.Length;
129 | if (overlapCount > 0)
130 | {
131 | outputBuilder.Append(' ', overlapCount);
132 | outputBuilder.Append('\b', overlapCount);
133 | }
134 |
135 | //Console.Write($"{Caption}{outputBuilder}");
136 | Console.Write(outputBuilder);
137 | _currentText = text;
138 | }
139 |
140 | internal void ResetTimer()
141 | {
142 | Timer.Change(_animationInterval, TimeSpan.FromMilliseconds(-1));
143 | }
144 |
145 | protected virtual void Dispose(bool disposing)
146 | {
147 | if (!disposing) return;
148 |
149 | lock (Timer)
150 | {
151 | Disposed = true;
152 | }
153 | }
154 | }
155 | }
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Controls/ProgressAnimations.cs:
--------------------------------------------------------------------------------
1 | namespace AaronLuna.ConsoleProgressBar
2 | {
3 | using System;
4 | using System.Linq;
5 |
6 | using Microsoft.VisualBasic;
7 |
8 | public static class ProgressAnimations
9 | {
10 | // These characters render correctly on Windows and Mac
11 | public const string Default = @"|/-\-";
12 | public const string BouncingBall = ".oO\u00b0Oo.";
13 | public const string Explosion = ".oO@*";
14 | public const string RotatingTriangle = "\u25b2\u25ba\u25bc\u25c4";
15 | public const string RotatingArrow = "\u2190\u2191\u2192\u2193";
16 | public const string PulsingLine = "\u2212\u003d\u2261\u039e\u2261\u003d\u2212";
17 | public const string Circles = "\u25cb\u263c\u00a4\u2219";
18 |
19 | // These characters render correctly only on Mac
20 | public const string RotatingDot = "\u25dc\u25dd\u25de\u25df";
21 | public const string GrowingBarVertical = "\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2587\u2586\u2585\u2584\u2583\u2581";
22 | public const string RotatingPipe = "\u2524\u2518\u2534\u2514\u251c\u250c\u252c\u2510";
23 | public const string RotatingCircle = "\u25d0\u25d3\u25d1\u25d2";
24 | public const string GrowingBarHorizontal = "\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u258e\u258d\u258c\u258b\u258a\u2589";
25 |
26 | public static string RandomBrailleSequence()
27 | {
28 | var rand = new Random();
29 | var sequence = string.Empty;
30 | foreach (int i in Enumerable.Range(0, 40))
31 | {
32 | var charIndex = rand.Next(10241, 10496);
33 | var randChar = Strings.ChrW(charIndex);
34 | sequence += randChar;
35 | }
36 |
37 | return sequence;
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Threading.Tasks;
4 | using Canaan.Kendryte.Flash.Cli.Services;
5 | using CommandLine;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.Extensions.Logging;
8 |
9 | namespace Canaan.Kendryte.Flash.Cli
10 | {
11 | public class Options
12 | {
13 | [Option('d', "device", Required = true, HelpText = "Set the serial device to communicate with Kendryte.")]
14 | public string Device { get; set; }
15 |
16 | [Option('b', "baudrate", Required = false, HelpText = "Set the serial device to communicate with Kendryte.", Default = 2000000)]
17 | public int BaudRate { get; set; }
18 |
19 | [Value(0, MetaName = "firmware", HelpText = "Firmware path")]
20 | public string Firmware { get; set; }
21 | }
22 |
23 | class Program
24 | {
25 | static async Task Main(string[] args)
26 | {
27 | FlashService flashService = null;
28 |
29 | Parser.Default.ParseArguments(args)
30 | .WithParsed(options =>
31 | {
32 | var serviceProvider = new ServiceCollection()
33 | .AddSingleton()
34 | .AddSingleton()
35 | .AddSingleton(options)
36 | .AddLogging(c =>
37 | {
38 | c.AddConsole();
39 | })
40 | .BuildServiceProvider();
41 |
42 | AppDomain.CurrentDomain.UnhandledException += (s, e) =>
43 | {
44 | if (e.ExceptionObject is Exception ex)
45 | Console.WriteLine("Fatal: " + ex.Message);
46 | else
47 | Console.WriteLine("Fatal: Unexpected error occurred.");
48 | Environment.Exit(-1);
49 | };
50 |
51 | flashService = serviceProvider.GetRequiredService();
52 | });
53 |
54 | if (flashService != null)
55 | {
56 | await flashService.StartAsync(default(CancellationToken));
57 | }
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Properties/PublishProfiles/FolderProfile.pubxml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | FileSystem
8 | Release
9 | Any CPU
10 | netcoreapp3.0
11 | bin\Release\netcoreapp3.0\win-x64\publish\
12 | win-x64
13 | true
14 | <_IsPortable>false
15 |
16 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Properties/PublishProfiles/FolderProfile.pubxml.user:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Properties/PublishProfiles/FolderProfile1.pubxml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | FileSystem
8 | Release
9 | Any CPU
10 | netcoreapp3.0
11 | bin\Release\netcoreapp3.0\linux-x64\publish\
12 | linux-x64
13 | true
14 | <_IsPortable>false
15 |
16 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "Canaan.Kendryte.Flash.Cli": {
4 | "commandName": "Project",
5 | "commandLineArgs": "-d COM5 D:\\Work\\Repository\\kendryte-freertos-sdk\\build\\hello_world.bin"
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Services/FlashService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Text;
5 | using System.Threading;
6 | using System.Threading.Tasks;
7 | using Microsoft.Extensions.Logging;
8 |
9 | namespace Canaan.Kendryte.Flash.Cli.Services
10 | {
11 | internal class FlashService
12 | {
13 | private readonly Options _options;
14 | private readonly uint _chip = 1;
15 | private readonly ProgressIndicator _progressIndicator;
16 |
17 | public FlashService(Options options, ProgressIndicator progressIndicator)
18 | {
19 | _options = options;
20 | _progressIndicator = progressIndicator;
21 | }
22 |
23 | public Task StartAsync(CancellationToken cancellationToken)
24 | {
25 | return StartFlash();
26 | }
27 |
28 | public Task StopAsync(CancellationToken cancellationToken)
29 | {
30 | return Task.CompletedTask;
31 | }
32 |
33 | public async Task StartFlash()
34 | {
35 | if (string.IsNullOrEmpty(_options.Firmware))
36 | throw new InvalidOperationException("Must specify firmware path.");
37 | var firmwareType = GetFirmwareType(_options.Firmware);
38 | if (firmwareType == FirmwareType.Unknown)
39 | throw new InvalidOperationException("Unknown firmware type.");
40 | if (string.IsNullOrEmpty(_options.Device))
41 | throw new InvalidOperationException("Must select device.");
42 | if (_options.BaudRate < 110)
43 | throw new InvalidOperationException("Invalid baud rate.");
44 |
45 | using (var loader = new KendryteLoader(_options.Device, _options.BaudRate))
46 | {
47 | loader.CurrentJobChanged += (s, e) =>
48 | {
49 | _progressIndicator.SetJobItem(loader.CurrentJob, loader.JobItemsStatus[loader.CurrentJob]);
50 | };
51 |
52 | Console.WriteLine("Flashing...");
53 | await loader.DetectBoard();
54 | await loader.InstallFlashBootloader();
55 | await loader.BootBootloader();
56 | await loader.FlashGreeting();
57 | await loader.ChangeBaudRate();
58 | await loader.InitializeFlash(_chip);
59 |
60 | if (firmwareType == FirmwareType.Single)
61 | {
62 | using (var file = File.OpenRead(_options.Firmware))
63 | using (var br = new BinaryReader(file))
64 | {
65 | await loader.FlashFirmware(0, br.ReadBytes((int)file.Length), true, false);
66 | }
67 | }
68 | else if (firmwareType == FirmwareType.FlashList)
69 | {
70 | using (var pkg = new FlashPackage(File.OpenRead(_options.Firmware)))
71 | {
72 | await pkg.LoadAsync();
73 |
74 | foreach (var item in pkg.Files)
75 | {
76 | using (var br = new BinaryReader(item.Bin))
77 | {
78 | await loader.FlashFirmware(item.Address, br.ReadBytes((int)item.Length), item.SHA256Prefix, item.Reverse4Bytes);
79 | }
80 | }
81 | }
82 | }
83 |
84 | await loader.Reboot();
85 | }
86 |
87 | Console.WriteLine(Environment.NewLine + "Flash completed!");
88 | }
89 |
90 | private FirmwareType GetFirmwareType(string firmware)
91 | {
92 | var ext = Path.GetExtension(firmware).ToLowerInvariant();
93 |
94 | switch (ext)
95 | {
96 | case ".bin":
97 | return FirmwareType.Single;
98 | case ".kfpkg":
99 | return FirmwareType.FlashList;
100 | default:
101 | return FirmwareType.Unknown;
102 | }
103 | }
104 |
105 | private enum FirmwareType
106 | {
107 | Single,
108 | FlashList,
109 | Unknown
110 | }
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Cli/Services/ProgressIndicator.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Text;
5 | using AaronLuna.ConsoleProgressBar;
6 |
7 | namespace Canaan.Kendryte.Flash.Cli.Services
8 | {
9 | internal class ProgressIndicator
10 | {
11 | private readonly ConsoleProgressBar _progressBar;
12 | private JobItemStatus _jobItem;
13 |
14 | public ProgressIndicator()
15 | {
16 | _progressBar = new ConsoleProgressBar();
17 | }
18 |
19 | public void SetJobItem(JobItemType itemType, JobItemStatus jobItem)
20 | {
21 | if(_jobItem != null)
22 | _jobItem.PropertyChanged -= JobItem_PropertyChanged;
23 |
24 | _jobItem = jobItem;
25 | jobItem.PropertyChanged += JobItem_PropertyChanged;
26 | _progressBar.UpdateText(itemType.ToString());
27 | }
28 |
29 | private void JobItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
30 | {
31 | switch (e.PropertyName)
32 | {
33 | case nameof(JobItemStatus.Progress):
34 | _progressBar.Report(_jobItem.Progress);
35 | break;
36 | default:
37 | break;
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Shell/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Shell/App.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Shell/App.xaml.cs:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Canaan Inc.
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 | //
15 | using System;
16 | using System.Collections.Generic;
17 | using System.Configuration;
18 | using System.Data;
19 | using System.Linq;
20 | using System.Threading.Tasks;
21 | using System.Windows;
22 |
23 | namespace Canaan.Kendryte.Flash.Shell
24 | {
25 | ///
26 | /// App.xaml 的交互逻辑
27 | ///
28 | public partial class App : Application
29 | {
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/Canaan.Kendryte.Flash.Shell/AppBootstrapper.cs:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Canaan Inc.
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 | //
15 | using System;
16 | using System.Collections.Generic;
17 | using System.Reflection;
18 | using System.Windows;
19 | using System.Windows.Threading;
20 | using Caliburn.Micro;
21 |
22 | namespace Canaan.Kendryte.Flash.Shell
23 | {
24 | public class AppBootstrapper : BootstrapperBase
25 | {
26 | private SimpleContainer _container;
27 | private bool _started = false;
28 |
29 | public AppBootstrapper()
30 | {
31 | var t = typeof(int).TypeHandle.Value;
32 |
33 | Initialize();
34 | }
35 |
36 | protected override void Configure()
37 | {
38 | _container = new SimpleContainer();
39 |
40 | _container.Singleton();
41 | _container.Singleton();
42 | _container.PerRequest();
43 | }
44 |
45 | protected override object GetInstance(Type service, string key)
46 | {
47 | return _container.GetInstance(service, key);
48 | }
49 |
50 | protected override IEnumerable