37 lines
1.7 KiB
PowerShell
37 lines
1.7 KiB
PowerShell
param(
|
|
[Parameter(Mandatory=$true)][string]$Path,
|
|
[string]$PublishPath
|
|
)
|
|
$ErrorActionPreference = 'Stop'
|
|
# Load_params/Save_params use word address 0x3FFF-(ANSWER_LEN+1).
|
|
# Seeprom_write converts that address to wire bytes (WORD_LEN=2).
|
|
$header = Get-Content -Raw -LiteralPath "$PSScriptRoot/Source/Internal/Include/message.h"
|
|
if ($header -notmatch '(?m)^#define\s+ANSWER_LEN\s+(0x[0-9a-fA-F]+|[0-9]+)') {
|
|
throw 'Cannot determine the EEPROM parameter reservation from ANSWER_LEN'
|
|
}
|
|
$registerCount = if ($Matches[1].StartsWith('0x')) {
|
|
[Convert]::ToInt32($Matches[1].Substring(2), 16)
|
|
} else { [int]$Matches[1] }
|
|
$limit = (0x3FFF - ($registerCount + 1)) * 2
|
|
$bytes = [IO.File]::ReadAllBytes((Resolve-Path -LiteralPath $Path).Path)
|
|
if ($bytes.Length -gt $limit) {
|
|
throw "Firmware size $($bytes.Length) exceeds EEPROM firmware area $limit bytes; overlaps saved parameters by $($bytes.Length - $limit) bytes."
|
|
}
|
|
if ($bytes.Length -lt 30 -or [BitConverter]::ToUInt16($bytes, 0) -ne 0x08AA) {
|
|
throw 'Expected a C2000 SCI8 boot image'
|
|
}
|
|
$offset = 22
|
|
$blocks = 0
|
|
while ($true) {
|
|
if ($offset + 2 -gt $bytes.Length) { throw 'Missing boot table terminator' }
|
|
$words = [BitConverter]::ToUInt16($bytes, $offset)
|
|
$offset += 2
|
|
if (!$words) { break }
|
|
$offset += 4 + 2 * $words
|
|
if ($offset -gt $bytes.Length) { throw 'Truncated boot table block' }
|
|
$blocks++
|
|
}
|
|
if (!$blocks -or $offset -ne $bytes.Length) { throw 'Invalid boot table length' }
|
|
if ($PublishPath) { Move-Item -LiteralPath $Path -Destination $PublishPath -Force }
|
|
Write-Output "Verified SCI8 image: $($bytes.Length) bytes, $blocks blocks, $($limit - $bytes.Length) bytes before saved parameters."
|