Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 273598
b: refs/heads/master
c: e54d081
h: refs/heads/master
v: v3
  • Loading branch information
Devin Heitmueller authored and Mauro Carvalho Chehab committed Nov 3, 2011
1 parent c617ae0 commit 6e1aeb2
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 44 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c6ccdca9801604e9e2797677f1a78c2c534b2f1f
refs/heads/master: e54d081dacdcdee7d10c1f87bacce89044519c5c
101 changes: 58 additions & 43 deletions trunk/drivers/staging/media/as102/as102_fw.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Abilis Systems Single DVB-T Receiver
* Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com>
* Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -31,15 +32,16 @@ char as102_st_fw2[] = "as102_data2_st.hex";
char as102_dt_fw1[] = "as102_data1_dt.hex";
char as102_dt_fw2[] = "as102_data2_dt.hex";

static unsigned char atohx(unsigned char *dst, char *src) {
static unsigned char atohx(unsigned char *dst, char *src)
{
unsigned char value = 0;

char msb = tolower(*src) - '0';
char lsb = tolower(*(src +1)) - '0';
char lsb = tolower(*(src + 1)) - '0';

if (msb > 9 )
if (msb > 9)
msb -= 7;
if (lsb > 9 )
if (lsb > 9)
lsb -= 7;

*dst = value = ((msb & 0xF) << 4) | (lsb & 0xF);
Expand All @@ -62,43 +64,42 @@ static int parse_hex_line(unsigned char *fw_data, unsigned char *addr,
}

/* locate end of line */
for (src=fw_data; *src != '\n'; src += 2) {
for (src = fw_data; *src != '\n'; src += 2) {
atohx(&dst, src);
/* parse line to split addr / data */
switch (count) {
case 0:
*dataLength = dst;
break;
case 1:
addr[2] = dst;
break;
case 2:
addr[3] = dst;
break;
case 3:
/* check if data is an address */
if (dst == 0x04)
*addr_has_changed = 1;
else
*addr_has_changed = 0;
break;
case 4:
case 5:
if (*addr_has_changed) {
addr[(count - 4)] = dst;
} else {
data[(count - 4)] = dst;
}
break;
default:
case 0:
*dataLength = dst;
break;
case 1:
addr[2] = dst;
break;
case 2:
addr[3] = dst;
break;
case 3:
/* check if data is an address */
if (dst == 0x04)
*addr_has_changed = 1;
else
*addr_has_changed = 0;
break;
case 4:
case 5:
if (*addr_has_changed)
addr[(count - 4)] = dst;
else
data[(count - 4)] = dst;
break;
break;
default:
data[(count - 4)] = dst;
break;
}
count++;
}

/* return read value + ':' + '\n' */
return ((count * 2) + 2);
return (count * 2) + 2;
}

static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,
Expand All @@ -122,17 +123,20 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,
&data_len,
&addr_has_changed);

if (read_bytes <= 0) {
if (read_bytes <= 0)
goto error;
}

/* detect the end of file */
if ((total_read_bytes += read_bytes) == firmware->size) {
total_read_bytes += read_bytes;
if (total_read_bytes == firmware->size) {
fw_pkt.u.request[0] = 0x00;
fw_pkt.u.request[1] = 0x03;

/* send EOF command */
if ((errno = bus_adap->ops->upload_fw_pkt(bus_adap,(uint8_t *) &fw_pkt, 2, 0)) < 0)
errno = bus_adap->ops->upload_fw_pkt(bus_adap,
(uint8_t *)
&fw_pkt, 2, 0);
if (errno < 0)
goto error;
} else {
if (!addr_has_changed) {
Expand All @@ -144,7 +148,12 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,
data_len += sizeof(fw_pkt.raw.address);

/* send cmd to device */
if ((errno = bus_adap->ops->upload_fw_pkt(bus_adap, (uint8_t *) &fw_pkt, data_len, 0)) < 0)
errno = bus_adap->ops->upload_fw_pkt(bus_adap,
(uint8_t *)
&fw_pkt,
data_len,
0);
if (errno < 0)
goto error;
}
}
Expand All @@ -154,7 +163,8 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,
return (errno == 0) ? total_read_bytes : errno;
}

int as102_fw_upload(struct as102_bus_adapter_t *bus_adap) {
int as102_fw_upload(struct as102_bus_adapter_t *bus_adap)
{
int errno = -EFAULT;
const struct firmware *firmware;
unsigned char *cmd_buf = NULL;
Expand All @@ -179,20 +189,23 @@ int as102_fw_upload(struct as102_bus_adapter_t *bus_adap) {

#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
/* allocate buffer to store firmware upload command and data */
if ((cmd_buf = kzalloc(MAX_FW_PKT_SIZE, GFP_KERNEL)) == NULL) {
cmd_buf = kzalloc(MAX_FW_PKT_SIZE, GFP_KERNEL);
if (cmd_buf == NULL) {
errno = -ENOMEM;
goto error;
}

/* request kernel to locate firmware file: part1 */
if ((errno = request_firmware(&firmware, fw1, &dev->dev)) < 0) {
errno = request_firmware(&firmware, fw1, &dev->dev);
if (errno < 0) {
printk(KERN_ERR "%s: unable to locate firmware file: %s\n",
DRIVER_NAME, fw1);
goto error;
}

/* initiate firmware upload */
if ((errno = as102_firmware_upload(bus_adap, cmd_buf, firmware)) < 0) {
errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
if (errno < 0) {
printk(KERN_ERR "%s: error during firmware upload part1\n",
DRIVER_NAME);
goto error;
Expand All @@ -206,14 +219,16 @@ int as102_fw_upload(struct as102_bus_adapter_t *bus_adap) {
mdelay(100);

/* request kernel to locate firmware file: part2 */
if ((errno = request_firmware(&firmware, fw2, &dev->dev)) < 0) {
errno = request_firmware(&firmware, fw2, &dev->dev);
if (errno < 0) {
printk(KERN_ERR "%s: unable to locate firmware file: %s\n",
DRIVER_NAME, fw2);
goto error;
}

/* initiate firmware upload */
if ((errno = as102_firmware_upload(bus_adap, cmd_buf, firmware)) < 0) {
errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
if (errno < 0) {
printk(KERN_ERR "%s: error during firmware upload part2\n",
DRIVER_NAME);
goto error;
Expand Down

0 comments on commit 6e1aeb2

Please sign in to comment.