Portál AbcLinuxu, 1. května 2025 09:54

07ca:0337 AVerMedia A867 DVB-T dongle

Identifikace pod Linuxem

Bus 001 Device 006: ID 07ca:0337 AVerMedia Technologies, Inc. A867 DVB-T dongle

Postup zprovoznění pod Linuxem

Ovladač je značně zastaralý a nelze zkompilovat na jádrech 3.5 a vyšší. Povedlo se mi napsat patch pro zprovoznění na Linux Mint 17 resp. Ubuntu 14.04 s jádrem 3.13. Nezkoušel jsem dálkový ovladač, proto uvádím částečná podpora.

  1. Nainstalujte zdrojové a hlavičkové soubory jádra:
    sudo apt-get install linux-source
    sudo apt-get install linux-headers-`uname -r`
    
  2. Zdrojové soubory rozbalte
    cd /usr/src
    tar -xjvf linux-source-XYZ
  3. Vytvořte symbolický odkaz v /lib/modules/jádro/source na zdrojové soubory jádra
    ln -s /usr/src/linux-source-XYZ /lib/modules/`uname -r`/source
  4. Ze stránek výrobce si stáhněte originální ovladač zde a rozbalte do adresáře /usr/local/src/a867_drv_v1.0.29
  5. Vytvořte patch soubor a867_v1.0.29.patch a uložte do adresáře a867_drv_v1.0.29

    Aplikujte patch

    patch -p1 -i a867_v1.0.29.patch
  6. Kompilace a instalace ovladače
    make
    make install 
  7. Pokud vše proběhlo jak má, vytvořil se soubor a867.ko, který se zkopíroval do adresáře /lib/modules/j`uname -r`/kernel/drivers/media/usb/dvb-usb
    Po instalaci doporučuji aktualizovat informace o modulech
    depmod -a

Poznámka

a867_v1.0.29.patch

Při kopírování patche z WEBu je problém, že většina řádků je zakončena CRLF znaky. Tento detail, ale způsobí, že patch nejde aplikovat. Dneska jsem ještě objevil mušku - na uložto už jsem novou verzi nedával. Jedná se o Makefile řádek ifneq (,$(wildcard $(KSRC)/drivers/media/dvb/.))^M. Správně je ifNeq.

diff -uprN a867_drv_v1.0.29/af903x-fe.c a867_drv_v1.0.29_new/af903x-fe.c
--- a867_drv_v1.0.29/af903x-fe.c    2012-05-22 15:45:29.000000000 +0200
+++ a867_drv_v1.0.29_new/af903x-fe.c    2014-08-12 19:42:39.973513655 +0200
@@ -6,15 +6,18 @@
#include <linux/list.h>
#include <linux/module.h>

+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0))
+#include <linux/kthread.h>
+#endif
+
#include "af903x.h"
#include "dvb_frontend.h"
#include "standard.h"
-
+#include <linux/dvb/frontend.h>
#define A333_FREQ_MIN    44250000
#define A333_FREQ_MAX    867250000


