From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Malcolm Priestley <tvboxspy@gmail.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH] added support for DM040832731 DVB-S USB BOX - Correction
Date: Thu, 29 Jul 2010 15:18:12 -0300 [thread overview]
Message-ID: <4C51C5E4.2020406@redhat.com> (raw)
In-Reply-To: <AANLkTilIWY_jHqRQwejiP4-jkQBwFQjDMgH1riH7rsyq@mail.gmail.com>
Em 16-07-2010 10:43, Malcolm Priestley escreveu:
> DVB USB Driver for DM04 LME2510 + LG TDQY - P001F =(TDA8263 + TDA10086H)
>
> Corrected patch error.
>
> Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Hi Malcolm,
Please read the developers section of our Wiki page for instructions on how to submit
a driver:
http://linuxtv.org/wiki/index.php/Developer_Section
In special, you need to read what's inside "Submiting your work" in order to fix some
troubles I identified on your driver.
Cheers,
Mauro
>
>
>
> diff -r 9652f85e688a linux/drivers/media/dvb/dvb-usb/Kconfig
> --- a/linux/drivers/media/dvb/dvb-usb/Kconfig Thu May 27 02:02:09 2010 -0300
> +++ b/linux/drivers/media/dvb/dvb-usb/Kconfig Fri Jul 16 14:30:02 2010 +0100
> @@ -346,3 +346,13 @@
> select DVB_STB6100 if !DVB_FE_CUSTOMISE
> help
> Say Y here to support the AZ6027 device
> +
> +config DVB_USB_LME2510
> + tristate "LME DM04 (LME 2510 + TDQY-P001F) DVB-S USB2.0 support"
> + depends on DVB_USB
It needs to depend also on INPUT/IR_CORE
> + select DVB_TDA10086 if !DVB_FE_CUSTOMISE
> + select DVB_TDA826X if !DVB_FE_CUSTOMISE
> + help
> + Say Y here to support the LME DM04 DVB-S USB2.0 .
> +
> +
> diff -r 9652f85e688a linux/drivers/media/dvb/dvb-usb/Makefile
> --- a/linux/drivers/media/dvb/dvb-usb/Makefile Thu May 27 02:02:09 2010 -0300
> +++ b/linux/drivers/media/dvb/dvb-usb/Makefile Fri Jul 16 14:30:02 2010 +0100
> @@ -88,6 +88,9 @@
> dvb-usb-az6027-objs = az6027.o
> obj-$(CONFIG_DVB_USB_AZ6027) += dvb-usb-az6027.o
>
> +dvb-usb-lmedm04-objs = lmedm04.o
> +obj-$(CONFIG_DVB_USB_LME2510) += dvb-usb-lmedm04.o
> +
> EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
> # due to tuner-xc3028
> EXTRA_CFLAGS += -Idrivers/media/common/tuners
> diff -r 9652f85e688a linux/drivers/media/dvb/dvb-usb/lmedm04.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/linux/drivers/media/dvb/dvb-usb/lmedm04.c Fri Jul 16 14:30:02 2010 +0100
> @@ -0,0 +1,910 @@
> +/* DVB USB compliant linux driver for
> + *
> + * DM040832731 DVB-S USB BOX (LME 2510 + TDQY-P001F)
> + *
> + * MV001F LG TDQY - P001F =(TDA8263 + TDA10086H)
> + *
> + * I2C addresses:
> + * 0x0e - TDA10086 - Demodulator
> + * 0x60 - TDA8263 - Tuner
> + *
> + * ***Please Note***
> + * There are other variants of the DM04
> + * ***NOT SUPPORTED***
> + * MVB0001F (LME2510C+LGTDQT-P001F)
> + * MV0194 (LME2510+SHARP0194)
> + * MVB0194 (LME2510C+SHARP0194)
> + * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
> + *
> + * The VID of 3344 and PID of 1122 has not been set until it is known not
> + * to be generic.
> + *
> + *
> + * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
> + * LME2510 (C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
> + *
> + * 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 the Free
> + * Software Foundation, version 2.
> + *
> + *
> + * see Documentation/dvb/README.dvb-usb for more information
> + *
> + * Known Issue :
> + * Non Intel USB chipsets fail to maintain High Speed on Boot or Hot Plug
> + *
> + */
> +#define DVB_USB_LOG_PREFIX "LME2510"
> +#include <linux/usb.h>
> +#include <linux/usb/input.h>
> +#include "dvb-usb.h"
> +#include "lmedm04.h"
> +#include "tda826x.h"
> +#include "tda10086.h"
> +
> +/* debug */
> +static int dvb_usb_lme2510_debug;
> +#define l_dprintk(var, level, args...) \
> + do { if ((var >= level)) info(args); } while (0)
> +#define deb_info(level, args...) l_dprintk(dvb_usb_lme2510_debug, level, args)
> +#define debug_data_snipet(level, name, p) \
> + deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
> + *p, *(p+1), *(p+2), *(p+3), *(p+4), \
> + *(p+5), *(p+6), *(p+7));
> +
> +
> +module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."
> + DVB_USB_DEBUG_STATUS);
> +
> +DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
> +
> +
> +struct lme2510_state {
> + u8 id;
> + u8 signal_lock;
> + u8 signal_level;
> + u8 signal_sn;
> + u8 time_key;
> + u8 i2c_talk_onoff;
> + u16 pid_table[64];
> + u8 pid_count;
> + u8 pid_flag_enable;
> + u8 filter_data[256];
> + void *buffer;
> + struct urb *lme_urb;
> +
> +};
> +
> +static int lme2510_bulk_write(struct usb_device *dev,
> + u8 *snd, int len, u8 pipe)
> +{
> + int ret, actual_l;
> + ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
> + snd, len , &actual_l, 500);
> + return ret;
> +}
> +
> +static int lme2510_bulk_read(struct usb_device *dev,
> + u8 *rev, int len, u8 pipe)
> +{
> + int ret, actual_l;
> + ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
> + rev, len , &actual_l, 500);
> + return ret;
> +}
> +
> +static int lme2510_usb_talk(struct dvb_usb_device *d,
> + u8 *wbuf, int wlen, u8 *rbuf, int rlen)
> +{
> + u8 s[wlen+4], r[rlen+4];
This won't work fine. You should not use a buffer at stack to communicate with
USB, as those memory areas may not be able do handle DMA transfers. Instead, you
need to allocate a buffer for such transfers.
Also, the stack area on kernel is very small. you should not allocate a dynamic area
there, as this might cause buffer overflows, if you don't carefully check all clients
of this function.
> + int ret = 0;
> + memset(s, 0, wlen);
> + memset(r, 0, rlen);
No need, as you're copying data with memcpy bellow.
> + memcpy(&s[0], wbuf, wlen);
> +
> + ret = mutex_lock_interruptible(&d->usb_mutex);
> +
> + if (ret < 0)
> + return -EAGAIN;
> +
> + ret += usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, 0x01));
> + msleep(5);
> + ret += lme2510_bulk_write(d->udev, s, wlen , 0x1);
> +
> + msleep(5);
> + ret += usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x1));
> +
> + msleep(5);
> + ret += lme2510_bulk_read(d->udev, r, rlen , 0x1);
> +
> + if (rlen > 0)
> + memcpy(rbuf, &r[0], rlen);
> +
> + mutex_unlock(&d->usb_mutex);
> +
> + return (ret < 0) ? -EAGAIN : 0;
returing -EAGAIN is not good, as one of the reasons for this error may be due to device removal.
> +}
> +
> +static int lme2510_remote_keypress(struct dvb_usb_adapter *adap, u16 keypress)
> +{
> + struct dvb_usb_device *d = adap->dev;
> + u32 event = 0;
> +
> + switch (keypress) {
> + KEYCASE(LME_R_1, KEY_1);
> + break;
> + KEYCASE(LME_R_2, KEY_2);
> + break;
> + KEYCASE(LME_R_3, KEY_3);
> + break;
> + KEYCASE(LME_R_4, KEY_4);
> + break;
> + KEYCASE(LME_R_5, KEY_5);
> + break;
> + KEYCASE(LME_R_6, KEY_6);
> + break;
> + KEYCASE(LME_R_7, KEY_7);
> + break;
> + KEYCASE(LME_R_8, KEY_8);
> + break;
> + KEYCASE(LME_R_9, KEY_9);
> + break;
> + KEYCASE(LME_R_0, KEY_0);
> + break;
> + KEYCASE(LME_R_POWER, KEY_POWER);
> + break;
> + KEYCASE(LME_R_SUB, KEY_SUBTITLE);
> + break;
> + KEYCASE(LME_R_CAPTURE, KEY_PAUSE);
> + break;
> + KEYCASE(LME_R_REPEAT, KEY_MEDIA_REPEAT);
> + break;
> + KEYCASE(LME_R_PAUSE, KEY_PAUSE);
> + break;
> + KEYCASE(LME_R_VOL_D, KEY_VOLUMEDOWN);
> + break;
> + KEYCASE(LME_R_VOL_U, KEY_VOLUMEUP);
> + break;
> + KEYCASE(LME_R_CH_D, KEY_CHANNELDOWN);
> + break;
> + KEYCASE(LME_R_CH_U, KEY_CHANNELUP);
> + break;
> + KEYCASE(LME_R_PLAYBACK, KEY_PLAY);
> + break;
> + KEYCASE(LME_R_ZOOM, KEY_ZOOM);
> + break;
> + KEYCASE(LME_R_MUTE, KEY_MUTE);
> + break;
> + KEYCASE(LME_R_LIVETV, KEY_TV);
> + break;
> + KEYCASE(LME_R_RECORD, KEY_RECORD);
> + break;
> + KEYCASE(LME_R_EPG, KEY_EPG);
> + break;
> + KEYCASE(LME_R_STOP, KEY_STOPCD);
> + break;
> + default:
> + event = 0;
> + break;
This is ugly for several reasons:
1) it hides case reserved word;
2) the IR translation table cannot be customized;
3) we'll be moving all IR keytables to userspace.
The proper solution is to use the rc-core handler for IR. I'll be porting soon the DVB drivers
to use it, but you can find already some examples on some drivers under drivers/media/video (like
saa7134 and em28xx).
> +
> +
> +
> + }
> +
> + deb_info(1, "INT Key Pressed =%04x Event =%04x",
> + keypress, event);
> + if (event > 0) {
> + input_event(d->rc_input_dev, EV_KEY, event, 1);
> +
> + input_event(d->rc_input_dev, EV_KEY, event, 0);
> +
> + }
> +
> + return 0;
> +}
> +
> +static int lme2510_enable_filter(struct dvb_usb_adapter *adap)
> +{
> + struct lme2510_state *st = adap->dev->priv;
> + static u8 filter_init[] = LME_FILTER_INT;
> + static u8 filter_on[] = LME_ST_ON_W;
> + static u8 rbuf[1];
> + static u8 *sbuf;
> + int ret = 0, len = 5;
> + info("PID Setting Filter");
> +
> + sbuf = (u8 *) st->filter_data;
> +
> +
> + ret += lme2510_usb_talk(adap->dev, filter_init, len, rbuf, 1);
> +
> + ret += lme2510_usb_talk(adap->dev, sbuf, 80 , rbuf, 1);
> +
> + ret += lme2510_usb_talk(adap->dev, filter_on, len, rbuf, 1);
Please, don't use "magic numbers". Instead of using "1" for the rbuf size, use
sizeof(rbuf).
> +
> + st->pid_count = 0;
> + st->pid_flag_enable = 0;
> +
> + return ret;
> +}
> +
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
> +static void lme2510_int_response(struct urb *lme_urb, struct pt_regs *ptregs)
> +#else
> +static void lme2510_int_response(struct urb *lme_urb)
> +#endif
> +{
> + struct dvb_usb_adapter *adap = lme_urb->context;
> + struct lme2510_state *st = adap->dev->priv;
> + static u8 *ibuf, *rbuf;
> + int i = 0, offset;
> +
> + switch (lme_urb->status) {
> + case 0:
> + case -ETIMEDOUT:
> + break;
> + case -ECONNRESET:
> + case -ENOENT:
> + case -ESHUTDOWN:
> + return;
> + default:
> + info("Error %x", lme_urb->status);
> + break;
> + }
> +
> + rbuf = (u8 *) lme_urb->transfer_buffer;
> +
> + offset = ((lme_urb->actual_length/8) > 4)
> + ? 4 : (lme_urb->actual_length/8) ;
> +
> +
> + for (i = 0; i < offset; ++i) {
> + ibuf = (u8 *)&rbuf[i*8];
> + deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
> + offset, i, ibuf[0], ibuf[1]);
> +
> + switch (ibuf[0]) {
> + case 0xaa:
> + debug_data_snipet(1, "INT Remote data snipet in", ibuf);
> + lme2510_remote_keypress(adap,
> + (u16)(ibuf[4]<<8)+ibuf[5]);
> + break;
> + case 0xbb:
> + st->signal_lock = ibuf[2];
> + st->signal_level = ibuf[4];
> + st->signal_sn = ibuf[3];
> + st->time_key = ibuf[7];
> + break;
> + case 0xcc:
> + debug_data_snipet(1, "INT Control data snipet", ibuf);
> + break;
> + default:
> + debug_data_snipet(1, "INT Unknown data snipet", ibuf);
> + break;
> + }
> + }
> +usb_submit_urb(lme_urb, GFP_ATOMIC);
> +}
> +
> +static int lme2510_int_read(struct dvb_usb_adapter *adap)
> +{
> + struct lme2510_state *lme_int = adap->dev->priv;
> + lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);
> +
> + if (lme_int->lme_urb == NULL)
> + return -ENOMEM;
> +
> + lme_int->buffer = usb_buffer_alloc(adap->dev->udev, 5000, GFP_ATOMIC,
> + &lme_int->lme_urb->transfer_dma);
> +
> + if (lme_int->buffer == NULL)
> + return -ENOMEM;
> +
> + usb_fill_int_urb(lme_int->lme_urb,
> + adap->dev->udev,
> + usb_rcvintpipe(adap->dev->udev, 0xa),
> + lme_int->buffer,
> + 4096,
> + lme2510_int_response,
> + adap,
> + 11);
> +
> + lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
> +
> + usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
> + info("INT Interupt Service Started");
> +
> + return 0;
> +}
> +
> +static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
> +{
> + struct lme2510_state *st = adap->dev->priv;
> + static u8 clear_pid_reg_3[] = LME_CLEAR_PID;
> + static u8 rbuf[1];
> + int ret = 0;
> + deb_info(3, "PID ONOFF Filter talk =%04x onoff=%02x pid_flag%02x",
> + st->i2c_talk_onoff, onoff, st->pid_flag_enable);
> +
> + if (onoff == 0)
> + return 0;
> + else {
Don't need for an else block here.
> + deb_info(1, "PID Clearing Filter");
> + ret += lme2510_usb_talk(adap->dev,
> + clear_pid_reg_3, 4, rbuf, 1);
> + }
> + return 0;
> +
> +}
> +
> +static int lme2510_pidbuild_table(struct lme2510_state *st)
> +{
> + u8 buffer_complete[] = {0x00, 0x00, 0x01, 0x00, 0x02,
> + 0x00, 0x10, 0x00, 0x11, 0x00,
> + 0x12, 0x00, 0x13, 0x00, 0x14,
> + 0x00, 0x20, 0x9a};
> + u16 pid_out;
> + int j, i, b = 0, je, reg = 0;
> + u8 temp_buff[256];
> +
> + deb_info(1, "PID Building Table");
> +
> + j = 3;
> + temp_buff[0] = 0x03;
> + i = 2;
> + reg = 0;
> + while (j < 8) {
> + pid_out = st->pid_table[j++];
> + if (pid_out == 0x0012)
> + break;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = (u8) pid_out & 0xff;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = pid_out>>8;
> + };
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = 0xfb;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = 0x1f;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = st->pid_table[3]&0xff;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = st->pid_table[3]>>8;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = st->pid_table[2]&0xff;
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = st->pid_table[2]>>8;
> + j = i;
> + je = i+16;
> + while (j++ < je) {
> + temp_buff[i++] = reg++;
> + temp_buff[i++] = buffer_complete[b++];
> + };
> + temp_buff[i] = 0x20;
> + temp_buff[1] = i ;
> + temp_buff[++i] = 0x9a;
> +
> + memcpy(st->filter_data, &temp_buff[0], 255);
Bad identation. Always use tabs for identation. A tab has 8 spaces. The identation should
look like:
while (j++ < je) {
temp_buff[i++] = reg++;
temp_buff[i++] = buffer_complete[b++];
}
Also, don't use ; after }
Please check your patches with scripts/checkpatch.pl (found at the kernel tree).
There are Several CodingStyle troubles on your patch. You should also take a look
at
> +
> + deb_info(2, "PID T RAW WRITE DUMP-----");
> + for (i = 0; i < 10; i++)
> + debug_data_snipet(2, ">", &st->filter_data[i*8]);
> +
> +
> + return 0;
> +}
> +
> +static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
> + int onoff)
> +{
> + struct lme2510_state *st = adap->dev->priv;
> + int ret = 0, i;
> +
> + deb_info(4, "PID F PID=%04x Inx=%04x onoff=%02x i2c_talk=%02x FC=%02x",
> + pid, index, onoff,
> + st->i2c_talk_onoff, adap->feedcount);
> +
> + if ((pid == 0)&(index == 0)&(onoff == 0))
> + st->pid_count = 0;
> +
> +
> + if (index < 30) {
> + st->pid_table[st->pid_count] = pid;
> +
> + deb_info(3, "PID T PID=%04x Inx=%04x onoff=%02x,i2c_talk=%02x",
> + st->pid_table[st->pid_count],
> + st->pid_count, onoff,
> + st->i2c_talk_onoff);
> +
> + if ((st->pid_table[st->pid_count] == 0x0012) &
> + (st->pid_count > 3)) {
> + deb_info(2, "PID Table Dump---------");
> + for (i = 0; i < st->pid_count; i++)
> + deb_info(2, "PID No %02x=(%04x)",
> + i, st->pid_table[i]);
> +
> +
> + if ((st->pid_count < 8) &
> + (st->pid_table[3] != 0x0012)) {
> + ret = lme2510_pidbuild_table(st);
> + st->pid_flag_enable = 1;
> + ret -= lme2510_enable_filter(adap);
> + }
> + else
> + info("PID more than 4 - passing full stream");
> + } else
> + st->pid_count++;
> + }
> +
> +
> + return ret;
> +}
> +
> +static int lme2510_return_status(struct usb_device *dev)
> +{
> + int i;
> + u8 data[10] = {0};
> + i = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
> + 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
> + /*i = usb_get_descriptor(dev, 0x03, 0x02, data, 0x06);*/
> + info("Firmware Status: %x (%x)", i, data[2]);
Hmm... what happens if usb_control_msg returns an error?
> + i = data[2];
> + return i;
> +}
> +
> +
> +static int lme2510_msg(struct dvb_usb_device *d,
> + u8 *wbuf, int wlen, u8 *rbuf, int rlen)
> +{
> + int ret = 0;
> + struct lme2510_state *st = d->priv;
> +
> + if (st->i2c_talk_onoff == 1) {
> + if ((wbuf[0] == 0x84) & (wbuf[1] == 0x03) &
> + (wbuf[2] == 0x1c) & (wbuf[3] == 0x0e))
> + msleep(80); /*take your time when waiting for tune*/
> +
> + if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
> + return -EAGAIN;
> +
> + ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
> +
> + mutex_unlock(&d->i2c_mutex);
> + } else {
> + if ((wbuf[0] == 0x84) & (wbuf[1] == 0x03)
> + & (wbuf[2] == 0x1c)) {
> + switch (wbuf[3]) {
> + case 0x0e:
> + rbuf[0] = 0x55;
> + rbuf[1] = st->signal_lock;
> + break;
> + case 0x43:
> + rbuf[0] = 0x55;
> + rbuf[1] = st->signal_level;
> + break;
> + case 0x1c:
> + rbuf[0] = 0x55;
> + rbuf[1] = st->signal_sn;
> + break;
> + default:
> + break;
> + }
> + deb_info(4, "I2C From Interupt Message out(%02x) in(%02x)",
> + wbuf[3], rbuf[1]);
> + }
> + }
> +
> +
> +
> +
> + return ret;
> +}
> +
> +static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
> + int num)
> +{
> + struct dvb_usb_device *d = i2c_get_adapdata(adap);
> + static u8 obuf[64], ibuf[512];
> + int i, read;
> + u16 len;
> +
> + if (num > 2)
> + warn("more than 2 i2c messages"
> + "at a time is not handled yet. TODO.");
> +
> + for (i = 0; i < num; i++) {
> + read = i+1 < num && (msg[i+1].flags & I2C_M_RD);
> + obuf[0] = 0x04 | (read << 7);
> + obuf[1] = (msg[i].addr < 0x40) ? LME_I2C_C_L : LME_I2C_C_H;
> + obuf[2] = (msg[i].addr << 1);
> + if (read) {
> + memcpy(&obuf[3], msg[i].buf, msg[i].len);
> + obuf[4] = msg[i].len;
> + len = msg[i].len+4;
> + } else {
> + memcpy(&obuf[3], msg[i].buf, msg[i].len);
> + len = 64;
> + }
> +
> +
> + if (lme2510_msg(d, obuf, len, ibuf, 512) < 0) {
> + deb_info(1, "i2c transfer failed.");
> + return -EAGAIN;
> + }
> +
> + if (read) {
> + memcpy(msg[i+1].buf, &ibuf[1],
> + (msg[i+1].len > 512) ? 512 : msg[i+1].len);
> +
> + i++;
> + }
> + }
> + return i;
> +}
> +
> +static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
> +{
> + return I2C_FUNC_I2C;
> +}
> +
> +static struct i2c_algorithm lme2510_i2c_algo = {
> + .master_xfer = lme2510_i2c_xfer,
> + .functionality = lme2510_i2c_func,
> +#ifdef NEED_ALGO_CONTROL
> + .algo_control = dummy_algo_control,
> +#endif
> +};
> +
> +/* Callbacks for DVB USB */
> +static int lme2510_identify_state(struct usb_device *udev,
> + struct dvb_usb_device_properties *props,
> + struct dvb_usb_device_description **desc,
> + int *cold)
> +{
> + *cold = 0;
> + return 0;
> +}
> +
> +static int lme2510_init(struct dvb_usb_device *d)
> +{
> + static u8 command1[] = LME_ST_OFF_C;
> + static u8 ibuf[512];
> + int ret, len = 5, len_in = 512;
> + msleep(500);
> + ret = lme2510_usb_talk(d, command1, len, ibuf, len_in);
> + return ret;
> +}
> +
> +static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
> +{
> + struct lme2510_state *st = adap->dev->priv;
> + static u8 stream_off[] = LME_ST_OFF_C;
> + static u8 clear_reg_3[] = LME_CLEAR_PID;
> + static u8 stream_on[] = LME_ST_ON_W;
> + static u8 rbuf[1];
> + int ret = 0, len = 5;
> + deb_info(1, "STM (%02x)", onoff);
> +
> + if (onoff == 1) {
> + ret += lme2510_usb_talk(adap->dev,
> + stream_on, len, rbuf, 1);
> + st->i2c_talk_onoff = 0;
> + } else {
> + st->i2c_talk_onoff = 1;
> + ret += lme2510_usb_talk(adap->dev,
> + stream_off, len, rbuf, 1);
> + deb_info(1, "STM Clearing PID Filter");
> + ret += lme2510_usb_talk(adap->dev,
> + clear_reg_3, 4, rbuf, 1);
> + }
> +
> + return 0;
> +}
> +
> +static int lme2510_int_service(struct dvb_usb_adapter *adap)
> +{
> + struct dvb_usb_device *d = adap->dev;
> + struct input_dev *input_dev;
> + int ret, i;
> + u32 keys[] = LME_KEYS_USED;
> + info("STA Configuring Remote");
> +
> + usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
> +
> + strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
> +
> + input_dev = input_allocate_device();
> + if (!input_dev)
> + return -ENOMEM;
> +
> + input_dev->evbit[0] = BIT_MASK(EV_KEY);
> + input_dev->name = "LME2510 Remote Control";
> + input_dev->phys = d->rc_phys;
> + usb_to_input_id(d->udev, &input_dev->id);
> +
> + for (i = 0; i < sizeof(keys)/4 ; ++i)
> + set_bit(keys[i], input_dev->keybit);
> +
> + deb_info(3, "STA Number of Keys %d", sizeof(keys)/4);
> +
> + ret = input_register_device(input_dev);
> + if (ret) {
> + input_free_device(input_dev);
> + return ret;
> + }
> +
> + d->rc_input_dev = input_dev;
> + /* Start the Interupt */
> + ret = lme2510_int_read(adap);
> +
> + if (ret < 0)
> + input_free_device(input_dev);
> +
> + return (ret < 0) ? -ENODEV : 0;
> +}
Should use the IR register functions from ir-core.
> +
> +static struct tda10086_config tda10086_config = {
> + .demod_address = 0x0e,
> + .invert = 0,
> + .diseqc_tone = 1,
> + .xtal_freq = TDA10086_XTAL_16M,
> +};
> +
> +static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
> + fe_sec_voltage_t voltage)
> +{
> + struct dvb_usb_adapter *adap = fe->dvb->priv;
> + static u8 voltage_low[] = LME_VOLTAGE_L;
> + static u8 voltage_high[] = LME_VOLTAGE_H;
> + static u8 rbuf[1];
> + int ret, len = 5;
> +
> + switch (voltage) {
> +
> + case SEC_VOLTAGE_18:
> + ret = lme2510_usb_talk(adap->dev,
> + voltage_high, len, rbuf, 1);
> + break;
> +
> + case SEC_VOLTAGE_OFF:
> + case SEC_VOLTAGE_13:
> + default:
> + ret = lme2510_usb_talk(adap->dev,
> + voltage_low, len, rbuf, 1);
> + break;
> +
> +
> + };
> + return 0;
> +}
> +
> +static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
> +{
> + int ret = 0;
> + struct lme2510_state *st = adap->dev->priv;
> + st->pid_flag_enable = 0;
> + /* Interupt Start */
> + ret = lme2510_int_service(adap);
> + if (ret < 0) {
> + info("INT Unable to start Interupt Service");
> + return -ENODEV;
> + }
> +
> + st->i2c_talk_onoff = 1;
> +
> + ret = lme2510_init(adap->dev);
> +
> + adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
> + &adap->dev->i2c_adap);
> +
> + if (adap->fe != NULL) {
> + memcpy(&adap->fe->ops.info.name,
> + &"DM04_LG_TDQY-P001F DVB-S", 24);
> + adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
> + } else {
> + info("This DM04 Device is not supported");
> + return -ENODEV;
> + }
> +
> + return ret;
> +}
> +
> +static int dm04_lme2510_tuner_attach(struct dvb_usb_adapter *adap)
> +{
> + if (dvb_attach(tda826x_attach, adap->fe, 0x60,
> + &adap->dev->i2c_adap, 1) == NULL) {
> + deb_info(1, "TDA8263 attach failed\n");
> + return -ENODEV;
> + }
> +
> + return 0;
> +}
> +
> +static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
> +{
> + struct lme2510_state *st = d->priv;
> + st->i2c_talk_onoff = 1;
> + return 0;
> +}
> +
> +static struct lme_firmware_data lme_firmware[] = LME_FIRMWARE_D;
> +
> +static int lme2510_firmware(struct usb_device *dev, const struct firmware *fw)
> +{
> + int ret = 0, j;
> + u8 data[1000] = {0};
> + u16 wlen = 253;
> + info("FRM Starting Firmware Download");
> +
> + for (j = 0; j < 17; ++j) {
> + wlen = (int)lme_firmware[j].length;
> + memcpy(&data[0], &lme_firmware[j].bulk_data[0],
> + (wlen < 256) ? wlen : 256);
> + ret += lme2510_bulk_write(dev, data, wlen, 1);
> + ret += lme2510_bulk_read(dev, data, 512 , 1);
> + ret += (data[0] == 0x88) ? 0 : -1;
> + }
> +
> + usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
> + 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000);
> +
> +
> + data[0] = 0x8a;
> + msleep(2000);
> + ret += lme2510_bulk_write(dev, data , 1, 1); /*Resetting*/
> + ret += lme2510_bulk_read(dev, data, 512 , 1);
> + msleep(400);
> +
> + if (ret < 0)
> + info("FRM Firmware Download Failed (%04x)" , ret);
> + else
> + info("FRM Firmware Download Completed - Resetting Device");
> +
> +
> + return (ret < 0) ? -ENODEV : 0;
> +}
> +
> +/* DVB USB Driver stuff */
> +static struct dvb_usb_device_properties lme2510_properties;
> +
> +static int lme2510_probe(struct usb_interface *intf,
> + const struct usb_device_id *id)
> +{
> + struct usb_device *udev = interface_to_usbdev(intf);
> + int ret = 0;
> +
> + usb_reset_configuration(udev);
> +
> + usb_set_interface(udev, intf->cur_altsetting->desc.bInterfaceNumber, 1);
> +
> + if (udev->speed != USB_SPEED_HIGH) {
> + ret = usb_reset_device(udev);
> + info("DEV Failed to connect in HIGH SPEED mode");
> + return -ENODEV;
> + }
> +
> +
> + if (0x44 == lme2510_return_status(udev)) {
> + ret += lme2510_firmware(udev, NULL);
> + return 0; /* reset on way */
> + }
> +
> +
> + if (0 == dvb_usb_device_init(intf, &lme2510_properties,
> + THIS_MODULE, NULL, adapter_nr)) {
> + info("DEV registering device driver");
> + return 0;
> + }
> +
> + info("DEV lme2510 Error");
> + return -ENODEV;
> +
> +}
> +
> +static struct usb_device_id lme2510_table[] = {
> + { USB_DEVICE(0x3344, 0x1122) }, /* generic China models */
> + {} /* Terminating entry */
> +};
> +
> +MODULE_DEVICE_TABLE(usb, lme2510_table);
> +
> +static struct dvb_usb_device_properties lme2510_properties = {
> + .caps = DVB_USB_IS_AN_I2C_ADAPTER,
> + .usb_ctrl = DEVICE_SPECIFIC,
> + .size_of_priv = sizeof(struct lme2510_state),
> + .num_adapters = 1,
> + .adapter = {
> + {
> + .caps = DVB_USB_ADAP_HAS_PID_FILTER|
> + DVB_USB_ADAP_NEED_PID_FILTERING|
> + DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
> + .streaming_ctrl = lme2510_streaming_ctrl,
> + .pid_filter_count = 29,
> + .pid_filter = lme2510_pid_filter,
> + .pid_filter_ctrl = lme2510_pid_filter_ctrl,
> + .frontend_attach = dm04_lme2510_frontend_attach,
> + .tuner_attach = dm04_lme2510_tuner_attach,
> + /* parameter for the MPEG2-data transfer */
> + .stream = {
> + .type = USB_BULK,
> + .count = 10,
> + .endpoint = 0x06,
> + .u = {
> + .bulk = {
> + .buffersize = 4096,
> +
> + }
> + }
> + }
> + }
> + },
> + .power_ctrl = lme2510_powerup,
> + .identify_state = lme2510_identify_state,
> + .i2c_algo = &lme2510_i2c_algo,
> + .generic_bulk_ctrl_endpoint = 0,
> + .num_device_descs = 1,
> + .devices = {
> + { "LME2510 + LG TDQY-P001F DVB-S USB2.0",
> + { &lme2510_table[0], NULL },
> + },
> +
> + }
> +};
> +
> +void lme2510_exit_int(struct dvb_usb_device *d)
> +{
> + struct lme2510_state *st = d->priv;
> + if (st->lme_urb != NULL) {
> + usb_kill_urb(st->lme_urb);
> + usb_buffer_free(d->udev, 5000, st->buffer,
> + st->lme_urb->transfer_dma);
> + info("Interupt Service Stopped");
> + }
> + return;
> +}
> +
> +void lme2510_exit(struct usb_interface *intf)
> +{
> + struct dvb_usb_device *d = usb_get_intfdata(intf);
> + if (d != NULL) {
> + lme2510_exit_int(d);
> + input_unregister_device(d->rc_input_dev);
> + info("Remote Stopped");
> + dvb_usb_device_exit(intf);
> + }
> +
> +}
> +
> +static struct usb_driver lme2510_driver = {
> + .name = "LME_DVBS",
> + .probe = lme2510_probe,
> + .disconnect = lme2510_exit,
> + .id_table = lme2510_table,
> +};
> +
> +/* module stuff */
> +static int __init lme2510_module_init(void)
> +{
> + int result = usb_register(&lme2510_driver);
> + if (result) {
> + err("usb_register failed. Error number %d", result);
> + return result;
> + }
> +
> + return 0;
> +}
> +
> +static void __exit lme2510_module_exit(void)
> +{
> + /* deregister this driver from the USB subsystem */
> + usb_deregister(&lme2510_driver);
> +}
> +
> +module_init(lme2510_module_init);
> +module_exit(lme2510_module_exit);
> +
> +MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
> +MODULE_DESCRIPTION("LME DVB-S USB2.0");
> +MODULE_VERSION("1.0");
> +MODULE_LICENSE("GPL");
> diff -r 9652f85e688a linux/drivers/media/dvb/dvb-usb/lmedm04.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/linux/drivers/media/dvb/dvb-usb/lmedm04.h Fri Jul 16 14:30:02 2010 +0100
> @@ -0,0 +1,682 @@
> +/* DVB USB compliant linux driver for
> + *
> + * LME DM040832731 (LME 2510 + TDQY-P001F)
> + *
> + * MV001F LG TDQY - P001F =(TDA8263 + TDA10086H)
> + *
> + *
> + * 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 the Free
> + * Software Foundation, version 2.
> + *
> + * see Documentation/dvb/README.dvb-usb for more information
> + */
> +#ifndef _DVB_USB_LME2510_H_
> +#define _DVB_USB_LME2510_H_
> +
> +
> +/* Interupt */
> +
> +#define LME_REMOTE 0xaa
> +#define LME_STREAM 0xbb
> +#define LME_IDLE 0xcc
> +
> +
> +/* Remote */
> +
> +#define KEYCASE(key, id) \
> +do { case key: \
> + event = id;\
> + } while (0)
> +
> +#define LME_R_1 0xa05f
> +#define LME_R_2 0xaf50
> +#define LME_R_3 0xa25d
> +#define LME_R_4 0xbe41
> +#define LME_R_5 0xf50a
> +#define LME_R_6 0xbd42
> +#define LME_R_7 0xb847
> +#define LME_R_8 0xb649
> +#define LME_R_9 0xfa05
> +#define LME_R_0 0xba45
> +#define LME_R_POWER 0xbc43
> +#define LME_R_SUB 0xb946
> +#define LME_R_CAPTURE 0xf906
> +#define LME_R_REPEAT 0xfc03
> +#define LME_R_PAUSE 0xfd02
> +#define LME_R_VOL_D 0xa35c
> +#define LME_R_VOL_U 0xa15e
> +#define LME_R_CH_D 0xe51a
> +#define LME_R_CH_U 0xf609
> +#define LME_R_PLAYBACK 0xe11e
> +#define LME_R_ZOOM 0xe41b
> +#define LME_R_MUTE 0xa659
> +#define LME_R_LIVETV 0xa55a
> +#define LME_R_RECORD 0xe718
> +#define LME_R_EPG 0xf807
> +#define LME_R_STOP 0xfe01
> +
> +#define LME_KEYS_USED { KEY_1, KEY_2, \
> + KEY_3, KEY_4, \
> + KEY_5, KEY_6, \
> + KEY_7, KEY_8, \
> + KEY_9, KEY_0, \
> + KEY_POWER, KEY_PAUSE, \
> + KEY_VOLUMEDOWN, KEY_VOLUMEUP, \
> + KEY_CHANNELDOWN, KEY_CHANNELUP, \
> + KEY_PLAY, KEY_MUTE, KEY_TV, \
> + KEY_ZOOM, KEY_EPG, \
> + KEY_SUBTITLE, KEY_RECORD, \
> + KEY_MEDIA_REPEAT, KEY_STOPCD, \
> + 0x0000}
> +
> +
> +/* Streamer & PID
> + *
> + * Note: These commands do not actually stop the streaming
> + * but form some kind of packet filtering/stream count
> + * or tuning related functions.
> + * 06 XX XX XX XX
> + * offset 1 = 00
> + * offset 2 = default after warm start 52, otherwise greater than 40
> + * offset 3 = default after warm start 80, =(power offset 3), 82, 88
> + * offset 4 = 20, before PID setting 5c, 1c, d0, (tuning 8c)
> + *
> + * PID
> + * 03 XX XX ----> reg number ---> setting....20 XX
> + * offset 1 = length
> + * offset 2 = start of data
> + * end byte -1 = 20
> + * end byte = clear pid always a0, other wise 9c, 9a ??
> +*/
> +#define LME_ST_ON_W {0x06, 0x00, 0x52, 0x80, 0x20}
> +#define LME_FILTER_INT {0x06, 0x00, 0x92, 0x88, 0x5c}
> +#define LME_ST_OFF_C {0x06, 0x00, 0x52, 0x80, 0xd0}
> +#define LME_CLEAR_PID {0x03, 0x02, 0x20, 0xa0}
> +
> +/*
> +#define LME_ST_INIT {0x06, 0x00, 0x72, 0xb3, 0x1c}
> +#define LME_ST_ON_C {0x06, 0x00, 0x52, 0x80, 0x20}
> +#define LME_ST_ON {0x06, 0x00, 0x40, 0x82, 0x50}
> +*/
> +
> +/* LME Power Control
> + * 07 XX XX XX XX
> + * offset 1 = 01 Power? my device cannot be powered down
> + * offset 2 = 00=Voltage low 01=Voltage high
> + * offset 3 = unknown but usually AE, B1-B3
> + * offset 4 = mosty C8 but sometimes C9
> + */
> +
> +#define LME_VOLTAGE_L {0x07, 0x01, 0x00, 0xb3, 0xc9}
> +#define LME_VOLTAGE_H {0x07, 0x01, 0x01, 0xb3, 0xc9}
> +
> +/* I2C */
> +#define LME_I2C_C_L 0x03
> +#define LME_I2C_C_H 0x0c
> +#define LME_I2C_WRITE 0x04
> +#define LME_I2C_READ 0x84
> +
> +/* Firmware */
> +#define FWF1 {\
> + 0x01, 0xf9, 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, \
> + 0x00, 0x40, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, \
> + 0x01, 0x02, 0x03, 0x01, 0x0a, 0x06, 0x00, 0x02, \
> + 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x09, 0x02, \
> + 0x37, 0x00, 0x01, 0x01, 0x00, 0xc0, 0xfa, 0x09, \
> + 0x04, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, \
> + 0x09, 0x04, 0x00, 0x01, 0x04, 0xff, 0x00, 0x00, \
> + 0x00, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x00, \
> + 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, \
> + 0x05, 0x8a, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, \
> + 0x0a, 0x02, 0x40, 0x00, 0x00, 0x09, 0x07, 0x53, \
> + 0x00, 0x01, 0x01, 0x00, 0xc0, 0xfa, 0x09, 0x04, \
> + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x09, \
> + 0x04, 0x00, 0x01, 0x08, 0xff, 0x00, 0x00, 0x00, \
> + 0x07, 0x05, 0x81, 0x02, 0x00, 0x02, 0x00, 0x07, \
> + 0x05, 0x01, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, \
> + 0x02, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x86, \
> + 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x87, 0x02, \
> + 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, \
> + 0x00, 0x00, 0x07, 0x05, 0x8a, 0x03, 0x40, 0x00, \
> + 0x0b, 0x07, 0x05, 0x0a, 0x02, 0x40, 0x00, 0x00, \
> + 0x08, 0x03, 0x09, 0x04, 0x03, 0x04, 0x15, 0x16, \
> + 0x05, 0x03, 0x41, 0x42, 0x43, 0x06, 0x03, 0x44, \
> + 0x44, 0x44, 0x44, 0x07, 0x03, 0x48, 0x49, 0x50, \
> + 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x75}
> +
> +#define FWF2 {\
> + 0x01, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, \
> + 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00, \
> + 0x03, 0x01, 0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, \
> + 0x00, 0x40, 0x01, 0x00, 0x09, 0x02, 0x53, 0x00, \
> + 0x01, 0x01, 0x00, 0xc0, 0xfa, 0x09, 0x04, 0x00, \
> + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x09, 0x04, \
> + 0x00, 0x01, 0x08, 0xff, 0x00, 0x00, 0x00, 0x07, \
> + 0x05, 0x81, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, \
> + 0x01, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x02, \
> + 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x86, 0x02, \
> + 0x00, 0x02, 0x00, 0x07, 0x05, 0x87, 0x02, 0x40, \
> + 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, \
> + 0x00, 0x07, 0x05, 0x8a, 0x03, 0x40, 0x00, 0x0b, \
> + 0x07, 0x05, 0x0a, 0x02, 0x40, 0x00, 0x00, 0x09, \
> + 0x07, 0x37, 0x00, 0x01, 0x01, 0x00, 0xc0, 0xfa, \
> + 0x09, 0x04, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, \
> + 0x00, 0x09, 0x04, 0x00, 0x01, 0x04, 0xff, 0x00, \
> + 0x00, 0x00, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, \
> + 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, \
> + 0x07, 0x05, 0x8a, 0x02, 0x40, 0x00, 0x00, 0x07, \
> + 0x05, 0x0a, 0x02, 0x40, 0x00, 0x00, 0x08, 0x03, \
> + 0x09, 0x04, 0x03, 0x04, 0x15, 0x16, 0x05, 0x03, \
> + 0x41, 0x42, 0x43, 0x06, 0x03, 0x47, 0x47, 0x47, \
> + 0x47, 0x07, 0x03, 0x48, 0x49, 0x50, 0x51, 0x52, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x7e}
> +
> +
> +#define FWF3 {0x81, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
> +
> +
> +#define FWP1 {\
> + 0x02, 0xf9, 0x02, 0x05, 0xc5, 0x30, 0x01, 0xfd, \
> + 0x8f, 0x99, 0xc2, 0x01, 0x22, 0x02, 0x09, 0x9f, \
> + 0x22, 0xff, 0xff, 0xff, 0xff, 0x02, 0x0a, 0x92, \
> + 0x90, 0xc0, 0x0b, 0xe0, 0x30, 0xe1, 0x02, 0xc3, \
> + 0x22, 0xd3, 0x22, 0xff, 0xff, 0x02, 0x0c, 0xdc, \
> + 0xc2, 0x05, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, 0xf5, \
> + 0x09, 0x90, 0xc0, 0x84, 0xe0, 0xff, 0x74, 0x0f, \
> + 0x25, 0x09, 0xf8, 0xa6, 0x07, 0x05, 0x09, 0xe5, \
> + 0x09, 0xb4, 0x02, 0xed, 0xe5, 0x0f, 0x12, 0x07, \
> + 0x27, 0x00, 0x8b, 0x02, 0x00, 0xe0, 0x03, 0x01, \
> + 0x4e, 0x04, 0x01, 0xd1, 0x05, 0x02, 0x61, 0x06, \
> + 0x02, 0x76, 0x07, 0x02, 0xd8, 0x08, 0x03, 0x32, \
> + 0x09, 0x03, 0x5c, 0x0a, 0x00, 0xb9, 0x82, 0x01, \
> + 0x16, 0x83, 0x01, 0x92, 0x84, 0x02, 0x05, 0x85, \
> + 0x02, 0x87, 0x87, 0x00, 0x7e, 0xf1, 0x00, 0xb3, \
> + 0xf2, 0x02, 0x41, 0xf5, 0x00, 0x00, 0x03, 0x79, \
> + 0x90, 0xc0, 0x0b, 0x74, 0x02, 0xf0, 0x90, 0xc1, \
> + 0xa3, 0x74, 0x50, 0xf0, 0x22, 0x90, 0xc0, 0x84, \
> + 0xe0, 0xf5, 0x0b, 0xe0, 0xf5, 0x0c, 0x90, 0xc0, \
> + 0x36, 0x74, 0x8b, 0xf0, 0x90, 0xc1, 0xa2, 0x74, \
> + 0x16, 0xf0, 0x74, 0x76, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x96, 0xf0, 0xad, 0x0c, 0xaf, 0x0b, 0x12, \
> + 0x0c, 0x21, 0x02, 0x02, 0x02, 0x12, 0x0c, 0xcc, \
> + 0x02, 0x02, 0x02, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, \
> + 0xc3, 0xe5, 0x0e, 0x95, 0x10, 0xe5, 0x0d, 0x94, \
> + 0x00, 0x50, 0x14, 0x90, 0xc0, 0x84, 0xe0, 0xf5, \
> + 0x0c, 0xff, 0x12, 0x00, 0x03, 0x05, 0x0e, 0xe5, \
> + 0x0e, 0x70, 0xe5, 0x05, 0x0d, 0x80, 0xe1, 0x02, \
> + 0x02, 0x02, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, 0xc3, \
> + 0xe5, 0x0e, 0x95, 0x10, 0xe5, 0x0d, 0x94, 0x00, \
> + 0x50, 0x23, 0x90, 0xc0, 0x84, 0xe0, 0xf5, 0x0b, \
> + 0xe0, 0xf5, 0x0c, 0xe4, 0x5a}
> +
> +
> +#define FWP2 {\
> + 0x02, 0xf9, 0x25, 0x0b, 0xf5, 0x82, 0xe4, 0x34, \
> + 0x90, 0xf5, 0x83, 0xe5, 0x0c, 0xf0, 0x74, 0x02, \
> + 0x25, 0x0e, 0xf5, 0x0e, 0xe4, 0x35, 0x0d, 0xf5, \
> + 0x0d, 0x80, 0xd2, 0x02, 0x02, 0x02, 0x90, 0xc0, \
> + 0x84, 0x74, 0x55, 0xf0, 0xe4, 0xf5, 0x0d, 0xf5, \
> + 0x0e, 0xc3, 0xe5, 0x0e, 0x95, 0x10, 0xe5, 0x0d, \
> + 0x94, 0x00, 0x50, 0x1f, 0x90, 0xc0, 0x84, 0xe0, \
> + 0xf5, 0x0b, 0xff, 0xe4, 0x2f, 0xf5, 0x82, 0xe4, \
> + 0x34, 0x90, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x84, \
> + 0xf0, 0x05, 0x0e, 0xe5, 0x0e, 0x70, 0xda, 0x05, \
> + 0x0d, 0x80, 0xd6, 0x02, 0x02, 0x56, 0x90, 0xc0, \
> + 0x84, 0xe0, 0xf5, 0x0a, 0xe0, 0xf5, 0x0b, 0xe5, \
> + 0x10, 0x24, 0xfe, 0xf5, 0x0e, 0xe4, 0x34, 0xff, \
> + 0xf5, 0x0d, 0xe4, 0xf5, 0x09, 0xc3, 0xe5, 0x09, \
> + 0x95, 0x0e, 0xe4, 0x95, 0x0d, 0x50, 0x10, 0x90, \
> + 0xc0, 0x84, 0xe0, 0xff, 0x74, 0x2a, 0x25, 0x09, \
> + 0xf8, 0xa6, 0x07, 0x05, 0x09, 0x80, 0xe6, 0x7b, \
> + 0x00, 0x7a, 0x00, 0x79, 0x2a, 0x85, 0x0e, 0x16, \
> + 0xad, 0x0b, 0xaf, 0x0a, 0x12, 0x08, 0xec, 0x02, \
> + 0x02, 0xd1, 0x90, 0xc0, 0x84, 0x74, 0x55, 0xf0, \
> + 0xe0, 0xf5, 0x0a, 0xe0, 0xf5, 0x0b, 0xe0, 0x75, \
> + 0x0d, 0x00, 0xf5, 0x0e, 0x7b, 0x00, 0x7a, 0x00, \
> + 0x79, 0x22, 0xf5, 0x16, 0xad, 0x0b, 0xaf, 0x0a, \
> + 0x12, 0x06, 0x51, 0xe4, 0xf5, 0x09, 0xc3, 0xe5, \
> + 0x09, 0x95, 0x0e, 0xe4, 0x95, 0x0d, 0x50, 0x0e, \
> + 0x74, 0x22, 0x25, 0x09, 0xf8, 0xe6, 0x90, 0xc0, \
> + 0x84, 0xf0, 0x05, 0x09, 0x80, 0xe8, 0x02, 0x02, \
> + 0x56, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, 0xc3, 0xe5, \
> + 0x0e, 0x95, 0x10, 0xe5, 0x0d, 0x94, 0x00, 0x50, \
> + 0x21, 0x90, 0xc0, 0x84, 0xe0, 0xf5, 0x0a, 0xe0, \
> + 0xf5, 0x0b, 0xe0, 0xf5, 0x2a, 0xfb, 0xad, 0x0b, \
> + 0xaf, 0x0a, 0x12, 0x0a, 0x7f}
> +
> +#define FWP3 {\
> + 0x02, 0xf9, 0x4a, 0x74, 0x03, 0x25, 0x0e, 0xf5, \
> + 0x0e, 0xe4, 0x35, 0x0d, 0xf5, 0x0d, 0x80, 0xd4, \
> + 0x02, 0x02, 0xd1, 0x90, 0xc0, 0x84, 0x74, 0x55, \
> + 0xf0, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, 0xc3, 0xe5, \
> + 0x0e, 0x95, 0x10, 0xe5, 0x0d, 0x94, 0x00, 0x50, \
> + 0x24, 0x90, 0xc0, 0x84, 0xe0, 0xf5, 0x0a, 0xe0, \
> + 0xf5, 0x0b, 0xfd, 0xaf, 0x0a, 0x12, 0x08, 0x92, \
> + 0x8f, 0x22, 0x90, 0xc0, 0x84, 0xe5, 0x22, 0xf0, \
> + 0x74, 0x02, 0x25, 0x0e, 0xf5, 0x0e, 0xe4, 0x35, \
> + 0x0d, 0xf5, 0x0d, 0x80, 0xd1, 0x80, 0x15, 0x90, \
> + 0xc0, 0x84, 0x74, 0x55, 0xf0, 0xe0, 0xf5, 0x0a, \
> + 0xff, 0x12, 0x0b, 0x7e, 0x8f, 0x22, 0x90, 0xc0, \
> + 0x84, 0xe5, 0x22, 0xf0, 0x90, 0xc0, 0x0b, 0x74, \
> + 0x02, 0xf0, 0x90, 0xc0, 0x0f, 0xf0, 0x22, 0xe4, \
> + 0xf5, 0x3b, 0xf5, 0x3c, 0x7b, 0xff, 0x7a, 0x0b, \
> + 0x79, 0x0f, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0b, \
> + 0xd9, 0x02, 0x03, 0x47, 0x90, 0xc0, 0x84, 0xe0, \
> + 0xf5, 0x0c, 0x70, 0x04, 0xc2, 0x83, 0x80, 0x02, \
> + 0xd2, 0x83, 0x02, 0x02, 0xd1, 0x90, 0xc0, 0x84, \
> + 0xe0, 0xf5, 0x09, 0xe4, 0xf5, 0x0d, 0xf5, 0x0e, \
> + 0xc3, 0xe5, 0x0e, 0x95, 0x09, 0xe5, 0x0d, 0x94, \
> + 0x00, 0x50, 0x34, 0xc2, 0xb7, 0xd2, 0xb6, 0xe4, \
> + 0xf5, 0x0b, 0x7f, 0xc8, 0x12, 0x05, 0x9e, 0x05, \
> + 0x0b, 0xe5, 0x0b, 0xc3, 0x94, 0xc8, 0x40, 0xf2, \
> + 0xd2, 0xb7, 0xc2, 0xb6, 0xe4, 0xf5, 0x0b, 0x7f, \
> + 0xc8, 0x12, 0x05, 0x9e, 0x05, 0x0b, 0xe5, 0x0b, \
> + 0xc3, 0x94, 0xc8, 0x40, 0xf2, 0x05, 0x0e, 0xe5, \
> + 0x0e, 0x70, 0xc5, 0x05, 0x0d, 0x80, 0xc1, 0x90, \
> + 0xc0, 0x0b, 0x74, 0x02, 0x80, 0x52, 0x90, 0xc0, \
> + 0x36, 0x74, 0x8b, 0xf0, 0x90, 0xc1, 0xa2, 0x74, \
> + 0x16, 0xf0, 0x74, 0x76, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x96, 0xf0, 0x90, 0xbb}
> +
> +
> +#define FWP4 {\
> + 0x02, 0xf9, 0xc0, 0x98, 0x74, 0x66, 0xf0, 0x90, \
> + 0xc0, 0x84, 0xe0, 0xf5, 0x0c, 0xe4, 0xf5, 0x0d, \
> + 0xf5, 0x0e, 0xc3, 0xe5, 0x0e, 0x95, 0x0c, 0xe5, \
> + 0x0d, 0x94, 0x00, 0x50, 0x14, 0x90, 0xc0, 0x88, \
> + 0xe0, 0xf5, 0x0a, 0x90, 0xc0, 0x98, 0xf0, 0x05, \
> + 0x0e, 0xe5, 0x0e, 0x70, 0xe5, 0x05, 0x0d, 0x80, \
> + 0xe1, 0x90, 0xc0, 0x0b, 0x74, 0x02, 0xf0, 0x90, \
> + 0xc0, 0x13, 0xf0, 0x90, 0xc0, 0x37, 0xf0, 0x90, \
> + 0xc0, 0x84, 0x74, 0x88, 0x80, 0x52, 0x90, 0xc0, \
> + 0x56, 0x74, 0x8c, 0xf0, 0x90, 0xc1, 0xa2, 0x74, \
> + 0x1a, 0xf0, 0x74, 0x7a, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x9a, 0xf0, 0x90, 0xc0, 0x0b, 0x74, 0x02, \
> + 0xf0, 0x90, 0xc0, 0x84, 0x74, 0x88, 0xf0, 0x90, \
> + 0xc0, 0x0f, 0x74, 0x02, 0xf0, 0xd2, 0x04, 0x22, \
> + 0x90, 0xc0, 0x0b, 0x74, 0x02, 0xf0, 0x90, 0xc0, \
> + 0x84, 0x74, 0x88, 0xf0, 0x90, 0xc0, 0x0f, 0x74, \
> + 0x02, 0xf0, 0x7f, 0xc8, 0x12, 0x05, 0xb9, 0x90, \
> + 0xff, 0xff, 0xe4, 0xf0, 0x22, 0x90, 0xc0, 0x0b, \
> + 0x74, 0x02, 0xf0, 0x90, 0xc0, 0x84, 0x74, 0x77, \
> + 0xf0, 0x90, 0xc0, 0x0f, 0x74, 0x02, 0xf0, 0x22, \
> + 0xe4, 0xff, 0xfe, 0xf5, 0x0b, 0x20, 0xb2, 0x07, \
> + 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x80, 0xf6, 0xc3, \
> + 0xef, 0x94, 0x28, 0xee, 0x94, 0x23, 0x50, 0x03, \
> + 0x02, 0x04, 0x76, 0xd3, 0xef, 0x94, 0xc8, 0xee, \
> + 0x94, 0x32, 0x40, 0x03, 0x02, 0x04, 0x76, 0xe4, \
> + 0xfe, 0xff, 0x30, 0xb2, 0x07, 0x0f, 0xbf, 0x00, \
> + 0x01, 0x0e, 0x80, 0xf6, 0xc3, 0xef, 0x94, 0x94, \
> + 0xee, 0x94, 0x11, 0x50, 0x03, 0x02, 0x04, 0x76, \
> + 0xd3, 0xef, 0x94, 0x4c, 0xee, 0x94, 0x1d, 0x40, \
> + 0x03, 0x02, 0x04, 0x76, 0xe4, 0xfe, 0x7f, 0x04, \
> + 0x12, 0x0c, 0xbc, 0x30, 0xb2, 0x03, 0x02, 0x04, \
> + 0x76, 0xe4, 0xf5, 0x0a, 0x39}
> +
> +#define FWP5 {\
> + 0x02, 0xf9, 0xe4, 0xf5, 0x09, 0x05, 0x0b, 0x30, \
> + 0xb2, 0xfd, 0x74, 0x48, 0x25, 0x0a, 0xf8, 0xc0, \
> + 0x00, 0xe6, 0xc3, 0x13, 0xd0, 0x00, 0xf6, 0x7f, \
> + 0x06, 0x12, 0x0c, 0xbc, 0x30, 0xb2, 0x05, 0x7f, \
> + 0x04, 0x12, 0x0c, 0xbc, 0x30, 0xb2, 0x05, 0x7f, \
> + 0x02, 0x12, 0x0c, 0xbc, 0x30, 0xb2, 0x05, 0x7f, \
> + 0x06, 0x12, 0x0c, 0xbc, 0x30, 0xb2, 0x07, 0x7f, \
> + 0x08, 0x12, 0x0c, 0xbc, 0x80, 0x09, 0x74, 0x48, \
> + 0x25, 0x0a, 0xf8, 0xe6, 0x44, 0x80, 0xf6, 0x20, \
> + 0xb2, 0xfd, 0x05, 0x09, 0xe5, 0x09, 0xc3, 0x94, \
> + 0x08, 0x40, 0xb2, 0x05, 0x0a, 0xe5, 0x0a, 0xc3, \
> + 0x94, 0x04, 0x40, 0xa6, 0xe5, 0x0b, 0x64, 0x20, \
> + 0x70, 0x2e, 0xf5, 0x0b, 0xe5, 0x4a, 0x25, 0x4b, \
> + 0xff, 0xe4, 0x33, 0xfe, 0xef, 0xf4, 0x4e, 0x70, \
> + 0x1f, 0xd2, 0x03, 0x75, 0x4c, 0xaa, 0x75, 0x47, \
> + 0x04, 0xf5, 0x0a, 0x74, 0x48, 0x25, 0x0a, 0xf8, \
> + 0xe6, 0xff, 0x74, 0x3f, 0x25, 0x0a, 0xf8, 0xa6, \
> + 0x07, 0x05, 0x0a, 0xe5, 0x0a, 0xb4, 0x04, 0xeb, \
> + 0x22, 0x90, 0xc1, 0xa3, 0x74, 0x10, 0xf0, 0x90, \
> + 0xc0, 0x0e, 0x74, 0x88, 0xf0, 0x90, 0xc1, 0xa2, \
> + 0x74, 0x11, 0xf0, 0x74, 0x71, 0xf0, 0x90, 0xc1, \
> + 0xa8, 0x74, 0x31, 0xf0, 0x90, 0xc0, 0x36, 0x74, \
> + 0x8b, 0xf0, 0x90, 0xc1, 0xa2, 0x74, 0x16, 0xf0, \
> + 0x74, 0x76, 0xf0, 0x90, 0xc1, 0xa8, 0x74, 0x36, \
> + 0xf0, 0x90, 0xc0, 0x0a, 0x74, 0x88, 0xf0, 0x90, \
> + 0xc1, 0xa2, 0x74, 0x01, 0xf0, 0x74, 0x61, 0xf0, \
> + 0x90, 0xc1, 0xa8, 0x74, 0x21, 0xf0, 0x90, 0xc0, \
> + 0x12, 0x74, 0x8b, 0xf0, 0x90, 0xc1, 0xa2, 0x74, \
> + 0x02, 0xf0, 0x74, 0x62, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x22, 0xf0, 0x90, 0xc0, 0x3e, 0x74, 0x8b, \
> + 0xf0, 0x90, 0xc1, 0xa2, 0x74, 0x17, 0xf0, 0x74, \
> + 0x77, 0xf0, 0x90, 0xc1, 0x1b}
> +
> +#define FWP6 {\
> + 0x02, 0xf9, 0xa8, 0x74, 0x37, 0xf0, 0x90, 0xc0, \
> + 0x56, 0x74, 0x8c, 0xf0, 0x90, 0xc1, 0xa2, 0x74, \
> + 0x1a, 0xf0, 0x74, 0x7a, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x3a, 0xf0, 0x90, 0xc0, 0x1a, 0x74, 0x8b, \
> + 0xf0, 0x90, 0xc1, 0xa2, 0x74, 0x03, 0xf0, 0x74, \
> + 0x63, 0xf0, 0x90, 0xc1, 0xa8, 0x74, 0x23, 0xf0, \
> + 0x90, 0xc0, 0x52, 0x74, 0x88, 0xf0, 0x90, 0xc1, \
> + 0xa2, 0x74, 0x0a, 0xf0, 0x74, 0x6a, 0xf0, 0x90, \
> + 0xc1, 0xa8, 0x74, 0x2a, 0xf0, 0x22, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, \
> + 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, \
> + 0x12, 0x05, 0xb9, 0x12, 0x05, 0xb9, 0x12, 0x05, \
> + 0xb9, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x04, \
> + 0x00, 0x0e, 0x80, 0xf7, 0x22, 0x78, 0x7f, 0xe4, \
> + 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x54, 0x02, 0x06, \
> + 0x0c, 0x02, 0x07, 0x53, 0xe4, 0x93, 0xa3, 0xf8, \
> + 0xe4, 0x93, 0xa3, 0x40, 0xe8}
> +
> +#define FWP7 {\
> + 0x02, 0xf9, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, \
> + 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, \
> + 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, \
> + 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, \
> + 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, \
> + 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, \
> + 0x40, 0x80, 0x90, 0x0c, 0x3f, 0xe4, 0x7e, 0x01, \
> + 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, \
> + 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, \
> + 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, \
> + 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, \
> + 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, \
> + 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, \
> + 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, \
> + 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0x8d, \
> + 0x12, 0x8b, 0x13, 0x8a, 0x14, 0x89, 0x15, 0xef, \
> + 0x54, 0xfe, 0xf5, 0x18, 0x12, 0x0c, 0x5c, 0xaf, \
> + 0x18, 0x12, 0x09, 0xf5, 0x20, 0x02, 0x02, 0x80, \
> + 0x69, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0xaf, 0x12, \
> + 0x12, 0x09, 0xf5, 0x7f, 0x14, 0x12, 0x05, 0xb9, \
> + 0x20, 0x02, 0x02, 0x80, 0x55, 0x12, 0x0c, 0x5c, \
> + 0xe5, 0x18, 0x04, 0xff, 0x12, 0x09, 0xf5, 0x20, \
> + 0x02, 0x02, 0x80, 0x46, 0xe4, 0xf5, 0x17, 0xe5, \
> + 0x16, 0x14, 0xff, 0xe5, 0x17, 0xc3, 0x9f, 0x50, \
> + 0x1c, 0x12, 0x0a, 0xd2, 0xab, 0x13, 0xaa, 0x14, \
> + 0xa9, 0x15, 0x85, 0x17, 0x82, 0x75, 0x83, 0x00, \
> + 0xef, 0x12, 0x07, 0x05, 0xc2, 0x06, 0x12, 0x0c, \
> + 0x78, 0x05, 0x17, 0x80, 0xda, 0x12, 0x0a, 0xd2, \
> + 0xab, 0x13, 0xaa, 0x14, 0xa9, 0x15, 0x85, 0x17, \
> + 0x82, 0x75, 0x83, 0x00, 0xef, 0x12, 0x07, 0x05, \
> + 0xd2, 0x06, 0x12, 0x0c, 0x78, 0x7f, 0x14, 0x12, \
> + 0x05, 0xb9, 0x12, 0x0c, 0x29}
> +
> +#define FWP8 {\
> + 0x02, 0xf9, 0x94, 0x22, 0xbb, 0x01, 0x0c, 0xe5, \
> + 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, \
> + 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, \
> + 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, \
> + 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, \
> + 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, \
> + 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, \
> + 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, \
> + 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, \
> + 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, \
> + 0xc8, 0xf2, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, \
> + 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, \
> + 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, \
> + 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, \
> + 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, \
> + 0xdf, 0x8a, 0x83, 0x89, 0x82, 0xe4, 0x73, 0x12, \
> + 0x0c, 0x01, 0x12, 0x0c, 0xa9, 0x7b, 0xff, 0x7a, \
> + 0x0b, 0x79, 0xb0, 0x7d, 0x28, 0x7c, 0x00, 0x12, \
> + 0x0b, 0x49, 0x12, 0x00, 0x16, 0x50, 0x11, 0xc2, \
> + 0x85, 0xc2, 0x00, 0x90, 0xc1, 0xa8, 0x74, 0x91, \
> + 0xf0, 0x12, 0x00, 0x26, 0xd2, 0x85, 0x80, 0xea, \
> + 0x20, 0xb2, 0x0c, 0xc2, 0xaa, 0x12, 0x03, 0x8c, \
> + 0xd2, 0xaa, 0x12, 0x08, 0x2c, 0x80, 0xdb, 0xe5, \
> + 0x3e, 0x24, 0x38, 0xff, 0xe5, 0x3d, 0x34, 0xff, \
> + 0xfe, 0xef, 0xb5, 0x3c, 0xcd, 0xee, 0xb5, 0x3b, \
> + 0xc9, 0x75, 0x2a, 0x1c, 0x75, 0x2b, 0x0e, 0x12, \
> + 0x08, 0x8e, 0x8f, 0x22, 0xe5, 0x22, 0x30, 0xe4, \
> + 0x04, 0xc2, 0x85, 0x80, 0x02, 0xd2, 0x85, 0x75, \
> + 0x2b, 0x43, 0x12, 0x08, 0x8e, 0x8f, 0x23, 0x75, \
> + 0x2b, 0x1c, 0x12, 0x08, 0x8e, 0x8f, 0x24, 0x80, \
> + 0xa1, 0x90, 0x90, 0x00, 0x74, 0x01, 0xf0, 0xe4, \
> + 0xa3, 0xf0, 0xa3, 0xf0, 0xdc}
> +
> +
> +#define FWP9 {\
> + 0x02, 0xf9, 0xa3, 0xf0, 0xa3, 0x74, 0x03, 0xf0, \
> + 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, \
> + 0x74, 0x05, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, \
> + 0xa3, 0xf0, 0xa3, 0x74, 0x07, 0xf0, 0xe4, 0xa3, \
> + 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x09, \
> + 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, \
> + 0xa3, 0x74, 0x0b, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, \
> + 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0xe4, \
> + 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, \
> + 0x0f, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, \
> + 0xf0, 0xa3, 0x74, 0xb5, 0xf0, 0xa3, 0x74, 0x06, \
> + 0xf0, 0xa3, 0x74, 0xbc, 0xf0, 0x22, 0xe5, 0x47, \
> + 0x60, 0x5d, 0xc2, 0xaa, 0x75, 0xa0, 0x01, 0x85, \
> + 0x4c, 0x33, 0x85, 0x47, 0x34, 0xe4, 0xff, 0xef, \
> + 0xc3, 0x95, 0x47, 0x50, 0x0f, 0x74, 0x3f, 0x2f, \
> + 0xf8, 0xe6, 0xfe, 0x74, 0x35, 0x2f, 0xf8, 0xa6, \
> + 0x06, 0x0f, 0x80, 0xeb, 0x75, 0x21, 0x08, 0xe4, \
> + 0xf5, 0x47, 0x20, 0x00, 0x2d, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x9a, 0xf0, 0x90, 0xc0, 0xa8, 0xe5, 0x33, \
> + 0xf0, 0xe5, 0x34, 0xf0, 0xe5, 0x35, 0xf0, 0xe5, \
> + 0x36, 0xf0, 0xe5, 0x37, 0xf0, 0xe5, 0x38, 0xf0, \
> + 0xe5, 0x39, 0xf0, 0xe5, 0x3a, 0xf0, 0x90, 0xc0, \
> + 0x57, 0x74, 0x02, 0xf0, 0x90, 0xc1, 0xa8, 0x74, \
> + 0x3a, 0xf0, 0xd2, 0xaa, 0x75, 0xa0, 0x02, 0x22, \
> + 0xad, 0x2b, 0xaf, 0x2a, 0x8d, 0x11, 0xef, 0x54, \
> + 0xfe, 0xf5, 0x13, 0x12, 0x0c, 0x5c, 0x7f, 0x14, \
> + 0x12, 0x05, 0xb9, 0xaf, 0x13, 0x12, 0x09, 0xf5, \
> + 0x20, 0x02, 0x02, 0x80, 0x21, 0x7f, 0x14, 0x12, \
> + 0x05, 0xb9, 0xaf, 0x11, 0x12, 0x09, 0xf5, 0x20, \
> + 0x02, 0x02, 0x80, 0x12, 0x7f, 0x14, 0x12, 0x05, \
> + 0xb9, 0x12, 0x0c, 0x5c, 0xe5, 0x13, 0x04, 0xff, \
> + 0x12, 0x09, 0xf5, 0x20, 0x9b}
> +
> +
> +#define FWP10 {\
> + 0x02, 0xf9, 0x02, 0x06, 0x12, 0x0c, 0x94, 0x7f, \
> + 0x00, 0x22, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, \
> + 0x0a, 0xd2, 0x8f, 0x12, 0xd2, 0x06, 0x12, 0x0c, \
> + 0x78, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, 0x0c, \
> + 0x94, 0xaf, 0x12, 0x22, 0x8d, 0x12, 0x8b, 0x13, \
> + 0x8a, 0x14, 0x89, 0x15, 0xef, 0x54, 0xfe, 0xf5, \
> + 0x18, 0x12, 0x0c, 0x5c, 0xaf, 0x18, 0x12, 0x09, \
> + 0xf5, 0x20, 0x02, 0x02, 0x80, 0x3f, 0x7f, 0x14, \
> + 0x12, 0x05, 0xb9, 0xaf, 0x12, 0x12, 0x09, 0xf5, \
> + 0x20, 0x02, 0x02, 0x80, 0x30, 0x7f, 0x14, 0x12, \
> + 0x05, 0xb9, 0xe4, 0xf5, 0x17, 0xe5, 0x17, 0xc3, \
> + 0x95, 0x16, 0x50, 0x17, 0xab, 0x13, 0xaa, 0x14, \
> + 0xa9, 0x15, 0x85, 0x17, 0x82, 0x75, 0x83, 0x00, \
> + 0x12, 0x06, 0xd8, 0xff, 0x12, 0x09, 0xf5, 0x05, \
> + 0x17, 0x80, 0xe2, 0x20, 0x02, 0x02, 0x80, 0x05, \
> + 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, 0x0c, 0x94, \
> + 0x22, 0x05, 0x3a, 0x30, 0x04, 0x50, 0xe5, 0x21, \
> + 0x90, 0xc1, 0xa8, 0x70, 0x1c, 0x74, 0x9a, 0xf0, \
> + 0x90, 0xc0, 0xa8, 0x74, 0xbb, 0xf0, 0x74, 0x03, \
> + 0xf0, 0xe5, 0x22, 0xf0, 0xe5, 0x23, 0xf0, 0xe5, \
> + 0x24, 0xf0, 0xe5, 0x25, 0xf0, 0xe5, 0x26, 0x80, \
> + 0x1a, 0x74, 0x9a, 0xf0, 0x90, 0xc0, 0xa8, 0xe5, \
> + 0x33, 0xf0, 0xe5, 0x34, 0xf0, 0xe5, 0x35, 0xf0, \
> + 0xe5, 0x36, 0xf0, 0xe5, 0x37, 0xf0, 0xe5, 0x38, \
> + 0xf0, 0xe5, 0x39, 0xf0, 0xe5, 0x3a, 0xf0, 0x90, \
> + 0xc0, 0x57, 0x74, 0x02, 0xf0, 0x90, 0xc1, 0xa8, \
> + 0x74, 0x3a, 0xf0, 0xe4, 0xf5, 0x21, 0x22, 0xc0, \
> + 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, \
> + 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, \
> + 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, \
> + 0xc0, 0x06, 0xc0, 0x07, 0xc2, 0x8d, 0x05, 0x4f, \
> + 0xe5, 0x4f, 0x70, 0x02, 0xf9}
> +
> +
> +#define FWP11 {\
> + 0x02, 0xf9, 0x05, 0x4e, 0xc3, 0x95, 0x54, 0xe5, \
> + 0x4e, 0x95, 0x53, 0x40, 0x0b, 0xc2, 0x8c, 0xc2, \
> + 0xa9, 0xaa, 0x51, 0xa9, 0x52, 0x12, 0x07, 0x4d, \
> + 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, \
> + 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, \
> + 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, \
> + 0xd0, 0xe0, 0x32, 0x8f, 0x19, 0xe4, 0xf5, 0x1a, \
> + 0xaf, 0x1a, 0xe5, 0x19, 0xa8, 0x07, 0x08, 0x80, \
> + 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x30, 0xe7, 0x04, \
> + 0xd2, 0x80, 0x80, 0x02, 0xc2, 0x80, 0x7f, 0x08, \
> + 0x12, 0x05, 0xb9, 0xd2, 0x81, 0x7f, 0x0a, 0x12, \
> + 0x05, 0xb9, 0xc2, 0x81, 0x05, 0x1a, 0xe5, 0x1a, \
> + 0xc3, 0x94, 0x08, 0x40, 0xd3, 0x7f, 0x02, 0x12, \
> + 0x05, 0xb9, 0xd2, 0x80, 0x7f, 0x0a, 0x12, 0x05, \
> + 0xb9, 0xd2, 0x81, 0x7f, 0x0a, 0x12, 0x05, 0xb9, \
> + 0x30, 0x80, 0x04, 0xc2, 0x02, 0x80, 0x02, 0xd2, \
> + 0x02, 0xc2, 0x81, 0x7f, 0x0a, 0x02, 0x05, 0xb9, \
> + 0x8d, 0x11, 0x8b, 0x12, 0xef, 0x54, 0xfe, 0xf5, \
> + 0x13, 0x12, 0x0c, 0x5c, 0x7f, 0x14, 0x12, 0x05, \
> + 0xb9, 0xaf, 0x13, 0x12, 0x09, 0xf5, 0x20, 0x02, \
> + 0x02, 0x80, 0x1c, 0x7f, 0x14, 0x12, 0x05, 0xb9, \
> + 0xaf, 0x11, 0x12, 0x09, 0xf5, 0x20, 0x02, 0x02, \
> + 0x80, 0x0d, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0xaf, \
> + 0x12, 0x12, 0x09, 0xf5, 0x20, 0x02, 0x03, 0x02, \
> + 0x0c, 0x94, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, \
> + 0x0c, 0x94, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x22, \
> + 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, \
> + 0x75, 0xd0, 0x00, 0xc0, 0x06, 0xc0, 0x07, 0xc2, \
> + 0x8b, 0x05, 0x3c, 0xe5, 0x3c, 0x70, 0x02, 0x05, \
> + 0x3b, 0x30, 0x00, 0x17, 0xc3, 0x95, 0x3e, 0xe5, \
> + 0x3b, 0x95, 0x3d, 0x40, 0x0e, 0x75, 0x3b, 0x00, \
> + 0x75, 0x3c, 0x00, 0x7f, 0xbc}
> +
> +
> +#define FWP12 {\
> + 0x02, 0xf9, 0x14, 0x12, 0x05, 0xb9, 0x12, 0x09, \
> + 0x49, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0xd0, 0xd0, \
> + 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xe4, 0xf5, \
> + 0x19, 0xd2, 0x80, 0xf5, 0x1a, 0x7f, 0x01, 0x12, \
> + 0x05, 0xb9, 0xc2, 0x81, 0x7f, 0x0a, 0x12, 0x05, \
> + 0xb9, 0xd2, 0x81, 0x7f, 0x08, 0x12, 0x05, 0xb9, \
> + 0xe5, 0x19, 0x25, 0xe0, 0xf5, 0x19, 0x30, 0x80, \
> + 0x02, 0x05, 0x19, 0x7f, 0x01, 0x12, 0x05, 0xb9, \
> + 0x05, 0x1a, 0xe5, 0x1a, 0xc3, 0x94, 0x08, 0x40, \
> + 0xd4, 0xc2, 0x81, 0x7f, 0x0a, 0x12, 0x05, 0xb9, \
> + 0xaf, 0x19, 0x22, 0x85, 0x3b, 0x3d, 0x85, 0x3c, \
> + 0x3e, 0x90, 0xc0, 0xa8, 0x74, 0xcc, 0xf0, 0x74, \
> + 0x02, 0xf0, 0xe5, 0x3d, 0xf0, 0xe5, 0x3e, 0xf0, \
> + 0xe4, 0xf0, 0xf0, 0xf0, 0xf0, 0x90, 0xc0, 0x57, \
> + 0x74, 0x02, 0xf0, 0x90, 0xc0, 0x36, 0x74, 0x8b, \
> + 0xf0, 0x90, 0xc1, 0xa2, 0x74, 0x16, 0xf0, 0x74, \
> + 0x76, 0xf0, 0x90, 0xc1, 0xa8, 0x74, 0x36, 0xf0, \
> + 0xd2, 0x00, 0xc2, 0x85, 0x22, 0x8b, 0x09, 0x8a, \
> + 0x0a, 0x89, 0x0b, 0x8c, 0x0c, 0x8d, 0x0d, 0xe4, \
> + 0xfd, 0xfc, 0xc3, 0xed, 0x95, 0x0d, 0xe5, 0x0c, \
> + 0x64, 0x80, 0xf8, 0xec, 0x64, 0x80, 0x98, 0x50, \
> + 0x18, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0x8d, \
> + 0x82, 0x8c, 0x83, 0x12, 0x06, 0xd8, 0xff, 0x12, \
> + 0x00, 0x03, 0x0d, 0xbd, 0x00, 0x01, 0x0c, 0x80, \
> + 0xd9, 0x22, 0x8f, 0x11, 0x12, 0x0c, 0x5c, 0x7f, \
> + 0x14, 0x12, 0x05, 0xb9, 0xaf, 0x11, 0x12, 0x09, \
> + 0xf5, 0x20, 0x02, 0x06, 0x12, 0x0c, 0x94, 0x7f, \
> + 0x00, 0x22, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, \
> + 0x0a, 0xd2, 0x8f, 0x12, 0xd2, 0x06, 0x12, 0x0c, \
> + 0x78, 0x7f, 0x14, 0x12, 0x05, 0xb9, 0x12, 0x0c, \
> + 0x94, 0xaf, 0x12, 0x22, 0x54, 0x44, 0x20, 0x69, \
> + 0x6e, 0x69, 0x74, 0x20, 0x2d}
> +
> +
> +#define FWP13 {\
> + 0x02, 0xf9, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, \
> + 0x3a, 0x65, 0x78, 0x63, 0x75, 0x74, 0x65, 0x20, \
> + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, \
> + 0x69, 0x6e, 0x20, 0x70, 0x64, 0x72, 0x61, 0x6d, \
> + 0x0d, 0x0a, 0x00, 0xc2, 0xaf, 0xc2, 0x8c, 0xe5, \
> + 0x89, 0x54, 0xf0, 0x44, 0x02, 0xf5, 0x89, 0x75, \
> + 0x8c, 0x87, 0x75, 0x8a, 0x87, 0x8e, 0x53, 0x8f, \
> + 0x54, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x8b, 0x50, \
> + 0x8a, 0x51, 0x89, 0x52, 0xd2, 0xa9, 0xd2, 0x8c, \
> + 0xd2, 0xaf, 0x22, 0x90, 0xc1, 0xa3, 0x74, 0x50, \
> + 0xf0, 0x7f, 0xc8, 0x12, 0x05, 0x26, 0x12, 0x05, \
> + 0x26, 0x74, 0x10, 0xf0, 0x90, 0x80, 0x90, 0x74, \
> + 0x05, 0xf0, 0x12, 0x07, 0xc5, 0x12, 0x04, 0x77, \
> + 0x02, 0x0c, 0xfa, 0x75, 0x98, 0x50, 0x75, 0x89, \
> + 0x20, 0xef, 0x70, 0x05, 0x53, 0x87, 0x7f, 0x80, \
> + 0x03, 0x43, 0x87, 0x80, 0x8d, 0x8d, 0xd2, 0x8e, \
> + 0xc2, 0x98, 0xc2, 0x99, 0xd2, 0xac, 0xd2, 0xaf, \
> + 0x22, 0xc1, 0x81, 0x02, 0x3b, 0x00, 0x00, 0x02, \
> + 0x3d, 0x03, 0xe8, 0x01, 0x47, 0x00, 0x01, 0x21, \
> + 0x00, 0xc1, 0x04, 0xc1, 0x00, 0x02, 0x53, 0x00, \
> + 0x00, 0x02, 0x4e, 0x00, 0x00, 0x00, 0xd2, 0x80, \
> + 0x7f, 0x14, 0x12, 0x05, 0xb9, 0xd2, 0x81, 0x7f, \
> + 0x14, 0x12, 0x05, 0xb9, 0xc2, 0x80, 0x7f, 0x14, \
> + 0x12, 0x05, 0xb9, 0xc2, 0x81, 0x7f, 0x14, 0x02, \
> + 0x05, 0xb9, 0x20, 0x06, 0x04, 0xc2, 0x80, 0x80, \
> + 0x02, 0xd2, 0x80, 0x7f, 0x0a, 0x12, 0x05, 0xb9, \
> + 0xd2, 0x81, 0x7f, 0x0a, 0x12, 0x05, 0xb9, 0xc2, \
> + 0x81, 0x7f, 0x0a, 0x02, 0x05, 0xb9, 0xc2, 0x80, \
> + 0x7f, 0x14, 0x12, 0x05, 0xb9, 0xd2, 0x81, 0x7f, \
> + 0x14, 0x12, 0x05, 0xb9, 0xd2, 0x80, 0x7f, 0x14, \
> + 0x02, 0x05, 0xb9, 0x90, 0x80, 0x90, 0x74, 0x05, \
> + 0xf0, 0xe4, 0xf5, 0xa0, 0x07}
> +
> +#define FWCT {\
> + 0x82, 0x4e, 0x12, 0x0c, 0xfa, 0xd2, 0x8a, 0xd2, \
> + 0xaa, 0xd2, 0xaf, 0x22, 0xef, 0xd3, 0x94, 0x00, \
> + 0x40, 0x09, 0xe4, 0xfe, 0x0e, 0xbe, 0x76, 0xfc, \
> + 0x1f, 0x80, 0xf1, 0x22, 0xc2, 0xaf, 0xc2, 0xac, \
> + 0xc2, 0x98, 0xc2, 0x99, 0x75, 0x98, 0x40, 0xc2, \
> + 0xa9, 0xc2, 0x8e, 0x22, 0x30, 0x99, 0x04, 0xd2, \
> + 0x01, 0xc2, 0x99, 0x30, 0x98, 0x05, 0x85, 0x99, \
> + 0x08, 0xc2, 0x98, 0x32, 0xc2, 0x8c, 0xc2, 0xa9, \
> + 0x75, 0x50, 0xff, 0x75, 0x51, 0x00, 0x75, 0x52, \
> + 0x0e, 0x22, 0x7d, 0xf8, 0xe4, 0xff, 0x02, 0x0c, \
> + 0x21, 0xfd}
Binding the firmware binary inside the a GPL code violates GPL license. Instead, please
split the firmware into a firmware file, and use the request_firmware() to load it from
userspace.
We need also manufacturer's ack to distribute their firmwares in a binary form, or, if this
is not possible, we'll need some script to extract the firmare from the original driver.
> +
> +#define FWTRL 0xfd
> +#define FWCTL 0x52
> +#define FWF3L 0x0f
> +#define LME_FIRMWARE_D {{FWTRL, FWF1}, \
> + {FWTRL, FWF2}, \
> + {FWF3L, FWF3}, \
> + {FWTRL, FWP1}, \
> + {FWTRL, FWP2}, \
> + {FWTRL, FWP3}, \
> + {FWTRL, FWP4}, \
> + {FWTRL, FWP5}, \
> + {FWTRL, FWP6}, \
> + {FWTRL, FWP7}, \
> + {FWTRL, FWP8}, \
> + {FWTRL, FWP9}, \
> + {FWTRL, FWP10}, \
> + {FWTRL, FWP11}, \
> + {FWTRL, FWP12}, \
> + {FWTRL, FWP13}, \
> + {FWCTL, FWCT} }
> +
> +struct lme_firmware_data {
> + u8 length;
> + u8 bulk_data[256]; /* Address */
> +};
> +
> +#endif
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
prev parent reply other threads:[~2010-07-29 18:18 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-16 13:43 [PATCH] added support for DM040832731 DVB-S USB BOX - Correction Malcolm Priestley
2010-07-29 18:16 ` Mauro Carvalho Chehab
2010-09-08 21:08 ` Mauro Carvalho Chehab
2010-07-29 18:18 ` Mauro Carvalho Chehab [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C51C5E4.2020406@redhat.com \
--to=mchehab@redhat.com \
--cc=linux-media@vger.kernel.org \
--cc=tvboxspy@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.