초기 커밋.
This commit is contained in:
259
LFP_Manager_PRM/Forms/fmxFwImageConverter.cs
Normal file
259
LFP_Manager_PRM/Forms/fmxFwImageConverter.cs
Normal file
@@ -0,0 +1,259 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.XtraEditors;
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
|
||||
using LFP_Manager.Utils;
|
||||
|
||||
namespace LFP_Manager
|
||||
{
|
||||
public partial class fmxFwImageConverter : DevExpress.XtraEditors.XtraForm
|
||||
{
|
||||
#region CONST
|
||||
|
||||
//const
|
||||
// mFileMaxSize : DWORD = 262144; // 256KByte
|
||||
// sFileMaxSize : DWORD = 131072; // 128KByte
|
||||
|
||||
// ImageCode : DWORD = $53454355;
|
||||
// ImageEmpty : DWORD = $00000000;
|
||||
// MasterOnly : DWORD = $00000001;
|
||||
// SlaveOnly : DWORD = $00000002;
|
||||
// MasterSlave : DWORD = $00000003;
|
||||
const UInt32 mFileMaxSize = 262144; // 256KBytes
|
||||
const UInt32 ImageCode = 0x6D424D53; // mBMS
|
||||
const UInt32 ImageEmpty = 0x00000000; //
|
||||
|
||||
const UInt32 POLYNOMIAL = 0x04C11DB7;
|
||||
|
||||
#endregion
|
||||
|
||||
#region STRUCTURE
|
||||
//TImageHeaderStructure = packed record
|
||||
// ImageCode : DWORD;
|
||||
// ImageType : DWORD;
|
||||
// mImageSize : DWORD;
|
||||
// mImageName : array[0..31]of Byte;
|
||||
// mImageVersion : TImageVersionStructure;
|
||||
// mImageCRC : DWORD;
|
||||
// sImageSize : DWORD;
|
||||
// sImageName : array[0..31]of Byte;
|
||||
// sImageVersion : TImageVersionStructure;
|
||||
// sImageCRC : DWORD;
|
||||
// reserved : array[0..927]of Byte;
|
||||
//end;
|
||||
struct TImageHeaderStructure // Total 64bytes
|
||||
{
|
||||
public UInt32 ImageCode; // 4
|
||||
public UInt32 ImageType; // 4
|
||||
public UInt32 ImageSize; // 4
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] ImageName; // 32
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public byte[] ImageVersion; // 4
|
||||
public UInt32 ImageCRC; // 4
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] reserved; // 12
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VARIABLES
|
||||
|
||||
TImageHeaderStructure fwHeader;
|
||||
byte[] fwdata;
|
||||
|
||||
UInt32[] crc_table;
|
||||
|
||||
#endregion
|
||||
|
||||
#region CONSTRUCTORS
|
||||
|
||||
public fmxFwImageConverter()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
crc_table = new UInt32[256];
|
||||
|
||||
gen_crc_table();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/* generate the table of CRC remainders for all possible bytes */
|
||||
void gen_crc_table()
|
||||
{
|
||||
int i, j;
|
||||
UInt32 crc_accum;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
crc_accum = ((UInt32)i << 24);
|
||||
|
||||
for (j = 0; j < 8; j++) {
|
||||
if ((crc_accum & 0x80000000) != 0)
|
||||
crc_accum = (crc_accum << 1) ^ POLYNOMIAL;
|
||||
else
|
||||
crc_accum = (crc_accum << 1);
|
||||
crc_table[i] = crc_accum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* update the CRC on the data block one byte at a time */
|
||||
UInt32 update_crc(UInt32 crc_accum, byte[] data_blk_ptr, UInt32 data_blk_size)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < data_blk_size; j++)
|
||||
{
|
||||
i = ((int)(crc_accum >> 24) ^ data_blk_ptr[j]) & 0xff;
|
||||
crc_accum = (crc_accum << 8) ^ crc_table[i];
|
||||
}
|
||||
return crc_accum;
|
||||
}
|
||||
|
||||
byte[] getBytes(TImageHeaderStructure header)
|
||||
{
|
||||
int size = Marshal.SizeOf(header);
|
||||
byte[] arr = new byte[size];
|
||||
|
||||
IntPtr ptr = Marshal.AllocHGlobal(size);
|
||||
Marshal.StructureToPtr(header, ptr, true);
|
||||
Marshal.Copy(ptr, arr, 0, size);
|
||||
Marshal.FreeHGlobal(ptr);
|
||||
return arr;
|
||||
}
|
||||
|
||||
bool MakeFwImageFile(byte[] fData, string AppPath, string FileName)
|
||||
{
|
||||
FileStream aFile = null;
|
||||
string path = System.IO.Path.GetDirectoryName(AppPath);
|
||||
string aFileName = String.Format("{0}\\{1}", path, FileName);
|
||||
|
||||
bool result = false;
|
||||
|
||||
if (File.Exists(aFileName) == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
aFile = new FileStream(aFileName, FileMode.CreateNew, FileAccess.ReadWrite);
|
||||
aFile.Write(fData, 0, fData.Length);
|
||||
aFile.Close();
|
||||
|
||||
result = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#region BUNTTON EVENT
|
||||
|
||||
private void btnFileFind_Click(object sender, EventArgs e)
|
||||
{
|
||||
OpenFileDialog oDialog;
|
||||
|
||||
oDialog = new OpenFileDialog();
|
||||
oDialog.DefaultExt = "*.*";
|
||||
oDialog.Filter = "bin files (*.bin)|*.bin|All files (*.*)|*.*";
|
||||
|
||||
if (oDialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
teFileName.Text = oDialog.FileName;
|
||||
|
||||
FileStream fwFile = new FileStream(teFileName.Text, FileMode.Open, FileAccess.Read);
|
||||
long fsize = fwFile.Length;
|
||||
|
||||
if (fsize > 0)
|
||||
{
|
||||
fwdata = new byte[fsize];
|
||||
fwFile.Seek(0, SeekOrigin.Begin);
|
||||
fwFile.Read(fwdata, 0, (int)fsize);
|
||||
}
|
||||
fwFile.Close();
|
||||
|
||||
byte[] bName = csUtils.StringToByte(Path.GetFileName(teFileName.Text));
|
||||
|
||||
fwHeader = new TImageHeaderStructure();
|
||||
fwHeader.ImageCode = ImageCode;
|
||||
fwHeader.ImageType = 0x00000001;
|
||||
fwHeader.ImageSize = (UInt32)fsize;
|
||||
fwHeader.ImageName = new byte[32];
|
||||
Buffer.BlockCopy(bName, 0, fwHeader.ImageName, 0, bName.Length);
|
||||
fwHeader.ImageCRC = update_crc(fwHeader.ImageCRC, fwdata, fwHeader.ImageSize);
|
||||
fwHeader.reserved = new byte[12];
|
||||
|
||||
if (bName.Length > 8)
|
||||
{
|
||||
fwHeader.ImageVersion = new byte[4];
|
||||
|
||||
UInt32 nPC = (UInt32)((fwdata[0] << 0) | (fwdata[1] << 8) | (fwdata[2] << 16) | (fwdata[3] << 24));
|
||||
UInt32 nSP = (UInt32)((fwdata[4] << 0) | (fwdata[5] << 8) | (fwdata[6] << 16) | (fwdata[7] << 24));
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
fwHeader.ImageVersion[i] = (byte)(bName[bName.Length - 1 - 3 - 4 + i] - 0x30);
|
||||
|
||||
lbFileInfo.Text = String.Format("File Information");
|
||||
lbFileInfo.Text += String.Format("\r\n - Filename: {0}", Encoding.UTF8.GetString(fwHeader.ImageName).Trim('\0'));
|
||||
lbFileInfo.Text += String.Format("\r\n - File Version: V{0}.{1}.{2}.{3}", fwHeader.ImageVersion[0], fwHeader.ImageVersion[1], fwHeader.ImageVersion[2], fwHeader.ImageVersion[3]);
|
||||
lbFileInfo.Text += String.Format("\r\n - File Size: {0:#,##0} bytes", fwHeader.ImageSize);
|
||||
lbFileInfo.Text += String.Format("\r\n - File CRC32: 0x{0:X8}", fwHeader.ImageCRC);
|
||||
lbFileInfo.Text += String.Format("\r\n - Packet Size: {0:#,##0} packets", fwHeader.ImageSize / 2048);
|
||||
lbFileInfo.Text += String.Format("\r\n - Last packet: {0:#,##0}", fwHeader.ImageSize % 2048);
|
||||
|
||||
lbFileInfo.Text += String.Format("\r\n - PC: 0x{0:X8}", nPC);
|
||||
lbFileInfo.Text += String.Format("\r\n - SP: 0x{0:X8}", nSP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnConvert_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (fwHeader.ImageSize > 0)
|
||||
{
|
||||
byte[] bHeader = getBytes(fwHeader);
|
||||
byte[] cFwData = new byte[bHeader.Length + fwdata.Length];
|
||||
|
||||
Buffer.BlockCopy(bHeader, 0, cFwData, 0, 64);
|
||||
Buffer.BlockCopy(fwdata, 0, cFwData, 64, fwdata.Length);
|
||||
|
||||
string nFileName = String.Format("mBMS_APP_DL_V{0}{1}{2}{3}.bin"
|
||||
, fwHeader.ImageVersion[0]
|
||||
, fwHeader.ImageVersion[1]
|
||||
, fwHeader.ImageVersion[2]
|
||||
, fwHeader.ImageVersion[3]
|
||||
);
|
||||
|
||||
if (MakeFwImageFile(cFwData, teFileName.Text, nFileName))
|
||||
{
|
||||
MessageBox.Show("Firmware Image Convert Success !!", "FwUpdate", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Firmware Image Convert Fail !!", "FwUpdate", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Please select firmware file !!", "FwUpdate", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user