Skip to content

Commit 934c137

Browse files
committed
support big file write at option --raw
Signed-off-by: Frank Li <Frank.Li@nxp.com>
1 parent 359c4bc commit 934c137

File tree

7 files changed

+199
-59
lines changed

7 files changed

+199
-59
lines changed

src/CStCFBootImager.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,23 @@ void CStCFBootImager::setVolumeLabel(const std::string & label)
109109
void CStCFBootImager::writeImage()
110110
{
111111
assert(m_device);
112-
assert(m_firmware);
112+
113+
if (m_bRaw)
114+
{
115+
std::string filename;
116+
117+
m_extra->GetExtraFilename(filename);
118+
119+
CStExtraComponent extra(filename, filename);
120+
extra.set_extra_reserved_size(0);
121+
122+
extra.WriteToDisk(this->m_offset / m_blockSize, m_device, this->m_skip);
123+
return;
124+
}
125+
126+
assert(m_firmware);
113127

114-
if (m_bImage || m_bRaw)
128+
if (m_bImage)
115129
{
116130
writeFirmware();
117131
return;

src/StExtraComponent.cpp

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ CStExtraComponent::CStExtraComponent(std::string & extraFileName,
2626

2727
m_extra_filesize = 0;
2828

29+
m_extra_reserved_size = EXTRA_RESERVERD_SIZE;
30+
2931
m_last_error = PrepareData();
3032
}
3133

@@ -82,7 +84,7 @@ ST_ERROR CStExtraComponent::PrepareData()
8284

8385
uint64_t CStExtraComponent::GetSizeInBytes()
8486
{
85-
return m_extra_filesize + EXTRA_RESERVERD_SIZE;
87+
return m_extra_filesize + m_extra_reserved_size;
8688
}
8789

8890
uint64_t CStExtraComponent::GetSizeInSectors(uint32_t sector_size)
@@ -103,10 +105,10 @@ uint64_t CStExtraComponent::GetSizeInSectors(uint32_t sector_size)
103105
return sectors;
104106
}
105107

106-
void CStExtraComponent::WriteToDisk(int32_t start_block, CStBlockDevice * pDevice)
108+
void CStExtraComponent::WriteToDisk(int32_t start_block, CStBlockDevice * pDevice, uint64_t input_skip_byte)
107109
{
108110
int buffersize;
109-
buffersize = 0x1000;
111+
buffersize = 0x100000;
110112

111113
char *buff =new char[buffersize];
112114

@@ -132,22 +134,50 @@ void CStExtraComponent::WriteToDisk(int32_t start_block, CStBlockDevice * pDevic
132134
return ;
133135
}
134136

135-
int i=0;
136-
int precent, old;
137-
precent = old =0;
138-
while( fw_file.read(buff,buffersize) >0)
139-
{
140-
pDevice->writeBlocks(start_block+i,buffersize/pDevice->getBlockSize(),buff);
141-
i+=buffersize/pDevice->getBlockSize();
137+
uint64_t i=0;
138+
uint64_t precent, old;
139+
precent= 0;
140+
old = 1000;
141+
142+
fw_file.seekg(input_skip_byte, ifstream::beg);
143+
144+
DWORD start = GetTickCount();
142145

143-
precent = (i)*100 /(this->m_extra_filesize/pDevice->getBlockSize());
146+
uint64_t total_blocks = this->m_extra_filesize;
147+
total_blocks += pDevice->getBlockSize() - 1;
148+
total_blocks /= pDevice->getBlockSize();
149+
150+
while(1)
151+
{
152+
fw_file.read(buff, buffersize);
153+
if (fw_file.gcount() == 0)
154+
break;
155+
156+
uint64_t sz = fw_file.gcount();
157+
sz += pDevice->getBlockSize() - 1;
158+
sz /= pDevice->getBlockSize();
159+
160+
pDevice->writeBlocks(start_block+i, sz,buff);
161+
i += sz;
162+
163+
precent = (i)*100 / total_blocks;
144164
if(precent != old)
145165
{
146166
printf("write %d%%\r", precent);
147167
old =precent;
148168
}
149169
}
150170

171+
DWORD end = GetTickCount();
172+
173+
uint64_t speed;
174+
if (end - start == 0)
175+
speed = 1000;
176+
else
177+
speed = (total_blocks * pDevice->getBlockSize()) * 1000 / (end - start);
178+
179+
printf("\n\nTotal: %d.%03ds speed:%lld.%03lldMB/s", (end - start) / 1000, (end - start) % 1000,
180+
speed / 10000000, speed / 1000);
151181
delete buff;
152182

153183
}

src/StExtraComponent.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ class CStExtraComponent :
2929
uint64_t GetSizeInBytes();
3030
uint64_t GetSizeInSectors(uint32_t sector_size);
3131

32-
void WriteToDisk(int32_t start_block, CStBlockDevice * pDevice);
32+
void WriteToDisk(int32_t start_block, CStBlockDevice * pDevice, uint64_t input_skip_byte=0);
3333

3434
void CStExtraComponent::GetExtraFilename(std::string& outFilename);
3535

36+
void set_extra_reserved_size(uint64_t x) { m_extra_reserved_size = x; }
3637
private:
3738
ST_ERROR PrepareData();
3839
std::string m_extra_filename;
39-
uint64_t m_extra_filesize;
40+
uint64_t m_extra_filesize;
41+
uint64_t m_extra_reserved_size;
4042
};

src/cfimager.cpp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -148,34 +148,43 @@ class CFBootImagerTool : public CStCFBootImager::Listener
148148
printf("device block size = %u bytes\n", device.getBlockSize());
149149
printf("device block count = %#x\n\n", device.getBlockCount());
150150

151+
CStCFBootImager imager;
152+
151153
// check if media is removable
152154
// if (!m_showInfo && !device.isMediaRemovable())
153155
// {
154156
// throw std::runtime_error("media is not removable");
155157
// }
156-
157-
CStFwComponent firmware(m_filename,"CStFwComponent");
158-
// create firmware instance
159-
unsigned extraBlocks=0;
160-
if( !m_filename.empty() )
161-
{
158+
if(!m_bRaw)
159+
{
160+
CStFwComponent firmware(m_filename,"CStFwComponent");
161+
// create firmware instance
162+
unsigned extraBlocks=0;
163+
if( !m_filename.empty())
164+
{
162165

163-
THROW_IF_ST_ERROR( firmware.GetLastError());
164-
uint64_t firmwareSize = firmware.GetSizeInBytes();
165-
if (firmwareSize == 0)
166-
{
167-
throw std::runtime_error("empty firmware file");
168-
}
166+
THROW_IF_ST_ERROR( firmware.GetLastError());
167+
uint64_t firmwareSize = firmware.GetSizeInBytes();
168+
if (firmwareSize == 0)
169+
{
170+
throw std::runtime_error("empty firmware file");
171+
}
169172

170-
uint64_t firmwareBlocks = firmware.GetSizeInSectors(device.getBlockSize());
171-
printf("firmware size = %#x bytes (%#x blocks)\n", (uint32_t)firmwareSize, (uint32_t)firmwareBlocks);
173+
uint64_t firmwareBlocks = firmware.GetSizeInSectors(device.getBlockSize());
174+
printf("firmware size = %#x bytes (%#x blocks)\n", (uint32_t)firmwareSize, (uint32_t)firmwareBlocks);
172175

173176

174-
// compute extra space in blocks
175-
extraBlocks = computeExtraBlocks(device.getBlockSize(), firmwareSize);
176-
printf("extra blocks = %u\n", extraBlocks);
177+
// compute extra space in blocks
178+
extraBlocks = computeExtraBlocks(device.getBlockSize(), firmwareSize);
179+
printf("extra blocks = %u\n", extraBlocks);
180+
}
181+
imager.setFirmware(&firmware);
182+
imager.setExtraBlocks(extraBlocks);
177183
}
178-
184+
185+
if (m_bRaw && m_extra_filename.empty())
186+
m_extra_filename = m_filename;
187+
179188
CStExtraComponent extra(m_extra_filename,"CStFwComponent");
180189
if( !m_extra_filename.empty())
181190
{
@@ -185,17 +194,15 @@ class CFBootImagerTool : public CStCFBootImager::Listener
185194
// now do the real work
186195
try
187196
{
188-
CStCFBootImager imager;
189197
imager.setROMVersion(m_romVersion);
190198
imager.setListener(this);
191199
imager.setDevice(&device);
192-
imager.setFirmware(&firmware);
200+
193201
imager.setExtra(&extra);
194202
imager.setAlwaysFormat(m_alwaysFormat);
195203
imager.setWriteFAT32(!m_skipFatFormat);
196204
imager.setWinCEVersion(m_WinCEVersion);
197-
imager.setExtraBlocks(extraBlocks);
198-
imager.Image(m_bImage);
205+
imager.Image(m_bImage);
199206
imager.RedundantBoot(m_bRedundantBoot);
200207
imager.BCBBoot(m_bBCBBoot);
201208
imager.m_bRaw = m_bRaw;

src/cfimager.sln

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
11
Microsoft Visual Studio Solution File, Format Version 12.00
2-
# Visual Studio 2012
2+
# Visual Studio 15
3+
VisualStudioVersion = 15.0.27130.2027
4+
MinimumVisualStudioVersion = 10.0.40219.1
35
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cfimager", "cfimager.vcxproj", "{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}"
46
EndProject
57
Global
68
GlobalSection(SolutionConfigurationPlatforms) = preSolution
7-
Debug|Default = Debug|Default
8-
Release|Default = Release|Default
9+
Debug|Win32 = Debug|Win32
10+
Debug|x64 = Debug|x64
11+
Debug|x86 = Debug|x86
12+
Release|Win32 = Release|Win32
13+
Release|x64 = Release|x64
14+
Release|x86 = Release|x86
915
EndGlobalSection
1016
GlobalSection(ProjectConfigurationPlatforms) = postSolution
11-
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|Default.ActiveCfg = Debug|Win32
12-
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|Default.Build.0 = Debug|Win32
13-
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|Default.ActiveCfg = Release|Win32
14-
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|Default.Build.0 = Release|Win32
17+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|Win32.ActiveCfg = Debug|Win32
18+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|Win32.Build.0 = Debug|Win32
19+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|x64.ActiveCfg = Debug|Win32
20+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|x64.Build.0 = Debug|Win32
21+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|x86.ActiveCfg = Debug|Win32
22+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Debug|x86.Build.0 = Debug|Win32
23+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|Win32.ActiveCfg = Release|Win32
24+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|Win32.Build.0 = Release|Win32
25+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|x64.ActiveCfg = Release|x64
26+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|x64.Build.0 = Release|x64
27+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|x86.ActiveCfg = Release|Win32
28+
{5E51B414-2D1B-4E42-96B7-2FC006CD0BFD}.Release|x86.Build.0 = Release|Win32
1529
EndGlobalSection
1630
GlobalSection(SolutionProperties) = preSolution
1731
HideSolutionNode = FALSE
1832
EndGlobalSection
33+
GlobalSection(ExtensibilityGlobals) = postSolution
34+
SolutionGuid = {48BBB538-48F5-46C3-8416-4FAD704E6609}
35+
EndGlobalSection
1936
EndGlobal

0 commit comments

Comments
 (0)