diff options
| -rw-r--r-- | Documentation/dvb/get_dvb_firmware | 61 | ||||
| -rw-r--r-- | Documentation/dvb/opera-firmware.txt | 27 | ||||
| -rw-r--r-- | drivers/media/dvb/dvb-usb/opera1.c | 17 |
3 files changed, 97 insertions, 8 deletions
diff --git a/Documentation/dvb/get_dvb_firmware b/Documentation/dvb/get_dvb_firmware index e32f79e05c85..b4d306ae9234 100644 --- a/Documentation/dvb/get_dvb_firmware +++ b/Documentation/dvb/get_dvb_firmware | |||
| @@ -24,7 +24,8 @@ use IO::Handle; | |||
| 24 | @components = ( "sp8870", "sp887x", "tda10045", "tda10046", | 24 | @components = ( "sp8870", "sp887x", "tda10045", "tda10046", |
| 25 | "tda10046lifeview", "av7110", "dec2000t", "dec2540t", | 25 | "tda10046lifeview", "av7110", "dec2000t", "dec2540t", |
| 26 | "dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004", | 26 | "dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004", |
| 27 | "or51211", "or51132_qam", "or51132_vsb", "bluebird"); | 27 | "or51211", "or51132_qam", "or51132_vsb", "bluebird", |
| 28 | "opera1"); | ||
| 28 | 29 | ||
| 29 | # Check args | 30 | # Check args |
| 30 | syntax() if (scalar(@ARGV) != 1); | 31 | syntax() if (scalar(@ARGV) != 1); |
| @@ -210,6 +211,45 @@ sub dec3000s { | |||
| 210 | 211 | ||
| 211 | $outfile; | 212 | $outfile; |
| 212 | } | 213 | } |
| 214 | sub opera1{ | ||
| 215 | my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0); | ||
| 216 | |||
| 217 | checkstandard(); | ||
| 218 | my $fwfile1="dvb-usb-opera1-fpga-01.fw"; | ||
| 219 | my $fwfile2="dvb-usb-opera-01.fw"; | ||
| 220 | extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw"); | ||
| 221 | extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1"); | ||
| 222 | extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2"); | ||
| 223 | delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1"); | ||
| 224 | delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1"); | ||
| 225 | verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70"); | ||
| 226 | verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1"); | ||
| 227 | verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d"); | ||
| 228 | |||
| 229 | my $RES1="\x01\x92\x7f\x00\x01\x00"; | ||
| 230 | my $RES0="\x01\x92\x7f\x00\x00\x00"; | ||
| 231 | my $DAT1="\x01\x00\xe6\x00\x01\x00"; | ||
| 232 | my $DAT0="\x01\x00\xe6\x00\x00\x00"; | ||
| 233 | open FW,">$tmpdir/opera.fw"; | ||
| 234 | print FW "$RES1"; | ||
| 235 | print FW "$DAT1"; | ||
| 236 | print FW "$RES1"; | ||
| 237 | print FW "$DAT1"; | ||
| 238 | appendfile(FW,"$tmpdir/fw1part1-1"); | ||
| 239 | print FW "$RES0"; | ||
| 240 | print FW "$DAT0"; | ||
| 241 | print FW "$RES1"; | ||
| 242 | print FW "$DAT1"; | ||
| 243 | appendfile(FW,"$tmpdir/fw1part2-1"); | ||
| 244 | print FW "$RES1"; | ||
| 245 | print FW "$DAT1"; | ||
| 246 | print FW "$RES0"; | ||
| 247 | print FW "$DAT0"; | ||
| 248 | copy ("$tmpdir/opera1-fpga.fw",$fwfile1); | ||
| 249 | copy ("$tmpdir/opera.fw",$fwfile2); | ||
| 250 | |||
| 251 | $fwfile1.",".$fwfile2; | ||
| 252 | } | ||
| 213 | 253 | ||
| 214 | sub vp7041 { | 254 | sub vp7041 { |
| 215 | my $sourcefile = "2.422.zip"; | 255 | my $sourcefile = "2.422.zip"; |
| @@ -440,6 +480,25 @@ sub appendfile { | |||
| 440 | close(INFILE); | 480 | close(INFILE); |
| 441 | } | 481 | } |
| 442 | 482 | ||
| 483 | sub delzero{ | ||
| 484 | my ($infile,$outfile) =@_; | ||
| 485 | |||
| 486 | open INFILE,"<$infile"; | ||
| 487 | open OUTFILE,">$outfile"; | ||
| 488 | while (1){ | ||
| 489 | $rcount=sysread(INFILE,$buf,22); | ||
| 490 | $len=ord(substr($buf,0,1)); | ||
| 491 | print OUTFILE substr($buf,0,1); | ||
| 492 | print OUTFILE substr($buf,2,$len+3); | ||
| 493 | last if ($rcount<1); | ||
| 494 | printf OUTFILE "%c",0; | ||
| 495 | #print $len." ".length($buf)."\n"; | ||
| 496 | |||
| 497 | } | ||
| 498 | close(INFILE); | ||
| 499 | close(OUTFILE); | ||
| 500 | } | ||
| 501 | |||
| 443 | sub syntax() { | 502 | sub syntax() { |
| 444 | print STDERR "syntax: get_dvb_firmware <component>\n"; | 503 | print STDERR "syntax: get_dvb_firmware <component>\n"; |
| 445 | print STDERR "Supported components:\n"; | 504 | print STDERR "Supported components:\n"; |
diff --git a/Documentation/dvb/opera-firmware.txt b/Documentation/dvb/opera-firmware.txt new file mode 100644 index 000000000000..93e784c2607b --- /dev/null +++ b/Documentation/dvb/opera-firmware.txt | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | To extract the firmware for the Opera DVB-S1 USB-Box | ||
| 2 | you need to copy the files: | ||
| 3 | |||
| 4 | 2830SCap2.sys | ||
| 5 | 2830SLoad2.sys | ||
| 6 | |||
| 7 | from the windriver disk into this directory. | ||
| 8 | |||
| 9 | Then run | ||
| 10 | |||
| 11 | ./get_dvb_firware opera1 | ||
| 12 | |||
| 13 | and after that you have 2 files: | ||
| 14 | |||
| 15 | dvb-usb-opera-01.fw | ||
| 16 | dvb-usb-opera1-fpga-01.fw | ||
| 17 | |||
| 18 | in here. | ||
| 19 | |||
| 20 | Copy them into /lib/firmware/ . | ||
| 21 | |||
| 22 | After that the driver can load the firmware | ||
| 23 | (if you have enabled firmware loading | ||
| 24 | in kernel config and have hotplug running). | ||
| 25 | |||
| 26 | |||
| 27 | Marco Gittler <g.marco@freenet.de> \ No newline at end of file | ||
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c index cdb02218ca6a..d7c04951ceab 100644 --- a/drivers/media/dvb/dvb-usb/opera1.c +++ b/drivers/media/dvb/dvb-usb/opera1.c | |||
| @@ -435,9 +435,9 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev, | |||
| 435 | { | 435 | { |
| 436 | const struct firmware *fw = NULL; | 436 | const struct firmware *fw = NULL; |
| 437 | u8 *b, *p; | 437 | u8 *b, *p; |
| 438 | int ret = 0, i; | 438 | int ret = 0, i,fpgasize=40; |
| 439 | u8 testval; | 439 | u8 testval; |
| 440 | info("start downloading fpga firmware"); | 440 | info("start downloading fpga firmware %s",filename); |
| 441 | 441 | ||
| 442 | if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) { | 442 | if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) { |
| 443 | err("did not find the firmware file. (%s) " | 443 | err("did not find the firmware file. (%s) " |
| @@ -454,17 +454,20 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev, | |||
| 454 | /* clear fpga ? */ | 454 | /* clear fpga ? */ |
| 455 | opera1_xilinx_rw(dev, 0xbc, 0xaa, &fpga_command, 1, | 455 | opera1_xilinx_rw(dev, 0xbc, 0xaa, &fpga_command, 1, |
| 456 | OPERA_WRITE_MSG); | 456 | OPERA_WRITE_MSG); |
| 457 | for (i = 0; p[i] != 0 && i < fw->size;) { | 457 | for (i = 0; i < fw->size;) { |
| 458 | if ( (fw->size - i) <fpgasize){ | ||
| 459 | fpgasize=fw->size-i; | ||
| 460 | } | ||
| 458 | b = (u8 *) p + i; | 461 | b = (u8 *) p + i; |
| 459 | if (opera1_xilinx_rw | 462 | if (opera1_xilinx_rw |
| 460 | (dev, OPERA_WRITE_FX2, 0x0, b + 1, b[0], | 463 | (dev, OPERA_WRITE_FX2, 0x0, b , fpgasize, |
| 461 | OPERA_WRITE_MSG) != b[0] | 464 | OPERA_WRITE_MSG) != fpgasize |
| 462 | ) { | 465 | ) { |
| 463 | err("error while transferring firmware"); | 466 | err("error while transferring firmware"); |
| 464 | ret = -EINVAL; | 467 | ret = -EINVAL; |
| 465 | break; | 468 | break; |
| 466 | } | 469 | } |
| 467 | i = i + 1 + b[0]; | 470 | i = i + fpgasize; |
| 468 | } | 471 | } |
| 469 | /* restart the CPU */ | 472 | /* restart the CPU */ |
| 470 | if (ret || opera1_xilinx_rw | 473 | if (ret || opera1_xilinx_rw |
| @@ -538,7 +541,7 @@ static int opera1_probe(struct usb_interface *intf, | |||
| 538 | 541 | ||
| 539 | if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && | 542 | if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && |
| 540 | udev->descriptor.idVendor == USB_VID_OPERA1 && | 543 | udev->descriptor.idVendor == USB_VID_OPERA1 && |
| 541 | opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga.fw") != 0 | 544 | opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga-01.fw") != 0 |
| 542 | ) { | 545 | ) { |
| 543 | return -EINVAL; | 546 | return -EINVAL; |
| 544 | } | 547 | } |
