private void WriteBinaryFile(byte[] bin, USARTBootloader loader, int count, int reminder) { ToolStripStatusLabel.Text = "ファームウェアの書き込み中。。。"; this.Update(); ProgressBar.Value = 0; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; for (byte i = 0; i < count; i++) { int offset = i * READ_WRITE_BLOCK_SIZE; int buffersize = READ_WRITE_BLOCK_SIZE; if (i == count - 1) { buffersize = reminder; } byte[] tmp = new byte[buffersize]; Buffer.BlockCopy(bin, offset, tmp, 0, buffersize); loader.WriteMemory( (uint)(BASE_ADDRESS + offset), tmp); ProgressBar.Value = i * 100 / count; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; } ProgressBar.Value = 100; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; }
/// <summary> /// FT232RのCBUSを操作するサンプルコード /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TestButton_Click(object sender, EventArgs e) { if (loader == null) { loader = CreateBootLoader(); } loader.Open(); if (!(loader is FT232RUSARTBootloader)) { MessageBox.Show("FT232RUSARTBootloader のインスタンスを生成してください。"); } FT232RUSARTBootloader ftLoader = (FT232RUSARTBootloader)loader; FT232RUSARTBootloader.CBUSConfig conf = new FT232RUSARTBootloader.CBUSConfig(); conf.cbus0 = FT_CBUS_OPTIONS.FT_CBUS_IOMODE; conf.cbus1 = FT_CBUS_OPTIONS.FT_CBUS_IOMODE; ftLoader.SetCBusConfig(conf); FT232RUSARTBootloader.CBUSBit bits = new FT232RUSARTBootloader.CBUSBit(); if (i == 0) { bits.cbus0 = false; bits.cbus1 = false; i++; } else if (i == 1) { bits.cbus0 = true; bits.cbus1 = false; i++; } else if (i == 2) { bits.cbus0 = false; bits.cbus1 = true; i++; } else if (i == 3) { bits.cbus0 = true; bits.cbus1 = true; i = 0; } ftLoader.SetCBusBit(bits); }
private void VerifyCheckBinaryFile(byte[] bin, USARTBootloader loader, int count, int reminder) { ToolStripStatusLabel.Text = "ベリファイチェック中。。。"; this.Update(); ProgressBar.Value = 0; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; for (byte i = 0; i < count; i++) { // バッファサイズ計算 int offset = i * READ_WRITE_BLOCK_SIZE; int buffersize = READ_WRITE_BLOCK_SIZE; if (i == count - 1) { buffersize = reminder; } // リード&チェック for (var j = 0; j < 5; j++) { try { bool isFailed = true; byte[] tmp = loader.ReadMemory((uint)(BASE_ADDRESS + offset), buffersize); for (var k = 0; k < buffersize; k++) { if (tmp[k] != bin[offset + k]) { break; } if (k == buffersize - 1) { isFailed = false; } } if (!isFailed) { break; } } catch (Exception ee) { } } ProgressBar.Value = i * 100 / count; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; } ProgressBar.Value = 100; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; }
private USARTBootloader CreateBootLoader() { SerialPort port = new SerialPort(); port.PortName = PortCombo.SelectedItem.ToString(); port.BaudRate = int.Parse(BaudrateCombo.SelectedItem.ToString()); port.DataBits = 8; port.StopBits = StopBits.One; port.Parity = Parity.Even; port.ReadTimeout = 250; port.WriteTimeout = 250; loader = new USARTBootloader(port); //loader = new FTDIUSARTBootloader(port); //loader = new FT232RUSARTBootloader(port); return(loader); }
private int EraseFlash(byte[] bin, USARTBootloader loader) { ToolStripStatusLabel.Text = "フラッシュメモリの消去中。。。"; this.Update(); int count = bin.Length / FLASH_BLOCK_SIZE; if (count % FLASH_BLOCK_SIZE != 0) { count++; } for (byte i = 0; i < count; i++) { loader.EraseMemory(i); ProgressBar.Value = i * 100 / count; ProgressLabel.Text = ProgressBar.Value.ToString() + "%"; } return(count); }
private void WriteButton_Click(object sender, EventArgs e) { // ポートチェック if (PortCombo.SelectedItem == null) { MessageBox.Show("ポートを選択してください。"); return; } // ファイルチェック if (string.IsNullOrEmpty(FileNameText.Text)) { MessageBox.Show("ファイルを選択してください。"); return; } else if (!(FileNameText.Text.EndsWith(".bin") || FileNameText.Text.EndsWith(".hex"))) { MessageBox.Show("バイナリファイルを選択してください。"); return; } // プログレスバーの初期化 ProgressBar.Value = 0; // バイナリファイルの取得 byte[] bin = GetBinary(FileNameText.Text); try { // USARTBootloaderの初期化 if (loader == null) { loader = CreateBootLoader(); } loader.Open(); loader.Init(); Stopwatch sw = new Stopwatch(); sw.Start(); // フラッシュメモリーの消去 int count = EraseFlash(bin, loader); // リードライトの回数と、最後のバッファサイズの計算 count = bin.Length / READ_WRITE_BLOCK_SIZE; int reminder = bin.Length % READ_WRITE_BLOCK_SIZE; if (reminder != 0) { count++; } // バイナリファイルの書き込み WriteBinaryFile(bin, loader, count, reminder); // ベリファイチェック VerifyCheckBinaryFile(bin, loader, count, reminder); // 完了 sw.Stop(); ToolStripStatusLabel.Text = "完了!! Total " + (decimal)sw.ElapsedMilliseconds / 1000 + "[s]"; } finally { if (loader != null) { //loader.Close(); } } }