-
static int alwayslock; // default to 0
module_param(alwayslock, int, 0644);
MODULE_PARM_DESC(alwayslock, "Whether to always report channel as locked (default:no).");
@@ -22,7 +25,7 @@ MODULE_PARM_DESC(alwayslock, "Whether to

struct af903xm_state {
struct dvb_frontend demod;
-    fe_bandwidth_t current_bandwidth;
+    u32 current_bandwidth;
uint32_t current_frequency;

struct completion thread_exit;
@@ -305,22 +308,28 @@ static int af903x_identify(struct af903x
return 0;
}

-static int af903x_get_frontend(struct dvb_frontend* fe,
-                struct dvb_frontend_parameters *fep)
+
+static int af903x_get_frontend(struct dvb_frontend* fe)
{
+    struct dtv_frontend_properties *fep = &fe->dtv_property_cache;    
struct af903xm_state *state = fe->demodulator_priv;
+    u32 delsys;

deb_data("- Enter %s Function -\n",__FUNCTION__);
+
+    delsys = fep->delivery_system;
memset(fep, 0, sizeof(*fep));
+    fep->delivery_system = delsys;
+
fep->frequency = state->current_frequency;
fep->inversion = INVERSION_AUTO;
-    fep->u.ofdm.bandwidth = state->current_bandwidth;
+    fep->bandwidth_hz = state->current_bandwidth;
return 0;
}

-static int af903x_set_frontend(struct dvb_frontend* fe,
-                struct dvb_frontend_parameters *fep)
+static int af903x_set_frontend(struct dvb_frontend* fe)
{
+    struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
struct af903xm_state *state = fe->demodulator_priv;
struct af903x_ofdm_channel ch;
u16 bw=0;
@@ -338,15 +347,15 @@ static int af903x_set_frontend(struct dv
return -EINVAL;
}

-    switch(fep->u.ofdm.bandwidth) {
-    case BANDWIDTH_8_MHZ: bw=8; break;
-    case BANDWIDTH_7_MHZ: bw=7; break;
-    case BANDWIDTH_6_MHZ: bw=6; break;
+    switch(fep->bandwidth_hz) {
+    case 8000000: bw=8; break;
+    case 7000000: bw=7; break;
+    case 6000000: bw=6; break;

case 6:  
case 7:
case 8:
-        bw = fep->u.ofdm.bandwidth;
+        bw = fep->bandwidth_hz;
deb_data("- %s wrong bw value: %d -\n",__FUNCTION__, fep->u.ofdm.bandwidth);
break;
default:
@@ -360,7 +369,7 @@ static int af903x_set_frontend(struct dv
ch.Bw               = bw;
deb_data("- %s freq=%d KHz, bw=%d MHz -\n",__FUNCTION__, ch.RF_kHz,  ch.Bw);

-    state->current_bandwidth = fep->u.ofdm.bandwidth;
+    state->current_bandwidth = fep->bandwidth_hz;
state->current_frequency = fep->frequency;

ret = af903x_tune(fe, &ch);
@@ -371,6 +380,8 @@ static int af903x_set_frontend(struct dv
return ret;
}

+
+
static int af903x_read_status(struct dvb_frontend *fe, fe_status_t *stat)
{
DWORD dwError;
@@ -539,9 +550,10 @@ static void af903x_release(struct dvb_fr
}

static struct dvb_frontend_ops af903x_ops = {
+    .delsys = { SYS_DVBT },
.info = {
.name = "A867 USB DVB-T",
-        .type = FE_OFDM,
+        //.type = FE_OFDM,
.frequency_min      = A333_FREQ_MIN,
.frequency_max      = A333_FREQ_MAX,
.frequency_stepsize = 62500,
@@ -590,7 +602,7 @@ struct dvb_frontend * af903x_attach(u8 t

return demod;
}
-
+//EXPORT_SYMBOL(af903x_attach);

static Dword Monitor_GPIO8(void)
{
@@ -688,7 +700,10 @@ static int af903x_monitor_thread_func(vo
sigfillset(&current->blocked);
sprintf(current->comm, "%s", thread_name);
#else
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0))
daemonize("%s", thread_name);
+#endif
allow_signal(SIGTERM);
#endif
siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|\
@@ -769,7 +784,11 @@ void af903x_start_monitor_thread(struct
if( atomic_add_unless(&st->thread_created, 1, 1) ) {
st->thread_should_stop = 0;
init_completion(&st->thread_exit);  
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0))
kernel_thread(af903x_monitor_thread_func, st, 0);
+#else
+                kthread_run(af903x_monitor_thread_func, st, "af903x_monitor");
+#endif
}
#endif //USE_MONITOR_TH

diff -uprN a867_drv_v1.0.29/af903x-tuner.c a867_drv_v1.0.29_new/af903x-tuner.c
--- a867_drv_v1.0.29/af903x-tuner.c    2010-11-10 04:46:22.000000000 +0100
+++ a867_drv_v1.0.29_new/af903x-tuner.c    2014-08-12 19:42:39.973513655 +0200
@@ -9,13 +9,15 @@
#define IF2  36150       // IF2 frequency = 36.150 MHz
#define FREF 16000       // Quartz oscillator 16 MHz

-static int tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int tuner_set_params(struct dvb_frontend *fe)
{
+    struct dtv_frontend_properties *params = &fe->dtv_property_cache;
struct tuner_priv *priv=NULL;
DWORD dwError = Error_NO_ERROR;
DWORD freq = params->frequency ;// 1000; // Hz -> kHz

-    priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
+    priv->bandwidth = (params->delivery_system == SYS_DVBT) ? params->bandwidth_hz : 0;
+    //priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->bandwidth_hz : 0;

deb_data("%s - freq : %d , bandwidth : %dn",__FUNCTION__, freq,priv->bandwidth);

@@ -24,6 +26,8 @@ static int tuner_set_params(struct dvb_f

return 0;
}
+
+
static int tuner_get_frequency(struct dvb_frontend *fe, u32 *frequency)
{
struct tuner_priv *priv = fe->tuner_priv;
@@ -70,6 +74,7 @@ static const struct dvb_tuner_ops tuner_
.sleep         = tuner_sleep,

.set_params    = tuner_set_params,
+
.get_frequency = tuner_get_frequency,
.get_bandwidth = tuner_get_bandwidth
};
diff -uprN a867_drv_v1.0.29/Makefile a867_drv_v1.0.29_new/Makefile
--- a867_drv_v1.0.29/Makefile    2010-11-10 04:46:22.000000000 +0100
+++ a867_drv_v1.0.29_new/Makefile    2014-08-12 19:43:32.077515006 +0200
@@ -1,7 +1,6 @@

EXTRA_CFLAGS = -DEXPORT_SYMTAB

-BUILD_DEP = dvb-usb/dvb-usb-common.h dvb-usb/dvb-usb.h dvb-usb/dvb-usb-ids.h dvb-core/dvb_frontend.h dvb-core/dvbdev.h dvb-core/dmxdev.h dvb-core/dvb_demux.h dvb-core/dvb_net.h dvb-core/demux.h dvb-core/dvb_ringbuffer.h frontends/dvb-pll.h

ifneq ($(KOBJ),)
version := $(shell egrep -e '^VERSION ' $(KSRC)/Makefile | awk 'BEGIN{FS="="}{print $$2}' | tr -d ' ')
@@ -29,9 +28,24 @@ INSTALL := $(shell which install)
DEPMOD  := $(shell which depmod || which /sbin/depmod || echo "true You should now run depmod")

# SYSTEM DVB setting
+ifneq (,$(wildcard $(KSRC)/drivers/media/dvb/.))
+BUILD_DEP = dvb/dvb-usb/dvb-usb-common.h dvb/dvb-usb/dvb-usb.h dvb/dvb-usb/dvb-usb-ids.h dvb/dvb-core/dvb_frontend.h dvb/dvb-core/dvbdev.h dvb/dvb-core/dmxdev.h dvb/dvb-core/dvb_demux.h dvb/dvb-core/dvb_net.h dvb/dvb-core/demux.h dvb/dvb-core/dvb_ringbuffer.h dvb/frontends/dvb-pll.h
+
+MISSINGFILE := $(shell for i in $(BUILD_DEP); do if [ ! -f $(KSRC)/drivers/media/$$i ]; then echo $$i; fi; done)
+
DVB_FLAGS += -I$(KSRC)/drivers/media/dvb/dvb-core/
DVB_FLAGS += -I$(KSRC)/drivers/media/dvb/dvb-usb/
DVB_FLAGS += -I$(KSRC)/drivers/media/dvb/frontends/
+else
+BUILD_DEP = usb/dvb-usb/dvb-usb-common.h usb/dvb-usb/dvb-usb.h dvb-core/dvb-usb-ids.h dvb-core/dvb_frontend.h dvb-core/dvbdev.h dvb-core/dmxdev.h dvb-core/dvb_demux.h dvb-core/dvb_net.h dvb-core/demux.h dvb-core/dvb_ringbuffer.h dvb-frontends/dvb-pll.h
+
+MISSINGFILE := $(shell for i in $(BUILD_DEP); do if [ ! -f $(KSRC)/drivers/media/$$i ]; then echo $$i; fi; done)
+
+DVB_FLAGS += -I$(KSRC)/drivers/media/dvb-core/
+DVB_FLAGS += -I$(KSRC)/drivers/media/usb/dvb-usb/
+DVB_FLAGS += -I$(KSRC)/drivers/media/dvb-frontends/
+endif
+
EXTRA_CFLAGS += $(DVB_FLAGS)

EXTRA_CFLAGS += -Wno-unused-value -Wno-unused-variable -Wno-unused-parameter \
@@ -41,20 +55,23 @@ a867-objs := af903x-core.o af903x-device
demodulator.o demodulatorextend.o usb2impl.o user.o mxl5007t.o Maxlinear_MXL5007.o Afa_AF9007.o
obj-m += a867.o

-MISSINGFILE := $(shell for i in $(BUILD_DEP); do if [ ! -f $(KSRC)/drivers/media/dvb/$$i ]; then echo $$i; fi; done)

ifeq ($(MISSINGFILE),)
default:
make -C $(KSRC) O=$(KOBJ) SUBDIRS=`pwd` modules
else
default:
-    @echo Missing files that required to build driver: $(KSRC)/drivers/media/dvb/$(MISSINGFILE)
-    @echo Try to get kernel source closest to $(CURRENT) from www.kernel.org and then copy to $(KSRC)/drivers/media/dvb  
+    @echo Missing files that required to build driver: $(KSRC)/drivers/media/$(MISSINGFILE)
+    @echo Try to get kernel source closest to $(CURRENT) from www.kernel.org and then copy to $(KSRC)/drivers/media  
endif

install:
-    @install -d $(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/dvb/a867
-    $(INSTALL) -c -D -m 644 -c a867.ko $(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/dvb/a867/
+    if [ -d "$(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/dvb" ];then  \
+             install -d $(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/dvb/a867; \
+             install -c -D -m 644 -c a867.ko $(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/dvb/a867/;    \
+        else \
+               install -c -D -m 644 -c a867.ko $(DESTDIR)/lib/modules/$(CURRENT)/kernel/drivers/media/usb/dvb-usb/;   \
+        fi  
/sbin/depmod -a

remove:

Dokument vytvořil: Skokan, 11.8.2014 21:26 | Poslední úprava: Skokan, 12.8.2014 20:20 | Historie změn | Zobrazeno: 1639×

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.