forked from ugokutennp/watchman-uf2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFW_gen.bat
123 lines (94 loc) · 4.4 KB
/
FW_gen.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
:: Fw_gen.bat
:: ver 3.0
@echo off
setlocal enabledelayedexpansion
:: SteamVR directory settings
set "steamvrDir=C:\Program Files (x86)\Steam\steamapps\common\SteamVR"
:: Delete old directories
if exist "firmware" (
rmdir /s /q "firmware"
)
if exist "gd_1558748372_dfu" (
rmdir /s /q "gd_1558748372_dfu"
)
:: Create new directories
echo Creating directories...
mkdir "firmware"
mkdir "gd_1558748372_dfu"
:: File unpacking
echo Unpacking firmware...
powershell -Command "Expand-Archive -Path '%steamvrDir%\drivers\indexhmd\resources\firmware\radio\gd_1558748372_dfu.zip' -DestinationPath 'gd_1558748372_dfu'"
:: File copying
copy gd_1558748372_dfu\temp_app_stamped.bin gd_1558748372_dfu\temp_app_stamped_fix.bin > nul
:: Binary rewriting (USB device name to "Watchaman Radio")
powershell -Command "$filePath = 'gd_1558748372_dfu\temp_app_stamped_fix.bin'; $newValues = 0x57,0x61,0x74,0x63,0x68,0x6D,0x61,0x6E,0x20,0x52,0x61,0x64,0x69,0x6F; $offset = 0x162E0; $bytes = [System.IO.File]::ReadAllBytes($filePath); for ($i = 0; $i -lt $newValues.Length; $i++) { $bytes[$offset + $i] = $newValues[$i] }; [IO.File]::WriteAllBytes($filePath, $bytes)"
:: Boot mode select
set /p mode="Please select boot mode (LYM, RYB, LYX, DYX): "
:: Binary rewriting (change boot mode)
if /i "%mode%"=="LYM" (
echo Selected mode is LYM
set mode_small=lym
) else if /i "%mode%"=="RYB" (
echo Selected mode is RYB
set mode_small=ryb
powershell -Command "$filePath = 'gd_1558748372_dfu\temp_app_stamped_fix.bin'; $newValue = 0xB9; $offset = 0x18385; $bytes = [System.IO.File]::ReadAllBytes($filePath); $bytes[$offset] = $newValue; [IO.File]::WriteAllBytes($filePath, $bytes)"
) else if /i "%mode%"=="LYX" (
echo Selected mode is LYX
set mode_small=lyx
powershell -Command "$filePath = 'gd_1558748372_dfu\temp_app_stamped_fix.bin'; $newValue = 0xB9; $offset = 0x1839D; $bytes = [System.IO.File]::ReadAllBytes($filePath); $bytes[$offset] = $newValue; [IO.File]::WriteAllBytes($filePath, $bytes)"
) else if /i "%mode%"=="DYX" (
echo Selected mode is DYX
set mode_small=dyx
powershell -Command "$filePath = 'gd_1558748372_dfu\temp_app_stamped_fix.bin'; $newValue = 0xB9; $offset = 0x18391; $bytes = [System.IO.File]::ReadAllBytes($filePath); $bytes[$offset] = $newValue; [IO.File]::WriteAllBytes($filePath, $bytes)"
) else (
echo Correct mode was not selected
pause
exit /b
)
:: Convert bin to uf2
set args=%*
powershell "iex((@('')*3+(cat '%~f0'|select -skip 80))-join[char]10)"
:: Rename file
rename "gd_1558748372_dfu\temp_app_stamped_fix.bin" "temp_app_stamped_%mode_small%.bin"
rename "firmware\temp_app_stamped_fix.uf2" "temp_app_stamped_%mode_small%.uf2"
echo Output file : firmware\temp_app_stamped_%mode_small%.uf2
:: Exit
pause
exit /b
:: The following is powershell script
Set-Location $PSScriptRoot
$UF2_MAGIC_START0 = 0x0A324655 # "UF2\n"
$UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected
$UF2_MAGIC_END = 0x0AB16F30 # Ditto
$appstartaddr = 0x26000 # offset
$familyid = 0xADA52840 # nrf52840
$inputFile = "gd_1558748372_dfu\temp_app_stamped_fix.bin"
$outputFile = "firmware\temp_app_stamped_fix.uf2"
Write-Host "Converting bin to uf2..."
$file_content = Get-Content -LiteralPath $inputFile -Encoding Byte
$numblocks = ($file_content.Length + 0xFF) -shr 8
$outp = @()
foreach ($blockno in @(0..($numblocks - 1))) {
$ptr = 0x100 * $blockno
$chunk = $file_content[$ptr..($ptr + 0xFF)]
$flags = 0
if ($familyid) {
$flags = $flags -bor 0x2000
}
$block = @(
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_START0),
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_START1),
[System.BitConverter]::GetBytes([Int32]$flags),
[System.BitConverter]::GetBytes([Int32]($ptr + $appstartaddr)),
[System.BitConverter]::GetBytes([Int32]256),
[System.BitConverter]::GetBytes([Int32]$blockno),
[System.BitConverter]::GetBytes([Int32]$numblocks),
[System.BitConverter]::GetBytes([Int32]$familyid),
$chunk,
(@([Byte]0x00) * (0x200 - (32 + $chunk.Length + 4))),
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_END)
) | ForEach-Object { $_ }
$outp += $block
}
$outp | Set-Content -LiteralPath $outputFile -Encoding Byte
Write-Host "Firmware generation completed"