Files
PR_PRM_GUI/LFP_Manager_PRM/Forms/fmxFwImageConverter.cs
2026-02-11 10:10:43 +09:00

259 lines
9.4 KiB
C#

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();
}
}
}