[linux-dvb] Extract tool for xc3028 firmware

Mauro Carvalho Chehab mchehab at infradead.org
Tue Jan 1 12:29:18 CET 2008


On Mon, 31 Dec 2007 14:57:18 +0000
"Aidan Thornton" <makosoft at googlemail.com> wrote:

> 
> 
> On 12/31/07, Mauro Carvalho Chehab <mchehab at infradead.org> wrote:
> > On Mon, 31 Dec 2007 03:34:56 -0200
> > Mauro Carvalho Chehab <mchehab at infradead.org> wrote:
> > 
> > > I've just added an extraction tool to allow retrieving xc2028/3028
> > firmwares
> > > from HVR-12x0 windows file.
> > > 
> > > In order to use, you need to:
> > >       1) Download the windows driver with something like:
> > >               wget
> > http://www.steventoth.net/linux/xc5000/HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip
> > >       2) Extract the file hcw85bda.sys from the zip into the current dir:
> > >               unzip -j HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip
> > Driver85/hcw85bda.sys
> > >       3) run the script:
> > >               ./extract_xc3028.pl
> > >       4) copy the generated file:
> > >               cp xc3028-v27.fw /lib/firmware
> > > 
> > > I've also added the tool at linux/Documentation/video4linux.
> > > 
> > > This firmware is known to work with most xc2028/xc3028 devices. Please
> > test.
> > 
> > Sorry for a big message like this. Only after sending, I realized that the
> > extracting tool were so badly optimized.
> > 
> > Anyway, I've optimized the script. It has now only 14Kb. It basically writes
> > the header for each firmware, with the firmware type, supported standard IDs
> > and its size. Then, it copies the entire firmwares from HVR driver.
> > Something
> > like this:
> >         #
> >         # Firmware 9, type: STD FW    MTS (0x00000004), id: PAL/BG A2/B
> > (0000000200000007), size: 169
> >         #
> > 
> >         write_le32(4);				# Type: MTS (0x00000004)
> >         write_le64(8589934599);			# Id: PAL/BG A2/B (0000000200000007)
> >         write_le32(169);			# Size: 169
> >         write_hunk_fix_endian(865592, 169);	# Get the firmware from position
> > 865592
> > 
> > Since ID has 64 bits, I suspect that this perl script works fine only on 64
> > bit kernels. Probably, we need to use Math::BigInt for this to work on 32
> > bit
> > kernels.

OK, I've replaced the 64 bit integer by two 32 bit ints:

        # Firmware 77, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192
        #

        write_le32(0x60008000);                 # Type
        write_le64(0x00000003, 0x000000e0);     # ID
        write_le16(6680);                       # IF
        write_le32(192);                        # Size
        write_hunk(810936, 192);

This should work fine also on 32 bit machines. Tested here.

Cheers,
Mauro



More information about the linux-dvb mailing list