Portál AbcLinuxu, 2. května 2025 05:44

07ca:0337 AVerMedia A867 DVB-T dongle

Podpora: částečná
Ovladač: dodává výrobce
Adresa ovladače: http://avertv.avermedia.com/Support/DownloadCoun..
Zastaralý: ano

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č 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

diff -rupBN 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-11 19:36:41.181953750 +0200
@@ -6,15 +6,18 @@
 #include 
 #include 
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0))
+#include 
+#endif
+
 #include "af903x.h"
 #include "dvb_frontend.h"
 #include "standard.h"
-
+#include 
 #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(¤t->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(¤t->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 -rupBN 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	2013-04-25 21:13:22.000000000 +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 -rupBN 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-11 19:20:29.137928544 +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
+ifeq (,$(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:25 | Zobrazeno: 1387×

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

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