extract_xc3028.pl 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926
  1. #!/usr/bin/perl
  2. # Copyright (c) Mauro Carvalho Chehab <mchehab@infradead.org>
  3. # Released under GPLv2
  4. #
  5. # In order to use, you need to:
  6. # 1) Download the windows driver with something like:
  7. # wget http://www.steventoth.net/linux/xc5000/HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip
  8. # 2) Extract the file hcw85bda.sys from the zip into the current dir:
  9. # unzip -j HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip Driver85/hcw85bda.sys
  10. # 3) run the script:
  11. # ./extract_xc3028.pl
  12. # 4) copy the generated file:
  13. # cp xc3028-v27.fw /lib/firmware
  14. #use strict;
  15. use IO::Handle;
  16. my $debug=0;
  17. sub verify ($$)
  18. {
  19. my ($filename, $hash) = @_;
  20. my ($testhash);
  21. if (system("which md5sum > /dev/null 2>&1")) {
  22. die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n";
  23. }
  24. open(CMD, "md5sum ".$filename."|");
  25. $testhash = <CMD>;
  26. $testhash =~ /([a-zA-Z0-9]*)/;
  27. $testhash = $1;
  28. close CMD;
  29. die "Hash of extracted file does not match (found $testhash, expected $hash!\n" if ($testhash ne $hash);
  30. }
  31. sub get_hunk ($$)
  32. {
  33. my ($offset, $length) = @_;
  34. my ($chunklength, $buf, $rcount, $out);
  35. sysseek(INFILE, $offset, SEEK_SET);
  36. while ($length > 0) {
  37. # Calc chunk size
  38. $chunklength = 2048;
  39. $chunklength = $length if ($chunklength > $length);
  40. $rcount = sysread(INFILE, $buf, $chunklength);
  41. die "Ran out of data\n" if ($rcount != $chunklength);
  42. $out .= $buf;
  43. $length -= $rcount;
  44. }
  45. return $out;
  46. }
  47. sub write_le16($)
  48. {
  49. my $val = shift;
  50. my $msb = ($val >> 8) &0xff;
  51. my $lsb = $val & 0xff;
  52. syswrite(OUTFILE, chr($lsb).chr($msb));
  53. }
  54. sub write_le32($)
  55. {
  56. my $val = shift;
  57. my $l3 = ($val >> 24) & 0xff;
  58. my $l2 = ($val >> 16) & 0xff;
  59. my $l1 = ($val >> 8) & 0xff;
  60. my $l0 = $val & 0xff;
  61. syswrite(OUTFILE, chr($l0).chr($l1).chr($l2).chr($l3));
  62. }
  63. sub write_le64($$)
  64. {
  65. my $msb_val = shift;
  66. my $lsb_val = shift;
  67. my $l7 = ($msb_val >> 24) & 0xff;
  68. my $l6 = ($msb_val >> 16) & 0xff;
  69. my $l5 = ($msb_val >> 8) & 0xff;
  70. my $l4 = $msb_val & 0xff;
  71. my $l3 = ($lsb_val >> 24) & 0xff;
  72. my $l2 = ($lsb_val >> 16) & 0xff;
  73. my $l1 = ($lsb_val >> 8) & 0xff;
  74. my $l0 = $lsb_val & 0xff;
  75. syswrite(OUTFILE,
  76. chr($l0).chr($l1).chr($l2).chr($l3).
  77. chr($l4).chr($l5).chr($l6).chr($l7));
  78. }
  79. sub write_hunk($$)
  80. {
  81. my ($offset, $length) = @_;
  82. my $out = get_hunk($offset, $length);
  83. printf "(len %d) ",$length if ($debug);
  84. for (my $i=0;$i<$length;$i++) {
  85. printf "%02x ",ord(substr($out,$i,1)) if ($debug);
  86. }
  87. printf "\n" if ($debug);
  88. syswrite(OUTFILE, $out);
  89. }
  90. sub write_hunk_fix_endian($$)
  91. {
  92. my ($offset, $length) = @_;
  93. my $out = get_hunk($offset, $length);
  94. printf "(len_fix %d) ",$length if ($debug);
  95. for (my $i=0;$i<$length;$i++) {
  96. printf "%02x ",ord(substr($out,$i,1)) if ($debug);
  97. }
  98. printf "\n" if ($debug);
  99. my $i=0;
  100. while ($i<$length) {
  101. my $size = ord(substr($out,$i,1))*256+ord(substr($out,$i+1,1));
  102. syswrite(OUTFILE, substr($out,$i+1,1));
  103. syswrite(OUTFILE, substr($out,$i,1));
  104. $i+=2;
  105. if ($size>0 && $size <0x8000) {
  106. for (my $j=0;$j<$size;$j++) {
  107. syswrite(OUTFILE, substr($out,$j+$i,1));
  108. }
  109. $i+=$size;
  110. }
  111. }
  112. }
  113. sub main_firmware($$$$)
  114. {
  115. my $out;
  116. my $j=0;
  117. my $outfile = shift;
  118. my $name = shift;
  119. my $version = shift;
  120. my $nr_desc = shift;
  121. for ($j = length($name); $j <32; $j++) {
  122. $name = $name.chr(0);
  123. }
  124. open OUTFILE, ">$outfile";
  125. syswrite(OUTFILE, $name);
  126. write_le16($version);
  127. write_le16($nr_desc);
  128. #
  129. # Firmware 0, type: BASE FW F8MHZ (0x00000003), id: (0000000000000000), size: 8718
  130. #
  131. write_le32(0x00000003); # Type
  132. write_le64(0x00000000, 0x00000000); # ID
  133. write_le32(8718); # Size
  134. write_hunk_fix_endian(813432, 8718);
  135. #
  136. # Firmware 1, type: BASE FW F8MHZ MTS (0x00000007), id: (0000000000000000), size: 8712
  137. #
  138. write_le32(0x00000007); # Type
  139. write_le64(0x00000000, 0x00000000); # ID
  140. write_le32(8712); # Size
  141. write_hunk_fix_endian(822152, 8712);
  142. #
  143. # Firmware 2, type: BASE FW FM (0x00000401), id: (0000000000000000), size: 8562
  144. #
  145. write_le32(0x00000401); # Type
  146. write_le64(0x00000000, 0x00000000); # ID
  147. write_le32(8562); # Size
  148. write_hunk_fix_endian(830872, 8562);
  149. #
  150. # Firmware 3, type: BASE FW FM INPUT1 (0x00000c01), id: (0000000000000000), size: 8576
  151. #
  152. write_le32(0x00000c01); # Type
  153. write_le64(0x00000000, 0x00000000); # ID
  154. write_le32(8576); # Size
  155. write_hunk_fix_endian(839440, 8576);
  156. #
  157. # Firmware 4, type: BASE FW (0x00000001), id: (0000000000000000), size: 8706
  158. #
  159. write_le32(0x00000001); # Type
  160. write_le64(0x00000000, 0x00000000); # ID
  161. write_le32(8706); # Size
  162. write_hunk_fix_endian(848024, 8706);
  163. #
  164. # Firmware 5, type: BASE FW MTS (0x00000005), id: (0000000000000000), size: 8682
  165. #
  166. write_le32(0x00000005); # Type
  167. write_le64(0x00000000, 0x00000000); # ID
  168. write_le32(8682); # Size
  169. write_hunk_fix_endian(856736, 8682);
  170. #
  171. # Firmware 6, type: STD FW (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161
  172. #
  173. write_le32(0x00000000); # Type
  174. write_le64(0x00000001, 0x00000007); # ID
  175. write_le32(161); # Size
  176. write_hunk_fix_endian(865424, 161);
  177. #
  178. # Firmware 7, type: STD FW MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169
  179. #
  180. write_le32(0x00000004); # Type
  181. write_le64(0x00000001, 0x00000007); # ID
  182. write_le32(169); # Size
  183. write_hunk_fix_endian(865592, 169);
  184. #
  185. # Firmware 8, type: STD FW (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161
  186. #
  187. write_le32(0x00000000); # Type
  188. write_le64(0x00000002, 0x00000007); # ID
  189. write_le32(161); # Size
  190. write_hunk_fix_endian(865424, 161);
  191. #
  192. # Firmware 9, type: STD FW MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169
  193. #
  194. write_le32(0x00000004); # Type
  195. write_le64(0x00000002, 0x00000007); # ID
  196. write_le32(169); # Size
  197. write_hunk_fix_endian(865592, 169);
  198. #
  199. # Firmware 10, type: STD FW (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161
  200. #
  201. write_le32(0x00000000); # Type
  202. write_le64(0x00000004, 0x00000007); # ID
  203. write_le32(161); # Size
  204. write_hunk_fix_endian(866112, 161);
  205. #
  206. # Firmware 11, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169
  207. #
  208. write_le32(0x00000004); # Type
  209. write_le64(0x00000004, 0x00000007); # ID
  210. write_le32(169); # Size
  211. write_hunk_fix_endian(866280, 169);
  212. #
  213. # Firmware 12, type: STD FW (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161
  214. #
  215. write_le32(0x00000000); # Type
  216. write_le64(0x00000008, 0x00000007); # ID
  217. write_le32(161); # Size
  218. write_hunk_fix_endian(866112, 161);
  219. #
  220. # Firmware 13, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169
  221. #
  222. write_le32(0x00000004); # Type
  223. write_le64(0x00000008, 0x00000007); # ID
  224. write_le32(169); # Size
  225. write_hunk_fix_endian(866280, 169);
  226. #
  227. # Firmware 14, type: STD FW (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161
  228. #
  229. write_le32(0x00000000); # Type
  230. write_le64(0x00000003, 0x000000e0); # ID
  231. write_le32(161); # Size
  232. write_hunk_fix_endian(866800, 161);
  233. #
  234. # Firmware 15, type: STD FW MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169
  235. #
  236. write_le32(0x00000004); # Type
  237. write_le64(0x00000003, 0x000000e0); # ID
  238. write_le32(169); # Size
  239. write_hunk_fix_endian(866968, 169);
  240. #
  241. # Firmware 16, type: STD FW (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161
  242. #
  243. write_le32(0x00000000); # Type
  244. write_le64(0x0000000c, 0x000000e0); # ID
  245. write_le32(161); # Size
  246. write_hunk_fix_endian(867144, 161);
  247. #
  248. # Firmware 17, type: STD FW MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169
  249. #
  250. write_le32(0x00000004); # Type
  251. write_le64(0x0000000c, 0x000000e0); # ID
  252. write_le32(169); # Size
  253. write_hunk_fix_endian(867312, 169);
  254. #
  255. # Firmware 18, type: STD FW (0x00000000), id: SECAM/K1 (0000000000200000), size: 161
  256. #
  257. write_le32(0x00000000); # Type
  258. write_le64(0x00000000, 0x00200000); # ID
  259. write_le32(161); # Size
  260. write_hunk_fix_endian(867488, 161);
  261. #
  262. # Firmware 19, type: STD FW MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169
  263. #
  264. write_le32(0x00000004); # Type
  265. write_le64(0x00000000, 0x00200000); # ID
  266. write_le32(169); # Size
  267. write_hunk_fix_endian(867656, 169);
  268. #
  269. # Firmware 20, type: STD FW (0x00000000), id: SECAM/K3 (0000000004000000), size: 161
  270. #
  271. write_le32(0x00000000); # Type
  272. write_le64(0x00000000, 0x04000000); # ID
  273. write_le32(161); # Size
  274. write_hunk_fix_endian(867832, 161);
  275. #
  276. # Firmware 21, type: STD FW MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169
  277. #
  278. write_le32(0x00000004); # Type
  279. write_le64(0x00000000, 0x04000000); # ID
  280. write_le32(169); # Size
  281. write_hunk_fix_endian(868000, 169);
  282. #
  283. # Firmware 22, type: STD FW D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149
  284. #
  285. write_le32(0x00010030); # Type
  286. write_le64(0x00000000, 0x00000000); # ID
  287. write_le32(149); # Size
  288. write_hunk_fix_endian(868176, 149);
  289. #
  290. # Firmware 23, type: STD FW D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149
  291. #
  292. write_le32(0x00000068); # Type
  293. write_le64(0x00000000, 0x00000000); # ID
  294. write_le32(149); # Size
  295. write_hunk_fix_endian(868336, 149);
  296. #
  297. # Firmware 24, type: STD FW D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149
  298. #
  299. write_le32(0x00000070); # Type
  300. write_le64(0x00000000, 0x00000000); # ID
  301. write_le32(149); # Size
  302. write_hunk_fix_endian(868488, 149);
  303. #
  304. # Firmware 25, type: STD FW D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149
  305. #
  306. write_le32(0x00000088); # Type
  307. write_le64(0x00000000, 0x00000000); # ID
  308. write_le32(149); # Size
  309. write_hunk_fix_endian(868648, 149);
  310. #
  311. # Firmware 26, type: STD FW D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149
  312. #
  313. write_le32(0x00000090); # Type
  314. write_le64(0x00000000, 0x00000000); # ID
  315. write_le32(149); # Size
  316. write_hunk_fix_endian(868800, 149);
  317. #
  318. # Firmware 27, type: STD FW D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149
  319. #
  320. write_le32(0x00000108); # Type
  321. write_le64(0x00000000, 0x00000000); # ID
  322. write_le32(149); # Size
  323. write_hunk_fix_endian(868960, 149);
  324. #
  325. # Firmware 28, type: STD FW D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149
  326. #
  327. write_le32(0x00000110); # Type
  328. write_le64(0x00000000, 0x00000000); # ID
  329. write_le32(149); # Size
  330. write_hunk_fix_endian(869112, 149);
  331. #
  332. # Firmware 29, type: STD FW D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149
  333. #
  334. write_le32(0x00000208); # Type
  335. write_le64(0x00000000, 0x00000000); # ID
  336. write_le32(149); # Size
  337. write_hunk_fix_endian(868648, 149);
  338. #
  339. # Firmware 30, type: STD FW D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149
  340. #
  341. write_le32(0x00000210); # Type
  342. write_le64(0x00000000, 0x00000000); # ID
  343. write_le32(149); # Size
  344. write_hunk_fix_endian(868800, 149);
  345. #
  346. # Firmware 31, type: STD FW FM (0x00000400), id: (0000000000000000), size: 135
  347. #
  348. write_le32(0x00000400); # Type
  349. write_le64(0x00000000, 0x00000000); # ID
  350. write_le32(135); # Size
  351. write_hunk_fix_endian(869584, 135);
  352. #
  353. # Firmware 32, type: STD FW (0x00000000), id: PAL/I (0000000000000010), size: 161
  354. #
  355. write_le32(0x00000000); # Type
  356. write_le64(0x00000000, 0x00000010); # ID
  357. write_le32(161); # Size
  358. write_hunk_fix_endian(869728, 161);
  359. #
  360. # Firmware 33, type: STD FW MTS (0x00000004), id: PAL/I (0000000000000010), size: 169
  361. #
  362. write_le32(0x00000004); # Type
  363. write_le64(0x00000000, 0x00000010); # ID
  364. write_le32(169); # Size
  365. write_hunk_fix_endian(869896, 169);
  366. #
  367. # Firmware 34, type: STD FW (0x00000000), id: SECAM/L AM (0000001000400000), size: 169
  368. #
  369. write_le32(0x00000000); # Type
  370. write_le64(0x00000010, 0x00400000); # ID
  371. write_le32(169); # Size
  372. write_hunk_fix_endian(870072, 169);
  373. #
  374. # Firmware 35, type: STD FW (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161
  375. #
  376. write_le32(0x00000000); # Type
  377. write_le64(0x0000000c, 0x00400000); # ID
  378. write_le32(161); # Size
  379. write_hunk_fix_endian(870248, 161);
  380. #
  381. # Firmware 36, type: STD FW (0x00000000), id: SECAM/Lc (0000000000800000), size: 161
  382. #
  383. write_le32(0x00000000); # Type
  384. write_le64(0x00000000, 0x00800000); # ID
  385. write_le32(161); # Size
  386. write_hunk_fix_endian(870416, 161);
  387. #
  388. # Firmware 37, type: STD FW (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161
  389. #
  390. write_le32(0x00000000); # Type
  391. write_le64(0x00000000, 0x00008000); # ID
  392. write_le32(161); # Size
  393. write_hunk_fix_endian(870584, 161);
  394. #
  395. # Firmware 38, type: STD FW LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161
  396. #
  397. write_le32(0x00001000); # Type
  398. write_le64(0x00000000, 0x00008000); # ID
  399. write_le32(161); # Size
  400. write_hunk_fix_endian(870752, 161);
  401. #
  402. # Firmware 39, type: STD FW LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161
  403. #
  404. write_le32(0x00003000); # Type
  405. write_le64(0x00000000, 0x00008000); # ID
  406. write_le32(161); # Size
  407. write_hunk_fix_endian(870920, 161);
  408. #
  409. # Firmware 40, type: STD FW MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169
  410. #
  411. write_le32(0x00000004); # Type
  412. write_le64(0x00000000, 0x00008000); # ID
  413. write_le32(169); # Size
  414. write_hunk_fix_endian(871088, 169);
  415. #
  416. # Firmware 41, type: STD FW (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
  417. #
  418. write_le32(0x00000000); # Type
  419. write_le64(0x00000000, 0x0000b700); # ID
  420. write_le32(161); # Size
  421. write_hunk_fix_endian(871264, 161);
  422. #
  423. # Firmware 42, type: STD FW LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
  424. #
  425. write_le32(0x00001000); # Type
  426. write_le64(0x00000000, 0x0000b700); # ID
  427. write_le32(161); # Size
  428. write_hunk_fix_endian(871432, 161);
  429. #
  430. # Firmware 43, type: STD FW LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
  431. #
  432. write_le32(0x00003000); # Type
  433. write_le64(0x00000000, 0x0000b700); # ID
  434. write_le32(161); # Size
  435. write_hunk_fix_endian(871600, 161);
  436. #
  437. # Firmware 44, type: STD FW (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161
  438. #
  439. write_le32(0x00000000); # Type
  440. write_le64(0x00000000, 0x00002000); # ID
  441. write_le32(161); # Size
  442. write_hunk_fix_endian(871264, 161);
  443. #
  444. # Firmware 45, type: STD FW MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
  445. #
  446. write_le32(0x00000004); # Type
  447. write_le64(0x00000000, 0x0000b700); # ID
  448. write_le32(169); # Size
  449. write_hunk_fix_endian(871936, 169);
  450. #
  451. # Firmware 46, type: STD FW MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
  452. #
  453. write_le32(0x00001004); # Type
  454. write_le64(0x00000000, 0x0000b700); # ID
  455. write_le32(169); # Size
  456. write_hunk_fix_endian(872112, 169);
  457. #
  458. # Firmware 47, type: STD FW MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
  459. #
  460. write_le32(0x00003004); # Type
  461. write_le64(0x00000000, 0x0000b700); # ID
  462. write_le32(169); # Size
  463. write_hunk_fix_endian(872288, 169);
  464. #
  465. # Firmware 48, type: SCODE FW HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192
  466. #
  467. write_le32(0x60000000); # Type
  468. write_le64(0x00000000, 0x00000000); # ID
  469. write_le16(3280); # IF
  470. write_le32(192); # Size
  471. write_hunk(811896, 192);
  472. #
  473. # Firmware 49, type: SCODE FW HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192
  474. #
  475. write_le32(0x60000000); # Type
  476. write_le64(0x00000000, 0x00000000); # ID
  477. write_le16(3300); # IF
  478. write_le32(192); # Size
  479. write_hunk(813048, 192);
  480. #
  481. # Firmware 50, type: SCODE FW HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192
  482. #
  483. write_le32(0x60000000); # Type
  484. write_le64(0x00000000, 0x00000000); # ID
  485. write_le16(3440); # IF
  486. write_le32(192); # Size
  487. write_hunk(812280, 192);
  488. #
  489. # Firmware 51, type: SCODE FW HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192
  490. #
  491. write_le32(0x60000000); # Type
  492. write_le64(0x00000000, 0x00000000); # ID
  493. write_le16(3460); # IF
  494. write_le32(192); # Size
  495. write_hunk(812472, 192);
  496. #
  497. # Firmware 52, type: SCODE FW DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192
  498. #
  499. write_le32(0x60210020); # Type
  500. write_le64(0x00000000, 0x00000000); # ID
  501. write_le16(3800); # IF
  502. write_le32(192); # Size
  503. write_hunk(809784, 192);
  504. #
  505. # Firmware 53, type: SCODE FW HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192
  506. #
  507. write_le32(0x60000000); # Type
  508. write_le64(0x00000000, 0x00000000); # ID
  509. write_le16(4000); # IF
  510. write_le32(192); # Size
  511. write_hunk(812088, 192);
  512. #
  513. # Firmware 54, type: SCODE FW DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192
  514. #
  515. write_le32(0x60410020); # Type
  516. write_le64(0x00000000, 0x00000000); # ID
  517. write_le16(4080); # IF
  518. write_le32(192); # Size
  519. write_hunk(809976, 192);
  520. #
  521. # Firmware 55, type: SCODE FW HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192
  522. #
  523. write_le32(0x60000000); # Type
  524. write_le64(0x00000000, 0x00000000); # ID
  525. write_le16(4200); # IF
  526. write_le32(192); # Size
  527. write_hunk(811704, 192);
  528. #
  529. # Firmware 56, type: SCODE FW MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192
  530. #
  531. write_le32(0x60008000); # Type
  532. write_le64(0x00000000, 0x00008000); # ID
  533. write_le16(4320); # IF
  534. write_le32(192); # Size
  535. write_hunk(808056, 192);
  536. #
  537. # Firmware 57, type: SCODE FW HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192
  538. #
  539. write_le32(0x60000000); # Type
  540. write_le64(0x00000000, 0x00000000); # ID
  541. write_le16(4450); # IF
  542. write_le32(192); # Size
  543. write_hunk(812664, 192);
  544. #
  545. # Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
  546. #
  547. write_le32(0x6002b004); # Type
  548. write_le64(0x00000000, 0x0000b700); # ID
  549. write_le16(4500); # IF
  550. write_le32(192); # Size
  551. write_hunk(807672, 192);
  552. #
  553. # Firmware 59, type: SCODE FW LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192
  554. #
  555. write_le32(0x60023000); # Type
  556. write_le64(0x00000000, 0x00008000); # ID
  557. write_le16(4600); # IF
  558. write_le32(192); # Size
  559. write_hunk(807864, 192);
  560. #
  561. # Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
  562. #
  563. write_le32(0x620003e0); # Type
  564. write_le64(0x00000000, 0x00000000); # ID
  565. write_le16(4760); # IF
  566. write_le32(192); # Size
  567. write_hunk(807288, 192);
  568. #
  569. # Firmware 61, type: SCODE FW HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192
  570. #
  571. write_le32(0x60000000); # Type
  572. write_le64(0x00000000, 0x00000000); # ID
  573. write_le16(4940); # IF
  574. write_le32(192); # Size
  575. write_hunk(811512, 192);
  576. #
  577. # Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
  578. #
  579. write_le32(0x60000000); # Type
  580. write_le64(0x00000000, 0x00000000); # ID
  581. write_le16(5260); # IF
  582. write_le32(192); # Size
  583. write_hunk(810552, 192);
  584. #
  585. # Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192
  586. #
  587. write_le32(0x60008000); # Type
  588. write_le64(0x0000000f, 0x00000007); # ID
  589. write_le16(5320); # IF
  590. write_le32(192); # Size
  591. write_hunk(810744, 192);
  592. #
  593. # Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
  594. #
  595. write_le32(0x65000380); # Type
  596. write_le64(0x00000000, 0x00000000); # ID
  597. write_le16(5400); # IF
  598. write_le32(192); # Size
  599. write_hunk(807096, 192);
  600. #
  601. # Firmware 65, type: SCODE FW DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192
  602. #
  603. write_le32(0x60110020); # Type
  604. write_le64(0x00000000, 0x00000000); # ID
  605. write_le16(5580); # IF
  606. write_le32(192); # Size
  607. write_hunk(809592, 192);
  608. #
  609. # Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192
  610. #
  611. write_le32(0x60000000); # Type
  612. write_le64(0x00000003, 0x00000007); # ID
  613. write_le16(5640); # IF
  614. write_le32(192); # Size
  615. write_hunk(808440, 192);
  616. #
  617. # Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192
  618. #
  619. write_le32(0x60000000); # Type
  620. write_le64(0x0000000c, 0x00000007); # ID
  621. write_le16(5740); # IF
  622. write_le32(192); # Size
  623. write_hunk(808632, 192);
  624. #
  625. # Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
  626. #
  627. write_le32(0x60000000); # Type
  628. write_le64(0x00000000, 0x00000000); # ID
  629. write_le16(5900); # IF
  630. write_le32(192); # Size
  631. write_hunk(810360, 192);
  632. #
  633. # Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
  634. #
  635. write_le32(0x60008000); # Type
  636. write_le64(0x0000000c, 0x04c000f0); # ID
  637. write_le16(6000); # IF
  638. write_le32(192); # Size
  639. write_hunk(808824, 192);
  640. #
  641. # Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
  642. #
  643. write_le32(0x68050060); # Type
  644. write_le64(0x00000000, 0x00000000); # ID
  645. write_le16(6200); # IF
  646. write_le32(192); # Size
  647. write_hunk(809400, 192);
  648. #
  649. # Firmware 71, type: SCODE FW HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192
  650. #
  651. write_le32(0x60000000); # Type
  652. write_le64(0x00000000, 0x00000010); # ID
  653. write_le16(6240); # IF
  654. write_le32(192); # Size
  655. write_hunk(808248, 192);
  656. #
  657. # Firmware 72, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192
  658. #
  659. write_le32(0x60008000); # Type
  660. write_le64(0x00000000, 0x00200000); # ID
  661. write_le16(6320); # IF
  662. write_le32(192); # Size
  663. write_hunk(811320, 192);
  664. #
  665. # Firmware 73, type: SCODE FW HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192
  666. #
  667. write_le32(0x60000000); # Type
  668. write_le64(0x00000000, 0x00200000); # ID
  669. write_le16(6340); # IF
  670. write_le32(192); # Size
  671. write_hunk(809208, 192);
  672. #
  673. # Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
  674. #
  675. write_le32(0x60008000); # Type
  676. write_le64(0x0000000c, 0x044000e0); # ID
  677. write_le16(6500); # IF
  678. write_le32(192); # Size
  679. write_hunk(811128, 192);
  680. #
  681. # Firmware 75, type: SCODE FW DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192
  682. #
  683. write_le32(0x60090020); # Type
  684. write_le64(0x00000000, 0x00000000); # ID
  685. write_le16(6580); # IF
  686. write_le32(192); # Size
  687. write_hunk(807480, 192);
  688. #
  689. # Firmware 76, type: SCODE FW HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192
  690. #
  691. write_le32(0x60000000); # Type
  692. write_le64(0x00000003, 0x000000e0); # ID
  693. write_le16(6600); # IF
  694. write_le32(192); # Size
  695. write_hunk(809016, 192);
  696. #
  697. # Firmware 77, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192
  698. #
  699. write_le32(0x60008000); # Type
  700. write_le64(0x00000003, 0x000000e0); # ID
  701. write_le16(6680); # IF
  702. write_le32(192); # Size
  703. write_hunk(810936, 192);
  704. #
  705. # Firmware 78, type: SCODE FW DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192
  706. #
  707. write_le32(0x60810020); # Type
  708. write_le64(0x00000000, 0x00000000); # ID
  709. write_le16(8140); # IF
  710. write_le32(192); # Size
  711. write_hunk(810168, 192);
  712. #
  713. # Firmware 79, type: SCODE FW HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192
  714. #
  715. write_le32(0x60000000); # Type
  716. write_le64(0x00000000, 0x00000000); # ID
  717. write_le16(8200); # IF
  718. write_le32(192); # Size
  719. write_hunk(812856, 192);
  720. }
  721. sub extract_firmware {
  722. my $sourcefile = "hcw85bda.sys";
  723. my $hash = "0e44dbf63bb0169d57446aec21881ff2";
  724. my $outfile = "xc3028-v27.fw";
  725. my $name = "xc2028 firmware";
  726. my $version = 519;
  727. my $nr_desc = 80;
  728. my $out;
  729. verify($sourcefile, $hash);
  730. open INFILE, "<$sourcefile";
  731. main_firmware($outfile, $name, $version, $nr_desc);
  732. close INFILE;
  733. }
  734. extract_firmware;
  735. printf "Firmwares generated.\n";