Skip to content

Commit

Permalink
[PATCH] dvb: tda10046: support for different firmware versions
Browse files Browse the repository at this point in the history
added support for different tda10046 firmware versions.  tested with v20, v21
and v25.  (Andreas Oberritter)

Signed-off-by: Johannes Stezenbach <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Johannes Stezenbach authored and Linus Torvalds committed May 17, 2005
1 parent 1dfb800 commit 71e3420
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
4 changes: 2 additions & 2 deletions Documentation/dvb/get_dvb_firmware
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,15 @@ sub tda10045 {
sub tda10046 {
my $sourcefile = "tt_budget_217g.zip";
my $url = "http://www.technotrend.de/new/217g/$sourcefile";
my $hash = "a25b579e37109af60f4a36c37893957c";
my $hash = "6a7e1e2f2644b162ff0502367553c72d";
my $outfile = "dvb-fe-tda10046.fw";
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);

checkstandard();

wgetfile($sourcefile, $url);
unzip($sourcefile, $tmpdir);
extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24479, "$tmpdir/fwtmp");
extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24478, "$tmpdir/fwtmp");
verify("$tmpdir/fwtmp", $hash);
copy("$tmpdir/fwtmp", $outfile);

Expand Down
36 changes: 34 additions & 2 deletions drivers/media/dvb/frontends/tda1004x.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ struct tda1004x_state {
/* private demod data */
u8 initialised;
enum tda1004x_demod demod_type;
u8 fw_version;
};


Expand Down Expand Up @@ -380,6 +381,25 @@ static int tda10045_fwupload(struct dvb_frontend* fe)
return tda1004x_check_upload_ok(state, 0x2c);
}

static int tda10046_get_fw_version(struct tda1004x_state *state,
const struct firmware *fw)
{
const unsigned char pattern[] = { 0x67, 0x00, 0x50, 0x62, 0x5e, 0x18, 0x67 };
unsigned int i;

/* area guessed from firmware v20, v21 and v25 */
for (i = 0x660; i < 0x700; i++) {
if (!memcmp(&fw->data[i], pattern, sizeof(pattern))) {
state->fw_version = fw->data[i + sizeof(pattern)];
printk(KERN_INFO "tda1004x: using firmware v%02x\n",
state->fw_version);
return 0;
}
}

return -EINVAL;
}

static int tda10046_fwupload(struct dvb_frontend* fe)
{
struct tda1004x_state* state = fe->demodulator_priv;
Expand All @@ -393,7 +413,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
msleep(100);

/* don't re-upload unless necessary */
if (tda1004x_check_upload_ok(state, 0x20) == 0)
if (tda1004x_check_upload_ok(state, state->fw_version) == 0)
return 0;

/* request the firmware, this will block until someone uploads it */
Expand All @@ -404,6 +424,17 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
return ret;
}

if (fw->size < 24478) { /* size of firmware v20, which is the smallest of v20, v21 and v25 */
printk("tda1004x: firmware file seems to be too small (%d bytes)\n", fw->size);
return -EINVAL;
}

ret = tda10046_get_fw_version(state, fw);
if (ret < 0) {
printk("tda1004x: unable to find firmware version\n");
return ret;
}

/* set parameters */
tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 10);
tda1004x_write_byteI(state, TDA10046H_CONFPLL3, state->config->n_i2c);
Expand All @@ -427,7 +458,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
msleep(1);
}

return tda1004x_check_upload_ok(state, 0x20);
return tda1004x_check_upload_ok(state, state->fw_version);
}

static int tda1004x_encode_fec(int fec)
Expand Down Expand Up @@ -1185,6 +1216,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops));
state->initialised = 0;
state->demod_type = TDA1004X_DEMOD_TDA10046;
state->fw_version = 0x20; /* dummy default value */

/* check if the demod is there */
if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) {
Expand Down

0 comments on commit 71e3420

Please sign in to comment.