diff options
author | Olli Salonen <olli.salonen@iki.fi> | 2014-11-27 14:42:23 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-12-04 11:00:01 -0500 |
commit | 1b97dc98b58dad98f13fa0a4cdc819b60f3f3bff (patch) | |
tree | 68e4f1d77a42384ccbf6b7e51951ff1ce065b249 | |
parent | a594cf21aa3c8e0e7510cbd316383fe6efb27f5c (diff) |
[media] si2168: add support for firmware files in new format
This patch adds support for new type of firmware versions of Si2168 chip.
Old type: n x 8 bytes (all data, first byte seems to be 04 or 05)
New type: n x 17 bytes (1 byte indicates len and max 16 bytes data)
New version of TechnoTrend CT2-4400 drivers
(http://www.tt-downloads.de/bda-treiber_4.3.0.0.zip) contains newer
firmware for Si2168-B40 that is in the new format. It can be extracted
with the following command:
dd if=ttTVStick4400_64.sys ibs=1 skip=323872 count=6919 of=dvb-demod-si2168-b40-01.fw
Signed-off-by: Olli Salonen <olli.salonen@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/dvb-frontends/si2168.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index 6da38e859cbc..ce9ab442b4b6 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c | |||
@@ -462,20 +462,38 @@ static int si2168_init(struct dvb_frontend *fe) | |||
462 | dev_info(&s->client->dev, "downloading firmware from file '%s'\n", | 462 | dev_info(&s->client->dev, "downloading firmware from file '%s'\n", |
463 | fw_file); | 463 | fw_file); |
464 | 464 | ||
465 | for (remaining = fw->size; remaining > 0; remaining -= i2c_wr_max) { | 465 | if ((fw->size % 17 == 0) && (fw->data[0] > 5)) { |
466 | len = remaining; | 466 | /* firmware is in the new format */ |
467 | if (len > i2c_wr_max) | 467 | for (remaining = fw->size; remaining > 0; remaining -= 17) { |
468 | len = i2c_wr_max; | 468 | len = fw->data[fw->size - remaining]; |
469 | 469 | memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len); | |
470 | memcpy(cmd.args, &fw->data[fw->size - remaining], len); | 470 | cmd.wlen = len; |
471 | cmd.wlen = len; | 471 | cmd.rlen = 1; |
472 | cmd.rlen = 1; | 472 | ret = si2168_cmd_execute(s, &cmd); |
473 | ret = si2168_cmd_execute(s, &cmd); | 473 | if (ret) { |
474 | if (ret) { | 474 | dev_err(&s->client->dev, |
475 | dev_err(&s->client->dev, | 475 | "firmware download failed=%d\n", |
476 | "firmware download failed=%d\n", | 476 | ret); |
477 | ret); | 477 | goto error_fw_release; |
478 | goto error_fw_release; | 478 | } |
479 | } | ||
480 | } else { | ||
481 | /* firmware is in the old format */ | ||
482 | for (remaining = fw->size; remaining > 0; remaining -= i2c_wr_max) { | ||
483 | len = remaining; | ||
484 | if (len > i2c_wr_max) | ||
485 | len = i2c_wr_max; | ||
486 | |||
487 | memcpy(cmd.args, &fw->data[fw->size - remaining], len); | ||
488 | cmd.wlen = len; | ||
489 | cmd.rlen = 1; | ||
490 | ret = si2168_cmd_execute(s, &cmd); | ||
491 | if (ret) { | ||
492 | dev_err(&s->client->dev, | ||
493 | "firmware download failed=%d\n", | ||
494 | ret); | ||
495 | goto error_fw_release; | ||
496 | } | ||
479 | } | 497 | } |
480 | } | 498 | } |
481 | 499 | ||