uuu
uuu (Universal Update Utility), mfgtools 3.0
Loading...
Searching...
No Matches
fastboot.h
Go to the documentation of this file.
1/*
2* Copyright 2018, 2022 NXP.
3*
4* Redistribution and use in source and binary forms, with or without modification,
5* are permitted provided that the following conditions are met:
6*
7* Redistributions of source code must retain the above copyright notice, this
8* list of conditions and the following disclaimer.
9*
10* Redistributions in binary form must reproduce the above copyright notice, this
11* list of conditions and the following disclaimer in the documentation and/or
12* other materials provided with the distribution.
13*
14* Neither the name of the NXP Semiconductor nor the names of its
15* contributors may be used to endorse or promote products derived from this
16* software without specific prior written permission.
17*
18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28* POSSIBILITY OF SUCH DAMAGE.
29*
30*/
31
32#pragma once
33
34#include "cmd.h"
35#include "bmap.h"
36
37#include <cstdint>
38
39class FBFlashCmd;
40class FileBuffer;
41class DataBuffer;
42class TransBase;
43
44/*
45Android fastboot protocol define at
46https://android.googlesource.com/platform/system/core/+/master/fastboot/
47*/
48
50{
51public:
53
54 int Transport(std::string cmd, void *p = nullptr, size_t size = 0, std::vector<uint8_t> *input = nullptr);
55 int Transport(std::string cmd, std::vector<uint8_t> data, std::vector<uint8_t> *input = nullptr) { return Transport(cmd, data.data(), data.size(), input); }
56
57 std::string m_info;
58
59private:
60 TransBase *const m_pTrans = nullptr;
61};
62
63class FBGetVar : public CmdBase
64{
65public:
66 FBGetVar(char *p) :CmdBase(p) {}
67
68 int parser(char *p = nullptr) override;
69 int run(CmdCtx *ctx) override;
70
71private:
72 std::string m_val;
73 std::string m_var;
74
75 friend FBFlashCmd;
76};
77
78class FBCmd: public CmdBase
79{
80public:
81 FBCmd(char *p, std::string &&fb_cmd, char separator =':') :
82 CmdBase(p), m_fb_cmd{std::move(fb_cmd)}, m_separator(separator) {}
83
84 int parser(char *p = nullptr) override;
85 int run(CmdCtx *ctx) override;
86
87protected:
88 std::string m_uboot_cmd;
89
90private:
91 const std::string m_fb_cmd;
92 const char m_separator = ':';
93};
94
95class FBLoop : public CmdBase
96{
97public:
98 std::string m_uboot_cmd = "mmc read $loadaddr";
99 size_t m_blksize = 512;
100 size_t m_each = 0x4000000; //byte address
101 size_t m_seek = 0; //byte address
102 size_t m_skip = 0; //byte address
103 bool m_nostop = false;
104
105 std::string m_filename;
106
107 FBLoop(char* p);
108
109 virtual int each(FastBoot& fb, std::shared_ptr<DataBuffer> fbuff, size_t off) = 0;
110 int run(CmdCtx* ctx) override;
111 std::string build_cmd(std::string& cmd, size_t off, size_t sz);
112};
113
114class FBCRC : public FBLoop
115{
116public:
117 int each(FastBoot& fb, std::shared_ptr<DataBuffer> fbuff, size_t off) override;
118 FBCRC(char* p) : FBLoop(p) {
119 m_uboot_cmd = "mmc read $loadaddr @off @size";
120 insert_param_info("CRC", nullptr, Param::Type::e_null);
121 };
122};
123
124class FBWrite : public FBLoop
125{
126public:
127 int each(FastBoot& fb, std::shared_ptr<DataBuffer> fbuff, size_t off) override;
128 FBWrite(char* p) : FBLoop(p) {
129 m_uboot_cmd = "mmc write ${fastboot_buffer} @off @size";
130 insert_param_info("WRITE", nullptr, Param::Type::e_null);
131 };
132};
133
134class FBUCmd : public FBCmd
135{
136public:
137 FBUCmd(char *p) :FBCmd(p, "UCmd") {}
138};
139
140class FBACmd : public FBCmd
141{
142public:
143 FBACmd(char *p) :FBCmd(p, "ACmd") {}
144};
145
146class FBSyncCmd: public FBCmd
147{
148public:
149 FBSyncCmd(char *p) : FBCmd(p, "Sync") {}
150};
151
152class FBFlashingCmd : public FBCmd
153{
154public:
155 FBFlashingCmd(char *p) : FBCmd(p, "flashing") {}
156};
157
158class FBOemCmd : public FBCmd
159{
160public:
161 FBOemCmd(char *p) : FBCmd(p, "oem", ' ') {}
162};
163
164class FBFlashCmd : public FBCmd
165{
166public:
167 FBFlashCmd(char *p) : FBCmd(p, "flash") { m_timeout = 10000; }
168 int parser(char *p = nullptr) override;
169 int run(CmdCtx *ctx) override;
170 int flash(FastBoot *fb, void *p, size_t sz);
171 int flash_raw2sparse(FastBoot *fb, std::shared_ptr<FileBuffer> p, size_t max);
172 bool isffu(std::shared_ptr<FileBuffer> p);
173 int flash_ffu(FastBoot *fb, std::shared_ptr<FileBuffer> p);
174 int flash_ffu_oneblk(FastBoot *fb, std::shared_ptr<FileBuffer> p, size_t off, size_t blksz, size_t blkindex);
175
176private:
178 std::string m_filename;
179 std::string m_bmap_filename;
180 std::string m_partition;
181 bool m_raw2sparse = false;
182 bool m_use_bmap = false;
183 size_t m_sparse_limit = 0x1000000;
184 uint64_t m_totalsize;
185 bool m_scanterm = false;
186 uint64_t m_scan_limited = UINT64_MAX;
187};
188
189class FBDelPartition : public FBCmd
190{
191public:
192 FBDelPartition(char*p) : FBCmd(p, "delete-logical-partition") {}
193};
194
195class FBPartNumber : public CmdBase
196{
197public:
198 FBPartNumber(char *p, std::string &&fb_cmd) :CmdBase(p), m_fb_cmd{std::move(fb_cmd)}
199 {
200 m_Size = 0;
201 m_bCheckTotalParam = true;
202 m_NoKeyParam = true;
203 insert_param_info(nullptr, &m_partition_name, Param::Type::e_string, false, "partition name");
204 insert_param_info(nullptr, &m_Size, Param::Type::e_uint32, false, "partition size");
205 }
206
207 int run(CmdCtx *ctx) override;
208
209private:
210 const std::string m_fb_cmd;
211 std::string m_partition_name;
212 uint32_t m_Size;
213};
214
216{
217public:
218 FBCreatePartition(char*p) :FBPartNumber(p, "create-logical-partition") {}
219};
220
222{
223public:
224 FBResizePartition(char*p) :FBPartNumber(p, "resize-logical-partition") {}
225};
226
227class FBUpdateSuper : public CmdBase
228{
229public:
231 {
232 m_bCheckTotalParam = true;
233 m_NoKeyParam = true;
234 insert_param_info(nullptr, &m_partition_name, Param::Type::e_string, false, "partition name");
235 insert_param_info(nullptr, &m_opt, Param::Type::e_string, false, "partition size");
236 }
237
238 int run(CmdCtx *ctx) override;
239
240private:
241 const std::string m_fb_cmd = "update-super";
242 std::string m_opt;
243 std::string m_partition_name;
244};
245
246class FBEraseCmd : public FBCmd
247{
248public:
249 FBEraseCmd(char *p) : FBCmd(p, "erase") {}
250};
251
252
253class FBRebootCmd : public FBCmd
254{
255public:
256 FBRebootCmd(char *p) : FBCmd(p, "reboot") {}
257};
258
259
260class FBSetActiveCmd : public FBCmd
261{
262public:
263 FBSetActiveCmd(char *p) : FBCmd(p, "set_active") {}
264};
265
266class FBDownload : public CmdBase
267{
268public:
274
275 int run(CmdCtx *ctx) override;
276
277private:
278 std::string m_filename;
279};
280
281class FBCopy : public CmdBase
282{
283public:
284 FBCopy(char *p) :CmdBase(p) {}
285 int parser(char *p = nullptr) override;
286 int run(CmdCtx *ctx) override;
287
288private:
290 std::string m_local_file;
291 size_t m_Maxsize_pre_cmd = 0x4000;
292 std::string m_target_file;
293};
294
295class FBBootCmd : public FBCmd
296{
297public:
298 FBBootCmd(char *p) : FBCmd(p, "boot") {}
299};
300
301class FBContinueCmd : public FBCmd
302{
303public:
304 FBContinueCmd(char *p) : FBCmd(p, "continue") {}
305};
306
307class FBUpload : public CmdBase
308{
309public:
316
317 int run(CmdCtx* ctx) override;
318
319private:
320 std::string m_var;
321 std::string m_filename;
322};
bool m_bCheckTotalParam
Definition cmd.h:105
bool m_NoKeyParam
Definition cmd.h:108
int m_timeout
Definition cmd.h:109
CmdBase()=default
void insert_param_info(const char *key, void *pD, Param::Type tp, bool ignore_case=true, const char *err=nullptr)
Definition cmd.h:96
Definition cmd.h:44
Definition buffer.h:111
FBACmd(char *p)
Definition fastboot.h:143
FBBootCmd(char *p)
Definition fastboot.h:298
FBCRC(char *p)
Definition fastboot.h:118
int each(FastBoot &fb, std::shared_ptr< DataBuffer > fbuff, size_t off) override
Definition fastboot.cpp:1174
std::string m_uboot_cmd
Definition fastboot.h:88
int parser(char *p=nullptr) override
Definition fastboot.cpp:164
FBCmd(char *p, std::string &&fb_cmd, char separator=':')
Definition fastboot.h:81
const char m_separator
Definition fastboot.h:92
int run(CmdCtx *ctx) override
Definition fastboot.cpp:190
const std::string m_fb_cmd
Definition fastboot.h:91
FBContinueCmd(char *p)
Definition fastboot.h:304
std::string m_local_file
Definition fastboot.h:290
size_t m_Maxsize_pre_cmd
Definition fastboot.h:291
bool m_bDownload
Definition fastboot.h:289
std::string m_target_file
Definition fastboot.h:292
int parser(char *p=nullptr) override
Definition fastboot.cpp:292
int run(CmdCtx *ctx) override
Definition fastboot.cpp:355
FBCopy(char *p)
Definition fastboot.h:284
FBCreatePartition(char *p)
Definition fastboot.h:218
FBDelPartition(char *p)
Definition fastboot.h:192
int run(CmdCtx *ctx) override
Definition fastboot.cpp:242
FBDownload(char *p)
Definition fastboot.h:269
std::string m_filename
Definition fastboot.h:278
FBEraseCmd(char *p)
Definition fastboot.h:249
Definition fastboot.h:165
FBFlashCmd(char *p)
Definition fastboot.h:167
uint64_t m_scan_limited
Definition fastboot.h:186
std::string m_partition
Definition fastboot.h:180
int flash(FastBoot *fb, void *p, size_t sz)
Definition fastboot.cpp:604
int flash_ffu(FastBoot *fb, std::shared_ptr< FileBuffer > p)
Definition fastboot.cpp:971
int parser(char *p=nullptr) override
Definition fastboot.cpp:497
std::string m_filename
Definition fastboot.h:178
int flash_ffu_oneblk(FastBoot *fb, std::shared_ptr< FileBuffer > p, size_t off, size_t blksz, size_t blkindex)
Definition fastboot.cpp:947
int flash_raw2sparse(FastBoot *fb, std::shared_ptr< FileBuffer > p, size_t max)
Definition fastboot.cpp:619
bool m_use_bmap
Definition fastboot.h:182
bool m_scanterm
Definition fastboot.h:185
int run(CmdCtx *ctx) override
Definition fastboot.cpp:699
bool isffu(std::shared_ptr< FileBuffer > p)
Definition fastboot.cpp:934
std::string m_bmap_filename
Definition fastboot.h:179
bool m_raw2sparse
Definition fastboot.h:181
bmap_t m_bmap
Definition fastboot.h:177
uint64_t m_totalsize
Definition fastboot.h:184
size_t m_sparse_limit
Definition fastboot.h:183
FBFlashingCmd(char *p)
Definition fastboot.h:155
int run(CmdCtx *ctx) override
Definition fastboot.cpp:141
int parser(char *p=nullptr) override
Definition fastboot.cpp:119
std::string m_val
Definition fastboot.h:72
FBGetVar(char *p)
Definition fastboot.h:66
std::string m_var
Definition fastboot.h:73
friend FBFlashCmd
Definition fastboot.h:75
FBLoop(char *p)
Definition fastboot.cpp:1070
size_t m_blksize
Definition fastboot.h:99
int run(CmdCtx *ctx) override
Definition fastboot.cpp:1103
size_t m_seek
Definition fastboot.h:101
size_t m_each
Definition fastboot.h:100
virtual int each(FastBoot &fb, std::shared_ptr< DataBuffer > fbuff, size_t off)=0
std::string m_uboot_cmd
Definition fastboot.h:98
std::string m_filename
Definition fastboot.h:105
size_t m_skip
Definition fastboot.h:102
bool m_nostop
Definition fastboot.h:103
std::string build_cmd(std::string &cmd, size_t off, size_t sz)
Definition fastboot.cpp:1081
FBOemCmd(char *p)
Definition fastboot.h:161
int run(CmdCtx *ctx) override
Definition fastboot.cpp:208
FBPartNumber(char *p, std::string &&fb_cmd)
Definition fastboot.h:198
const std::string m_fb_cmd
Definition fastboot.h:210
std::string m_partition_name
Definition fastboot.h:211
uint32_t m_Size
Definition fastboot.h:212
FBRebootCmd(char *p)
Definition fastboot.h:256
FBResizePartition(char *p)
Definition fastboot.h:224
FBSetActiveCmd(char *p)
Definition fastboot.h:263
FBSyncCmd(char *p)
Definition fastboot.h:149
FBUCmd(char *p)
Definition fastboot.h:137
FBUpdateSuper(char *p)
Definition fastboot.h:230
int run(CmdCtx *ctx) override
Definition fastboot.cpp:225
std::string m_partition_name
Definition fastboot.h:243
std::string m_opt
Definition fastboot.h:242
const std::string m_fb_cmd
Definition fastboot.h:241
std::string m_var
Definition fastboot.h:320
FBUpload(char *p)
Definition fastboot.h:310
std::string m_filename
Definition fastboot.h:321
int run(CmdCtx *ctx) override
Definition fastboot.cpp:266
FBWrite(char *p)
Definition fastboot.h:128
int each(FastBoot &fb, std::shared_ptr< DataBuffer > fbuff, size_t off) override
Definition fastboot.cpp:1196
Definition fastboot.h:50
int Transport(std::string cmd, std::vector< uint8_t > data, std::vector< uint8_t > *input=nullptr)
Definition fastboot.h:55
FastBoot(TransBase *p)
Definition fastboot.h:52
int Transport(std::string cmd, void *p=nullptr, size_t size=0, std::vector< uint8_t > *input=nullptr)
Definition fastboot.cpp:55
TransBase *const m_pTrans
Definition fastboot.h:60
std::string m_info
Definition fastboot.h:57
Definition buffer.h:164
Definition trans.h:38
@ e_string_filename
Definition cmd.h:72
@ e_uint32
Definition cmd.h:67
@ e_null
Definition cmd.h:71
@ e_string
Definition cmd.h:70
Definition bmap.h:6