Portál AbcLinuxu, 1. května 2025 09:54
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.
sudo apt-get install linux-source sudo apt-get install linux-headers-`uname -r`
cd /usr/src tar -xjvf linux-source-XYZ
ln -s /usr/src/linux-source-XYZ /lib/modules/`uname -r`/source
Aplikujte patch
patch -p1 -i a867_v1.0.29.patch
make make install
depmod -a
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(¤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 -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:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.