Commit 888c9d64 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] dvb updates - mostly typedef to structs and other similar cleaning

parent a913beae
...@@ -6,5 +6,7 @@ dvb-ttpci-objs := saa7146_core.o saa7146_v4l.o av7110.o av7110_ir.o ...@@ -6,5 +6,7 @@ dvb-ttpci-objs := saa7146_core.o saa7146_v4l.o av7110.o av7110_ir.o
obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
...@@ -89,7 +89,7 @@ static int outcom(av7110_t *av7110, int type, int com, int num, ...); ...@@ -89,7 +89,7 @@ static int outcom(av7110_t *av7110, int type, int com, int num, ...);
static void SetMode(av7110_t *av7110, int mode); static void SetMode(av7110_t *av7110, int mode);
void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p); void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p);
void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, dvb_demux_feed_t *feed); void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, struct dvb_demux_feed *feed);
static u32 vidmem = 0; static u32 vidmem = 0;
static u32 vidlow = 0; static u32 vidlow = 0;
...@@ -392,9 +392,9 @@ static int arm_thread(void *data) ...@@ -392,9 +392,9 @@ static int arm_thread(void *data)
static int static int
record_cb(pes2ts_t *p2t, u8 *buf, size_t len) record_cb(dvb_filter_pes2ts_t *p2t, u8 *buf, size_t len)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) p2t->priv; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
if (!(dvbdmxfeed->ts_type & TS_PACKET)) if (!(dvbdmxfeed->ts_type & TS_PACKET))
return 0; return 0;
...@@ -404,13 +404,13 @@ record_cb(pes2ts_t *p2t, u8 *buf, size_t len) ...@@ -404,13 +404,13 @@ record_cb(pes2ts_t *p2t, u8 *buf, size_t len)
return dvbdmxfeed->cb.ts(buf, len, 0, 0, return dvbdmxfeed->cb.ts(buf, len, 0, 0,
&dvbdmxfeed->feed.ts, DMX_OK); &dvbdmxfeed->feed.ts, DMX_OK);
else else
return pes2ts(p2t, buf, len); return dvb_filter_pes2ts(p2t, buf, len);
} }
static int static int
pes2ts_cb(void *priv, unsigned char *data) dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) priv; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
dvbdmxfeed->cb.ts(data, 188, 0, 0, dvbdmxfeed->cb.ts(data, 188, 0, 0,
&dvbdmxfeed->feed.ts, &dvbdmxfeed->feed.ts,
...@@ -420,9 +420,9 @@ pes2ts_cb(void *priv, unsigned char *data) ...@@ -420,9 +420,9 @@ pes2ts_cb(void *priv, unsigned char *data)
static int static int
AV_StartRecord(av7110_t *av7110, int av, AV_StartRecord(av7110_t *av7110, int av,
dvb_demux_feed_t *dvbdmxfeed) struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
if (av7110->playing||(av7110->rec_mode&av)) if (av7110->playing||(av7110->rec_mode&av))
return -EBUSY; return -EBUSY;
...@@ -432,20 +432,30 @@ AV_StartRecord(av7110_t *av7110, int av, ...@@ -432,20 +432,30 @@ AV_StartRecord(av7110_t *av7110, int av,
switch (av7110->rec_mode) { switch (av7110->rec_mode) {
case RP_AUDIO: case RP_AUDIO:
pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, dvb_filter_pes2ts_init (&av7110->p2t[0],
pes2ts_cb, (void *)dvbdmx->pesfilter[0]); dvbdmx->pesfilter[0]->pid,
dvb_filter_pes2ts_cb,
(void *)dvbdmx->pesfilter[0]);
outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
break; break;
case RP_VIDEO: case RP_VIDEO:
pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, dvb_filter_pes2ts_init (&av7110->p2t[1],
pes2ts_cb, (void *)dvbdmx->pesfilter[1]); dvbdmx->pesfilter[1]->pid,
dvb_filter_pes2ts_cb,
(void *)dvbdmx->pesfilter[1]);
outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
break; break;
case RP_AV: case RP_AV:
pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, dvb_filter_pes2ts_init (&av7110->p2t[0],
pes2ts_cb, (void *)dvbdmx->pesfilter[0]); dvbdmx->pesfilter[0]->pid,
pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, dvb_filter_pes2ts_cb,
pes2ts_cb, (void *)dvbdmx->pesfilter[1]); (void *)dvbdmx->pesfilter[0]);
dvb_filter_pes2ts_init (&av7110->p2t[1],
dvbdmx->pesfilter[1]->pid,
dvb_filter_pes2ts_cb,
(void *)dvbdmx->pesfilter[1]);
outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0);
break; break;
} }
...@@ -463,8 +473,8 @@ AV_StartPlay(av7110_t *av7110, int av) ...@@ -463,8 +473,8 @@ AV_StartPlay(av7110_t *av7110, int av)
outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
if (av7110->playing == RP_NONE) { if (av7110->playing == RP_NONE) {
reset_ipack(&av7110->ipack[0]); dvb_filter_ipack_reset(&av7110->ipack[0]);
reset_ipack(&av7110->ipack[1]); dvb_filter_ipack_reset(&av7110->ipack[1]);
} }
av7110->playing|=av; av7110->playing|=av;
...@@ -814,7 +824,7 @@ void CI_handle(av7110_t *av7110, u8 *data, u16 len) ...@@ -814,7 +824,7 @@ void CI_handle(av7110_t *av7110, u8 *data, u16 len)
static inline int static inline int
DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len, DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len,
u8 * buffer2, size_t buffer2_len, u8 * buffer2, size_t buffer2_len,
dvb_demux_filter_t *dvbdmxfilter, struct dvb_demux_filter *dvbdmxfilter,
dmx_success_t success, dmx_success_t success,
av7110_t *av7110) av7110_t *av7110)
{ {
...@@ -896,7 +906,7 @@ static void fidbirq(struct saa7146* saa, void *data) ...@@ -896,7 +906,7 @@ static void fidbirq(struct saa7146* saa, void *data)
// FIXME: use bottom half or tasklet // FIXME: use bottom half or tasklet
if (av7110->feeding && mem[0]==0x47) if (av7110->feeding && mem[0]==0x47)
DvbDmxSWFilterPackets(&av7110->demux, mem, 512); dvb_dmx_swfilter_packets(&av7110->demux, mem, 512);
} }
#else #else
static static
...@@ -922,7 +932,7 @@ void fidbirq (unsigned long data) ...@@ -922,7 +932,7 @@ void fidbirq (unsigned long data)
} else { } else {
if (av7110->ttbp>1000*188 && av7110->ttbp<1024*188) { if (av7110->ttbp>1000*188 && av7110->ttbp<1024*188) {
if (av7110->feeding) if (av7110->feeding)
DvbDmxSWFilterPackets(&av7110->demux, dvb_dmx_swfilter_packets(&av7110->demux,
mem+av7110->ttbp, mem+av7110->ttbp,
1024- av7110->ttbp / 188); 1024- av7110->ttbp / 188);
} }
...@@ -937,7 +947,7 @@ void fidbirq (unsigned long data) ...@@ -937,7 +947,7 @@ void fidbirq (unsigned long data)
// FIXME: use bottom half or tasklet // FIXME: use bottom half or tasklet
if (av7110->feeding && mem[0]==0x47) if (av7110->feeding && mem[0]==0x47)
DvbDmxSWFilterPackets(&av7110->demux, mem, num); dvb_dmx_swfilter_packets(&av7110->demux, mem, num);
} }
#endif #endif
...@@ -1001,7 +1011,7 @@ void debiirq (unsigned long data) ...@@ -1001,7 +1011,7 @@ void debiirq (unsigned long data)
switch (type&0xff) { switch (type&0xff) {
case DATA_TS_RECORD: case DATA_TS_RECORD:
DvbDmxSWFilterPackets(&av7110->demux, dvb_dmx_swfilter_packets(&av7110->demux,
(const u8 *)av7110->debi_virt, (const u8 *)av7110->debi_virt,
av7110->debilen/188); av7110->debilen/188);
spin_lock(&av7110->debilock); spin_lock(&av7110->debilock);
...@@ -2008,8 +2018,8 @@ firmversion(av7110_t *av7110) ...@@ -2008,8 +2018,8 @@ firmversion(av7110_t *av7110)
av7110->arm_app=(buf[6] << 16) + buf[7]; av7110->arm_app=(buf[6] << 16) + buf[7];
av7110->avtype=(buf[8] << 16) + buf[9]; av7110->avtype=(buf[8] << 16) + buf[9];
printk ("av7110 (%d): AV711%d - firm %08x, rtsl %08x, vid %08x, app %08x\n", printk ("DVB: AV711%d(%d) - firm %08x, rtsl %08x, vid %08x, app %08x\n",
av7110->saa->dvb_adapter->num, av7110->avtype, av7110->arm_fw, av7110->avtype, av7110->saa->dvb_adapter->num, av7110->arm_fw,
av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app); av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
return; return;
...@@ -2483,9 +2493,12 @@ dvb_play(av7110_t *av7110, const u8 *buf, ...@@ -2483,9 +2493,12 @@ dvb_play(av7110_t *av7110, const u8 *buf,
if (umem) { if (umem) {
if (copy_from_user(av7110->kbuf[type], buf, n)) if (copy_from_user(av7110->kbuf[type], buf, n))
return -EFAULT; return -EFAULT;
instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); dvb_filter_instant_repack(av7110->kbuf[type], n,
} else &av7110->ipack[type]);
instant_repack((u8 *)buf, n, &av7110->ipack[type]); } else {
dvb_filter_instant_repack((u8 *)buf, n,
&av7110->ipack[type]);
}
todo -= n; todo -= n;
buf += n; buf += n;
} }
...@@ -2517,7 +2530,8 @@ dvb_aplay(av7110_t *av7110, const u8 *buf, ...@@ -2517,7 +2530,8 @@ dvb_aplay(av7110_t *av7110, const u8 *buf,
n=IPACKS*2; n=IPACKS*2;
if (copy_from_user(av7110->kbuf[type], buf, n)) if (copy_from_user(av7110->kbuf[type], buf, n))
return -EFAULT; return -EFAULT;
instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); dvb_filter_instant_repack(av7110->kbuf[type], n,
&av7110->ipack[type]);
// memcpy(dvb->kbuf[type], buf, n); // memcpy(dvb->kbuf[type], buf, n);
todo -= n; todo -= n;
buf += n; buf += n;
...@@ -2525,7 +2539,7 @@ dvb_aplay(av7110_t *av7110, const u8 *buf, ...@@ -2525,7 +2539,7 @@ dvb_aplay(av7110_t *av7110, const u8 *buf,
return count-todo; return count-todo;
} }
void init_p2t(p2t_t *p, dvb_demux_feed_t *feed) void init_p2t(p2t_t *p, struct dvb_demux_feed *feed)
{ {
memset(p->pes,0,TS_SIZE); memset(p->pes,0,TS_SIZE);
p->counter = 0; p->counter = 0;
...@@ -2721,7 +2735,7 @@ int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length) ...@@ -2721,7 +2735,7 @@ int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length)
void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter,
dvb_demux_feed_t *feed) struct dvb_demux_feed *feed)
{ {
int l, pes_start; int l, pes_start;
...@@ -3104,7 +3118,7 @@ static int dvb_mmap(struct file* file, struct vm_area_struct *vma) ...@@ -3104,7 +3118,7 @@ static int dvb_mmap(struct file* file, struct vm_area_struct *vma)
static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) static unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned int mask=0; unsigned int mask=0;
...@@ -3124,24 +3138,24 @@ static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) ...@@ -3124,24 +3138,24 @@ static unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
static struct file_operations dvb_fops = { static struct file_operations dvb_fops = {
ioctl: dvb_ioctl, .ioctl = dvb_ioctl,
mmap: dvb_mmap, .mmap = dvb_mmap,
llseek: no_llseek .llseek = no_llseek
}; };
/* template for video_device-structure */ /* template for video_device-structure */
static struct video_device dvb_template = { static struct video_device dvb_template = {
owner: THIS_MODULE, .owner = THIS_MODULE,
name: "DVB Board", .name = "DVB Board",
type: VID_TYPE_TUNER | .type = VID_TYPE_TUNER |
VID_TYPE_CAPTURE | VID_TYPE_CAPTURE |
VID_TYPE_OVERLAY | VID_TYPE_OVERLAY |
VID_TYPE_CLIPPING | VID_TYPE_CLIPPING |
VID_TYPE_FRAMERAM | VID_TYPE_FRAMERAM |
VID_TYPE_SCALES, VID_TYPE_SCALES,
hardware: VID_HARDWARE_SAA7146, .hardware = VID_HARDWARE_SAA7146,
fops: &dvb_fops .fops = &dvb_fops
}; };
...@@ -3182,9 +3196,9 @@ static inline int vid_unregister(av7110_t *av7110) ...@@ -3182,9 +3196,9 @@ static inline int vid_unregister(av7110_t *av7110)
******************************************************************************/ ******************************************************************************/
static int static int
StartHWFilter(dvb_demux_filter_t *dvbdmxfilter) StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
{ {
dvb_demux_feed_t *dvbdmxfeed=dvbdmxfilter->feed; struct dvb_demux_feed *dvbdmxfeed=dvbdmxfilter->feed;
av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv; av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv;
u16 buf[20]; u16 buf[20];
int ret, i; int ret, i;
...@@ -3220,7 +3234,7 @@ StartHWFilter(dvb_demux_filter_t *dvbdmxfilter) ...@@ -3220,7 +3234,7 @@ StartHWFilter(dvb_demux_filter_t *dvbdmxfilter)
} }
static int static int
StopHWFilter(dvb_demux_filter_t *dvbdmxfilter) StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
{ {
av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv; av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv;
u16 buf[3]; u16 buf[3];
...@@ -3252,9 +3266,9 @@ StopHWFilter(dvb_demux_filter_t *dvbdmxfilter) ...@@ -3252,9 +3266,9 @@ StopHWFilter(dvb_demux_filter_t *dvbdmxfilter)
static int static int
dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count) dvb_write_to_decoder(struct dvb_demux_feed *dvbdmxfeed, u8 *buf, size_t count)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
av7110_t *av7110=(av7110_t *) dvbdmx->priv; av7110_t *av7110=(av7110_t *) dvbdmx->priv;
ipack *ipack=&av7110->ipack[dvbdmxfeed->pes_type]; ipack *ipack=&av7110->ipack[dvbdmxfeed->pes_type];
...@@ -3277,7 +3291,7 @@ dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count) ...@@ -3277,7 +3291,7 @@ dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count)
return -1; return -1;
} }
if (buf[1]&0x40) if (buf[1]&0x40)
send_ipack_rest(ipack); dvb_filter_ipack_flush(ipack);
if (buf[3]&0x20) { // adaptation field? if (buf[3]&0x20) { // adaptation field?
count-=buf[4]+1; count-=buf[4]+1;
...@@ -3287,14 +3301,15 @@ dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count) ...@@ -3287,14 +3301,15 @@ dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count)
} }
} }
instant_repack(buf+4, count-4, &av7110->ipack[dvbdmxfeed->pes_type]); dvb_filter_instant_repack(buf+4, count-4,
&av7110->ipack[dvbdmxfeed->pes_type]);
return 0; return 0;
} }
static void static void
dvb_feed_start_pid(dvb_demux_feed_t *dvbdmxfeed) dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
av7110_t *av7110=(av7110_t *) dvbdmx->priv; av7110_t *av7110=(av7110_t *) dvbdmx->priv;
u16 *pid=dvbdmx->pids, npids[5]; u16 *pid=dvbdmx->pids, npids[5];
int i; int i;
...@@ -3329,9 +3344,9 @@ dvb_feed_start_pid(dvb_demux_feed_t *dvbdmxfeed) ...@@ -3329,9 +3344,9 @@ dvb_feed_start_pid(dvb_demux_feed_t *dvbdmxfeed)
} }
static void static void
dvb_feed_stop_pid(dvb_demux_feed_t *dvbdmxfeed) dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
av7110_t *av7110=(av7110_t *) dvbdmx->priv; av7110_t *av7110=(av7110_t *) dvbdmx->priv;
u16 *pid=dvbdmx->pids, npids[5]; u16 *pid=dvbdmx->pids, npids[5];
int i; int i;
...@@ -3365,9 +3380,9 @@ dvb_feed_stop_pid(dvb_demux_feed_t *dvbdmxfeed) ...@@ -3365,9 +3380,9 @@ dvb_feed_stop_pid(dvb_demux_feed_t *dvbdmxfeed)
} }
static int static int
dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed) dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
av7110_t *av7110=(av7110_t *) dvbdmx->priv; av7110_t *av7110=(av7110_t *) dvbdmx->priv;
if (!dvbdmx->dmx.frontend) if (!dvbdmx->dmx.frontend)
...@@ -3425,9 +3440,9 @@ dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed) ...@@ -3425,9 +3440,9 @@ dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed)
static int static int
dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed) dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
av7110_t *av7110=(av7110_t *) dvbdmx->priv; av7110_t *av7110=(av7110_t *) dvbdmx->priv;
if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET)
...@@ -3468,8 +3483,8 @@ dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed) ...@@ -3468,8 +3483,8 @@ dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed)
static void static void
restart_feeds(av7110_t *av7110) restart_feeds(av7110_t *av7110)
{ {
dvb_demux_t *dvbdmx=&av7110->demux; struct dvb_demux *dvbdmx=&av7110->demux;
dvb_demux_feed_t *feed; struct dvb_demux_feed *feed;
int mode; int mode;
int i; int i;
...@@ -3660,7 +3675,7 @@ ci_ll_read(ring_buffer_t *cibuf, struct file *file, char *buf, size_t count, lof ...@@ -3660,7 +3675,7 @@ ci_ll_read(ring_buffer_t *cibuf, struct file *file, char *buf, size_t count, lof
static int static int
dvb_ca_open(struct inode *inode, struct file *file) dvb_ca_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
int err=dvb_generic_open(inode, file); int err=dvb_generic_open(inode, file);
...@@ -3673,7 +3688,7 @@ dvb_ca_open(struct inode *inode, struct file *file) ...@@ -3673,7 +3688,7 @@ dvb_ca_open(struct inode *inode, struct file *file)
static unsigned static unsigned
int dvb_ca_poll(struct file *file, poll_table *wait) int dvb_ca_poll(struct file *file, poll_table *wait)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned int mask=0; unsigned int mask=0;
...@@ -3702,7 +3717,7 @@ static int ...@@ -3702,7 +3717,7 @@ static int
dvb_ca_ioctl(struct inode *inode, struct file *file, dvb_ca_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned long arg=(unsigned long) parg; unsigned long arg=(unsigned long) parg;
...@@ -3716,7 +3731,7 @@ dvb_ca_ioctl(struct inode *inode, struct file *file, ...@@ -3716,7 +3731,7 @@ dvb_ca_ioctl(struct inode *inode, struct file *file,
case CA_GET_CAP: case CA_GET_CAP:
{ {
ca_cap_t cap; ca_caps_t cap;
cap.slot_num=2; cap.slot_num=2;
#ifdef NEW_CI #ifdef NEW_CI
...@@ -3788,7 +3803,7 @@ static ssize_t ...@@ -3788,7 +3803,7 @@ static ssize_t
dvb_ca_write(struct file *file, const char *buf, dvb_ca_write(struct file *file, const char *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos); return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
...@@ -3797,7 +3812,7 @@ dvb_ca_write(struct file *file, const char *buf, ...@@ -3797,7 +3812,7 @@ dvb_ca_write(struct file *file, const char *buf,
static ssize_t static ssize_t
dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos) dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos); return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
...@@ -3812,7 +3827,7 @@ dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos) ...@@ -3812,7 +3827,7 @@ dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos)
static unsigned int dvb_video_poll(struct file *file, poll_table *wait) static unsigned int dvb_video_poll(struct file *file, poll_table *wait)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned int mask=0; unsigned int mask=0;
...@@ -3834,7 +3849,7 @@ static ssize_t ...@@ -3834,7 +3849,7 @@ static ssize_t
dvb_video_write(struct file *file, const char *buf, dvb_video_write(struct file *file, const char *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY)
...@@ -3847,7 +3862,7 @@ static ssize_t ...@@ -3847,7 +3862,7 @@ static ssize_t
dvb_audio_write(struct file *file, const char *buf, dvb_audio_write(struct file *file, const char *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) { if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) {
...@@ -3876,7 +3891,7 @@ play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock) ...@@ -3876,7 +3891,7 @@ play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock)
for (i=0; i<n; i++) for (i=0; i<n; i++)
dvb_play(av7110, buf, len, 0, 1, 1); dvb_play(av7110, buf, len, 0, 1, 1);
send_ipack_rest(&av7110->ipack[1]); dvb_filter_ipack_flush(&av7110->ipack[1]);
} }
...@@ -3884,7 +3899,7 @@ static int ...@@ -3884,7 +3899,7 @@ static int
dvb_video_ioctl(struct inode *inode, struct file *file, dvb_video_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned long arg=(unsigned long) parg; unsigned long arg=(unsigned long) parg;
int ret=0; int ret=0;
...@@ -4041,7 +4056,7 @@ dvb_video_ioctl(struct inode *inode, struct file *file, ...@@ -4041,7 +4056,7 @@ dvb_video_ioctl(struct inode *inode, struct file *file,
case VIDEO_CLEAR_BUFFER: case VIDEO_CLEAR_BUFFER:
ring_buffer_flush(&av7110->avout); ring_buffer_flush(&av7110->avout);
reset_ipack(&av7110->ipack[1]); dvb_filter_ipack_reset(&av7110->ipack[1]);
if (av7110->playing==RP_AV) { if (av7110->playing==RP_AV) {
outcom(av7110, COMTYPE_REC_PLAY, outcom(av7110, COMTYPE_REC_PLAY,
...@@ -4073,7 +4088,7 @@ static int ...@@ -4073,7 +4088,7 @@ static int
dvb_audio_ioctl(struct inode *inode, struct file *file, dvb_audio_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
unsigned long arg=(unsigned long) parg; unsigned long arg=(unsigned long) parg;
int ret=0; int ret=0;
...@@ -4164,7 +4179,7 @@ dvb_audio_ioctl(struct inode *inode, struct file *file, ...@@ -4164,7 +4179,7 @@ dvb_audio_ioctl(struct inode *inode, struct file *file,
case AUDIO_CLEAR_BUFFER: case AUDIO_CLEAR_BUFFER:
ring_buffer_flush(&av7110->aout); ring_buffer_flush(&av7110->aout);
reset_ipack(&av7110->ipack[0]); dvb_filter_ipack_reset(&av7110->ipack[0]);
if (av7110->playing==RP_AV) if (av7110->playing==RP_AV)
outcom(av7110, COMTYPE_REC_PLAY, outcom(av7110, COMTYPE_REC_PLAY,
__Play, 2, AV_PES, 0); __Play, 2, AV_PES, 0);
...@@ -4192,7 +4207,7 @@ static int ...@@ -4192,7 +4207,7 @@ static int
dvb_osd_ioctl(struct inode *inode, struct file *file, dvb_osd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
#ifdef CONFIG_DVB_AV7110_OSD #ifdef CONFIG_DVB_AV7110_OSD
...@@ -4204,7 +4219,7 @@ dvb_osd_ioctl(struct inode *inode, struct file *file, ...@@ -4204,7 +4219,7 @@ dvb_osd_ioctl(struct inode *inode, struct file *file,
static int dvb_video_open(struct inode *inode, struct file *file) static int dvb_video_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
int err; int err;
...@@ -4220,7 +4235,7 @@ static int dvb_video_open(struct inode *inode, struct file *file) ...@@ -4220,7 +4235,7 @@ static int dvb_video_open(struct inode *inode, struct file *file)
static int dvb_video_release(struct inode *inode, struct file *file) static int dvb_video_release(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
AV_Stop(av7110, RP_VIDEO); AV_Stop(av7110, RP_VIDEO);
...@@ -4229,7 +4244,7 @@ static int dvb_video_release(struct inode *inode, struct file *file) ...@@ -4229,7 +4244,7 @@ static int dvb_video_release(struct inode *inode, struct file *file)
static int dvb_audio_open(struct inode *inode, struct file *file) static int dvb_audio_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
int err=dvb_generic_open(inode, file); int err=dvb_generic_open(inode, file);
...@@ -4242,7 +4257,7 @@ static int dvb_audio_open(struct inode *inode, struct file *file) ...@@ -4242,7 +4257,7 @@ static int dvb_audio_open(struct inode *inode, struct file *file)
static int dvb_audio_release(struct inode *inode, struct file *file) static int dvb_audio_release(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
av7110_t *av7110=(av7110_t *) dvbdev->priv; av7110_t *av7110=(av7110_t *) dvbdev->priv;
AV_Stop(av7110, RP_AUDIO); AV_Stop(av7110, RP_AUDIO);
...@@ -4256,75 +4271,70 @@ static int dvb_audio_release(struct inode *inode, struct file *file) ...@@ -4256,75 +4271,70 @@ static int dvb_audio_release(struct inode *inode, struct file *file)
******************************************************************************/ ******************************************************************************/
static struct file_operations dvb_video_fops = { static struct file_operations dvb_video_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: 0, .write = dvb_video_write,
write: dvb_video_write, .ioctl = dvb_generic_ioctl,
ioctl: dvb_generic_ioctl, .open = dvb_video_open,
open: dvb_video_open, .release = dvb_video_release,
release: dvb_video_release, .poll = dvb_video_poll,
poll: dvb_video_poll,
}; };
static dvb_device_t dvbdev_video = { static struct dvb_device dvbdev_video = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_video_fops, .fops = &dvb_video_fops,
kernel_ioctl: dvb_video_ioctl, .kernel_ioctl = dvb_video_ioctl,
}; };
static struct file_operations dvb_audio_fops = { static struct file_operations dvb_audio_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: 0, .write = dvb_audio_write,
write: dvb_audio_write, .ioctl = dvb_generic_ioctl,
ioctl: dvb_generic_ioctl, .open = dvb_audio_open,
open: dvb_audio_open, .release = dvb_audio_release,
release: dvb_audio_release, .poll = dvb_audio_poll,
poll: dvb_audio_poll,
}; };
static dvb_device_t dvbdev_audio = { static struct dvb_device dvbdev_audio = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_audio_fops, .fops = &dvb_audio_fops,
kernel_ioctl: dvb_audio_ioctl, .kernel_ioctl = dvb_audio_ioctl,
}; };
static struct file_operations dvb_ca_fops = { static struct file_operations dvb_ca_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: dvb_ca_read, .read = dvb_ca_read,
write: dvb_ca_write, .write = dvb_ca_write,
ioctl: dvb_generic_ioctl, .ioctl = dvb_generic_ioctl,
open: dvb_ca_open, .open = dvb_ca_open,
release: dvb_generic_release, .release = dvb_generic_release,
poll: dvb_ca_poll, .poll = dvb_ca_poll,
}; };
static dvb_device_t dvbdev_ca = { static struct dvb_device dvbdev_ca = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_ca_fops, .fops = &dvb_ca_fops,
kernel_ioctl: dvb_ca_ioctl, .kernel_ioctl = dvb_ca_ioctl,
}; };
static struct file_operations dvb_osd_fops = { static struct file_operations dvb_osd_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: 0, .ioctl = dvb_generic_ioctl,
write: 0, .open = dvb_generic_open,
ioctl: dvb_generic_ioctl, .release = dvb_generic_release,
open: dvb_generic_open,
release: dvb_generic_release,
poll: 0,
}; };
static dvb_device_t dvbdev_osd = { static struct dvb_device dvbdev_osd = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_osd_fops, .fops = &dvb_osd_fops,
kernel_ioctl: dvb_osd_ioctl, .kernel_ioctl = dvb_osd_ioctl,
}; };
...@@ -4359,7 +4369,7 @@ dvb_register(av7110_t *av7110) ...@@ -4359,7 +4369,7 @@ dvb_register(av7110_t *av7110)
{ {
int ret, i; int ret, i;
dmx_frontend_t *dvbfront=&av7110->hw_frontend; dmx_frontend_t *dvbfront=&av7110->hw_frontend;
dvb_demux_t *dvbdemux=&av7110->demux; struct dvb_demux *dvbdemux=&av7110->demux;
if (av7110->registered) if (av7110->registered)
return -1; return -1;
...@@ -4414,7 +4424,7 @@ dvb_register(av7110_t *av7110) ...@@ -4414,7 +4424,7 @@ dvb_register(av7110_t *av7110)
DMX_SECTION_FILTERING| DMX_SECTION_FILTERING|
DMX_MEMORY_BASED_FILTERING); DMX_MEMORY_BASED_FILTERING);
DvbDmxInit(&av7110->demux); dvb_dmx_init(&av7110->demux);
dvbfront->id="hw_frontend"; dvbfront->id="hw_frontend";
...@@ -4426,7 +4436,7 @@ dvb_register(av7110_t *av7110) ...@@ -4426,7 +4436,7 @@ dvb_register(av7110_t *av7110)
av7110->dmxdev.demux=&dvbdemux->dmx; av7110->dmxdev.demux=&dvbdemux->dmx;
av7110->dmxdev.capabilities=0; av7110->dmxdev.capabilities=0;
DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
} }
if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) { if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) {
...@@ -4443,7 +4453,7 @@ dvb_register(av7110_t *av7110) ...@@ -4443,7 +4453,7 @@ dvb_register(av7110_t *av7110)
DMX_SECTION_FILTERING| DMX_SECTION_FILTERING|
DMX_MEMORY_BASED_FILTERING); DMX_MEMORY_BASED_FILTERING);
DvbDmxInit(&av7110->demux); dvb_dmx_init(&av7110->demux);
dvbfront->id="hw_frontend"; dvbfront->id="hw_frontend";
dvbfront->vendor="VLSI"; dvbfront->vendor="VLSI";
...@@ -4454,7 +4464,7 @@ dvb_register(av7110_t *av7110) ...@@ -4454,7 +4464,7 @@ dvb_register(av7110_t *av7110)
av7110->dmxdev.demux=&dvbdemux->dmx; av7110->dmxdev.demux=&dvbdemux->dmx;
av7110->dmxdev.capabilities=0; av7110->dmxdev.capabilities=0;
DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
} }
ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx,
...@@ -4505,7 +4515,7 @@ dvb_register(av7110_t *av7110) ...@@ -4505,7 +4515,7 @@ dvb_register(av7110_t *av7110)
static void static void
dvb_unregister(av7110_t *av7110) dvb_unregister(av7110_t *av7110)
{ {
dvb_demux_t *dvbdemux=&av7110->demux; struct dvb_demux *dvbdemux=&av7110->demux;
if (!av7110->registered) if (!av7110->registered)
return; return;
...@@ -4516,8 +4526,8 @@ dvb_unregister(av7110_t *av7110) ...@@ -4516,8 +4526,8 @@ dvb_unregister(av7110_t *av7110)
dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend); dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend); dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
DmxDevRelease(&av7110->dmxdev); dvb_dmxdev_release(&av7110->dmxdev);
DvbDmxRelease(&av7110->demux); dvb_dmx_release(&av7110->demux);
if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS)
dvb_remove_frontend_notifier (av7110->dvb_adapter, dvb_remove_frontend_notifier (av7110->dvb_adapter,
...@@ -4584,9 +4594,9 @@ int av7110_attach (struct saa7146 *saa, void **av7110_ptr) ...@@ -4584,9 +4594,9 @@ int av7110_attach (struct saa7146 *saa, void **av7110_ptr)
av7110->vidmode=VIDEO_MODE_PAL; av7110->vidmode=VIDEO_MODE_PAL;
init_ipack(&av7110->ipack[0], IPACKS, play_audio_cb); dvb_filter_ipack_init(&av7110->ipack[0], IPACKS, play_audio_cb);
av7110->ipack[0].data=(void *) av7110; av7110->ipack[0].data=(void *) av7110;
init_ipack(&av7110->ipack[1], IPACKS, play_video_cb); dvb_filter_ipack_init(&av7110->ipack[1], IPACKS, play_video_cb);
av7110->ipack[1].data=(void *) av7110; av7110->ipack[1].data=(void *) av7110;
...@@ -4705,8 +4715,8 @@ int av7110_detach (struct saa7146 *saa, void** av7110_ptr) ...@@ -4705,8 +4715,8 @@ int av7110_detach (struct saa7146 *saa, void** av7110_ptr)
saa7146_write(av7110->saa_mem, ISR,(MASK_19 | MASK_03)); saa7146_write(av7110->saa_mem, ISR,(MASK_19 | MASK_03));
ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer); ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
free_ipack(&av7110->ipack[0]); dvb_filter_ipack_free(&av7110->ipack[0]);
free_ipack(&av7110->ipack[1]); dvb_filter_ipack_free(&av7110->ipack[1]);
vfree(av7110->iobuf); vfree(av7110->iobuf);
pci_free_consistent(av7110->saa->device, 8192, av7110->debi_virt, pci_free_consistent(av7110->saa->device, 8192, av7110->debi_virt,
av7110->debi_bus); av7110->debi_bus);
......
...@@ -479,7 +479,7 @@ typedef struct p2t_s { ...@@ -479,7 +479,7 @@ typedef struct p2t_s {
u8 counter; u8 counter;
long int pos; long int pos;
int frags; int frags;
dvb_demux_feed_t *feed; struct dvb_demux_feed *feed;
} p2t_t; } p2t_t;
...@@ -561,7 +561,7 @@ typedef struct av7110_s { ...@@ -561,7 +561,7 @@ typedef struct av7110_s {
int vidmode; int vidmode;
dmxdev_t dmxdev; dmxdev_t dmxdev;
dvb_demux_t demux; struct dvb_demux demux;
char demux_id[16]; char demux_id[16];
dmx_frontend_t hw_frontend; dmx_frontend_t hw_frontend;
...@@ -580,9 +580,9 @@ typedef struct av7110_s { ...@@ -580,9 +580,9 @@ typedef struct av7110_s {
#define TRICK_FREEZE 3 #define TRICK_FREEZE 3
struct audio_status audiostate; struct audio_status audiostate;
dvb_demux_filter_t *handle2filter[32]; struct dvb_demux_filter *handle2filter[32];
p2t_t p2t_filter[MAXFILT]; p2t_t p2t_filter[MAXFILT];
pes2ts_t p2t[2]; dvb_filter_pes2ts_t p2t[2];
struct ipack_s ipack[2]; struct ipack_s ipack[2];
u8 *kbuf[2]; u8 *kbuf[2];
...@@ -621,11 +621,11 @@ typedef struct av7110_s { ...@@ -621,11 +621,11 @@ typedef struct av7110_s {
ring_buffer_t ci_wbuffer; ring_buffer_t ci_wbuffer;
dvb_adapter_t *dvb_adapter; struct dvb_adapter *dvb_adapter;
dvb_device_t *video_dev; struct dvb_device *video_dev;
dvb_device_t *audio_dev; struct dvb_device *audio_dev;
dvb_device_t *ca_dev; struct dvb_device *ca_dev;
dvb_device_t *osd_dev; struct dvb_device *osd_dev;
int dsp_dev; int dsp_dev;
} av7110_t; } av7110_t;
......
...@@ -1399,7 +1399,7 @@ int i2c_reset(struct saa7146* saa) ...@@ -1399,7 +1399,7 @@ int i2c_reset(struct saa7146* saa)
/* if any error is still present, a fatal error has occured ... */ /* if any error is still present, a fatal error has occured ... */
if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) { if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) {
hprintk("saa7146: i2c_reset: fatal error, status:0x%08x\n",status); hprintk("saa7146: i2c_reset: fatal error, status:0x%08x\n",status);
return -1; return -EIO;
} }
return 0; return 0;
......
...@@ -33,8 +33,8 @@ ...@@ -33,8 +33,8 @@
#include "saa7146_core.h" #include "saa7146_core.h"
#include "saa7146_v4l.h" #include "saa7146_v4l.h"
#include "av7110.h" #include "av7110.h"
#include "../dvb-core/compat.h" #include "compat.h"
#include "../dvb-core/dvb_i2c.h" #include "dvb_i2c.h"
/* insmod parameter: here you can specify the number of video-buffers /* insmod parameter: here you can specify the number of video-buffers
to be allocated. for simple capturing 2 buffers (double-buffering) to be allocated. for simple capturing 2 buffers (double-buffering)
...@@ -197,23 +197,23 @@ static ...@@ -197,23 +197,23 @@ static
int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
{ {
struct saa7146 *a = i2c->data; struct saa7146 *a = i2c->data;
int result, count; int count;
int i = 0; int i = 0;
dprintk(KERN_ERR "saa7146_core.o: master_xfer called, num:%d\n",num); dprintk(KERN_ERR "saa7146_core.o: master_xfer called, num:%d\n",num);
/* prepare the message(s), get number of u32s to transfer */ /* prepare the message(s), get number of u32s to transfer */
count = prepare(msgs, num, a->i2c); count = prepare(msgs, num, a->i2c);
if ( 0 > count ) {
hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not prepare i2c-message\n"); if (count < 0) {
hprintk(KERN_ERR "saa7146_core.o: could not prepare i2c-message\n");
return -EIO; return -EIO;
} }
/* reset the i2c-device if necessary */ /* reset the i2c-device if necessary */
result = i2c_reset( a ); if (i2c_reset(a) < 0) {
if ( 0 > result ) { hprintk(KERN_ERR "saa7146_core.o: could not reset i2c-bus\n");
hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not reset i2c-bus\n"); return -EIO;
return result;
} }
for(i = 0; i < count; i++) { for(i = 0; i < count; i++) {
...@@ -222,31 +222,17 @@ int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) ...@@ -222,31 +222,17 @@ int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
* we do not start the whole rps1-engine... * we do not start the whole rps1-engine...
*/ */
result = i2c_write_out( a, &a->i2c[i],
SAA7146_I2C_TIMEOUT );
if ( 0 != result) {
/* if address-error occured, don't retry */ /* if address-error occured, don't retry */
if ( result == -EREMOTEIO ) if (i2c_write_out(a, &a->i2c[i], SAA7146_I2C_TIMEOUT) < 0) {
{ hprintk (KERN_ERR "saa7146_core.o: "
hprintk(KERN_ERR "saa7146_core.o: master_xfer: error in address phase\n"); "i2c error in address phase\n");
return result; return -EREMOTEIO;
}
hprintk(KERN_ERR "saa7146_core.o: master_xfer: error transferring, trying again\n");
break;
}
} }
/* see if an error occured & the last retry failed */
if (0 != result) {
hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not transfer i2c-message\n");
return -EIO;
} }
/* if any things had to be read, get the results */ /* if any things had to be read, get the results */
result = clean_up(msgs, num, a->i2c); if (clean_up(msgs, num, a->i2c) < 0) {
if ( 0 > result ) { hprintk(KERN_ERR "saa7146_core.o: i2c cleanup failed!\n");
hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not cleanup\n");
return -EIO; return -EIO;
} }
...@@ -259,13 +245,19 @@ int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) ...@@ -259,13 +245,19 @@ int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
static static
int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
{ {
struct saa7146 *saa = i2c->data;
int retries = SAA7146_I2C_RETRIES; int retries = SAA7146_I2C_RETRIES;
int ret; int ret;
if (down_interruptible (&saa->i2c_sem))
return -ERESTARTSYS;
do { do {
ret = do_master_xfer (i2c, msgs, num); ret = do_master_xfer (i2c, msgs, num);
} while (ret != num && retries--); } while (ret != num && retries--);
up (&saa->i2c_sem);
return ret; return ret;
} }
...@@ -273,6 +265,8 @@ int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) ...@@ -273,6 +265,8 @@ int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
/* registering functions to load algorithms at runtime */ /* registering functions to load algorithms at runtime */
int i2c_saa7146_add_bus (struct saa7146 *saa) int i2c_saa7146_add_bus (struct saa7146 *saa)
{ {
init_MUTEX(&saa->i2c_sem);
/* enable i2c-port pins */ /* enable i2c-port pins */
saa7146_write (saa->mem, MC1, (MASK_08 | MASK_24)); saa7146_write (saa->mem, MC1, (MASK_08 | MASK_24));
...@@ -389,9 +383,9 @@ static int saa7146_core_command (struct dvb_i2c_bus *i2c, unsigned int cmd, void ...@@ -389,9 +383,9 @@ static int saa7146_core_command (struct dvb_i2c_bus *i2c, unsigned int cmd, void
struct saa7146_debi_transfer *dt = arg; struct saa7146_debi_transfer *dt = arg;
printk("saa7146_core.o: SAA7146_DEBI_TRANSFER\n"); dprintk("saa7146_core.o: SAA7146_DEBI_TRANSFER\n");
printk("saa7146_core.o: timeout:%d, swap:%d, slave16:%d, increment:%d, intel:%d, tien:%d\n", dt->timeout, dt->swap, dt->slave16, dt->increment, dt->intel, dt->tien); dprintk("saa7146_core.o: timeout:%d, swap:%d, slave16:%d, increment:%d, intel:%d, tien:%d\n", dt->timeout, dt->swap, dt->slave16, dt->increment, dt->intel, dt->tien);
printk("saa7146_core.o: address:0x%04x, num_bytes:%d, direction:%d, mem:0x%08x\n",dt->address,dt->address,dt->direction,dt->mem); dprintk("saa7146_core.o: address:0x%04x, num_bytes:%d, direction:%d, mem:0x%08x\n",dt->address,dt->address,dt->direction,dt->mem);
debi_transfer(saa, dt); debi_transfer(saa, dt);
break; break;
...@@ -622,7 +616,7 @@ int configure_saa7146 (struct saa7146 *saa) ...@@ -622,7 +616,7 @@ int configure_saa7146 (struct saa7146 *saa)
} }
/* print status message */ /* print status message */
printk(KERN_ERR "saa7146_core.o: %s: bus:%d, rev:%d, mem:0x%08x.\n", saa->name, saa->device->bus->number, saa->revision, (unsigned int) saa->mem); dprintk("saa7146_core.o: %s: bus:%d, rev:%d, mem:0x%08x.\n", saa->name, saa->device->bus->number, saa->revision, (unsigned int) saa->mem);
/* enable bus-mastering */ /* enable bus-mastering */
pci_set_master( saa->device ); pci_set_master( saa->device );
...@@ -827,7 +821,7 @@ static ...@@ -827,7 +821,7 @@ static
int __devinit saa7146_init_one (struct pci_dev *pdev, int __devinit saa7146_init_one (struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
struct dvb_adapter_s *adap; struct dvb_adapter *adap;
struct saa7146 *saa; struct saa7146 *saa;
int card_type; int card_type;
struct card_info *cinfo= (struct card_info *) ent->driver_data; struct card_info *cinfo= (struct card_info *) ent->driver_data;
......
#ifndef __SAA7146_CORE__ #ifndef __SAA7146_CORE__
#define __SAA7146_CORE__ #define __SAA7146_CORE__
#include <asm/io.h> /* definitions of u32 etc. */ #include <asm/io.h>
#include "../dvb-core/dvbdev.h" #include <asm/semaphore.h>
#if LINUX_VERSION_CODE < 0x020300 #include "dvbdev.h"
#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX
#define DECLARE_MUTEX_LOCKED(foo) struct semaphore foo = MUTEX_LOCKED
#define WAIT_QUEUE struct wait_queue*
#define init_waitqueue_head(wq) *(wq) = NULL;
#else
#define WAIT_QUEUE wait_queue_head_t
#endif
/* maximum number of capture frames we support */ /* maximum number of capture frames we support */
#define SAA7146_MAX_BUF 5 #define SAA7146_MAX_BUF 5
...@@ -37,12 +31,13 @@ struct saa7146 { ...@@ -37,12 +31,13 @@ struct saa7146 {
char name[32]; /* give it a nice name */ char name[32]; /* give it a nice name */
struct list_head list_head; struct list_head list_head;
dvb_adapter_t *dvb_adapter;
struct dvb_i2c_bus *i2c_bus;
struct pci_dev *device; struct pci_dev *device;
int card_type; int card_type;
struct dvb_adapter *dvb_adapter;
struct dvb_i2c_bus *i2c_bus;
struct semaphore i2c_sem;
void* data[SAA7146_MAX_EXTENSIONS]; /* data hooks for extensions */ void* data[SAA7146_MAX_EXTENSIONS]; /* data hooks for extensions */
int (*command) (struct dvb_i2c_bus *i, unsigned int cmd, void *arg); int (*command) (struct dvb_i2c_bus *i, unsigned int cmd, void *arg);
...@@ -70,8 +65,8 @@ struct saa7146 { ...@@ -70,8 +65,8 @@ struct saa7146 {
int grab_format[SAA7146_MAX_BUF]; /* video format of grabs */ int grab_format[SAA7146_MAX_BUF]; /* video format of grabs */
int grab_port[SAA7146_MAX_BUF]; /* video port for grab */ int grab_port[SAA7146_MAX_BUF]; /* video port for grab */
WAIT_QUEUE rps0_wq; /* rps0 interrupt queue (=> capture) */ wait_queue_head_t rps0_wq; /* rps0 interrupt queue (=> capture) */
WAIT_QUEUE rps1_wq; /* rps1 interrupt queue (=> i2c, ...) */ wait_queue_head_t rps1_wq; /* rps1 interrupt queue (=> i2c, ...) */
}; };
#define SAA7146_IRQ_RPS0 #define SAA7146_IRQ_RPS0
......
...@@ -320,7 +320,6 @@ static int saa7146_v4l_command(struct saa7146* saa, void *p, unsigned int cmd, v ...@@ -320,7 +320,6 @@ static int saa7146_v4l_command(struct saa7146* saa, void *p, unsigned int cmd, v
/* set corresponding buffer to unused */ /* set corresponding buffer to unused */
saa->frame_stat[i] = GBUFFER_UNUSED; saa->frame_stat[i] = GBUFFER_UNUSED;
printk ("saa7146_v4l.o: SAA7146_V4L_CSYNC, frame %i done.\n", i);
break; break;
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/videodev.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "dmxdev.h" #include "dmxdev.h"
...@@ -40,19 +41,19 @@ static int debug = 0; ...@@ -40,19 +41,19 @@ static int debug = 0;
#define dprintk if (debug) printk #define dprintk if (debug) printk
inline dmxdev_filter_t * inline dmxdev_filter_t *
DmxDevFile2Filter(struct file *file) dvb_dmxdev_file_to_filter(struct file *file)
{ {
return (dmxdev_filter_t *) file->private_data; return (dmxdev_filter_t *) file->private_data;
} }
inline dmxdev_dvr_t * inline dmxdev_dvr_t *
DmxDevFile2DVR(dmxdev_t *dmxdev, struct file *file) dvb_dmxdev_file_to_dvr(dmxdev_t *dmxdev, struct file *file)
{ {
return (dmxdev_dvr_t *) file->private_data; return (dmxdev_dvr_t *) file->private_data;
} }
static inline void static inline void
DmxDevBufferInit(dmxdev_buffer_t *buffer) dvb_dmxdev_buffer_init(dmxdev_buffer_t *buffer)
{ {
buffer->data=0; buffer->data=0;
buffer->size=8192; buffer->size=8192;
...@@ -63,7 +64,7 @@ DmxDevBufferInit(dmxdev_buffer_t *buffer) ...@@ -63,7 +64,7 @@ DmxDevBufferInit(dmxdev_buffer_t *buffer)
} }
static inline int static inline int
DmxDevBufferWrite(dmxdev_buffer_t *buf, uint8_t *src, int len) dvb_dmxdev_buffer_write(dmxdev_buffer_t *buf, uint8_t *src, int len)
{ {
int split; int split;
int free; int free;
...@@ -98,7 +99,7 @@ DmxDevBufferWrite(dmxdev_buffer_t *buf, uint8_t *src, int len) ...@@ -98,7 +99,7 @@ DmxDevBufferWrite(dmxdev_buffer_t *buf, uint8_t *src, int len)
} }
static ssize_t static ssize_t
DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking, dvb_dmxdev_buffer_read(dmxdev_buffer_t *src, int non_blocking,
char *buf, size_t count, loff_t *ppos) char *buf, size_t count, loff_t *ppos)
{ {
unsigned long todo=count; unsigned long todo=count;
...@@ -108,6 +109,7 @@ DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking, ...@@ -108,6 +109,7 @@ DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking,
return 0; return 0;
if ((error=src->error)) { if ((error=src->error)) {
src->pwrite=src->pread;
src->error=0; src->error=0;
return error; return error;
} }
...@@ -125,6 +127,7 @@ DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking, ...@@ -125,6 +127,7 @@ DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking,
return count-todo; return count-todo;
if ((error=src->error)) { if ((error=src->error)) {
src->pwrite=src->pread;
src->error=0; src->error=0;
return error; return error;
} }
...@@ -172,7 +175,7 @@ get_fe(dmx_demux_t *demux, int type) ...@@ -172,7 +175,7 @@ get_fe(dmx_demux_t *demux, int type)
} }
static inline void static inline void
DmxDevDVRStateSet(dmxdev_dvr_t *dmxdevdvr, int state) dvb_dmxdev_dvr_state_set(dmxdev_dvr_t *dmxdevdvr, int state)
{ {
spin_lock_irq(&dmxdevdvr->dev->lock); spin_lock_irq(&dmxdevdvr->dev->lock);
dmxdevdvr->state=state; dmxdevdvr->state=state;
...@@ -181,7 +184,7 @@ DmxDevDVRStateSet(dmxdev_dvr_t *dmxdevdvr, int state) ...@@ -181,7 +184,7 @@ DmxDevDVRStateSet(dmxdev_dvr_t *dmxdevdvr, int state)
static int dvb_dvr_open(struct inode *inode, struct file *file) static int dvb_dvr_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
dmx_frontend_t *front; dmx_frontend_t *front;
...@@ -198,7 +201,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file) ...@@ -198,7 +201,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
} }
if ((file->f_flags&O_ACCMODE)==O_RDONLY) { if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
DmxDevBufferInit(&dmxdev->dvr_buffer); dvb_dmxdev_buffer_init(&dmxdev->dvr_buffer);
dmxdev->dvr_buffer.size=DVR_BUFFER_SIZE; dmxdev->dvr_buffer.size=DVR_BUFFER_SIZE;
dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE); dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE);
if (!dmxdev->dvr_buffer.data) { if (!dmxdev->dvr_buffer.data) {
...@@ -230,7 +233,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file) ...@@ -230,7 +233,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
static int dvb_dvr_release(struct inode *inode, struct file *file) static int dvb_dvr_release(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
if (down_interruptible (&dmxdev->mutex)) if (down_interruptible (&dmxdev->mutex))
...@@ -258,7 +261,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) ...@@ -258,7 +261,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
static ssize_t static ssize_t
dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos) dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
int ret; int ret;
...@@ -276,12 +279,12 @@ dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos) ...@@ -276,12 +279,12 @@ dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
static ssize_t static ssize_t
dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos) dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
int ret; int ret;
//down(&dmxdev->mutex); //down(&dmxdev->mutex);
ret= DmxDevBufferRead(&dmxdev->dvr_buffer, ret= dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer,
file->f_flags&O_NONBLOCK, file->f_flags&O_NONBLOCK,
buf, count, ppos); buf, count, ppos);
//up(&dmxdev->mutex); //up(&dmxdev->mutex);
...@@ -289,7 +292,7 @@ dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos) ...@@ -289,7 +292,7 @@ dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos)
} }
static inline void static inline void
DmxDevFilterStateSet(dmxdev_filter_t *dmxdevfilter, int state) dvb_dmxdev_filter_state_set(dmxdev_filter_t *dmxdevfilter, int state)
{ {
spin_lock_irq(&dmxdevfilter->dev->lock); spin_lock_irq(&dmxdevfilter->dev->lock);
dmxdevfilter->state=state; dmxdevfilter->state=state;
...@@ -297,7 +300,7 @@ DmxDevFilterStateSet(dmxdev_filter_t *dmxdevfilter, int state) ...@@ -297,7 +300,7 @@ DmxDevFilterStateSet(dmxdev_filter_t *dmxdevfilter, int state)
} }
static int static int
DmxDevSetBufferSize(dmxdev_filter_t *dmxdevfilter, unsigned long size) dvb_dmxdev_set_buffer_size(dmxdev_filter_t *dmxdevfilter, unsigned long size)
{ {
dmxdev_buffer_t *buf=&dmxdevfilter->buffer; dmxdev_buffer_t *buf=&dmxdevfilter->buffer;
void *mem; void *mem;
...@@ -327,7 +330,7 @@ DmxDevSetBufferSize(dmxdev_filter_t *dmxdevfilter, unsigned long size) ...@@ -327,7 +330,7 @@ DmxDevSetBufferSize(dmxdev_filter_t *dmxdevfilter, unsigned long size)
} }
static void static void
DmxDevFilterTimeout(unsigned long data) dvb_dmxdev_filter_timeout(unsigned long data)
{ {
dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data; dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data;
...@@ -339,13 +342,13 @@ DmxDevFilterTimeout(unsigned long data) ...@@ -339,13 +342,13 @@ DmxDevFilterTimeout(unsigned long data)
} }
static void static void
DmxDevFilterTimer(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_filter_timer(dmxdev_filter_t *dmxdevfilter)
{ {
struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec;
del_timer(&dmxdevfilter->timer); del_timer(&dmxdevfilter->timer);
if (para->timeout) { if (para->timeout) {
dmxdevfilter->timer.function=DmxDevFilterTimeout; dmxdevfilter->timer.function=dvb_dmxdev_filter_timeout;
dmxdevfilter->timer.data=(unsigned long) dmxdevfilter; dmxdevfilter->timer.data=(unsigned long) dmxdevfilter;
dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000; dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000;
add_timer(&dmxdevfilter->timer); add_timer(&dmxdevfilter->timer);
...@@ -353,7 +356,7 @@ DmxDevFilterTimer(dmxdev_filter_t *dmxdevfilter) ...@@ -353,7 +356,7 @@ DmxDevFilterTimer(dmxdev_filter_t *dmxdevfilter)
} }
static int static int
DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len, dvb_dmxdev_section_callback(u8 *buffer1, size_t buffer1_len,
u8 *buffer2, size_t buffer2_len, u8 *buffer2, size_t buffer2_len,
dmx_section_filter_t *filter, dmx_section_filter_t *filter,
dmx_success_t success) dmx_success_t success)
...@@ -375,9 +378,9 @@ DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len, ...@@ -375,9 +378,9 @@ DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len,
buffer1[0], buffer1[1], buffer1[0], buffer1[1],
buffer1[2], buffer1[3], buffer1[2], buffer1[3],
buffer1[4], buffer1[5]); buffer1[4], buffer1[5]);
ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer1, buffer1_len); ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, buffer1_len);
if (ret==buffer1_len) { if (ret==buffer1_len) {
ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer2, buffer2_len); ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2, buffer2_len);
} }
if (ret<0) { if (ret<0) {
dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread; dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread;
...@@ -391,7 +394,7 @@ DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len, ...@@ -391,7 +394,7 @@ DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len,
} }
static int static int
DmxDevTSCallback(u8 *buffer1, size_t buffer1_len, dvb_dmxdev_ts_callback(u8 *buffer1, size_t buffer1_len,
u8 *buffer2, size_t buffer2_len, u8 *buffer2, size_t buffer2_len,
dmx_ts_feed_t *feed, dmx_ts_feed_t *feed,
dmx_success_t success) dmx_success_t success)
...@@ -415,9 +418,9 @@ DmxDevTSCallback(u8 *buffer1, size_t buffer1_len, ...@@ -415,9 +418,9 @@ DmxDevTSCallback(u8 *buffer1, size_t buffer1_len,
wake_up(&buffer->queue); wake_up(&buffer->queue);
return 0; return 0;
} }
ret=DmxDevBufferWrite(buffer, buffer1, buffer1_len); ret=dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
if (ret==buffer1_len) if (ret==buffer1_len)
ret=DmxDevBufferWrite(buffer, buffer2, buffer2_len); ret=dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
if (ret<0) { if (ret<0) {
buffer->pwrite=buffer->pread; buffer->pwrite=buffer->pread;
buffer->error=-EOVERFLOW; buffer->error=-EOVERFLOW;
...@@ -431,9 +434,9 @@ DmxDevTSCallback(u8 *buffer1, size_t buffer1_len, ...@@ -431,9 +434,9 @@ DmxDevTSCallback(u8 *buffer1, size_t buffer1_len,
/* stop feed but only mark the specified filter as stopped (state set) */ /* stop feed but only mark the specified filter as stopped (state set) */
static int static int
DmxDevFeedStop(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_feed_stop(dmxdev_filter_t *dmxdevfilter)
{ {
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
switch (dmxdevfilter->type) { switch (dmxdevfilter->type) {
case DMXDEV_TYPE_SEC: case DMXDEV_TYPE_SEC:
...@@ -453,9 +456,9 @@ DmxDevFeedStop(dmxdev_filter_t *dmxdevfilter) ...@@ -453,9 +456,9 @@ DmxDevFeedStop(dmxdev_filter_t *dmxdevfilter)
/* start feed associated with the specified filter */ /* start feed associated with the specified filter */
static int static int
DmxDevFeedStart(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_feed_start(dmxdev_filter_t *dmxdevfilter)
{ {
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_GO);
switch (dmxdevfilter->type) { switch (dmxdevfilter->type) {
case DMXDEV_TYPE_SEC: case DMXDEV_TYPE_SEC:
...@@ -475,7 +478,7 @@ DmxDevFeedStart(dmxdev_filter_t *dmxdevfilter) ...@@ -475,7 +478,7 @@ DmxDevFeedStart(dmxdev_filter_t *dmxdevfilter)
otherwise release the feed */ otherwise release the feed */
static int static int
DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_feed_restart(dmxdev_filter_t *dmxdevfilter)
{ {
int i; int i;
dmxdev_t *dmxdev=dmxdevfilter->dev; dmxdev_t *dmxdev=dmxdevfilter->dev;
...@@ -485,7 +488,7 @@ DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter) ...@@ -485,7 +488,7 @@ DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter)
if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && if (dmxdev->filter[i].state>=DMXDEV_STATE_GO &&
dmxdev->filter[i].type==DMXDEV_TYPE_SEC && dmxdev->filter[i].type==DMXDEV_TYPE_SEC &&
dmxdev->filter[i].pid==pid) { dmxdev->filter[i].pid==pid) {
DmxDevFeedStart(&dmxdev->filter[i]); dvb_dmxdev_feed_start(&dmxdev->filter[i]);
return 0; return 0;
} }
...@@ -497,7 +500,7 @@ DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter) ...@@ -497,7 +500,7 @@ DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter)
} }
static int static int
DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_filter_stop(dmxdev_filter_t *dmxdevfilter)
{ {
if (dmxdevfilter->state<DMXDEV_STATE_GO) if (dmxdevfilter->state<DMXDEV_STATE_GO)
return 0; return 0;
...@@ -506,18 +509,18 @@ DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter) ...@@ -506,18 +509,18 @@ DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter)
case DMXDEV_TYPE_SEC: case DMXDEV_TYPE_SEC:
if (!dmxdevfilter->feed.sec) if (!dmxdevfilter->feed.sec)
break; break;
DmxDevFeedStop(dmxdevfilter); dvb_dmxdev_feed_stop(dmxdevfilter);
if (dmxdevfilter->filter.sec) if (dmxdevfilter->filter.sec)
dmxdevfilter->feed.sec-> dmxdevfilter->feed.sec->
release_filter(dmxdevfilter->feed.sec, release_filter(dmxdevfilter->feed.sec,
dmxdevfilter->filter.sec); dmxdevfilter->filter.sec);
DmxDevFeedRestart(dmxdevfilter); dvb_dmxdev_feed_restart(dmxdevfilter);
dmxdevfilter->feed.sec=0; dmxdevfilter->feed.sec=0;
break; break;
case DMXDEV_TYPE_PES: case DMXDEV_TYPE_PES:
if (!dmxdevfilter->feed.ts) if (!dmxdevfilter->feed.ts)
break; break;
DmxDevFeedStop(dmxdevfilter); dvb_dmxdev_feed_stop(dmxdevfilter);
dmxdevfilter->dev->demux-> dmxdevfilter->dev->demux->
release_ts_feed(dmxdevfilter->dev->demux, release_ts_feed(dmxdevfilter->dev->demux,
dmxdevfilter->feed.ts); dmxdevfilter->feed.ts);
...@@ -533,19 +536,19 @@ DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter) ...@@ -533,19 +536,19 @@ DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter)
} }
static inline int static inline int
DmxDevFilterReset(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_filter_reset(dmxdev_filter_t *dmxdevfilter)
{ {
if (dmxdevfilter->state<DMXDEV_STATE_SET) if (dmxdevfilter->state<DMXDEV_STATE_SET)
return 0; return 0;
dmxdevfilter->type=DMXDEV_TYPE_NONE; dmxdevfilter->type=DMXDEV_TYPE_NONE;
dmxdevfilter->pid=0xffff; dmxdevfilter->pid=0xffff;
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
return 0; return 0;
} }
static int static int
DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_filter_start(dmxdev_filter_t *dmxdevfilter)
{ {
dmxdev_t *dmxdev=dmxdevfilter->dev; dmxdev_t *dmxdev=dmxdevfilter->dev;
void *mem; void *mem;
...@@ -554,7 +557,7 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -554,7 +557,7 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
if (dmxdevfilter->state<DMXDEV_STATE_SET) if (dmxdevfilter->state<DMXDEV_STATE_SET)
return -EINVAL; return -EINVAL;
if (dmxdevfilter->state>=DMXDEV_STATE_GO) if (dmxdevfilter->state>=DMXDEV_STATE_GO)
DmxDevFilterStop(dmxdevfilter); dvb_dmxdev_filter_stop(dmxdevfilter);
mem=dmxdevfilter->buffer.data; mem=dmxdevfilter->buffer.data;
if (!mem) { if (!mem) {
...@@ -566,6 +569,8 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -566,6 +569,8 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
return -ENOMEM; return -ENOMEM;
} }
dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0;
switch (dmxdevfilter->type) { switch (dmxdevfilter->type) {
case DMXDEV_TYPE_SEC: case DMXDEV_TYPE_SEC:
{ {
...@@ -588,10 +593,9 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -588,10 +593,9 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
/* if no feed found, try to allocate new one */ /* if no feed found, try to allocate new one */
if (!*secfeed) { if (!*secfeed) {
ret=dmxdev->demux-> ret=dmxdev->demux->allocate_section_feed(dmxdev->demux,
allocate_section_feed(dmxdev->demux,
secfeed, secfeed,
DmxDevSectionCallback); dvb_dmxdev_section_callback);
if (ret<0) { if (ret<0) {
printk ("DVB (%s): could not alloc feed\n", printk ("DVB (%s): could not alloc feed\n",
__FUNCTION__); __FUNCTION__);
...@@ -604,18 +608,17 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -604,18 +608,17 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
if (ret<0) { if (ret<0) {
printk ("DVB (%s): could not set feed\n", printk ("DVB (%s): could not set feed\n",
__FUNCTION__); __FUNCTION__);
DmxDevFeedRestart(dmxdevfilter); dvb_dmxdev_feed_restart(dmxdevfilter);
return ret; return ret;
} }
} }
else else
DmxDevFeedStop(dmxdevfilter); dvb_dmxdev_feed_stop(dmxdevfilter);
ret=(*secfeed)->allocate_filter(*secfeed, secfilter); ret=(*secfeed)->allocate_filter(*secfeed, secfilter);
if (ret<0) { if (ret<0) {
DmxDevFeedRestart(dmxdevfilter); dvb_dmxdev_feed_restart(dmxdevfilter);
dmxdevfilter->feed.sec-> dmxdevfilter->feed.sec->start_filtering(*secfeed);
start_filtering(*secfeed);
dprintk ("could not get filter\n"); dprintk ("could not get filter\n");
return ret; return ret;
} }
...@@ -636,15 +639,14 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -636,15 +639,14 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
(*secfilter)->filter_mask[2]=0; (*secfilter)->filter_mask[2]=0;
dmxdevfilter->todo=0; dmxdevfilter->todo=0;
dmxdevfilter->feed.sec-> dmxdevfilter->feed.sec->start_filtering(dmxdevfilter->feed.sec);
start_filtering(dmxdevfilter->feed.sec); dvb_dmxdev_filter_timer(dmxdevfilter);
DmxDevFilterTimer(dmxdevfilter);
break; break;
} }
case DMXDEV_TYPE_PES: case DMXDEV_TYPE_PES:
{ {
struct timespec timeout = {0 }; struct timespec timeout = { 0 };
struct dmx_pes_filter_params *para=&dmxdevfilter->params.pes; struct dmx_pes_filter_params *para=&dmxdevfilter->params.pes;
dmx_output_t otype; dmx_output_t otype;
int ret; int ret;
...@@ -670,31 +672,29 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) ...@@ -670,31 +672,29 @@ DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter)
ret=dmxdev->demux->allocate_ts_feed(dmxdev->demux, ret=dmxdev->demux->allocate_ts_feed(dmxdev->demux,
tsfeed, tsfeed,
DmxDevTSCallback); dvb_dmxdev_ts_callback);
if (ret<0) if (ret<0)
return ret; return ret;
(*tsfeed)->priv=(void *) dmxdevfilter; (*tsfeed)->priv=(void *) dmxdevfilter;
ret=(*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 188, 32768, 0, timeout); ret=(*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 188, 32768, 0, timeout);
if (ret<0) { if (ret<0) {
dmxdev->demux-> dmxdev->demux->release_ts_feed(dmxdev->demux, *tsfeed);
release_ts_feed(dmxdev->demux, *tsfeed);
return ret; return ret;
} }
dmxdevfilter->feed.ts-> dmxdevfilter->feed.ts->start_filtering(dmxdevfilter->feed.ts);
start_filtering(dmxdevfilter->feed.ts);
break; break;
} }
default: default:
return -EINVAL; return -EINVAL;
} }
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_GO);
return 0; return 0;
} }
static int dvb_demux_open(struct inode *inode, struct file *file) static int dvb_demux_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
int i; int i;
dmxdev_filter_t *dmxdevfilter; dmxdev_filter_t *dmxdevfilter;
...@@ -714,9 +714,9 @@ static int dvb_demux_open(struct inode *inode, struct file *file) ...@@ -714,9 +714,9 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
dmxdevfilter->dvbdev=dmxdev->dvbdev; dmxdevfilter->dvbdev=dmxdev->dvbdev;
file->private_data=dmxdevfilter; file->private_data=dmxdevfilter;
DmxDevBufferInit(&dmxdevfilter->buffer); dvb_dmxdev_buffer_init(&dmxdevfilter->buffer);
dmxdevfilter->type=DMXDEV_TYPE_NONE; dmxdevfilter->type=DMXDEV_TYPE_NONE;
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
dmxdevfilter->feed.ts=0; dmxdevfilter->feed.ts=0;
init_timer(&dmxdevfilter->timer); init_timer(&dmxdevfilter->timer);
...@@ -725,13 +725,13 @@ static int dvb_demux_open(struct inode *inode, struct file *file) ...@@ -725,13 +725,13 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
} }
int int
DmxDevFilterFree(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter) dvb_dmxdev_filter_free(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter)
{ {
if (down_interruptible(&dmxdev->mutex)) if (down_interruptible(&dmxdev->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
DmxDevFilterStop(dmxdevfilter); dvb_dmxdev_filter_stop(dmxdevfilter);
DmxDevFilterReset(dmxdevfilter); dvb_dmxdev_filter_reset(dmxdevfilter);
if (dmxdevfilter->buffer.data) { if (dmxdevfilter->buffer.data) {
void *mem=dmxdevfilter->buffer.data; void *mem=dmxdevfilter->buffer.data;
...@@ -741,7 +741,7 @@ DmxDevFilterFree(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter) ...@@ -741,7 +741,7 @@ DmxDevFilterFree(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter)
spin_unlock_irq(&dmxdev->lock); spin_unlock_irq(&dmxdev->lock);
vfree(mem); vfree(mem);
} }
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_FREE); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_FREE);
wake_up(&dmxdevfilter->buffer.queue); wake_up(&dmxdevfilter->buffer.queue);
up(&dmxdev->mutex); up(&dmxdev->mutex);
return 0; return 0;
...@@ -758,33 +758,33 @@ invert_mode(dmx_filter_t *filter) ...@@ -758,33 +758,33 @@ invert_mode(dmx_filter_t *filter)
static int static int
DmxDevFilterSet(dmxdev_t *dmxdev, dvb_dmxdev_filter_set(dmxdev_t *dmxdev,
dmxdev_filter_t *dmxdevfilter, dmxdev_filter_t *dmxdevfilter,
struct dmx_sct_filter_params *params) struct dmx_sct_filter_params *params)
{ {
dprintk ("function : %s\n", __FUNCTION__); dprintk ("function : %s\n", __FUNCTION__);
DmxDevFilterStop(dmxdevfilter); dvb_dmxdev_filter_stop(dmxdevfilter);
dmxdevfilter->type=DMXDEV_TYPE_SEC; dmxdevfilter->type=DMXDEV_TYPE_SEC;
dmxdevfilter->pid=params->pid; dmxdevfilter->pid=params->pid;
memcpy(&dmxdevfilter->params.sec, memcpy(&dmxdevfilter->params.sec,
params, sizeof(struct dmx_sct_filter_params)); params, sizeof(struct dmx_sct_filter_params));
invert_mode(&dmxdevfilter->params.sec.filter); invert_mode(&dmxdevfilter->params.sec.filter);
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
if (params->flags&DMX_IMMEDIATE_START) if (params->flags&DMX_IMMEDIATE_START)
return DmxDevFilterStart(dmxdevfilter); return dvb_dmxdev_filter_start(dmxdevfilter);
return 0; return 0;
} }
static int static int
DmxDevPesFilterSet(dmxdev_t *dmxdev, dvb_dmxdev_pes_filter_set(dmxdev_t *dmxdev,
dmxdev_filter_t *dmxdevfilter, dmxdev_filter_t *dmxdevfilter,
struct dmx_pes_filter_params *params) struct dmx_pes_filter_params *params)
{ {
DmxDevFilterStop(dmxdevfilter); dvb_dmxdev_filter_stop(dmxdevfilter);
if (params->pes_type>DMX_PES_OTHER || params->pes_type<0) if (params->pes_type>DMX_PES_OTHER || params->pes_type<0)
return -EINVAL; return -EINVAL;
...@@ -793,16 +793,16 @@ DmxDevPesFilterSet(dmxdev_t *dmxdev, ...@@ -793,16 +793,16 @@ DmxDevPesFilterSet(dmxdev_t *dmxdev,
dmxdevfilter->pid=params->pid; dmxdevfilter->pid=params->pid;
memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params)); memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params));
DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
if (params->flags&DMX_IMMEDIATE_START) if (params->flags&DMX_IMMEDIATE_START)
return DmxDevFilterStart(dmxdevfilter); return dvb_dmxdev_filter_start(dmxdevfilter);
return 0; return 0;
} }
static ssize_t static ssize_t
DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, dvb_dmxdev_read_sec(dmxdev_filter_t *dfil, struct file *file,
char *buf, size_t count, loff_t *ppos) char *buf, size_t count, loff_t *ppos)
{ {
int result, hcount; int result, hcount;
...@@ -812,7 +812,7 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, ...@@ -812,7 +812,7 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file,
hcount=3+dfil->todo; hcount=3+dfil->todo;
if (hcount>count) if (hcount>count)
hcount=count; hcount=count;
result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK,
buf, hcount, ppos); buf, hcount, ppos);
if (result<0) { if (result<0) {
dfil->todo=0; dfil->todo=0;
...@@ -832,7 +832,7 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, ...@@ -832,7 +832,7 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file,
} }
if (count>dfil->todo) if (count>dfil->todo)
count=dfil->todo; count=dfil->todo;
result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK,
buf, count, ppos); buf, count, ppos);
if (result<0) if (result<0)
return result; return result;
...@@ -844,16 +844,16 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, ...@@ -844,16 +844,16 @@ DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file,
ssize_t ssize_t
dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos) dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{ {
dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
//dmxdev_t *dmxdev=dmxdevfilter->dev; //dmxdev_t *dmxdev=dmxdevfilter->dev;
int ret=0; int ret=0;
// semaphore should not be necessary (I hope ...) // semaphore should not be necessary (I hope ...)
//down(&dmxdev->mutex); //down(&dmxdev->mutex);
if (dmxdevfilter->type==DMXDEV_TYPE_SEC) if (dmxdevfilter->type==DMXDEV_TYPE_SEC)
ret=DmxDevReadSec(dmxdevfilter, file, buf, count, ppos); ret=dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos);
else else
ret=DmxDevBufferRead(&dmxdevfilter->buffer, ret=dvb_dmxdev_buffer_read(&dmxdevfilter->buffer,
file->f_flags&O_NONBLOCK, file->f_flags&O_NONBLOCK,
buf, count, ppos); buf, count, ppos);
//up(&dmxdev->mutex); //up(&dmxdev->mutex);
...@@ -864,7 +864,7 @@ dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos) ...@@ -864,7 +864,7 @@ dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos)
static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
dmxdev_t *dmxdev=dmxdevfilter->dev; dmxdev_t *dmxdev=dmxdevfilter->dev;
unsigned long arg=(unsigned long) parg; unsigned long arg=(unsigned long) parg;
int ret=0; int ret=0;
...@@ -877,25 +877,25 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, ...@@ -877,25 +877,25 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
if (dmxdevfilter->state<DMXDEV_STATE_SET) if (dmxdevfilter->state<DMXDEV_STATE_SET)
ret=-EINVAL; ret=-EINVAL;
else else
ret=DmxDevFilterStart(dmxdevfilter); ret=dvb_dmxdev_filter_start(dmxdevfilter);
break; break;
case DMX_STOP: case DMX_STOP:
ret=DmxDevFilterStop(dmxdevfilter); ret=dvb_dmxdev_filter_stop(dmxdevfilter);
break; break;
case DMX_SET_FILTER: case DMX_SET_FILTER:
ret=DmxDevFilterSet(dmxdev, dmxdevfilter, ret=dvb_dmxdev_filter_set(dmxdev, dmxdevfilter,
(struct dmx_sct_filter_params *)parg); (struct dmx_sct_filter_params *)parg);
break; break;
case DMX_SET_PES_FILTER: case DMX_SET_PES_FILTER:
ret=DmxDevPesFilterSet(dmxdev, dmxdevfilter, ret=dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter,
(struct dmx_pes_filter_params *)parg); (struct dmx_pes_filter_params *)parg);
break; break;
case DMX_SET_BUFFER_SIZE: case DMX_SET_BUFFER_SIZE:
ret=DmxDevSetBufferSize(dmxdevfilter, arg); ret=dvb_dmxdev_set_buffer_size(dmxdevfilter, arg);
break; break;
case DMX_GET_EVENT: case DMX_GET_EVENT:
...@@ -919,13 +919,13 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, ...@@ -919,13 +919,13 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
static int dvb_demux_ioctl(struct inode *inode, struct file *file, static int dvb_demux_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
return generic_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl); return video_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl);
} }
static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
{ {
dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
if (!dmxdevfilter) if (!dmxdevfilter)
return -EINVAL; return -EINVAL;
...@@ -958,33 +958,32 @@ static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) ...@@ -958,33 +958,32 @@ static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
static int dvb_demux_release(struct inode *inode, struct file *file) static int dvb_demux_release(struct inode *inode, struct file *file)
{ {
dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
dmxdev_t *dmxdev=dmxdevfilter->dev; dmxdev_t *dmxdev=dmxdevfilter->dev;
return DmxDevFilterFree(dmxdev, dmxdevfilter); return dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
} }
static struct file_operations dvb_demux_fops = { static struct file_operations dvb_demux_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: dvb_demux_read, .read = dvb_demux_read,
write: 0, .ioctl = dvb_demux_ioctl,
ioctl: dvb_demux_ioctl, .open = dvb_demux_open,
open: dvb_demux_open, .release = dvb_demux_release,
release: dvb_demux_release, .poll = dvb_demux_poll,
poll: dvb_demux_poll,
}; };
static dvb_device_t dvbdev_demux = { static struct dvb_device dvbdev_demux = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_demux_fops .fops = &dvb_demux_fops
}; };
static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file, static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
int ret=0; int ret=0;
...@@ -1008,13 +1007,13 @@ static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file, ...@@ -1008,13 +1007,13 @@ static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file,
static int dvb_dvr_ioctl(struct inode *inode, struct file *file, static int dvb_dvr_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
return generic_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl); return video_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl);
} }
static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
dprintk ("function : %s\n", __FUNCTION__); dprintk ("function : %s\n", __FUNCTION__);
...@@ -1040,24 +1039,24 @@ static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) ...@@ -1040,24 +1039,24 @@ static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
} }
static struct file_operations dvb_dvr_fops = { static struct file_operations dvb_dvr_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: dvb_dvr_read, .read = dvb_dvr_read,
write: dvb_dvr_write, .write = dvb_dvr_write,
ioctl: dvb_dvr_ioctl, .ioctl = dvb_dvr_ioctl,
open: dvb_dvr_open, .open = dvb_dvr_open,
release: dvb_dvr_release, .release = dvb_dvr_release,
poll: dvb_dvr_poll, .poll =dvb_dvr_poll,
}; };
static dvb_device_t dvbdev_dvr = { static struct dvb_device dvbdev_dvr = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_dvr_fops .fops = &dvb_dvr_fops
}; };
int int
DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *dvb_adapter) dvb_dmxdev_init(dmxdev_t *dmxdev, struct dvb_adapter *dvb_adapter)
{ {
int i; int i;
...@@ -1079,22 +1078,22 @@ DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *dvb_adapter) ...@@ -1079,22 +1078,22 @@ DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *dvb_adapter)
for (i=0; i<dmxdev->filternum; i++) { for (i=0; i<dmxdev->filternum; i++) {
dmxdev->filter[i].dev=dmxdev; dmxdev->filter[i].dev=dmxdev;
dmxdev->filter[i].buffer.data=0; dmxdev->filter[i].buffer.data=0;
DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
dmxdev->dvr[i].dev=dmxdev; dmxdev->dvr[i].dev=dmxdev;
dmxdev->dvr[i].buffer.data=0; dmxdev->dvr[i].buffer.data=0;
DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
DmxDevDVRStateSet(&dmxdev->dvr[i], DMXDEV_STATE_FREE); dvb_dmxdev_dvr_state_set(&dmxdev->dvr[i], DMXDEV_STATE_FREE);
} }
dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX); dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX);
dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR); dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR);
DmxDevBufferInit(&dmxdev->dvr_buffer); dvb_dmxdev_buffer_init(&dmxdev->dvr_buffer);
MOD_INC_USE_COUNT; MOD_INC_USE_COUNT;
return 0; return 0;
} }
void void
DmxDevRelease(dmxdev_t *dmxdev) dvb_dmxdev_release(dmxdev_t *dmxdev)
{ {
dvb_unregister_device(dmxdev->dvbdev); dvb_unregister_device(dmxdev->dvbdev);
dvb_unregister_device(dmxdev->dvr_dvbdev); dvb_unregister_device(dmxdev->dvr_dvbdev);
......
...@@ -64,7 +64,7 @@ typedef struct dmxdev_buffer_s { ...@@ -64,7 +64,7 @@ typedef struct dmxdev_buffer_s {
typedef struct dmxdev_filter_s { typedef struct dmxdev_filter_s {
dvb_device_t *dvbdev; struct dvb_device *dvbdev;
union { union {
dmx_section_filter_t *sec; dmx_section_filter_t *sec;
...@@ -102,8 +102,8 @@ typedef struct dmxdev_dvr_s { ...@@ -102,8 +102,8 @@ typedef struct dmxdev_dvr_s {
typedef struct dmxdev_s { typedef struct dmxdev_s {
dvb_device_t *dvbdev; struct dvb_device *dvbdev;
dvb_device_t *dvr_dvbdev; struct dvb_device *dvr_dvbdev;
dmxdev_filter_t *filter; dmxdev_filter_t *filter;
dmxdev_dvr_t *dvr; dmxdev_dvr_t *dvr;
...@@ -122,7 +122,7 @@ typedef struct dmxdev_s { ...@@ -122,7 +122,7 @@ typedef struct dmxdev_s {
} dmxdev_t; } dmxdev_t;
int DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *); int dvb_dmxdev_init(dmxdev_t *dmxdev, struct dvb_adapter *);
void DmxDevRelease(dmxdev_t *dmxdev); void dvb_dmxdev_release(dmxdev_t *dmxdev);
#endif /* _DMXDEV_H_ */ #endif /* _DMXDEV_H_ */
...@@ -182,7 +182,7 @@ void dvb_set_crc32(u8 *data, int length) ...@@ -182,7 +182,7 @@ void dvb_set_crc32(u8 *data, int length)
******************************************************************************/ ******************************************************************************/
static inline int static inline int
DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) dvb_dmx_swfilter_payload(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf)
{ {
int p, count; int p, count;
//int ccok; //int ccok;
...@@ -208,8 +208,8 @@ DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -208,8 +208,8 @@ DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
static int static int
DvbDmxSWFilterSectionFilter(dvb_demux_feed_t *dvbdmxfeed, dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *dvbdmxfeed,
dvb_demux_filter_t *f) struct dvb_demux_filter *f)
{ {
dmx_section_filter_t *filter=&f->filter; dmx_section_filter_t *filter=&f->filter;
int i; int i;
...@@ -229,10 +229,10 @@ DvbDmxSWFilterSectionFilter(dvb_demux_feed_t *dvbdmxfeed, ...@@ -229,10 +229,10 @@ DvbDmxSWFilterSectionFilter(dvb_demux_feed_t *dvbdmxfeed,
} }
static inline int static inline int
DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed) dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *dvbdmxfeed)
{ {
u8 *buf=dvbdmxfeed->secbuf; u8 *buf=dvbdmxfeed->secbuf;
dvb_demux_filter_t *f; struct dvb_demux_filter *f;
if (dvbdmxfeed->secbufp!=dvbdmxfeed->seclen) if (dvbdmxfeed->secbufp!=dvbdmxfeed->seclen)
return -1; return -1;
...@@ -241,7 +241,7 @@ DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed) ...@@ -241,7 +241,7 @@ DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed)
if (!(f=dvbdmxfeed->filter)) if (!(f=dvbdmxfeed->filter))
return 0; return 0;
do do
if (DvbDmxSWFilterSectionFilter(dvbdmxfeed, f)<0) if (dvb_dmx_swfilter_sectionfilter(dvbdmxfeed, f)<0)
return -1; return -1;
while ((f=f->next) && dvbdmxfeed->feed.sec.is_filtering); while ((f=f->next) && dvbdmxfeed->feed.sec.is_filtering);
...@@ -251,7 +251,7 @@ DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed) ...@@ -251,7 +251,7 @@ DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed)
} }
static inline int static inline int
DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf)
{ {
int p, count; int p, count;
int ccok, rest; int ccok, rest;
...@@ -286,7 +286,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -286,7 +286,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp,
buf+p+1, buf[p]); buf+p+1, buf[p]);
dvbdmxfeed->secbufp+=buf[p]; dvbdmxfeed->secbufp+=buf[p];
DvbDmxSWFilterSectionFeed(dvbdmxfeed); dvb_dmx_swfilter_section_feed(dvbdmxfeed);
} }
} }
p+=buf[p]+1; // skip rest of last section p+=buf[p]+1; // skip rest of last section
...@@ -301,7 +301,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -301,7 +301,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
dvbdmxfeed->secbufp=dvbdmxfeed->seclen; dvbdmxfeed->secbufp=dvbdmxfeed->seclen;
p+=dvbdmxfeed->seclen; p+=dvbdmxfeed->seclen;
count=188-p; count=188-p;
DvbDmxSWFilterSectionFeed(dvbdmxfeed); dvb_dmx_swfilter_section_feed(dvbdmxfeed);
// filling bytes until packet end? // filling bytes until packet end?
if (count && buf[p]==0xff) if (count && buf[p]==0xff)
...@@ -337,7 +337,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -337,7 +337,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
if (rest<=count) { // section completed in this TS packet if (rest<=count) { // section completed in this TS packet
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest);
dvbdmxfeed->secbufp+=rest; dvbdmxfeed->secbufp+=rest;
DvbDmxSWFilterSectionFeed(dvbdmxfeed); dvb_dmx_swfilter_section_feed(dvbdmxfeed);
} else { // section continues in following ts packet } else { // section continues in following ts packet
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count);
dvbdmxfeed->secbufp+=count; dvbdmxfeed->secbufp+=count;
...@@ -346,7 +346,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -346,7 +346,7 @@ DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
} }
static inline void static inline void
DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf)
{ {
switch(dvbdmxfeed->type) { switch(dvbdmxfeed->type) {
case DMX_TYPE_TS: case DMX_TYPE_TS:
...@@ -354,7 +354,7 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -354,7 +354,7 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
break; break;
if (dvbdmxfeed->ts_type & TS_PACKET) { if (dvbdmxfeed->ts_type & TS_PACKET) {
if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
DvbDmxSWFilterPayload(dvbdmxfeed, buf); dvb_dmx_swfilter_payload(dvbdmxfeed, buf);
else else
dvbdmxfeed->cb.ts((u8 *)buf, 188, 0, 0, dvbdmxfeed->cb.ts((u8 *)buf, 188, 0, 0,
&dvbdmxfeed->feed.ts, DMX_OK); &dvbdmxfeed->feed.ts, DMX_OK);
...@@ -368,7 +368,7 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -368,7 +368,7 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
case DMX_TYPE_SEC: case DMX_TYPE_SEC:
if (!dvbdmxfeed->feed.sec.is_filtering) if (!dvbdmxfeed->feed.sec.is_filtering)
break; break;
if (DvbDmxSWFilterSectionPacket(dvbdmxfeed, buf)<0) if (dvb_dmx_swfilter_section_packet(dvbdmxfeed, buf)<0)
dvbdmxfeed->seclen=dvbdmxfeed->secbufp=0; dvbdmxfeed->seclen=dvbdmxfeed->secbufp=0;
break; break;
...@@ -377,27 +377,27 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) ...@@ -377,27 +377,27 @@ DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf)
} }
} }
void inline void
DvbDmxSWFilterPacket(dvb_demux_t *dvbdmx, const u8 *buf) dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf)
{ {
dvb_demux_feed_t *dvbdmxfeed; struct dvb_demux_feed *dvbdmxfeed;
if (!(dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)])) if (!(dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)]))
return; return;
DvbDmxSWFilterPacketType(dvbdmxfeed, buf); dvb_dmx_swfilter_packet_type(dvbdmxfeed, buf);
} }
void void
DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count) dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, int count)
{ {
dvb_demux_feed_t *dvbdmxfeed; struct dvb_demux_feed *dvbdmxfeed;
spin_lock(&dvbdmx->lock); spin_lock(&dvbdmx->lock);
if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000])) if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000]))
dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0,
&dvbdmxfeed->feed.ts, DMX_OK); &dvbdmxfeed->feed.ts, DMX_OK);
while (count) { while (count) {
DvbDmxSWFilterPacket(dvbdmx, buf); dvb_dmx_swfilter_packet(dvbdmx, buf);
count--; count--;
buf+=188; buf+=188;
} }
...@@ -405,7 +405,7 @@ DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count) ...@@ -405,7 +405,7 @@ DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count)
} }
static inline void static inline void
DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) dvb_dmx_swfilter(struct dvb_demux *dvbdmx, const u8 *buf, size_t count)
{ {
int p=0,i, j; int p=0,i, j;
...@@ -416,7 +416,7 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) ...@@ -416,7 +416,7 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count)
return; return;
} }
memcpy(&dvbdmx->tsbuf[i], buf, j); memcpy(&dvbdmx->tsbuf[i], buf, j);
DvbDmxSWFilterPacket(dvbdmx, dvbdmx->tsbuf); dvb_dmx_swfilter_packet(dvbdmx, dvbdmx->tsbuf);
dvbdmx->tsbufp=0; dvbdmx->tsbufp=0;
p+=j; p+=j;
} }
...@@ -424,7 +424,7 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) ...@@ -424,7 +424,7 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count)
while (p<count) { while (p<count) {
if (buf[p]==0x47) { if (buf[p]==0x47) {
if (count-p>=188) { if (count-p>=188) {
DvbDmxSWFilterPacket(dvbdmx, buf+p); dvb_dmx_swfilter_packet(dvbdmx, buf+p);
p+=188; p+=188;
} else { } else {
i=count-p; i=count-p;
...@@ -444,8 +444,8 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) ...@@ -444,8 +444,8 @@ DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count)
****************************************************************************** ******************************************************************************
******************************************************************************/ ******************************************************************************/
static dvb_demux_filter_t * static struct dvb_demux_filter *
DvbDmxFilterAlloc(dvb_demux_t *dvbdmx) dvb_dmx_filter_alloc(struct dvb_demux *dvbdmx)
{ {
int i; int i;
...@@ -458,8 +458,8 @@ DvbDmxFilterAlloc(dvb_demux_t *dvbdmx) ...@@ -458,8 +458,8 @@ DvbDmxFilterAlloc(dvb_demux_t *dvbdmx)
return &dvbdmx->filter[i]; return &dvbdmx->filter[i];
} }
static dvb_demux_feed_t * static struct dvb_demux_feed *
DvbDmxFeedAlloc(dvb_demux_t *dvbdmx) dvb_dmx_feed_alloc(struct dvb_demux *dvbdmx)
{ {
int i; int i;
...@@ -478,10 +478,10 @@ DvbDmxFeedAlloc(dvb_demux_t *dvbdmx) ...@@ -478,10 +478,10 @@ DvbDmxFeedAlloc(dvb_demux_t *dvbdmx)
******************************************************************************/ ******************************************************************************/
static int static int
dmx_pid_set(u16 pid, dvb_demux_feed_t *dvbdmxfeed) dmx_pid_set(u16 pid, struct dvb_demux_feed *dvbdmxfeed)
{ {
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
dvb_demux_feed_t **pid2feed=dvbdmx->pid2feed; struct dvb_demux_feed **pid2feed=dvbdmx->pid2feed;
if (pid>DMX_MAX_PID) if (pid>DMX_MAX_PID)
return -EINVAL; return -EINVAL;
...@@ -510,8 +510,8 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* feed, ...@@ -510,8 +510,8 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* feed,
struct timespec timeout struct timespec timeout
) )
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
int ret; int ret;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
...@@ -576,8 +576,8 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* feed, ...@@ -576,8 +576,8 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* feed,
static int static int
dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed) dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
int ret; int ret;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
...@@ -608,8 +608,8 @@ dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed) ...@@ -608,8 +608,8 @@ dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed)
static int static int
dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* feed) dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* feed)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
int ret; int ret;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
...@@ -637,13 +637,13 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux, ...@@ -637,13 +637,13 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux,
dmx_ts_feed_t **feed, dmx_ts_feed_t **feed,
dmx_ts_cb callback) dmx_ts_cb callback)
{ {
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
dvb_demux_feed_t *dvbdmxfeed; struct dvb_demux_feed *dvbdmxfeed;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { if (!(dvbdmxfeed=dvb_dmx_feed_alloc(dvbdmx))) {
up(&dvbdmx->mutex); up(&dvbdmx->mutex);
return -EBUSY; return -EBUSY;
} }
...@@ -663,7 +663,7 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux, ...@@ -663,7 +663,7 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux,
(*feed)->stop_filtering=dmx_ts_feed_stop_filtering; (*feed)->stop_filtering=dmx_ts_feed_stop_filtering;
if (!(dvbdmxfeed->filter=DvbDmxFilterAlloc(dvbdmx))) { if (!(dvbdmxfeed->filter=dvb_dmx_filter_alloc(dvbdmx))) {
dvbdmxfeed->state=DMX_STATE_FREE; dvbdmxfeed->state=DMX_STATE_FREE;
up(&dvbdmx->mutex); up(&dvbdmx->mutex);
return -EBUSY; return -EBUSY;
...@@ -679,8 +679,8 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux, ...@@ -679,8 +679,8 @@ static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux,
static int dvbdmx_release_ts_feed(dmx_demux_t *demux, dmx_ts_feed_t *feed) static int dvbdmx_release_ts_feed(dmx_demux_t *demux, dmx_ts_feed_t *feed)
{ {
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -715,14 +715,14 @@ static int ...@@ -715,14 +715,14 @@ static int
dmx_section_feed_allocate_filter(struct dmx_section_feed_s* feed, dmx_section_feed_allocate_filter(struct dmx_section_feed_s* feed,
dmx_section_filter_t** filter) dmx_section_filter_t** filter)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdemux=dvbdmxfeed->demux; struct dvb_demux *dvbdemux=dvbdmxfeed->demux;
dvb_demux_filter_t *dvbdmxfilter; struct dvb_demux_filter *dvbdmxfilter;
if (down_interruptible (&dvbdemux->mutex)) if (down_interruptible (&dvbdemux->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
dvbdmxfilter=DvbDmxFilterAlloc(dvbdemux); dvbdmxfilter=dvb_dmx_filter_alloc(dvbdemux);
if (!dvbdmxfilter) { if (!dvbdmxfilter) {
up(&dvbdemux->mutex); up(&dvbdemux->mutex);
return -ENOSPC; return -ENOSPC;
...@@ -747,8 +747,8 @@ dmx_section_feed_set(struct dmx_section_feed_s* feed, ...@@ -747,8 +747,8 @@ dmx_section_feed_set(struct dmx_section_feed_s* feed,
u16 pid, size_t circular_buffer_size, u16 pid, size_t circular_buffer_size,
int descramble, int check_crc) int descramble, int check_crc)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
if (pid>0x1fff) if (pid>0x1fff)
return -EINVAL; return -EINVAL;
...@@ -789,11 +789,11 @@ dmx_section_feed_set(struct dmx_section_feed_s* feed, ...@@ -789,11 +789,11 @@ dmx_section_feed_set(struct dmx_section_feed_s* feed,
return 0; return 0;
} }
static void prepare_secfilters(dvb_demux_feed_t *dvbdmxfeed) static void prepare_secfilters(struct dvb_demux_feed *dvbdmxfeed)
{ {
int i; int i;
dmx_section_filter_t *sf; dmx_section_filter_t *sf;
dvb_demux_filter_t *f; struct dvb_demux_filter *f;
u8 mask, mode, doneq; u8 mask, mode, doneq;
if (!(f=dvbdmxfeed->filter)) if (!(f=dvbdmxfeed->filter))
...@@ -815,8 +815,8 @@ static void prepare_secfilters(dvb_demux_feed_t *dvbdmxfeed) ...@@ -815,8 +815,8 @@ static void prepare_secfilters(dvb_demux_feed_t *dvbdmxfeed)
static int static int
dmx_section_feed_start_filtering(dmx_section_feed_t *feed) dmx_section_feed_start_filtering(dmx_section_feed_t *feed)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
int ret; int ret;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
...@@ -854,8 +854,8 @@ dmx_section_feed_start_filtering(dmx_section_feed_t *feed) ...@@ -854,8 +854,8 @@ dmx_section_feed_start_filtering(dmx_section_feed_t *feed)
static int static int
dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed) dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
int ret; int ret;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
...@@ -878,9 +878,9 @@ static int ...@@ -878,9 +878,9 @@ static int
dmx_section_feed_release_filter(dmx_section_feed_t *feed, dmx_section_feed_release_filter(dmx_section_feed_t *feed,
dmx_section_filter_t* filter) dmx_section_filter_t* filter)
{ {
dvb_demux_filter_t *dvbdmxfilter=(dvb_demux_filter_t *) filter, *f; struct dvb_demux_filter *dvbdmxfilter=(struct dvb_demux_filter *) filter, *f;
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -911,13 +911,13 @@ static int dvbdmx_allocate_section_feed(dmx_demux_t *demux, ...@@ -911,13 +911,13 @@ static int dvbdmx_allocate_section_feed(dmx_demux_t *demux,
dmx_section_feed_t **feed, dmx_section_feed_t **feed,
dmx_section_cb callback) dmx_section_cb callback)
{ {
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
dvb_demux_feed_t *dvbdmxfeed; struct dvb_demux_feed *dvbdmxfeed;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { if (!(dvbdmxfeed=dvb_dmx_feed_alloc(dvbdmx))) {
up(&dvbdmx->mutex); up(&dvbdmx->mutex);
return -EBUSY; return -EBUSY;
} }
...@@ -946,8 +946,8 @@ static int dvbdmx_allocate_section_feed(dmx_demux_t *demux, ...@@ -946,8 +946,8 @@ static int dvbdmx_allocate_section_feed(dmx_demux_t *demux,
static int dvbdmx_release_section_feed(dmx_demux_t *demux, static int dvbdmx_release_section_feed(dmx_demux_t *demux,
dmx_section_feed_t *feed) dmx_section_feed_t *feed)
{ {
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
if (down_interruptible (&dvbdmx->mutex)) if (down_interruptible (&dvbdmx->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -977,7 +977,7 @@ static int dvbdmx_release_section_feed(dmx_demux_t *demux, ...@@ -977,7 +977,7 @@ static int dvbdmx_release_section_feed(dmx_demux_t *demux,
static int dvbdmx_open(dmx_demux_t *demux) static int dvbdmx_open(dmx_demux_t *demux)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if (dvbdemux->users>=MAX_DVB_DEMUX_USERS) if (dvbdemux->users>=MAX_DVB_DEMUX_USERS)
return -EUSERS; return -EUSERS;
...@@ -987,7 +987,7 @@ static int dvbdmx_open(dmx_demux_t *demux) ...@@ -987,7 +987,7 @@ static int dvbdmx_open(dmx_demux_t *demux)
static int dvbdmx_close(struct dmx_demux_s *demux) static int dvbdmx_close(struct dmx_demux_s *demux)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if (dvbdemux->users==0) if (dvbdemux->users==0)
return -ENODEV; return -ENODEV;
...@@ -998,7 +998,7 @@ static int dvbdmx_close(struct dmx_demux_s *demux) ...@@ -998,7 +998,7 @@ static int dvbdmx_close(struct dmx_demux_s *demux)
static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count) static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if ((!demux->frontend) || if ((!demux->frontend) ||
(demux->frontend->source!=DMX_MEMORY_FE)) (demux->frontend->source!=DMX_MEMORY_FE))
...@@ -1007,7 +1007,7 @@ static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count) ...@@ -1007,7 +1007,7 @@ static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count)
if (down_interruptible (&dvbdemux->mutex)) if (down_interruptible (&dvbdemux->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
DvbDmxSWFilter(dvbdemux, buf, count); dvb_dmx_swfilter(dvbdemux, buf, count);
up(&dvbdemux->mutex); up(&dvbdemux->mutex);
return count; return count;
} }
...@@ -1016,7 +1016,7 @@ static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count) ...@@ -1016,7 +1016,7 @@ static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count)
static int dvbdmx_add_frontend(dmx_demux_t *demux, static int dvbdmx_add_frontend(dmx_demux_t *demux,
dmx_frontend_t *frontend) dmx_frontend_t *frontend)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
struct list_head *pos, *head=&dvbdemux->frontend_list; struct list_head *pos, *head=&dvbdemux->frontend_list;
if (!(frontend->id && frontend->vendor && frontend->model)) if (!(frontend->id && frontend->vendor && frontend->model))
...@@ -1035,7 +1035,7 @@ static int ...@@ -1035,7 +1035,7 @@ static int
dvbdmx_remove_frontend(dmx_demux_t *demux, dvbdmx_remove_frontend(dmx_demux_t *demux,
dmx_frontend_t *frontend) dmx_frontend_t *frontend)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
struct list_head *pos, *n, *head=&dvbdemux->frontend_list; struct list_head *pos, *n, *head=&dvbdemux->frontend_list;
list_for_each_safe (pos, n, head) list_for_each_safe (pos, n, head)
...@@ -1052,7 +1052,7 @@ dvbdmx_remove_frontend(dmx_demux_t *demux, ...@@ -1052,7 +1052,7 @@ dvbdmx_remove_frontend(dmx_demux_t *demux,
static struct list_head * static struct list_head *
dvbdmx_get_frontends(dmx_demux_t *demux) dvbdmx_get_frontends(dmx_demux_t *demux)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if (list_empty(&dvbdemux->frontend_list)) if (list_empty(&dvbdemux->frontend_list))
return NULL; return NULL;
...@@ -1062,7 +1062,7 @@ dvbdmx_get_frontends(dmx_demux_t *demux) ...@@ -1062,7 +1062,7 @@ dvbdmx_get_frontends(dmx_demux_t *demux)
static int dvbdmx_connect_frontend(dmx_demux_t *demux, static int dvbdmx_connect_frontend(dmx_demux_t *demux,
dmx_frontend_t *frontend) dmx_frontend_t *frontend)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if (demux->frontend) if (demux->frontend)
return -EINVAL; return -EINVAL;
...@@ -1077,7 +1077,7 @@ static int dvbdmx_connect_frontend(dmx_demux_t *demux, ...@@ -1077,7 +1077,7 @@ static int dvbdmx_connect_frontend(dmx_demux_t *demux,
static int dvbdmx_disconnect_frontend(dmx_demux_t *demux) static int dvbdmx_disconnect_frontend(dmx_demux_t *demux)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
if (down_interruptible (&dvbdemux->mutex)) if (down_interruptible (&dvbdemux->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -1089,24 +1089,24 @@ static int dvbdmx_disconnect_frontend(dmx_demux_t *demux) ...@@ -1089,24 +1089,24 @@ static int dvbdmx_disconnect_frontend(dmx_demux_t *demux)
static int dvbdmx_get_pes_pids(dmx_demux_t *demux, u16 *pids) static int dvbdmx_get_pes_pids(dmx_demux_t *demux, u16 *pids)
{ {
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
memcpy(pids, dvbdemux->pids, 5*sizeof(u16)); memcpy(pids, dvbdemux->pids, 5*sizeof(u16));
return 0; return 0;
} }
int int
DvbDmxInit(dvb_demux_t *dvbdemux) dvb_dmx_init(struct dvb_demux *dvbdemux)
{ {
int i; int i;
dmx_demux_t *dmx=&dvbdemux->dmx; dmx_demux_t *dmx=&dvbdemux->dmx;
dvbdemux->users=0; dvbdemux->users=0;
dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(struct dvb_demux_filter));
if (!dvbdemux->filter) if (!dvbdemux->filter)
return -ENOMEM; return -ENOMEM;
dvbdemux->feed=vmalloc(dvbdemux->feednum*sizeof(dvb_demux_feed_t)); dvbdemux->feed=vmalloc(dvbdemux->feednum*sizeof(struct dvb_demux_feed));
if (!dvbdemux->feed) { if (!dvbdemux->feed) {
vfree(dvbdemux->filter); vfree(dvbdemux->filter);
return -ENOMEM; return -ENOMEM;
...@@ -1125,7 +1125,7 @@ DvbDmxInit(dvb_demux_t *dvbdemux) ...@@ -1125,7 +1125,7 @@ DvbDmxInit(dvb_demux_t *dvbdemux)
dvbdemux->pids[i]=0xffff; dvbdemux->pids[i]=0xffff;
} }
dvbdemux->playing=dvbdemux->recording=0; dvbdemux->playing=dvbdemux->recording=0;
memset(dvbdemux->pid2feed, 0, (DMX_MAX_PID+1)*sizeof(dvb_demux_feed_t *)); memset(dvbdemux->pid2feed, 0, (DMX_MAX_PID+1)*sizeof(struct dvb_demux_feed *));
dvbdemux->tsbufp=0; dvbdemux->tsbufp=0;
dmx->frontend=0; dmx->frontend=0;
...@@ -1159,7 +1159,7 @@ DvbDmxInit(dvb_demux_t *dvbdemux) ...@@ -1159,7 +1159,7 @@ DvbDmxInit(dvb_demux_t *dvbdemux)
} }
int int
DvbDmxRelease(dvb_demux_t *dvbdemux) dvb_dmx_release(struct dvb_demux *dvbdemux)
{ {
dmx_demux_t *dmx=&dvbdemux->dmx; dmx_demux_t *dmx=&dvbdemux->dmx;
......
...@@ -39,14 +39,14 @@ ...@@ -39,14 +39,14 @@
#define DVB_DEMUX_MASK_MAX 18 #define DVB_DEMUX_MASK_MAX 18
typedef struct dvb_demux_filter_s { struct dvb_demux_filter {
dmx_section_filter_t filter; dmx_section_filter_t filter;
u8 maskandmode [DMX_MAX_FILTER_SIZE]; u8 maskandmode [DMX_MAX_FILTER_SIZE];
u8 maskandnotmode [DMX_MAX_FILTER_SIZE]; u8 maskandnotmode [DMX_MAX_FILTER_SIZE];
int doneq; int doneq;
struct dvb_demux_filter_s *next; struct dvb_demux_filter *next;
struct dvb_demux_feed_s *feed; struct dvb_demux_feed *feed;
int index; int index;
int state; int state;
int type; int type;
...@@ -56,11 +56,10 @@ typedef struct dvb_demux_filter_s { ...@@ -56,11 +56,10 @@ typedef struct dvb_demux_filter_s {
u16 hw_handle; u16 hw_handle;
struct timer_list timer; struct timer_list timer;
int ts_state; int ts_state;
};
//u16 pid; //to be removed
} dvb_demux_filter_t;
typedef struct dvb_demux_feed_s { struct dvb_demux_feed {
union { union {
dmx_ts_feed_t ts; dmx_ts_feed_t ts;
dmx_section_feed_t sec; dmx_section_feed_t sec;
...@@ -71,7 +70,7 @@ typedef struct dvb_demux_feed_s { ...@@ -71,7 +70,7 @@ typedef struct dvb_demux_feed_s {
dmx_section_cb sec; dmx_section_cb sec;
} cb; } cb;
struct dvb_demux_s *demux; struct dvb_demux *demux;
int type; int type;
int state; int state;
u16 pid; u16 pid;
...@@ -81,7 +80,7 @@ typedef struct dvb_demux_feed_s { ...@@ -81,7 +80,7 @@ typedef struct dvb_demux_feed_s {
int check_crc; int check_crc;
struct timespec timeout; struct timespec timeout;
dvb_demux_filter_t *filter; struct dvb_demux_filter *filter;
int cb_length; int cb_length;
int ts_type; int ts_type;
...@@ -93,42 +92,43 @@ typedef struct dvb_demux_feed_s { ...@@ -93,42 +92,43 @@ typedef struct dvb_demux_feed_s {
int cc; int cc;
u16 peslen; u16 peslen;
} dvb_demux_feed_t; };
typedef struct dvb_demux_s { struct dvb_demux {
dmx_demux_t dmx; dmx_demux_t dmx;
void *priv; void *priv;
int filternum; int filternum;
int feednum; int feednum;
int (*start_feed)(dvb_demux_feed_t *); int (*start_feed)(struct dvb_demux_feed *);
int (*stop_feed)(dvb_demux_feed_t *); int (*stop_feed)(struct dvb_demux_feed *);
int (*write_to_decoder)(dvb_demux_feed_t *, u8 *, size_t); int (*write_to_decoder)(struct dvb_demux_feed *, u8 *, size_t);
int users; int users;
#define MAX_DVB_DEMUX_USERS 10 #define MAX_DVB_DEMUX_USERS 10
dvb_demux_filter_t *filter; struct dvb_demux_filter *filter;
dvb_demux_feed_t *feed; struct dvb_demux_feed *feed;
struct list_head frontend_list; struct list_head frontend_list;
dvb_demux_feed_t *pesfilter[DMX_TS_PES_OTHER]; struct dvb_demux_feed *pesfilter[DMX_TS_PES_OTHER];
u16 pids[DMX_TS_PES_OTHER]; u16 pids[DMX_TS_PES_OTHER];
int playing; int playing;
int recording; int recording;
#define DMX_MAX_PID 0x2000 #define DMX_MAX_PID 0x2000
dvb_demux_feed_t *pid2feed[DMX_MAX_PID+1]; struct dvb_demux_feed *pid2feed[DMX_MAX_PID+1];
u8 tsbuf[188]; u8 tsbuf[188];
int tsbufp; int tsbufp;
struct semaphore mutex; struct semaphore mutex;
spinlock_t lock; spinlock_t lock;
} dvb_demux_t; };
int DvbDmxInit(dvb_demux_t *dvbdemux); int dvb_dmx_init(struct dvb_demux *dvbdemux);
int DvbDmxRelease(dvb_demux_t *dvbdemux); int dvb_dmx_release(struct dvb_demux *dvbdemux);
void DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count); void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, int count);
#endif /* _DVB_DEMUX_H_ */ #endif /* _DVB_DEMUX_H_ */
...@@ -24,939 +24,978 @@ uint32_t ac3_frames[3][32] = ...@@ -24,939 +24,978 @@ uint32_t ac3_frames[3][32] =
void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, #if 0
pes2ts_cb_t *cb, void *priv) static
void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv,
void (*pes_write)(u8 *buf, int count, void *data),
void *priv)
{ {
unsigned char *buf=p2ts->buf; dvb_filter_ipack_init(pa, IPACKS, pes_write);
dvb_filter_ipack_init(pv, IPACKS, pes_write);
buf[0]=0x47; pa->pid = pida;
buf[1]=(pid>>8); pv->pid = pidv;
buf[2]=pid&0xff; pa->data = priv;
p2ts->cc=0; pv->data = priv;
p2ts->cb=cb;
p2ts->priv=priv;
} }
#endif
int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len) #if 0
static
void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
{ {
unsigned char *buf=p2ts->buf; u8 off = 0;
int ret=0, rest;
//len=6+((pes[4]<<8)|pes[5]);
buf[1]|=0x40; if (!buf || !p ){
while (len>=184) { printk("NULL POINTER IDIOT\n");
buf[3]=0x10|((p2ts->cc++)&0x0f); return;
memcpy(buf+4, pes, 184);
if ((ret=p2ts->cb(p2ts->priv, buf)))
return ret;
len-=184; pes+=184;
buf[1]&=~0x40;
}
if (!len)
return 0;
buf[3]=0x30|((p2ts->cc++)&0x0f);
rest=183-len;
if (rest) {
buf[5]=0x00;
if (rest-1)
memset(buf+6, 0xff, rest-1);
} }
buf[4]=rest; if (buf[1]&PAY_START) {
memcpy(buf+5+rest, pes, len); if (p->plength == MMAX_PLENGTH-6 && p->found>6){
return p2ts->cb(p2ts->priv, buf); p->plength = p->found-6;
}
void reset_ipack(ipack *p)
{
p->found = 0; p->found = 0;
p->cid = 0; send_ipack(p);
p->plength = 0; dvb_filter_ipack_reset(p);
p->flag1 = 0;
p->flag2 = 0;
p->hlength = 0;
p->mpeg = 0;
p->check = 0;
p->which = 0;
p->done = 0;
p->count = 0;
}
void init_ipack(ipack *p, int size,
void (*func)(u8 *buf, int size, void *priv))
{
if ( !(p->buf = vmalloc(size*sizeof(u8))) ){
printk ("Couldn't allocate memory for ipack\n");
} }
p->size = size; }
p->func = func; if (buf[3] & ADAPT_FIELD) { // adaptation field?
p->repack_subids = 0; off = buf[4] + 1;
reset_ipack(p); if (off+4 > 187) return;
} }
dvb_filter_instant_repack(buf+4+off, TS_SIZE-4-off, p);
void free_ipack(ipack * p)
{
if (p->buf) vfree(p->buf);
} }
#endif
void send_ipack(ipack *p) #if 0
/* needs 5 byte input, returns picture coding type*/
static
int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr)
{ {
int off; uint8_t pct;
AudioInfo ai;
int ac3_off = 0;
int streamid=0;
int nframes= 0;
int f=0;
switch ( p->mpeg ){
case 2:
if (p->count < 10) return;
p->buf[3] = p->cid;
p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
p->buf[5] = (u8)((p->count-6) & 0x00FF);
if (p->repack_subids && p->cid == PRIVATE_STREAM1){
off = 9+p->buf[8]; if (pr) printk( "Pic header: ");
streamid = p->buf[off]; pic->temporal_reference[field] = (( headr[0] << 2 ) |
if ((streamid & 0xF8) == 0x80){ (headr[1] & 0x03) )& 0x03ff;
ai.off = 0; if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
ac3_off = ((p->buf[off+2] << 8)|
p->buf[off+3]);
if (ac3_off < p->count)
f=get_ac3info(p->buf+off+3+ac3_off,
p->count-ac3_off, &ai,0);
if ( !f ){
nframes = (p->count-off-3-ac3_off)/
ai.framesize + 1;
p->buf[off+2] = (ac3_off >> 8)& 0xFF;
p->buf[off+3] = (ac3_off)& 0xFF;
p->buf[off+1] = nframes;
ac3_off += nframes * ai.framesize - pct = ( headr[1] >> 2 ) & 0x07;
p->count; pic->picture_coding_type[field] = pct;
} if (pr) {
switch(pct){
case I_FRAME:
printk( " I-FRAME");
break;
case B_FRAME:
printk( " B-FRAME");
break;
case P_FRAME:
printk( " P-FRAME");
break;
} }
} }
p->func(p->buf, p->count, p->data);
p->buf[6] = 0x80;
p->buf[7] = 0x00;
p->buf[8] = 0x00;
p->count = 9;
if (p->repack_subids && p->cid == PRIVATE_STREAM1
&& (streamid & 0xF8)==0x80 ){
p->count += 4;
p->buf[9] = streamid;
p->buf[10] = (ac3_off >> 8)& 0xFF;
p->buf[11] = (ac3_off)& 0xFF;
p->buf[12] = 0;
}
break; pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) |
case 1: ( (headr[3] & 0x1F) << 11) ) & 0xffff;
if (p->count < 8) return;
p->buf[3] = p->cid;
p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
p->buf[5] = (u8)((p->count-6) & 0x00FF);
p->func(p->buf, p->count, p->data);
p->buf[6] = 0x0F; pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
p->count = 7; ((headr[4] & 0x80) >> 3);
break;
if ( pct == B_FRAME ){
pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
} }
} if (pr) printk( " pic head param: 0x%x",
pic->picture_header_parameter);
void send_ipack_rest(ipack *p) return pct;
{
if (p->plength != MMAX_PLENGTH-6 || p->found<=6)
return;
p->plength = p->found-6;
p->found = 0;
send_ipack(p);
reset_ipack(p);
} }
#endif
static void write_ipack(ipack *p, u8 *data, int count) #if 0
/* needs 4 byte input */
static
int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr)
{ {
u8 headr[3] = { 0x00, 0x00, 0x01} ; if (pr) printk("GOP header: ");
if (p->count < 6){ pic->time_code = (( headr[0] << 17 ) | ( headr[1] << 9) |
memcpy(p->buf, headr, 3); ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff;
p->count = 6;
if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F,
((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
if ( ( headr[3] & 0x40 ) != 0 ){
pic->closed_gop = 1;
} else {
pic->closed_gop = 0;
} }
if (pr) printk("closed: %d", pic->closed_gop);
if (p->count + count < p->size){ if ( ( headr[3] & 0x20 ) != 0 ){
memcpy(p->buf+p->count, data, count); pic->broken_link = 1;
p->count += count;
} else { } else {
int rest = p->size - p->count; pic->broken_link = 0;
memcpy(p->buf+p->count, data, rest);
p->count += rest;
send_ipack(p);
if (count - rest > 0)
write_ipack(p, data+rest, count-rest);
} }
if (pr) printk(" broken: %d\n", pic->broken_link);
return 0;
} }
#endif
int instant_repack(u8 *buf, int count, ipack *p) #if 0
/* needs 8 byte input */
static
int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr)
{ {
int l; int sw;
int c=0; int form = -1;
while (c < count && (p->mpeg == 0 || if (pr) printk("Reading sequence header\n");
(p->mpeg == 1 && p->found < 7) ||
(p->mpeg == 2 && p->found < 9)) vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
&& (p->found < 5 || !p->done)){ vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]);
switch ( p->found ){
case 0: sw = (int)((headr[3]&0xF0) >> 4) ;
switch( sw ){
case 1: case 1:
if (buf[c] == 0x00) p->found++; if (pr)
else p->found = 0; printk("Videostream: ASPECT: 1:1");
c++; vi->aspect_ratio = 100;
break; break;
case 2: case 2:
if (buf[c] == 0x01) p->found++; if (pr)
else if (buf[c] == 0) { printk("Videostream: ASPECT: 4:3");
p->found = 2; vi->aspect_ratio = 133;
} else p->found = 0;
c++;
break; break;
case 3: case 3:
p->cid = 0; if (pr)
switch (buf[c]){ printk("Videostream: ASPECT: 16:9");
case PROG_STREAM_MAP: vi->aspect_ratio = 177;
case PRIVATE_STREAM2:
case PROG_STREAM_DIR:
case ECM_STREAM :
case EMM_STREAM :
case PADDING_STREAM :
case DSM_CC_STREAM :
case ISO13522_STREAM:
p->done = 1;
case PRIVATE_STREAM1:
case VIDEO_STREAM_S ... VIDEO_STREAM_E:
case AUDIO_STREAM_S ... AUDIO_STREAM_E:
p->found++;
p->cid = buf[c];
c++;
break; break;
default: case 4:
p->found = 0; if (pr)
printk("Videostream: ASPECT: 2.21:1");
vi->aspect_ratio = 221;
break; break;
}
case 5 ... 15:
if (pr)
printk("Videostream: ASPECT: reserved");
vi->aspect_ratio = 0;
break; break;
case 4: default:
if (count-c > 1){ vi->aspect_ratio = 0;
p->plen[0] = buf[c]; return -1;
c++;
p->plen[1] = buf[c];
c++;
p->found+=2;
p->plength=(p->plen[0]<<8)|p->plen[1];
} else {
p->plen[0] = buf[c];
p->found++;
return count;
} }
if (pr)
printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size);
sw = (int)(headr[3]&0x0F);
switch ( sw ) {
case 1:
if (pr)
printk(" FRate: 23.976 fps");
vi->framerate = 23976;
form = -1;
break;
case 2:
if (pr)
printk(" FRate: 24 fps");
vi->framerate = 24000;
form = -1;
break;
case 3:
if (pr)
printk(" FRate: 25 fps");
vi->framerate = 25000;
form = VIDEO_MODE_PAL;
break;
case 4:
if (pr)
printk(" FRate: 29.97 fps");
vi->framerate = 29970;
form = VIDEO_MODE_NTSC;
break; break;
case 5: case 5:
p->plen[1] = buf[c]; if (pr)
c++; printk(" FRate: 30 fps");
p->found++; vi->framerate = 30000;
p->plength=(p->plen[0]<<8)|p->plen[1]; form = VIDEO_MODE_NTSC;
break; break;
case 6: case 6:
if (!p->done){ if (pr)
p->flag1 = buf[c]; printk(" FRate: 50 fps");
c++; vi->framerate = 50000;
p->found++; form = VIDEO_MODE_PAL;
if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2;
else {
p->hlength = 0;
p->which = 0;
p->mpeg = 1;
p->flag2 = 0;
}
}
break; break;
case 7: case 7:
if ( !p->done && p->mpeg == 2) { if (pr)
p->flag2 = buf[c]; printk(" FRate: 60 fps");
c++; vi->framerate = 60000;
p->found++; form = VIDEO_MODE_NTSC;
}
break; break;
case 8:
if ( !p->done && p->mpeg == 2) {
p->hlength = buf[c];
c++;
p->found++;
} }
break;
default: vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
break; vi->vbv_buffer_size
} = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
if (pr){
printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
printk(" vbvbuffer %d",16*1024*(vi->vbv_buffer_size));
printk("\n");
} }
if (c == count) return count; vi->video_format = form;
if (!p->plength) p->plength = MMAX_PLENGTH-6; return 0;
}
#endif
if ( p->done || ((p->mpeg == 2 && p->found >= 9) ||
(p->mpeg == 1 && p->found >= 7)) ){
switch (p->cid){
case AUDIO_STREAM_S ... AUDIO_STREAM_E: #if 0
case VIDEO_STREAM_S ... VIDEO_STREAM_E: static
case PRIVATE_STREAM1: int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr)
{
uint8_t *headr;
int found = 0;
int c = 0;
if (p->mpeg == 2 && p->found == 9) { while (found < 4 && c+4 < count){
write_ipack(p, &p->flag1, 1); uint8_t *b;
write_ipack(p, &p->flag2, 1);
write_ipack(p, &p->hlength, 1); b = mbuf+c;
if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
&& b[3] == 0xb3) found = 4;
else {
c++;
}
} }
if (p->mpeg == 1 && p->found == 7) if (! found) return -1;
write_ipack(p, &p->flag1, 1); c += 4;
if (c+12 >= count) return -1;
headr = mbuf+c;
if (read_sequence_header(headr, vi, pr) < 0) return -1;
vi->off = c-4;
return 0;
}
#endif
if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) &&
p->found < 14) { #if 0
while (c < count && p->found < 14) { static
p->pts[p->found-9] = buf[c]; int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr)
write_ipack(p, buf+c, 1); {
uint8_t *headr;
int found = 0;
int c = 0;
int fr = 0;
while (found < 2 && c < count){
uint8_t b[2];
memcpy( b, mbuf+c, 2);
if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
found = 2;
else {
c++; c++;
p->found++;
} }
if (c == count) return count;
} }
if (p->mpeg == 1 && p->which < 2000) { if (!found) return -1;
if (p->found == 7) { if (c+3 >= count) return -1;
p->check = p->flag1; headr = mbuf+c;
p->hlength = 1;
ai->layer = (headr[1] & 0x06) >> 1;
if (pr)
printk("Audiostream: Layer: %d", 4-ai->layer);
ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;
if (pr){
if (ai->bit_rate == 0)
printk(" Bit rate: free");
else if (ai->bit_rate == 0xf)
printk(" BRate: reserved");
else
printk(" BRate: %d kb/s", ai->bit_rate/1000);
} }
while (!p->which && c < count && fr = (headr[2] & 0x0c ) >> 2;
p->check == 0xFF){ ai->frequency = freq[fr]*100;
p->check = buf[c]; if (pr){
write_ipack(p, buf+c, 1); if (ai->frequency == 3)
c++; printk(" Freq: reserved\n");
p->found++; else
p->hlength++; printk(" Freq: %d kHz\n",ai->frequency);
} }
ai->off = c;
return 0;
}
#endif
if ( c == count) return count; static
int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr)
{
uint8_t *headr;
int found = 0;
int c = 0;
uint8_t frame = 0;
int fr = 0;
if ( (p->check & 0xC0) == 0x40 && !p->which){ while ( !found && c < count){
p->check = buf[c]; uint8_t *b = mbuf+c;
write_ipack(p, buf+c, 1);
c++;
p->found++;
p->hlength++;
p->which = 1; if ( b[0] == 0x0b && b[1] == 0x77 )
if ( c == count) return count; found = 1;
p->check = buf[c]; else {
write_ipack(p, buf+c, 1);
c++; c++;
p->found++;
p->hlength++;
p->which = 2;
if ( c == count) return count;
} }
if (p->which == 1){
p->check = buf[c];
write_ipack(p, buf+c, 1);
c++;
p->found++;
p->hlength++;
p->which = 2;
if ( c == count) return count;
} }
if ( (p->check & 0x30) && p->check != 0xFF){ if (!found) return -1;
p->flag2 = (p->check & 0xF0) << 2; if (pr)
p->pts[0] = p->check; printk("Audiostream: AC3");
p->which = 3;
}
if ( c == count) return count;
if (p->which > 2){
if ((p->flag2 & PTS_DTS_FLAGS)
== PTS_ONLY){
while (c < count &&
p->which < 7){
p->pts[p->which-2] =
buf[c];
write_ipack(p,buf+c,1);
c++;
p->found++;
p->which++;
p->hlength++;
}
if ( c == count) return count;
} else if ((p->flag2 & PTS_DTS_FLAGS)
== PTS_DTS){
while (c < count &&
p->which< 12){
if (p->which< 7)
p->pts[p->which
-2] =
buf[c];
write_ipack(p,buf+c,1);
c++;
p->found++;
p->which++;
p->hlength++;
}
if ( c == count) return count;
}
p->which = 2000;
}
} ai->off = c;
if (c+5 >= count) return -1;
while (c < count && p->found < p->plength+6){ ai->layer = 0; // 0 for AC3
l = count -c; headr = mbuf+c+2;
if (l+p->found > p->plength+6)
l = p->plength+6-p->found;
write_ipack(p, buf+c, l);
p->found += l;
c += l;
}
break; frame = (headr[2]&0x3f);
} ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
if (pr)
printk(" BRate: %d kb/s", ai->bit_rate/1000);
if ( p->done ){ ai->frequency = (headr[2] & 0xc0 ) >> 6;
if( p->found + count - c < p->plength+6){ fr = (headr[2] & 0xc0 ) >> 6;
p->found += count-c; ai->frequency = freq[fr]*100;
c = count; if (pr) printk (" Freq: %d Hz\n", ai->frequency);
} else {
c += p->plength+6 - p->found;
p->found = p->plength+6;
}
}
if (p->plength && p->found == p->plength+6) {
send_ipack(p);
reset_ipack(p);
if (c < count)
instant_repack(buf+c, count-c, p);
}
}
return count;
}
ai->framesize = ac3_frames[fr][frame >> 1];
if ((frame & 1) && (fr == 1)) ai->framesize++;
ai->framesize = ai->framesize << 1;
if (pr) printk (" Framesize %d\n", ai->framesize);
void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, return 0;
void (*pes_write)(u8 *buf, int count, void *data),
void *priv)
{
init_ipack(pa, IPACKS, pes_write);
init_ipack(pv, IPACKS, pes_write);
pa->pid = pida;
pv->pid = pidv;
pa->data = priv;
pv->data = priv;
} }
void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
{
u8 off = 0;
if (!buf || !p ){
printk("NULL POINTER IDIOT\n");
return;
}
if (buf[1]&PAY_START) {
if (p->plength == MMAX_PLENGTH-6 && p->found>6){
p->plength = p->found-6;
p->found = 0;
send_ipack(p);
reset_ipack(p);
}
}
if (buf[3] & ADAPT_FIELD) { // adaptation field?
off = buf[4] + 1;
if (off+4 > 187) return;
}
instant_repack(buf+4+off, TS_SIZE-4-off, p);
}
/* needs 5 byte input, returns picture coding type*/ #if 0
int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr) static
uint8_t *skip_pes_header(uint8_t **bufp)
{ {
uint8_t pct; uint8_t *inbuf = *bufp;
uint8_t *buf = inbuf;
uint8_t *pts = NULL;
int skip = 0;
if (pr) printk( "Pic header: "); static const int mpeg1_skip_table[16] = {
pic->temporal_reference[field] = (( headr[0] << 2 ) | 1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff,
(headr[1] & 0x03) )& 0x03ff; 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]); };
pct = ( headr[1] >> 2 ) & 0x07;
pic->picture_coding_type[field] = pct; if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
if (pr) { if (buf[7] & PTS_ONLY)
switch(pct){ pts = buf+9;
case I_FRAME: else pts = NULL;
printk( " I-FRAME"); buf = inbuf + 9 + inbuf[8];
break; } else { /* mpeg1 */
case B_FRAME: for (buf = inbuf + 6; *buf == 0xff; buf++)
printk( " B-FRAME"); if (buf == inbuf + 6 + 16) {
break;
case P_FRAME:
printk( " P-FRAME");
break; break;
} }
} if ((*buf & 0xc0) == 0x40)
buf += 2;
skip = mpeg1_skip_table [*buf >> 4];
pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) | if (skip == 5 || skip == 10) pts = buf;
( (headr[3] & 0x1F) << 11) ) & 0xffff; else pts = NULL;
if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
((headr[4] & 0x80) >> 3);
if ( pct == B_FRAME ){ buf += mpeg1_skip_table [*buf >> 4];
pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
} }
if (pr) printk( " pic head param: 0x%x",
pic->picture_header_parameter);
return pct; *bufp = buf;
return pts;
} }
#endif
#if 0
/* needs 4 byte input */ static
int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr) void initialize_quant_matrix( uint32_t *matrix )
{ {
if (pr) printk("GOP header: "); int i;
pic->time_code = (( headr[0] << 17 ) | ( headr[1] << 9) | matrix[0] = 0x08101013;
( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff; matrix[1] = 0x10131616;
matrix[2] = 0x16161616;
matrix[3] = 0x1a181a1b;
matrix[4] = 0x1b1b1a1a;
matrix[5] = 0x1a1a1b1b;
matrix[6] = 0x1b1d1d1d;
matrix[7] = 0x2222221d;
matrix[8] = 0x1d1d1b1b;
matrix[9] = 0x1d1d2020;
matrix[10] = 0x22222526;
matrix[11] = 0x25232322;
matrix[12] = 0x23262628;
matrix[13] = 0x28283030;
matrix[14] = 0x2e2e3838;
matrix[15] = 0x3a454553;
if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F, for ( i = 16 ; i < 32 ; i++ )
((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F), matrix[i] = 0x10101010;
((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F)); }
#endif
if ( ( headr[3] & 0x40 ) != 0 ){ #if 0
pic->closed_gop = 1; static
} else { void initialize_mpg_picture(mpg_picture *pic)
pic->closed_gop = 0; {
} int i;
if (pr) printk("closed: %d", pic->closed_gop);
if ( ( headr[3] & 0x20 ) != 0 ){ /* set MPEG1 */
pic->broken_link = 1; pic->mpeg1_flag = 1;
} else { pic->profile_and_level = 0x4A ; /* MP@LL */
pic->broken_link = 0; pic->progressive_sequence = 1;
pic->low_delay = 0;
pic->sequence_display_extension_flag = 0;
for ( i = 0 ; i < 4 ; i++ ){
pic->frame_centre_horizontal_offset[i] = 0;
pic->frame_centre_vertical_offset[i] = 0;
} }
if (pr) printk(" broken: %d\n", pic->broken_link); pic->last_frame_centre_horizontal_offset = 0;
pic->last_frame_centre_vertical_offset = 0;
return 0; pic->picture_display_extension_flag[0] = 0;
pic->picture_display_extension_flag[1] = 0;
pic->sequence_header_flag = 0;
pic->gop_flag = 0;
pic->sequence_end_flag = 0;
} }
#endif
/* needs 8 byte input */ #if 0
int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr) static
void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic )
{ {
int sw; int16_t last_h_offset;
int form = -1; int16_t last_v_offset;
if (pr) printk("Reading sequence header\n"); int16_t *p_h_offset;
int16_t *p_v_offset;
vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4); if ( pic->mpeg1_flag ){
vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]); pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
pic->top_field_first = 0;
pic->repeat_first_field = 0;
pic->progressive_frame = 1;
pic->picture_coding_parameter = 0x000010;
}
sw = (int)((headr[3]&0xF0) >> 4) ; /* Reset flag */
pic->picture_display_extension_flag[field_type] = 0;
switch( sw ){ last_h_offset = pic->last_frame_centre_horizontal_offset;
case 1: last_v_offset = pic->last_frame_centre_vertical_offset;
if (pr) if ( field_type == FIRST_FIELD ){
printk("Videostream: ASPECT: 1:1"); p_h_offset = pic->frame_centre_horizontal_offset;
vi->aspect_ratio = 100; p_v_offset = pic->frame_centre_vertical_offset;
break; *p_h_offset = last_h_offset;
case 2: *(p_h_offset + 1) = last_h_offset;
if (pr) *(p_h_offset + 2) = last_h_offset;
printk("Videostream: ASPECT: 4:3"); *p_v_offset = last_v_offset;
vi->aspect_ratio = 133; *(p_v_offset + 1) = last_v_offset;
break; *(p_v_offset + 2) = last_v_offset;
case 3: } else {
if (pr) pic->frame_centre_horizontal_offset[3] = last_h_offset;
printk("Videostream: ASPECT: 16:9"); pic->frame_centre_vertical_offset[3] = last_v_offset;
vi->aspect_ratio = 177;
break;
case 4:
if (pr)
printk("Videostream: ASPECT: 2.21:1");
vi->aspect_ratio = 221;
break;
case 5 ... 15:
if (pr)
printk("Videostream: ASPECT: reserved");
vi->aspect_ratio = 0;
break;
default:
vi->aspect_ratio = 0;
return -1;
} }
}
#endif
if (pr) #if 0
printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size); static
void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type)
sw = (int)(headr[3]&0x0F); {
pic->picture_header = 0;
pic->sequence_header_data
= ( INIT_HORIZONTAL_SIZE << 20 )
| ( INIT_VERTICAL_SIZE << 8 )
| ( INIT_ASPECT_RATIO << 4 )
| ( INIT_FRAME_RATE );
pic->mpeg1_flag = 0;
pic->vinfo.horizontal_size
= INIT_DISP_HORIZONTAL_SIZE;
pic->vinfo.vertical_size
= INIT_DISP_VERTICAL_SIZE;
pic->picture_display_extension_flag[field_type]
= 0;
pic->pts_flag[field_type] = 0;
switch ( sw ) { pic->sequence_gop_header = 0;
case 1: pic->picture_header = 0;
if (pr) pic->sequence_header_flag = 0;
printk(" FRate: 23.976 fps"); pic->gop_flag = 0;
vi->framerate = 23976; pic->sequence_end_flag = 0;
form = -1; pic->sequence_display_extension_flag = 0;
break; pic->last_frame_centre_horizontal_offset = 0;
case 2: pic->last_frame_centre_vertical_offset = 0;
if (pr) pic->channel = chan;
printk(" FRate: 24 fps"); }
vi->framerate = 24000; #endif
form = -1;
break;
case 3:
if (pr)
printk(" FRate: 25 fps");
vi->framerate = 25000;
form = VIDEO_MODE_PAL;
break;
case 4:
if (pr)
printk(" FRate: 29.97 fps");
vi->framerate = 29970;
form = VIDEO_MODE_NTSC;
break;
case 5:
if (pr)
printk(" FRate: 30 fps");
vi->framerate = 30000;
form = VIDEO_MODE_NTSC;
break;
case 6:
if (pr)
printk(" FRate: 50 fps");
vi->framerate = 50000;
form = VIDEO_MODE_PAL;
break;
case 7:
if (pr)
printk(" FRate: 60 fps");
vi->framerate = 60000;
form = VIDEO_MODE_NTSC;
break;
}
vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03); void dvb_filter_pes2ts_init(dvb_filter_pes2ts_t *p2ts, unsigned short pid,
dvb_filter_pes2ts_cb_t *cb, void *priv)
{
unsigned char *buf=p2ts->buf;
vi->vbv_buffer_size buf[0]=0x47;
= (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5); buf[1]=(pid>>8);
buf[2]=pid&0xff;
p2ts->cc=0;
p2ts->cb=cb;
p2ts->priv=priv;
}
if (pr){ int dvb_filter_pes2ts(dvb_filter_pes2ts_t *p2ts, unsigned char *pes, int len)
printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000); {
printk(" vbvbuffer %d",16*1024*(vi->vbv_buffer_size)); unsigned char *buf=p2ts->buf;
printk("\n"); int ret=0, rest;
}
vi->video_format = form; //len=6+((pes[4]<<8)|pes[5]);
buf[1]|=0x40;
while (len>=184) {
buf[3]=0x10|((p2ts->cc++)&0x0f);
memcpy(buf+4, pes, 184);
if ((ret=p2ts->cb(p2ts->priv, buf)))
return ret;
len-=184; pes+=184;
buf[1]&=~0x40;
}
if (!len)
return 0; return 0;
buf[3]=0x30|((p2ts->cc++)&0x0f);
rest=183-len;
if (rest) {
buf[5]=0x00;
if (rest-1)
memset(buf+6, 0xff, rest-1);
}
buf[4]=rest;
memcpy(buf+5+rest, pes, len);
return p2ts->cb(p2ts->priv, buf);
} }
int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr) void dvb_filter_ipack_reset(ipack *p)
{ {
uint8_t *headr; p->found = 0;
int found = 0; p->cid = 0;
int c = 0; p->plength = 0;
p->flag1 = 0;
while (found < 4 && c+4 < count){ p->flag2 = 0;
uint8_t *b; p->hlength = 0;
p->mpeg = 0;
p->check = 0;
p->which = 0;
p->done = 0;
p->count = 0;
}
b = mbuf+c; void dvb_filter_ipack_init(ipack *p, int size,
if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 void (*func)(u8 *buf, int size, void *priv))
&& b[3] == 0xb3) found = 4; {
else { if ( !(p->buf = vmalloc(size*sizeof(u8))) ){
c++; printk ("Couldn't allocate memory for ipack\n");
}
} }
p->size = size;
p->func = func;
p->repack_subids = 0;
dvb_filter_ipack_reset(p);
}
if (! found) return -1; void dvb_filter_ipack_free(ipack * p)
c += 4; {
if (c+12 >= count) return -1; if (p->buf) vfree(p->buf);
headr = mbuf+c;
if (read_sequence_header(headr, vi, pr) < 0) return -1;
vi->off = c-4;
return 0;
} }
int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr) static
void send_ipack(ipack *p)
{ {
uint8_t *headr; int off;
int found = 0; AudioInfo ai;
int c = 0; int ac3_off = 0;
int fr = 0; int streamid=0;
int nframes= 0;
int f=0;
while (found < 2 && c < count){ switch ( p->mpeg ){
uint8_t b[2]; case 2:
memcpy( b, mbuf+c, 2); if (p->count < 10) return;
p->buf[3] = p->cid;
if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8) p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
found = 2; p->buf[5] = (u8)((p->count-6) & 0x00FF);
else { if (p->repack_subids && p->cid == PRIVATE_STREAM1){
c++;
off = 9+p->buf[8];
streamid = p->buf[off];
if ((streamid & 0xF8) == 0x80){
ai.off = 0;
ac3_off = ((p->buf[off+2] << 8)|
p->buf[off+3]);
if (ac3_off < p->count)
f=get_ac3info(p->buf+off+3+ac3_off,
p->count-ac3_off, &ai,0);
if ( !f ){
nframes = (p->count-off-3-ac3_off)/
ai.framesize + 1;
p->buf[off+2] = (ac3_off >> 8)& 0xFF;
p->buf[off+3] = (ac3_off)& 0xFF;
p->buf[off+1] = nframes;
ac3_off += nframes * ai.framesize -
p->count;
}
} }
} }
p->func(p->buf, p->count, p->data);
if (!found) return -1; p->buf[6] = 0x80;
p->buf[7] = 0x00;
p->buf[8] = 0x00;
p->count = 9;
if (p->repack_subids && p->cid == PRIVATE_STREAM1
&& (streamid & 0xF8)==0x80 ){
p->count += 4;
p->buf[9] = streamid;
p->buf[10] = (ac3_off >> 8)& 0xFF;
p->buf[11] = (ac3_off)& 0xFF;
p->buf[12] = 0;
}
if (c+3 >= count) return -1; break;
headr = mbuf+c; case 1:
if (p->count < 8) return;
p->buf[3] = p->cid;
ai->layer = (headr[1] & 0x06) >> 1; p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
p->buf[5] = (u8)((p->count-6) & 0x00FF);
p->func(p->buf, p->count, p->data);
if (pr) p->buf[6] = 0x0F;
printk("Audiostream: Layer: %d", 4-ai->layer); p->count = 7;
break;
}
}
void dvb_filter_ipack_flush(ipack *p)
{
if (p->plength != MMAX_PLENGTH-6 || p->found<=6)
return;
p->plength = p->found-6;
p->found = 0;
send_ipack(p);
dvb_filter_ipack_reset(p);
}
ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000; static
void write_ipack(ipack *p, u8 *data, int count)
{
u8 headr[3] = { 0x00, 0x00, 0x01} ;
if (pr){ if (p->count < 6){
if (ai->bit_rate == 0) memcpy(p->buf, headr, 3);
printk(" Bit rate: free"); p->count = 6;
else if (ai->bit_rate == 0xf)
printk(" BRate: reserved");
else
printk(" BRate: %d kb/s", ai->bit_rate/1000);
} }
fr = (headr[2] & 0x0c ) >> 2; if (p->count + count < p->size){
ai->frequency = freq[fr]*100; memcpy(p->buf+p->count, data, count);
if (pr){ p->count += count;
if (ai->frequency == 3) } else {
printk(" Freq: reserved\n"); int rest = p->size - p->count;
else memcpy(p->buf+p->count, data, rest);
printk(" Freq: %d kHz\n",ai->frequency); p->count += rest;
send_ipack(p);
if (count - rest > 0)
write_ipack(p, data+rest, count-rest);
} }
ai->off = c;
return 0;
} }
int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr)
int dvb_filter_instant_repack(u8 *buf, int count, ipack *p)
{ {
uint8_t *headr; int l;
int found = 0; int c=0;
int c = 0;
uint8_t frame = 0;
int fr = 0;
while ( !found && c < count){ while (c < count && (p->mpeg == 0 ||
uint8_t *b = mbuf+c; (p->mpeg == 1 && p->found < 7) ||
(p->mpeg == 2 && p->found < 9))
&& (p->found < 5 || !p->done)){
switch ( p->found ){
case 0:
case 1:
if (buf[c] == 0x00) p->found++;
else p->found = 0;
c++;
break;
case 2:
if (buf[c] == 0x01) p->found++;
else if (buf[c] == 0) {
p->found = 2;
} else p->found = 0;
c++;
break;
case 3:
p->cid = 0;
switch (buf[c]){
case PROG_STREAM_MAP:
case PRIVATE_STREAM2:
case PROG_STREAM_DIR:
case ECM_STREAM :
case EMM_STREAM :
case PADDING_STREAM :
case DSM_CC_STREAM :
case ISO13522_STREAM:
p->done = 1;
case PRIVATE_STREAM1:
case VIDEO_STREAM_S ... VIDEO_STREAM_E:
case AUDIO_STREAM_S ... AUDIO_STREAM_E:
p->found++;
p->cid = buf[c];
c++;
break;
default:
p->found = 0;
break;
}
break;
if ( b[0] == 0x0b && b[1] == 0x77 ) case 4:
found = 1; if (count-c > 1){
else { p->plen[0] = buf[c];
c++; c++;
p->plen[1] = buf[c];
c++;
p->found+=2;
p->plength=(p->plen[0]<<8)|p->plen[1];
} else {
p->plen[0] = buf[c];
p->found++;
return count;
} }
break;
case 5:
p->plen[1] = buf[c];
c++;
p->found++;
p->plength=(p->plen[0]<<8)|p->plen[1];
break;
case 6:
if (!p->done){
p->flag1 = buf[c];
c++;
p->found++;
if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2;
else {
p->hlength = 0;
p->which = 0;
p->mpeg = 1;
p->flag2 = 0;
} }
}
break;
if (!found) return -1; case 7:
if (pr) if ( !p->done && p->mpeg == 2) {
printk("Audiostream: AC3"); p->flag2 = buf[c];
c++;
ai->off = c; p->found++;
if (c+5 >= count) return -1; }
break;
ai->layer = 0; // 0 for AC3
headr = mbuf+c+2;
frame = (headr[2]&0x3f);
ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
if (pr)
printk(" BRate: %d kb/s", ai->bit_rate/1000);
ai->frequency = (headr[2] & 0xc0 ) >> 6; case 8:
fr = (headr[2] & 0xc0 ) >> 6; if ( !p->done && p->mpeg == 2) {
ai->frequency = freq[fr]*100; p->hlength = buf[c];
if (pr) printk (" Freq: %d Hz\n", ai->frequency); c++;
p->found++;
}
break;
default:
ai->framesize = ac3_frames[fr][frame >> 1]; break;
if ((frame & 1) && (fr == 1)) ai->framesize++; }
ai->framesize = ai->framesize << 1; }
if (pr) printk (" Framesize %d\n", ai->framesize);
if (c == count) return count;
return 0; if (!p->plength) p->plength = MMAX_PLENGTH-6;
}
uint8_t *skip_pes_header(uint8_t **bufp) if ( p->done || ((p->mpeg == 2 && p->found >= 9) ||
{ (p->mpeg == 1 && p->found >= 7)) ){
uint8_t *inbuf = *bufp; switch (p->cid){
uint8_t *buf = inbuf;
uint8_t *pts = NULL;
int skip = 0;
int mpeg1_skip_table[16] = { case AUDIO_STREAM_S ... AUDIO_STREAM_E:
1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff, case VIDEO_STREAM_S ... VIDEO_STREAM_E:
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff case PRIVATE_STREAM1:
};
if (p->mpeg == 2 && p->found == 9) {
write_ipack(p, &p->flag1, 1);
write_ipack(p, &p->flag2, 1);
write_ipack(p, &p->hlength, 1);
}
if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */ if (p->mpeg == 1 && p->found == 7)
if (buf[7] & PTS_ONLY) write_ipack(p, &p->flag1, 1);
pts = buf+9;
else pts = NULL;
buf = inbuf + 9 + inbuf[8];
} else { /* mpeg1 */
for (buf = inbuf + 6; *buf == 0xff; buf++)
if (buf == inbuf + 6 + 16) {
break;
}
if ((*buf & 0xc0) == 0x40)
buf += 2;
skip = mpeg1_skip_table [*buf >> 4];
if (skip == 5 || skip == 10) pts = buf;
else pts = NULL;
buf += mpeg1_skip_table [*buf >> 4]; if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) &&
p->found < 14) {
while (c < count && p->found < 14) {
p->pts[p->found-9] = buf[c];
write_ipack(p, buf+c, 1);
c++;
p->found++;
}
if (c == count) return count;
} }
*bufp = buf; if (p->mpeg == 1 && p->which < 2000) {
return pts;
}
void initialize_quant_matrix( uint32_t *matrix ) if (p->found == 7) {
{ p->check = p->flag1;
int i; p->hlength = 1;
}
matrix[0] = 0x08101013; while (!p->which && c < count &&
matrix[1] = 0x10131616; p->check == 0xFF){
matrix[2] = 0x16161616; p->check = buf[c];
matrix[3] = 0x1a181a1b; write_ipack(p, buf+c, 1);
matrix[4] = 0x1b1b1a1a; c++;
matrix[5] = 0x1a1a1b1b; p->found++;
matrix[6] = 0x1b1d1d1d; p->hlength++;
matrix[7] = 0x2222221d; }
matrix[8] = 0x1d1d1b1b;
matrix[9] = 0x1d1d2020;
matrix[10] = 0x22222526;
matrix[11] = 0x25232322;
matrix[12] = 0x23262628;
matrix[13] = 0x28283030;
matrix[14] = 0x2e2e3838;
matrix[15] = 0x3a454553;
for ( i = 16 ; i < 32 ; i++ ) if ( c == count) return count;
matrix[i] = 0x10101010;
}
void initialize_mpg_picture(mpg_picture *pic) if ( (p->check & 0xC0) == 0x40 && !p->which){
{ p->check = buf[c];
int i; write_ipack(p, buf+c, 1);
c++;
p->found++;
p->hlength++;
/* set MPEG1 */ p->which = 1;
pic->mpeg1_flag = 1; if ( c == count) return count;
pic->profile_and_level = 0x4A ; /* MP@LL */ p->check = buf[c];
pic->progressive_sequence = 1; write_ipack(p, buf+c, 1);
pic->low_delay = 0; c++;
p->found++;
p->hlength++;
p->which = 2;
if ( c == count) return count;
}
pic->sequence_display_extension_flag = 0; if (p->which == 1){
for ( i = 0 ; i < 4 ; i++ ){ p->check = buf[c];
pic->frame_centre_horizontal_offset[i] = 0; write_ipack(p, buf+c, 1);
pic->frame_centre_vertical_offset[i] = 0; c++;
p->found++;
p->hlength++;
p->which = 2;
if ( c == count) return count;
} }
pic->last_frame_centre_horizontal_offset = 0;
pic->last_frame_centre_vertical_offset = 0;
pic->picture_display_extension_flag[0] = 0; if ( (p->check & 0x30) && p->check != 0xFF){
pic->picture_display_extension_flag[1] = 0; p->flag2 = (p->check & 0xF0) << 2;
pic->sequence_header_flag = 0; p->pts[0] = p->check;
pic->gop_flag = 0; p->which = 3;
pic->sequence_end_flag = 0; }
}
if ( c == count) return count;
if (p->which > 2){
if ((p->flag2 & PTS_DTS_FLAGS)
== PTS_ONLY){
while (c < count &&
p->which < 7){
p->pts[p->which-2] =
buf[c];
write_ipack(p,buf+c,1);
c++;
p->found++;
p->which++;
p->hlength++;
}
if ( c == count) return count;
} else if ((p->flag2 & PTS_DTS_FLAGS)
== PTS_DTS){
while (c < count &&
p->which< 12){
if (p->which< 7)
p->pts[p->which
-2] =
buf[c];
write_ipack(p,buf+c,1);
c++;
p->found++;
p->which++;
p->hlength++;
}
if ( c == count) return count;
}
p->which = 2000;
}
void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic ) }
{
int16_t last_h_offset;
int16_t last_v_offset;
int16_t *p_h_offset; while (c < count && p->found < p->plength+6){
int16_t *p_v_offset; l = count -c;
if (l+p->found > p->plength+6)
l = p->plength+6-p->found;
write_ipack(p, buf+c, l);
p->found += l;
c += l;
}
if ( pic->mpeg1_flag ){ break;
pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
pic->top_field_first = 0;
pic->repeat_first_field = 0;
pic->progressive_frame = 1;
pic->picture_coding_parameter = 0x000010;
} }
/* Reset flag */
pic->picture_display_extension_flag[field_type] = 0;
last_h_offset = pic->last_frame_centre_horizontal_offset; if ( p->done ){
last_v_offset = pic->last_frame_centre_vertical_offset; if( p->found + count - c < p->plength+6){
if ( field_type == FIRST_FIELD ){ p->found += count-c;
p_h_offset = pic->frame_centre_horizontal_offset; c = count;
p_v_offset = pic->frame_centre_vertical_offset;
*p_h_offset = last_h_offset;
*(p_h_offset + 1) = last_h_offset;
*(p_h_offset + 2) = last_h_offset;
*p_v_offset = last_v_offset;
*(p_v_offset + 1) = last_v_offset;
*(p_v_offset + 2) = last_v_offset;
} else { } else {
pic->frame_centre_horizontal_offset[3] = last_h_offset; c += p->plength+6 - p->found;
pic->frame_centre_vertical_offset[3] = last_v_offset; p->found = p->plength+6;
}
} }
}
void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type)
{
pic->picture_header = 0;
pic->sequence_header_data
= ( INIT_HORIZONTAL_SIZE << 20 )
| ( INIT_VERTICAL_SIZE << 8 )
| ( INIT_ASPECT_RATIO << 4 )
| ( INIT_FRAME_RATE );
pic->mpeg1_flag = 0;
pic->vinfo.horizontal_size
= INIT_DISP_HORIZONTAL_SIZE;
pic->vinfo.vertical_size
= INIT_DISP_VERTICAL_SIZE;
pic->picture_display_extension_flag[field_type]
= 0;
pic->pts_flag[field_type] = 0;
pic->sequence_gop_header = 0; if (p->plength && p->found == p->plength+6) {
pic->picture_header = 0; send_ipack(p);
pic->sequence_header_flag = 0; dvb_filter_ipack_reset(p);
pic->gop_flag = 0; if (c < count)
pic->sequence_end_flag = 0; dvb_filter_instant_repack(buf+c, count-c, p);
pic->sequence_display_extension_flag = 0; }
pic->last_frame_centre_horizontal_offset = 0; }
pic->last_frame_centre_vertical_offset = 0; return count;
pic->channel = chan;
} }
...@@ -6,18 +6,18 @@ ...@@ -6,18 +6,18 @@
#include "demux.h" #include "demux.h"
typedef int (pes2ts_cb_t) (void *, unsigned char *); typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
typedef struct pes2ts_s { typedef struct dvb_filter_pes2ts_s {
unsigned char buf[188]; unsigned char buf[188];
unsigned char cc; unsigned char cc;
pes2ts_cb_t *cb; dvb_filter_pes2ts_cb_t *cb;
void *priv; void *priv;
} pes2ts_t; } dvb_filter_pes2ts_t;
void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, void dvb_filter_pes2ts_init(dvb_filter_pes2ts_t *p2ts, unsigned short pid,
pes2ts_cb_t *cb, void *priv); dvb_filter_pes2ts_cb_t *cb, void *priv);
int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len); int dvb_filter_pes2ts(dvb_filter_pes2ts_t *p2ts, unsigned char *pes, int len);
#define PROG_STREAM_MAP 0xBC #define PROG_STREAM_MAP 0xBC
...@@ -224,26 +224,11 @@ typedef struct audio_i{ ...@@ -224,26 +224,11 @@ typedef struct audio_i{
} AudioInfo; } AudioInfo;
void reset_ipack(ipack *p); void dvb_filter_ipack_reset(ipack *p);
int instant_repack(u8 *buf, int count, ipack *p); int dvb_filter_instant_repack(u8 *buf, int count, ipack *p);
void init_ipack(ipack *p, int size, void dvb_filter_ipack_init(ipack *p, int size,
void (*func)(u8 *buf, int size, void *priv)); void (*func)(u8 *buf, int size, void *priv));
void free_ipack(ipack * p); void dvb_filter_ipack_free(ipack * p);
void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, void dvb_filter_ipack_flush(ipack *p);
void (*pes_write)(u8 *buf, int count, void *data),
void *priv);
void ts_to_pes(ipack *p, u8 *buf);
void send_ipack(ipack *p);
void send_ipack_rest(ipack *p);
int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr);
int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr);
int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr);
uint8_t *skip_pes_header(uint8_t **bufp);
void initialize_quant_matrix( uint32_t *matrix );
void initialize_mpg_picture(mpg_picture *pic);
void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type);
void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic );
int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr);
int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr);
int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr);
#endif #endif
...@@ -83,7 +83,7 @@ struct dvb_frontend_data { ...@@ -83,7 +83,7 @@ struct dvb_frontend_data {
struct dvb_frontend_ioctl_data { struct dvb_frontend_ioctl_data {
struct list_head list_head; struct list_head list_head;
struct dvb_adapter_s *adapter; struct dvb_adapter *adapter;
int (*before_ioctl) (struct dvb_frontend *frontend, int (*before_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg); unsigned int cmd, void *arg);
int (*after_ioctl) (struct dvb_frontend *frontend, int (*after_ioctl) (struct dvb_frontend *frontend,
...@@ -336,9 +336,6 @@ int dvb_frontend_set_parameters (struct dvb_frontend_data *fe, ...@@ -336,9 +336,6 @@ int dvb_frontend_set_parameters (struct dvb_frontend_data *fe,
struct dvb_frontend *frontend = &fe->frontend; struct dvb_frontend *frontend = &fe->frontend;
int err; int err;
dprintk ("%s: f == %i, drift == %i\n",
__FUNCTION__, param->frequency, fe->lnb_drift);
dvb_bend_frequency (fe, 0); dvb_bend_frequency (fe, 0);
if (first_trial) { if (first_trial) {
...@@ -352,6 +349,9 @@ int dvb_frontend_set_parameters (struct dvb_frontend_data *fe, ...@@ -352,6 +349,9 @@ int dvb_frontend_set_parameters (struct dvb_frontend_data *fe,
sizeof (struct dvb_frontend_parameters)); sizeof (struct dvb_frontend_parameters));
} }
dprintk ("%s: f == %i, drift == %i\n",
__FUNCTION__, param->frequency, fe->lnb_drift);
param->frequency += fe->lnb_drift + fe->bending; param->frequency += fe->lnb_drift + fe->bending;
err = dvb_frontend_internal_ioctl (frontend, FE_SET_FRONTEND, param); err = dvb_frontend_internal_ioctl (frontend, FE_SET_FRONTEND, param);
param->frequency -= fe->lnb_drift + fe->bending; param->frequency -= fe->lnb_drift + fe->bending;
...@@ -367,9 +367,8 @@ void dvb_frontend_init (struct dvb_frontend_data *fe) ...@@ -367,9 +367,8 @@ void dvb_frontend_init (struct dvb_frontend_data *fe)
struct dvb_frontend *frontend = &fe->frontend; struct dvb_frontend *frontend = &fe->frontend;
struct dvb_frontend_parameters *init_param; struct dvb_frontend_parameters *init_param;
printk ("%s: initialising frontend %i:%i (%s)...\n", __FUNCTION__, printk ("DVB: initialising frontend %i:%i (%s)...\n",
frontend->i2c->adapter->num, frontend->i2c->id, frontend->i2c->adapter->num, frontend->i2c->id, fe->info->name);
fe->info->name);
dvb_frontend_internal_ioctl (frontend, FE_INIT, NULL); dvb_frontend_internal_ioctl (frontend, FE_INIT, NULL);
...@@ -436,15 +435,20 @@ void dvb_frontend_recover (struct dvb_frontend_data *fe) ...@@ -436,15 +435,20 @@ void dvb_frontend_recover (struct dvb_frontend_data *fe)
*/ */
{ {
int j = fe->lost_sync_count; int j = fe->lost_sync_count;
int stepsize = fe->info->frequency_stepsize; int stepsize;
if (j % 32 == 0)
fe->lnb_drift = 0;
if (j % 2) if (fe->info->type == FE_QPSK)
fe->lnb_drift += stepsize * ((j+1)/2); stepsize = fe->parameters.u.qpsk.symbol_rate / 16000;
else else
stepsize = fe->info->frequency_stepsize * 2;
if (j % 32 == 0) {
fe->lnb_drift = 0;
} else {
fe->lnb_drift = -fe->lnb_drift; fe->lnb_drift = -fe->lnb_drift;
if (j % 2)
fe->lnb_drift += stepsize;
}
dvb_frontend_set_parameters (fe, &fe->parameters, 0); dvb_frontend_set_parameters (fe, &fe->parameters, 0);
} }
...@@ -511,7 +515,8 @@ int dvb_frontend_thread (void *data) ...@@ -511,7 +515,8 @@ int dvb_frontend_thread (void *data)
fe->lost_sync_count = 0; fe->lost_sync_count = 0;
} else { } else {
fe->lost_sync_count++; fe->lost_sync_count++;
if (fe->lost_sync_count < 10) /* XXX FIXME CHECKME! */
continue;
dvb_frontend_recover (fe); dvb_frontend_recover (fe);
delay = HZ/5; delay = HZ/5;
if (jiffies - fe->lost_sync_jiffies > TIMEOUT) { if (jiffies - fe->lost_sync_jiffies > TIMEOUT) {
...@@ -627,7 +632,7 @@ unsigned int dvb_frontend_poll (struct file *file, struct poll_table_struct *wai ...@@ -627,7 +632,7 @@ unsigned int dvb_frontend_poll (struct file *file, struct poll_table_struct *wai
static static
int dvb_frontend_open (struct inode *inode, struct file *file) int dvb_frontend_open (struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
struct dvb_frontend_data *fe = dvbdev->priv; struct dvb_frontend_data *fe = dvbdev->priv;
int ret; int ret;
...@@ -648,7 +653,7 @@ int dvb_frontend_open (struct inode *inode, struct file *file) ...@@ -648,7 +653,7 @@ int dvb_frontend_open (struct inode *inode, struct file *file)
static static
int dvb_frontend_release (struct inode *inode, struct file *file) int dvb_frontend_release (struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
struct dvb_frontend_data *fe = dvbdev->priv; struct dvb_frontend_data *fe = dvbdev->priv;
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
...@@ -661,7 +666,7 @@ int dvb_frontend_release (struct inode *inode, struct file *file) ...@@ -661,7 +666,7 @@ int dvb_frontend_release (struct inode *inode, struct file *file)
int int
dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, dvb_add_frontend_ioctls (struct dvb_adapter *adapter,
int (*before_ioctl) (struct dvb_frontend *frontend, int (*before_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg), unsigned int cmd, void *arg),
int (*after_ioctl) (struct dvb_frontend *frontend, int (*after_ioctl) (struct dvb_frontend *frontend,
...@@ -715,7 +720,7 @@ dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, ...@@ -715,7 +720,7 @@ dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter,
void void
dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, dvb_remove_frontend_ioctls (struct dvb_adapter *adapter,
int (*before_ioctl) (struct dvb_frontend *frontend, int (*before_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg), unsigned int cmd, void *arg),
int (*after_ioctl) (struct dvb_frontend *frontend, int (*after_ioctl) (struct dvb_frontend *frontend,
...@@ -748,7 +753,7 @@ dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, ...@@ -748,7 +753,7 @@ dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter,
int int
dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, dvb_add_frontend_notifier (struct dvb_adapter *adapter,
void (*callback) (fe_status_t s, void *data), void (*callback) (fe_status_t s, void *data),
void *data) void *data)
{ {
...@@ -791,7 +796,7 @@ dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, ...@@ -791,7 +796,7 @@ dvb_add_frontend_notifier (struct dvb_adapter_s *adapter,
void void
dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, dvb_remove_frontend_notifier (struct dvb_adapter *adapter,
void (*callback) (fe_status_t s, void *data)) void (*callback) (fe_status_t s, void *data))
{ {
struct list_head *entry; struct list_head *entry;
...@@ -827,11 +832,11 @@ dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, ...@@ -827,11 +832,11 @@ dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter,
static static
struct file_operations dvb_frontend_fops = { struct file_operations dvb_frontend_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
ioctl: dvb_generic_ioctl, .ioctl = dvb_generic_ioctl,
poll: dvb_frontend_poll, .poll = dvb_frontend_poll,
open: dvb_frontend_open, .open = dvb_frontend_open,
release: dvb_frontend_release .release = dvb_frontend_release
}; };
...@@ -845,9 +850,11 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, ...@@ -845,9 +850,11 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend,
{ {
struct list_head *entry; struct list_head *entry;
struct dvb_frontend_data *fe; struct dvb_frontend_data *fe;
dvb_device_t dvbdev_template = { users: 1, writers: 1, static const struct dvb_device dvbdev_template = {
fops: &dvb_frontend_fops, .users = 1,
kernel_ioctl: dvb_frontend_ioctl .writers = 1,
.fops = &dvb_frontend_fops,
.kernel_ioctl = dvb_frontend_ioctl
}; };
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
...@@ -878,7 +885,9 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, ...@@ -878,7 +885,9 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend,
list_for_each (entry, &frontend_ioctl_list) { list_for_each (entry, &frontend_ioctl_list) {
struct dvb_frontend_ioctl_data *ioctl; struct dvb_frontend_ioctl_data *ioctl;
ioctl = list_entry (entry, struct dvb_frontend_ioctl_data, list_head); ioctl = list_entry (entry,
struct dvb_frontend_ioctl_data,
list_head);
if (ioctl->adapter == i2c->adapter) { if (ioctl->adapter == i2c->adapter) {
fe->frontend.before_ioctl = ioctl->before_ioctl; fe->frontend.before_ioctl = ioctl->before_ioctl;
...@@ -936,3 +945,4 @@ MODULE_PARM(dvb_frontend_debug,"i"); ...@@ -936,3 +945,4 @@ MODULE_PARM(dvb_frontend_debug,"i");
MODULE_PARM(dvb_shutdown_timeout,"i"); MODULE_PARM(dvb_shutdown_timeout,"i");
MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages"); MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages");
MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware"); MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
...@@ -90,7 +90,7 @@ dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend, ...@@ -90,7 +90,7 @@ dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend,
* Return value: number of frontends where the ioctl's were applied. * Return value: number of frontends where the ioctl's were applied.
*/ */
extern int extern int
dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, dvb_add_frontend_ioctls (struct dvb_adapter *adapter,
int (*before_ioctl) (struct dvb_frontend *frontend, int (*before_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg), unsigned int cmd, void *arg),
int (*after_ioctl) (struct dvb_frontend *frontend, int (*after_ioctl) (struct dvb_frontend *frontend,
...@@ -99,18 +99,18 @@ dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, ...@@ -99,18 +99,18 @@ dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter,
extern void extern void
dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, dvb_remove_frontend_ioctls (struct dvb_adapter *adapter,
int (*before_ioctl) (struct dvb_frontend *frontend, int (*before_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg), unsigned int cmd, void *arg),
int (*after_ioctl) (struct dvb_frontend *frontend, int (*after_ioctl) (struct dvb_frontend *frontend,
unsigned int cmd, void *arg)); unsigned int cmd, void *arg));
extern int extern int
dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, dvb_add_frontend_notifier (struct dvb_adapter *adapter,
void (*callback) (fe_status_t s, void *data), void (*callback) (fe_status_t s, void *data),
void *data); void *data);
extern void extern void
dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, dvb_remove_frontend_notifier (struct dvb_adapter *adapter,
void (*callback) (fe_status_t s, void *data)); void (*callback) (fe_status_t s, void *data));
#endif #endif
......
...@@ -173,7 +173,7 @@ struct dvb_i2c_bus* ...@@ -173,7 +173,7 @@ struct dvb_i2c_bus*
dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct i2c_msg msgs[], int num), struct i2c_msg msgs[], int num),
void *data, void *data,
struct dvb_adapter_s *adapter, struct dvb_adapter *adapter,
int id) int id)
{ {
struct dvb_i2c_bus *i2c; struct dvb_i2c_bus *i2c;
...@@ -200,7 +200,7 @@ dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, ...@@ -200,7 +200,7 @@ dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct dvb_i2c_bus* struct dvb_i2c_bus*
dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct i2c_msg msgs[], int num), struct i2c_msg msgs[], int num),
struct dvb_adapter_s *adapter, struct dvb_adapter *adapter,
int id) int id)
{ {
struct list_head *entry; struct list_head *entry;
...@@ -231,7 +231,7 @@ dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, ...@@ -231,7 +231,7 @@ dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct i2c_msg msgs[], int num), struct i2c_msg msgs[], int num),
struct dvb_adapter_s *adapter, struct dvb_adapter *adapter,
int id) int id)
{ {
struct dvb_i2c_bus *i2c = dvb_find_i2c_bus (xfer, adapter, id); struct dvb_i2c_bus *i2c = dvb_find_i2c_bus (xfer, adapter, id);
......
...@@ -32,7 +32,7 @@ struct dvb_i2c_bus { ...@@ -32,7 +32,7 @@ struct dvb_i2c_bus {
struct list_head list_head; struct list_head list_head;
int (*xfer) (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num); int (*xfer) (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num);
void *data; void *data;
struct dvb_adapter_s *adapter; struct dvb_adapter *adapter;
int id; int id;
struct list_head client_list; struct list_head client_list;
}; };
...@@ -43,13 +43,13 @@ struct dvb_i2c_bus* dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, ...@@ -43,13 +43,13 @@ struct dvb_i2c_bus* dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct i2c_msg msgs[], struct i2c_msg msgs[],
int num), int num),
void *data, void *data,
struct dvb_adapter_s *adapter, struct dvb_adapter *adapter,
int id); int id);
extern extern
void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
struct i2c_msg msgs[], int num), struct i2c_msg msgs[], int num),
struct dvb_adapter_s *adapter, struct dvb_adapter *adapter,
int id); int id);
......
...@@ -9,11 +9,12 @@ ...@@ -9,11 +9,12 @@
#include "dvb_net.h" #include "dvb_net.h"
EXPORT_SYMBOL(DmxDevInit); EXPORT_SYMBOL(dvb_dmxdev_init);
EXPORT_SYMBOL(DmxDevRelease); EXPORT_SYMBOL(dvb_dmxdev_release);
EXPORT_SYMBOL(DvbDmxInit); EXPORT_SYMBOL(dvb_dmx_init);
EXPORT_SYMBOL(DvbDmxRelease); EXPORT_SYMBOL(dvb_dmx_release);
EXPORT_SYMBOL(DvbDmxSWFilterPackets); EXPORT_SYMBOL(dvb_dmx_swfilter_packet);
EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
EXPORT_SYMBOL(dvb_register_frontend); EXPORT_SYMBOL(dvb_register_frontend);
EXPORT_SYMBOL(dvb_unregister_frontend); EXPORT_SYMBOL(dvb_unregister_frontend);
...@@ -37,13 +38,12 @@ EXPORT_SYMBOL(dvb_unregister_device); ...@@ -37,13 +38,12 @@ EXPORT_SYMBOL(dvb_unregister_device);
EXPORT_SYMBOL(dvb_generic_ioctl); EXPORT_SYMBOL(dvb_generic_ioctl);
EXPORT_SYMBOL(dvb_generic_open); EXPORT_SYMBOL(dvb_generic_open);
EXPORT_SYMBOL(dvb_generic_release); EXPORT_SYMBOL(dvb_generic_release);
EXPORT_SYMBOL(generic_usercopy);
EXPORT_SYMBOL(dvb_filter_ipack_init);
EXPORT_SYMBOL(init_ipack); EXPORT_SYMBOL(dvb_filter_ipack_reset);
EXPORT_SYMBOL(reset_ipack); EXPORT_SYMBOL(dvb_filter_ipack_free);
EXPORT_SYMBOL(free_ipack); EXPORT_SYMBOL(dvb_filter_ipack_flush);
EXPORT_SYMBOL(send_ipack_rest); EXPORT_SYMBOL(dvb_filter_instant_repack);
EXPORT_SYMBOL(instant_repack); EXPORT_SYMBOL(dvb_filter_pes2ts_init);
EXPORT_SYMBOL(pes2ts_init); EXPORT_SYMBOL(dvb_filter_pes2ts);
EXPORT_SYMBOL(pes2ts);
...@@ -435,7 +435,7 @@ dvb_net_remove_if(dvb_net_t *dvbnet, int num) ...@@ -435,7 +435,7 @@ dvb_net_remove_if(dvb_net_t *dvbnet, int num)
int dvb_net_ioctl(struct inode *inode, struct file *file, int dvb_net_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg) unsigned int cmd, void *parg)
{ {
dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
dvb_net_t *dvbnet=(dvb_net_t *) dvbdev->priv; dvb_net_t *dvbnet=(dvb_net_t *) dvbdev->priv;
if (((file->f_flags&O_ACCMODE)==O_RDONLY)) if (((file->f_flags&O_ACCMODE)==O_RDONLY))
...@@ -462,21 +462,18 @@ int dvb_net_ioctl(struct inode *inode, struct file *file, ...@@ -462,21 +462,18 @@ int dvb_net_ioctl(struct inode *inode, struct file *file,
} }
static struct file_operations dvb_net_fops = { static struct file_operations dvb_net_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: 0, .ioctl = dvb_generic_ioctl,
write: 0, .open = dvb_generic_open,
ioctl: dvb_generic_ioctl, .release = dvb_generic_release,
open: dvb_generic_open,
release: dvb_generic_release,
poll: 0,
}; };
static dvb_device_t dvbdev_net = { static struct dvb_device dvbdev_net = {
priv: 0, .priv = 0,
users: 1, .users = 1,
writers: 1, .writers = 1,
fops: &dvb_net_fops, .fops = &dvb_net_fops,
kernel_ioctl: dvb_net_ioctl, .kernel_ioctl = dvb_net_ioctl,
}; };
void void
...@@ -493,7 +490,7 @@ dvb_net_release(dvb_net_t *dvbnet) ...@@ -493,7 +490,7 @@ dvb_net_release(dvb_net_t *dvbnet)
} }
int int
dvb_net_init(dvb_adapter_t *adap, dvb_net_t *dvbnet, dmx_demux_t *demux) dvb_net_init(struct dvb_adapter *adap, dvb_net_t *dvbnet, dmx_demux_t *demux)
{ {
int i; int i;
......
...@@ -47,7 +47,7 @@ typedef struct dvb_net_priv_s { ...@@ -47,7 +47,7 @@ typedef struct dvb_net_priv_s {
} dvb_net_priv_t; } dvb_net_priv_t;
typedef struct dvb_net_s { typedef struct dvb_net_s {
dvb_device_t *dvbdev; struct dvb_device *dvbdev;
int card_num; int card_num;
int dev_num; int dev_num;
...@@ -58,6 +58,6 @@ typedef struct dvb_net_s { ...@@ -58,6 +58,6 @@ typedef struct dvb_net_s {
void dvb_net_release(dvb_net_t *); void dvb_net_release(dvb_net_t *);
int dvb_net_init(dvb_adapter_t *, dvb_net_t *, dmx_demux_t *); int dvb_net_init(struct dvb_adapter *, dvb_net_t *, dmx_demux_t *);
#endif #endif
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <asm/system.h> #include <asm/system.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/videodev.h>
#include "compat.h" #include "compat.h"
#include "dvbdev.h" #include "dvbdev.h"
...@@ -69,17 +70,17 @@ static char *dnames[] = { ...@@ -69,17 +70,17 @@ static char *dnames[] = {
static static
dvb_device_t* dvbdev_find_device (int minor) struct dvb_device* dvbdev_find_device (int minor)
{ {
struct list_head *entry; struct list_head *entry;
list_for_each (entry, &dvb_adapter_list) { list_for_each (entry, &dvb_adapter_list) {
struct list_head *entry0; struct list_head *entry0;
dvb_adapter_t *adap; struct dvb_adapter *adap;
adap = list_entry (entry, dvb_adapter_t, list_head); adap = list_entry (entry, struct dvb_adapter, list_head);
list_for_each (entry0, &adap->device_list) { list_for_each (entry0, &adap->device_list) {
dvb_device_t *dev; struct dvb_device *dev;
dev = list_entry (entry0, dvb_device_t, list_head); dev = list_entry (entry0, struct dvb_device, list_head);
if (nums2minor(adap->num, dev->type, dev->id) == minor) if (nums2minor(adap->num, dev->type, dev->id) == minor)
return dev; return dev;
} }
...@@ -92,7 +93,7 @@ dvb_device_t* dvbdev_find_device (int minor) ...@@ -92,7 +93,7 @@ dvb_device_t* dvbdev_find_device (int minor)
static static
int dvb_device_open(struct inode *inode, struct file *file) int dvb_device_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev; struct dvb_device *dvbdev;
dvbdev = dvbdev_find_device (minor(inode->i_rdev)); dvbdev = dvbdev_find_device (minor(inode->i_rdev));
...@@ -118,13 +119,8 @@ int dvb_device_open(struct inode *inode, struct file *file) ...@@ -118,13 +119,8 @@ int dvb_device_open(struct inode *inode, struct file *file)
static struct file_operations dvb_device_fops = static struct file_operations dvb_device_fops =
{ {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: NULL, .open = dvb_device_open,
write: NULL,
ioctl: NULL,
open: dvb_device_open,
release: NULL,
poll: NULL,
}; };
#endif /* CONFIG_DVB_DEVFS_ONLY */ #endif /* CONFIG_DVB_DEVFS_ONLY */
...@@ -132,7 +128,7 @@ static struct file_operations dvb_device_fops = ...@@ -132,7 +128,7 @@ static struct file_operations dvb_device_fops =
int dvb_generic_open(struct inode *inode, struct file *file) int dvb_generic_open(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
if (!dvbdev) if (!dvbdev)
return -ENODEV; return -ENODEV;
...@@ -153,7 +149,7 @@ int dvb_generic_open(struct inode *inode, struct file *file) ...@@ -153,7 +149,7 @@ int dvb_generic_open(struct inode *inode, struct file *file)
int dvb_generic_release(struct inode *inode, struct file *file) int dvb_generic_release(struct inode *inode, struct file *file)
{ {
dvb_device_t *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
if (!dvbdev) if (!dvbdev)
return -ENODEV; return -ENODEV;
...@@ -166,73 +162,10 @@ int dvb_generic_release(struct inode *inode, struct file *file) ...@@ -166,73 +162,10 @@ int dvb_generic_release(struct inode *inode, struct file *file)
} }
/*
* helper function -- handles userspace copying for ioctl arguments
*/
int
generic_usercopy(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg,
int (*func)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg))
{
char sbuf[128];
void *mbuf = NULL;
void *parg = NULL;
int err = -EINVAL;
/* Copy arguments into temp kernel buffer */
switch (_IOC_DIR(cmd)) {
case _IOC_NONE:
parg = (void *)arg;
break;
case _IOC_READ: /* some v4l ioctls are marked wrong ... */
case _IOC_WRITE:
case (_IOC_WRITE | _IOC_READ):
if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
parg = sbuf;
} else {
/* too big to allocate from stack */
mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
if (NULL == mbuf)
return -ENOMEM;
parg = mbuf;
}
err = -EFAULT;
if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd)))
goto out;
break;
}
/* call driver */
if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
err = -EINVAL;
if (err < 0)
goto out;
/* Copy results into user buffer */
switch (_IOC_DIR(cmd))
{
case _IOC_READ:
case (_IOC_WRITE | _IOC_READ):
if (copy_to_user((void *)arg, parg, _IOC_SIZE(cmd)))
err = -EFAULT;
break;
}
out:
if (mbuf)
kfree(mbuf);
return err;
}
int dvb_generic_ioctl(struct inode *inode, struct file *file, int dvb_generic_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
dvb_device_t *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
if (!dvbdev) if (!dvbdev)
return -ENODEV; return -ENODEV;
...@@ -240,20 +173,20 @@ int dvb_generic_ioctl(struct inode *inode, struct file *file, ...@@ -240,20 +173,20 @@ int dvb_generic_ioctl(struct inode *inode, struct file *file,
if (!dvbdev->kernel_ioctl) if (!dvbdev->kernel_ioctl)
return -EINVAL; return -EINVAL;
return generic_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl); return video_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl);
} }
static static
int dvbdev_get_free_id (struct dvb_adapter_s *adap, int type) int dvbdev_get_free_id (struct dvb_adapter *adap, int type)
{ {
u32 id = 0; u32 id = 0;
while (id < DVB_MAX_IDS) { while (id < DVB_MAX_IDS) {
struct list_head *entry; struct list_head *entry;
list_for_each (entry, &adap->device_list) { list_for_each (entry, &adap->device_list) {
dvb_device_t *dev; struct dvb_device *dev;
dev = list_entry (entry, dvb_device_t, list_head); dev = list_entry (entry, struct dvb_device, list_head);
if (dev->type == type && dev->id == id) if (dev->type == type && dev->id == id)
goto skip; goto skip;
} }
...@@ -265,12 +198,12 @@ int dvbdev_get_free_id (struct dvb_adapter_s *adap, int type) ...@@ -265,12 +198,12 @@ int dvbdev_get_free_id (struct dvb_adapter_s *adap, int type)
} }
int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
dvb_device_t *template, void *priv, int type) const struct dvb_device *template, void *priv, int type)
{ {
u32 id; u32 id;
char name [20]; char name [20];
dvb_device_t *dvbdev; struct dvb_device *dvbdev;
if (down_interruptible (&dvbdev_register_lock)) if (down_interruptible (&dvbdev_register_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -282,7 +215,7 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, ...@@ -282,7 +215,7 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev,
return -ENFILE; return -ENFILE;
} }
*pdvbdev = dvbdev = kmalloc(sizeof(dvb_device_t), GFP_KERNEL); *pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL);
if (!dvbdev) { if (!dvbdev) {
up(&dvbdev_register_lock); up(&dvbdev_register_lock);
...@@ -291,7 +224,7 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, ...@@ -291,7 +224,7 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev,
up (&dvbdev_register_lock); up (&dvbdev_register_lock);
memcpy(dvbdev, template, sizeof(dvb_device_t)); memcpy(dvbdev, template, sizeof(struct dvb_device));
dvbdev->type = type; dvbdev->type = type;
dvbdev->id = id; dvbdev->id = id;
dvbdev->adapter = adap; dvbdev->adapter = adap;
...@@ -307,15 +240,15 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, ...@@ -307,15 +240,15 @@ int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev,
S_IFCHR | S_IRUSR | S_IWUSR, S_IFCHR | S_IRUSR | S_IWUSR,
dvbdev->fops, dvbdev); dvbdev->fops, dvbdev);
dprintk("%s: register adapter%d/%s @ minor: %i (0x%02x) - dvbdev: %p\n", dprintk("DVB: register adapter%d/%s @ minor: %i (0x%02x)\n",
__FUNCTION__, adap->num, name, nums2minor(adap->num, type, id), adap->num, name, nums2minor(adap->num, type, id),
nums2minor(adap->num, type, id), dvbdev); nums2minor(adap->num, type, id));
return 0; return 0;
} }
void dvb_unregister_device(dvb_device_t *dvbdev) void dvb_unregister_device(struct dvb_device *dvbdev)
{ {
if (!dvbdev) if (!dvbdev)
return; return;
...@@ -334,8 +267,8 @@ int dvbdev_get_free_adapter_num (void) ...@@ -334,8 +267,8 @@ int dvbdev_get_free_adapter_num (void)
while (1) { while (1) {
struct list_head *entry; struct list_head *entry;
list_for_each (entry, &dvb_adapter_list) { list_for_each (entry, &dvb_adapter_list) {
dvb_adapter_t *adap; struct dvb_adapter *adap;
adap = list_entry (entry, dvb_adapter_t, list_head); adap = list_entry (entry, struct dvb_adapter, list_head);
if (adap->num == num) if (adap->num == num)
goto skip; goto skip;
} }
...@@ -348,10 +281,10 @@ int dvbdev_get_free_adapter_num (void) ...@@ -348,10 +281,10 @@ int dvbdev_get_free_adapter_num (void)
} }
int dvb_register_adapter(dvb_adapter_t **padap, char *name) int dvb_register_adapter(struct dvb_adapter **padap, char *name)
{ {
char dirname[16]; char dirname[16];
dvb_adapter_t *adap; struct dvb_adapter *adap;
int num; int num;
if (down_interruptible (&dvbdev_register_lock)) if (down_interruptible (&dvbdev_register_lock))
...@@ -362,17 +295,17 @@ int dvb_register_adapter(dvb_adapter_t **padap, char *name) ...@@ -362,17 +295,17 @@ int dvb_register_adapter(dvb_adapter_t **padap, char *name)
return -ENFILE; return -ENFILE;
} }
if (!(*padap = adap = kmalloc(sizeof(dvb_adapter_t), GFP_KERNEL))) { if (!(*padap = adap = kmalloc(sizeof(struct dvb_adapter), GFP_KERNEL))) {
up(&dvbdev_register_lock); up(&dvbdev_register_lock);
return -ENOMEM; return -ENOMEM;
} }
memset (adap, 0, sizeof(dvb_adapter_t)); memset (adap, 0, sizeof(struct dvb_adapter));
INIT_LIST_HEAD (&adap->device_list); INIT_LIST_HEAD (&adap->device_list);
MOD_INC_USE_COUNT; MOD_INC_USE_COUNT;
printk ("%s: registering new adapter (%s).\n", __FUNCTION__, name); printk ("DVB: registering new adapter (%s).\n", name);
sprintf(dirname, "dvb/adapter%d", num); sprintf(dirname, "dvb/adapter%d", num);
adap->devfs_handle = devfs_mk_dir(NULL, dirname, NULL); adap->devfs_handle = devfs_mk_dir(NULL, dirname, NULL);
...@@ -386,7 +319,7 @@ int dvb_register_adapter(dvb_adapter_t **padap, char *name) ...@@ -386,7 +319,7 @@ int dvb_register_adapter(dvb_adapter_t **padap, char *name)
} }
int dvb_unregister_adapter(dvb_adapter_t *adap) int dvb_unregister_adapter(struct dvb_adapter *adap)
{ {
devfs_unregister (adap->devfs_handle); devfs_unregister (adap->devfs_handle);
if (down_interruptible (&dvbdev_register_lock)) if (down_interruptible (&dvbdev_register_lock))
......
...@@ -43,49 +43,48 @@ ...@@ -43,49 +43,48 @@
#define DVB_DEVICE_OSD 8 #define DVB_DEVICE_OSD 8
typedef struct dvb_adapter_s struct dvb_adapter {
{
int num; int num;
devfs_handle_t devfs_handle; devfs_handle_t devfs_handle;
struct list_head list_head; struct list_head list_head;
struct list_head device_list; struct list_head device_list;
} dvb_adapter_t; };
typedef struct dvb_device struct dvb_device {
{
struct list_head list_head; struct list_head list_head;
struct file_operations *fops; struct file_operations *fops;
devfs_handle_t devfs_handle; devfs_handle_t devfs_handle;
dvb_adapter_t *adapter; struct dvb_adapter *adapter;
int type; int type;
u32 id; u32 id;
int users; int users;
int writers; int writers;
/* don't really need those !? */ /* don't really need those !? -- FIXME: use video_usercopy */
int (*kernel_ioctl)(struct inode *inode, struct file *file, int (*kernel_ioctl)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg); // FIXME: use generic_usercopy() unsigned int cmd, void *arg);
void *priv; void *priv;
} dvb_device_t; };
int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, extern int dvb_register_adapter (struct dvb_adapter **padap, char *name);
dvb_device_t *template, void *priv, int type); extern int dvb_unregister_adapter (struct dvb_adapter *adap);
void dvb_unregister_device(struct dvb_device *dvbdev);
int dvb_register_adapter(dvb_adapter_t **padap, char *name); extern int dvb_register_device (struct dvb_adapter *adap,
int dvb_unregister_adapter(dvb_adapter_t *adap); struct dvb_device **pdvbdev,
const struct dvb_device *template,
void *priv,
int type);
int dvb_generic_ioctl(struct inode *inode, struct file *file, extern void dvb_unregister_device (struct dvb_device *dvbdev);
extern int dvb_generic_open (struct inode *inode, struct file *file);
extern int dvb_generic_release (struct inode *inode, struct file *file);
extern int dvb_generic_ioctl (struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
int dvb_generic_open(struct inode *inode, struct file *file);
int dvb_generic_release(struct inode *inode, struct file *file); #endif /* #ifndef _DVBDEV_H_ */
int generic_usercopy(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg,
int (*func)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg));
#endif /* #ifndef __DVBDEV_H */
...@@ -23,6 +23,30 @@ config DVB_ALPS_BSRV2 ...@@ -23,6 +23,30 @@ config DVB_ALPS_BSRV2
DVB adapter simply enable all supported frontends, the DVB adapter simply enable all supported frontends, the
right one will get autodetected. right one will get autodetected.
config DVB_ALPS_TDLB7
tristate "Alps TDLB7 (OFDM)"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
This tuner module needs some microcode located in a file called
"Sc_main.mc" in the windows driver. Please pass the module parameter
mcfile="/PATH/FILENAME" when loading alps_tdlb7.o.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_ALPS_TDMB7
tristate "Alps BSRV2 (OFDM)"
depends on DVB_CORE
help
A DVB-S tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_GRUNDIG_29504_491 config DVB_GRUNDIG_29504_491
tristate "Grundig 29504-491 (QPSK)" tristate "Grundig 29504-491 (QPSK)"
depends on DVB_CORE depends on DVB_CORE
......
...@@ -6,6 +6,8 @@ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ ...@@ -6,6 +6,8 @@ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
obj-$(CONFIG_DVB_ALPS_BSRU6) += alps_bsru6.o obj-$(CONFIG_DVB_ALPS_BSRU6) += alps_bsru6.o
obj-$(CONFIG_DVB_ALPS_BSRV2) += alps_bsrv2.o obj-$(CONFIG_DVB_ALPS_BSRV2) += alps_bsrv2.o
obj-$(CONFIG_DVB_ALPS_TDLB7) += alps_tdlb7.o
obj-$(CONFIG_DVB_ALPS_TDMB7) += alps_tdmb7.o
obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o
obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o
obj-$(CONFIG_DVB_VES1820) += ves1820.o obj-$(CONFIG_DVB_VES1820) += ves1820.o
......
/* /*
Alps BSRU6 DVB QPSK frontend driver Alps BSRU6 and LG TDQB-S00x DVB QPSK frontend driver
Copyright (C) 2001-2002 Convergence Integrated Media GmbH Copyright (C) 2001-2002 Convergence Integrated Media GmbH
<ralph@convergence.de>, <holger@convergence.de> <ralph@convergence.de>, <holger@convergence.de>,
<js@convergence.de>
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
...@@ -32,12 +33,16 @@ static int debug = 0; ...@@ -32,12 +33,16 @@ static int debug = 0;
#define M_CLK (88000000UL) #define M_CLK (88000000UL)
/* M=21, K=0, P=0, f_VCO = 4MHz*4*(M+1)/(K+1) = 352 MHz */ /* M=21, K=0, P=0, f_VCO = 4MHz*4*(M+1)/(K+1) = 352 MHz */
static static
struct dvb_frontend_info bsru6_info = { struct dvb_frontend_info bsru6_info = {
#ifdef CONFIG_ALPS_BSRU6_IS_LG_TDQBS00X
name: "LG TDQB-S00x",
#else
name: "Alps BSRU6", name: "Alps BSRU6",
#endif
type: FE_QPSK, type: FE_QPSK,
frequency_min: 950000, frequency_min: 950000,
frequency_max: 2150000, frequency_max: 2150000,
...@@ -63,7 +68,8 @@ u8 init_tab [] = { ...@@ -63,7 +68,8 @@ u8 init_tab [] = {
0x05, 0x35, // SDAT:0 SCLT:0 I2CT:1 0x05, 0x35, // SDAT:0 SCLT:0 I2CT:1
0x06, 0x00, // DAC mode and MSB 0x06, 0x00, // DAC mode and MSB
0x07, 0x00, // DAC LSB 0x07, 0x00, // DAC LSB
0x08, 0x43, // DiSEqC // 0x08, 0x43, // DiSEqC
0x08, 0x03, // DiSEqC
0x09, 0x00, 0x09, 0x00,
0x0a, 0x42, 0x0a, 0x42,
0x0c, 0x51, // QPSK reverse:1 Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1 0x0c, 0x51, // QPSK reverse:1 Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1
...@@ -79,17 +85,20 @@ u8 init_tab [] = { ...@@ -79,17 +85,20 @@ u8 init_tab [] = {
0x15, 0xc9, // lock detector threshold 0x15, 0xc9, // lock detector threshold
0x16, 0x1d, 0x16, 0x1d,
0x17, 0x0, 0x17, 0x00,
0x18, 0x14, 0x18, 0x14,
0x19, 0xf2, 0x19, 0xf2,
0x1a, 0x11, 0x1a, 0x11,
0x1b, 0x9c, 0x1b, 0x9c,
0x1c, 0x0, 0x1c, 0x00,
0x1d, 0x0, 0x1d, 0x00,
0x1e, 0xb, 0x1e, 0x0b,
0x1f, 0x50,
0x20, 0x00,
0x21, 0x00,
0x22, 0x00, 0x22, 0x00,
0x23, 0x00, 0x23, 0x00,
0x24, 0xff, 0x24, 0xff,
...@@ -110,16 +119,37 @@ u8 init_tab [] = { ...@@ -110,16 +119,37 @@ u8 init_tab [] = {
0x33, 0xfc, // rs control 0x33, 0xfc, // rs control
0x34, 0x93, // error control 0x34, 0x93, // error control
0x0b, 0x00, 0x0b, 0x00,
0x27, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x27, 0x00,
0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x2f, 0x00,
0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x30, 0x00,
0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x35, 0x00,
0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x36, 0x00,
0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x37, 0x00,
0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x38, 0x00,
0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00 0x39, 0x00,
0x3a, 0x00,
0x3b, 0x00,
0x3c, 0x00,
0x3d, 0x00,
0x3e, 0x00,
0x3f, 0x00,
0x40, 0x00,
0x41, 0x00,
0x42, 0x00,
0x43, 0x00,
0x44, 0x00,
0x45, 0x00,
0x46, 0x00,
0x47, 0x00,
0x48, 0x00,
0x49, 0x00,
0x4a, 0x00,
0x4b, 0x00,
0x4c, 0x00,
0x4d, 0x00,
0x4e, 0x00,
0x4f, 0x00
}; };
...@@ -231,12 +261,27 @@ int stv0299_init (struct dvb_i2c_bus *i2c) ...@@ -231,12 +261,27 @@ int stv0299_init (struct dvb_i2c_bus *i2c)
static static
int stv0299_set_inversion (struct dvb_i2c_bus *i2c, int inversion) int stv0299_set_inversion (struct dvb_i2c_bus *i2c,
fe_spectral_inversion_t inversion)
{ {
u8 val; u8 val;
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
#ifdef CONFIG_ALPS_BSRU6_IS_LG_TDQBS00X /* reversed I/Q pins */
switch (inversion) {
case INVERSION_AUTO:
return -EOPNOTSUPP;
case INVERSION_OFF:
val = stv0299_readreg (i2c, 0x0c);
return stv0299_writereg (i2c, 0x0c, val & 0xfe);
case INVERSION_ON:
val = stv0299_readreg (i2c, 0x0c);
return stv0299_writereg (i2c, 0x0c, val | 0x01);
default:
return -EINVAL;
};
#else
switch (inversion) { switch (inversion) {
case INVERSION_AUTO: case INVERSION_AUTO:
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -248,7 +293,8 @@ int stv0299_set_inversion (struct dvb_i2c_bus *i2c, int inversion) ...@@ -248,7 +293,8 @@ int stv0299_set_inversion (struct dvb_i2c_bus *i2c, int inversion)
return stv0299_writereg (i2c, 0x0c, val & 0xfe); return stv0299_writereg (i2c, 0x0c, val & 0xfe);
default: default:
return -EINVAL; return -EINVAL;
} };
#endif
} }
...@@ -277,9 +323,10 @@ int stv0299_set_FEC (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) ...@@ -277,9 +323,10 @@ int stv0299_set_FEC (struct dvb_i2c_bus *i2c, fe_code_rate_t fec)
static static
fe_code_rate_t stv0299_get_FEC (struct dvb_i2c_bus *i2c) fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
{ {
static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_1_2 }; static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6,
FEC_7_8, FEC_1_2 };
u8 index; u8 index;
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
...@@ -343,6 +390,9 @@ int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c, ...@@ -343,6 +390,9 @@ int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c,
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
return -ETIMEDOUT;
val = stv0299_readreg (i2c, 0x08); val = stv0299_readreg (i2c, 0x08);
if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */ if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */
...@@ -356,12 +406,7 @@ int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c, ...@@ -356,12 +406,7 @@ int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c,
return -EREMOTEIO; return -EREMOTEIO;
} }
/* Shouldn't we wait for idle state (FE=1, FF=0) here to if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
make certain all bytes have been sent ?
Hmm, actually we should do that before all mode changes too ...
if (stv0299_wait_diseqc_idle (i2c, 100) < 0) */
if (stv0299_wait_diseqc_fifo (i2c, 100) < 0)
return -ETIMEDOUT; return -ETIMEDOUT;
return 0; return 0;
...@@ -375,18 +420,18 @@ int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst) ...@@ -375,18 +420,18 @@ int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst)
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
val = stv0299_readreg (i2c, 0x08); if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
if (stv0299_wait_diseqc_fifo (i2c, 100) < 0)
return -ETIMEDOUT; return -ETIMEDOUT;
val = stv0299_readreg (i2c, 0x08);
if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2)) /* burst mode */ if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2)) /* burst mode */
return -EREMOTEIO; return -EREMOTEIO;
if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff)) if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff))
return -EREMOTEIO; return -EREMOTEIO;
if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
return -ETIMEDOUT; return -ETIMEDOUT;
if (stv0299_writereg (i2c, 0x08, val)) if (stv0299_writereg (i2c, 0x08, val))
...@@ -403,6 +448,9 @@ int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone) ...@@ -403,6 +448,9 @@ int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone)
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
return -ETIMEDOUT;
val = stv0299_readreg (i2c, 0x08); val = stv0299_readreg (i2c, 0x08);
switch (tone) { switch (tone) {
...@@ -445,8 +493,6 @@ int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) ...@@ -445,8 +493,6 @@ int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
u32 tmp; u32 tmp;
u8 aclk = 0xb4, bclk = 0x51; u8 aclk = 0xb4, bclk = 0x51;
dprintk ("%s\n", __FUNCTION__);
if (srate > M_CLK) if (srate > M_CLK)
srate = M_CLK; srate = M_CLK;
if (srate < 500000) if (srate < 500000)
...@@ -479,7 +525,6 @@ int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) ...@@ -479,7 +525,6 @@ int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
} }
static static
int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c) int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c)
{ {
...@@ -608,7 +653,7 @@ int bsru6_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) ...@@ -608,7 +653,7 @@ int bsru6_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
p->frequency += derot_freq; p->frequency += derot_freq;
p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ? p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ?
INVERSION_OFF : INVERSION_ON; INVERSION_OFF : INVERSION_ON;
p->u.qpsk.fec_inner = stv0299_get_FEC (i2c); p->u.qpsk.fec_inner = stv0299_get_fec (i2c);
p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c); p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c);
break; break;
} }
...@@ -694,7 +739,7 @@ module_exit (exit_bsru6); ...@@ -694,7 +739,7 @@ module_exit (exit_bsru6);
MODULE_PARM(debug,"i"); MODULE_PARM(debug,"i");
MODULE_PARM_DESC(debug, "enable verbose debug messages"); MODULE_PARM_DESC(debug, "enable verbose debug messages");
MODULE_DESCRIPTION("BSRU6 DVB Frontend driver"); MODULE_DESCRIPTION("Alps BSRU6/LG TDQB-S00x DVB Frontend driver");
MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); MODULE_AUTHOR("Ralph Metzler, Holger Waechtler");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -342,7 +342,7 @@ int bsrv2_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) ...@@ -342,7 +342,7 @@ int bsrv2_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
*ber = ves1893_readreg (i2c, 0x15); *ber = ves1893_readreg (i2c, 0x15);
*ber |= (ves1893_readreg (i2c, 0x16) << 8); *ber |= (ves1893_readreg (i2c, 0x16) << 8);
*ber |= (ves1893_readreg (i2c, 0x17) << 16); *ber |= ((ves1893_readreg (i2c, 0x17) & 0x0f) << 16);
*ber *= 10; *ber *= 10;
break; break;
} }
......
/*
Driver for Alps TDLB7 Frontend
Copyright (C) 1999 Juergen Peitz <peitz@snafu.de>
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; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
Wrote this code mainly to get my own card running. It's working for me, but I
hope somebody who knows more about linux programming and the DVB driver can
improve it.
Reused a lot from the existing driver and tuner code.
Thanks to everybody who worked on it!
This driver needs a copy of the microcode file 'Sc_main.mc' from the Haupauge
windows driver in the 'usr/lib/DVB/driver/frontends' directory.
You can also pass the complete file name with the module parameter 'mcfile'.
The code only needs to be loaded once after a power on. Because loading the
microcode to the card takes some time, you can use the 'loadcode=0' module
parameter, if you only want to reload the dvb driver.
Juergen Peitz
*/
#define __KERNEL_SYSCALLS__
#include <linux/module.h>
#include <linux/init.h>
#include <linux/vmalloc.h>
#include <linux/fs.h>
#include <linux/unistd.h>
#include "compat.h"
#include "dvb_frontend.h"
static int debug = 0;
static int loadcode = 1;
static char * mcfile = "/usr/lib/DVB/driver/frontends/Sc_main.mc";
#define dprintk if (debug) printk
/* microcode size for sp8870 */
#define SP8870_CODE_SIZE 16384
/* starting point for microcode in file 'Sc_main.mc' */
#define SP8870_CODE_OFFSET 0x0A
static int errno;
static
struct dvb_frontend_info tdlb7_info = {
name: "Alps TDLB7",
type: FE_OFDM,
frequency_min: 470000000,
frequency_max: 860000000,
frequency_stepsize: 166666,
#if 0
frequency_tolerance: ???,
symbol_rate_min: ???,
symbol_rate_max: ???,
symbol_rate_tolerance: ???,
notifier_delay: 0,
#endif
caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64
};
static
int sp8870_writereg (struct dvb_i2c_bus *i2c, u16 reg, u16 data)
{
u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
struct i2c_msg msg = { addr: 0x71, flags: 0, buf: buf, len: 4 };
int err;
if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {
dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data);
return -EREMOTEIO;
}
return 0;
}
static
u16 sp8870_readreg (struct dvb_i2c_bus *i2c, u16 reg)
{
int ret;
u8 b0 [] = { reg >> 8 , reg & 0xff };
u8 b1 [] = { 0, 0 };
struct i2c_msg msg [] = { { addr: 0x71, flags: 0, buf: b0, len: 2 },
{ addr: 0x71, flags: I2C_M_RD, buf: b1, len: 2 } };
ret = i2c->xfer (i2c, msg, 2);
if (ret != 2)
dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
return (b1[0] << 8 | b1[1]);
}
static
int sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4])
{
int ret;
struct i2c_msg msg = { addr: 0x60, flags: 0, buf: data, len: 4 };
ret = i2c->xfer (i2c, &msg, 1);
if (ret != 1)
printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
return (ret != 1) ? -1 : 0;
}
static
int sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr)
{
u32 div = (freq + 36200000) / 166666;
u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x85, (pwr << 5) | 0x30 };
return sp5659_write (i2c, buf);
}
static
int sp8870_read_code(const char *fn, char **fp)
{
int fd;
loff_t l;
char *dp;
fd = open(fn, 0, 0);
if (fd == -1) {
printk(KERN_INFO "%s: Unable to load '%s'.\n", __FUNCTION__, fn);
return -1;
}
l = lseek(fd, 0L, 2);
if (l <= 0 || l < SP8870_CODE_OFFSET+SP8870_CODE_SIZE) {
printk(KERN_INFO "%s: code file too small '%s'\n", __FUNCTION__, fn);
sys_close(fd);
return -1;
}
lseek(fd, SP8870_CODE_OFFSET, 0);
*fp= dp = vmalloc(SP8870_CODE_SIZE);
if (dp == NULL) {
printk(KERN_INFO "%s: Out of memory loading '%s'.\n", __FUNCTION__, fn);
sys_close(fd);
return -1;
}
if (read(fd, dp, SP8870_CODE_SIZE) != SP8870_CODE_SIZE) {
printk(KERN_INFO "%s: Failed to read '%s'.\n",__FUNCTION__, fn);
vfree(dp);
sys_close(fd);
return -1;
}
sys_close(fd);
*fp = dp;
return 0;
}
static
int sp8870_load_code(struct dvb_i2c_bus *i2c)
{
/* this takes a long time. is there a way to do it faster? */
char *lcode;
struct i2c_msg msg;
unsigned char buf[255];
int err;
int p=0;
int c;
mm_segment_t fs = get_fs();
sp8870_writereg(i2c,0x8F08,0x1FFF);
sp8870_writereg(i2c,0x8F0A,0x0000);
set_fs(get_ds());
if (sp8870_read_code(mcfile,(char**) &lcode)<0) return -1;
set_fs(fs);
while (p<SP8870_CODE_SIZE){
c = (p<=SP8870_CODE_SIZE-252) ? 252 : SP8870_CODE_SIZE-p;
buf[0]=0xCF;
buf[1]=0x0A;
memcpy(&buf[2],lcode+p,c);
c+=2;
msg.addr=0x71;
msg.flags=0;
msg.buf=buf;
msg.len=c;
if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {
dprintk ("%s: i2c error (err == %i)\n", __FUNCTION__, err);
vfree(lcode);
return -EREMOTEIO;
}
p+=252;
}
vfree(lcode);
return 0;
};
static
int sp8870_init (struct dvb_i2c_bus *i2c)
{
dprintk ("%s\n", __FUNCTION__);
sp8870_readreg(i2c,0x200);
sp8870_readreg(i2c,0x200);
sp8870_readreg(i2c,0x0F00); /* system controller stop */
sp8870_readreg(i2c,0x0301); /* ???????? */
sp8870_readreg(i2c,0x0309); /* integer carrier offset */
sp8870_readreg(i2c,0x030A); /* fractional carrier offset */
sp8870_readreg(i2c,0x0311); /* filter for 8 Mhz channel */
sp8870_readreg(i2c,0x0319); /* sample rate correction bit [23..17] */
sp8870_readreg(i2c,0x031A); /* sample rate correction bit [16..0] */
sp8870_readreg(i2c,0x0338); /* ???????? */
sp8870_readreg(i2c,0x0F00);
sp8870_readreg(i2c,0x0200);
if (loadcode) {
dprintk("%s: loading mcfile '%s' !\n", __FUNCTION__, mcfile);
if (sp8870_load_code(i2c)==0)
dprintk("%s: microcode loaded!\n", __FUNCTION__);
}else{
dprintk("%s: without loading mcfile!\n", __FUNCTION__);
}
return 0;
}
static
int sp8870_reset (struct dvb_i2c_bus *i2c)
{
dprintk("%s\n", __FUNCTION__);
sp8870_writereg(i2c,0x0F00,0x0000); /* system controller stop */
sp8870_writereg(i2c,0x0301,0x0003); /* ???????? */
sp8870_writereg(i2c,0x0309,0x0400); /* integer carrier offset */
sp8870_writereg(i2c,0x030A,0x0000); /* fractional carrier offset */
sp8870_writereg(i2c,0x0311,0x0000); /* filter for 8 Mhz channel */
sp8870_writereg(i2c,0x0319,0x000A); /* sample rate correction bit [23..17] */
sp8870_writereg(i2c,0x031A,0x0AAB); /* sample rate correction bit [16..0] */
sp8870_writereg(i2c,0x0338,0x0000); /* ???????? */
sp8870_writereg(i2c,0x0201,0x0000); /* interrupts for change of lock or tuner adjustment disabled */
sp8870_writereg(i2c,0x0F00,0x0001); /* system controller start */
return 0;
}
static
int tdlb7_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
{
struct dvb_i2c_bus *i2c = fe->i2c;
switch (cmd) {
case FE_GET_INFO:
memcpy (arg, &tdlb7_info, sizeof(struct dvb_frontend_info));
break;
case FE_READ_STATUS:
{
fe_status_t *status = arg;
int sync = sp8870_readreg (i2c, 0x0200);
*status=0;
if (sync&0x04) // FIXME: find criteria for having signal
*status |= FE_HAS_SIGNAL;
if (sync&0x04) // FIXME: find criteria
*status |= FE_HAS_CARRIER;
if (sync&0x04) // FIXME
*status |= FE_HAS_VITERBI;
if (sync&0x08) // FIXME
*status |= FE_HAS_SYNC;
if (sync&0x04)
*status |= FE_HAS_LOCK;
break;
}
case FE_READ_BER:
{
u32 *ber=(u32 *) arg;
*ber=sp8870_readreg(i2c,0x0C07); // bit error rate before Viterbi
break;
}
case FE_READ_SIGNAL_STRENGTH: // not supported by hardware?
{
s32 *signal=(s32 *) arg;
*signal=0;
break;
}
case FE_READ_SNR: // not supported by hardware?
{
s32 *snr=(s32 *) arg;
*snr=0;
break;
}
case FE_READ_UNCORRECTED_BLOCKS: // not supported by hardware?
{
u32 *ublocks=(u32 *) arg;
*ublocks=0;
break;
}
case FE_SET_FRONTEND:
{
struct dvb_frontend_parameters *p = arg;
sp5659_set_tv_freq (i2c, p->frequency, 0);
// all other parameters are set by the on card
// system controller. Don't know how to pass
// distinct values to the card.
break;
}
case FE_GET_FRONTEND: // how to do this?
{
break;
}
case FE_SLEEP: // is this supported by hardware?
return -EOPNOTSUPP;
case FE_INIT:
return sp8870_init (i2c);
case FE_RESET:
return sp8870_reset (i2c);
default:
return -EOPNOTSUPP;
};
return 0;
}
static
int tdlb7_attach (struct dvb_i2c_bus *i2c)
{
struct i2c_msg msg = { addr: 0x71, flags: 0, buf: NULL, len: 0 };
dprintk ("%s\n", __FUNCTION__);
if (i2c->xfer (i2c, &msg, 1) != 1)
return -ENODEV;
dvb_register_frontend (tdlb7_ioctl, i2c, NULL, &tdlb7_info);
return 0;
}
static
void tdlb7_detach (struct dvb_i2c_bus *i2c)
{
dprintk ("%s\n", __FUNCTION__);
dvb_unregister_frontend (tdlb7_ioctl, i2c);
}
static
int __init init_tdlb7 (void)
{
dprintk ("%s\n", __FUNCTION__);
return dvb_register_i2c_device (THIS_MODULE, tdlb7_attach, tdlb7_detach);
}
static
void __exit exit_tdlb7 (void)
{
dprintk ("%s\n", __FUNCTION__);
dvb_unregister_i2c_device (tdlb7_attach);
}
module_init(init_tdlb7);
module_exit(exit_tdlb7);
MODULE_PARM(debug,"i");
MODULE_PARM_DESC(debug, "enable verbose debug messages");
MODULE_PARM(loadcode,"i");
MODULE_PARM_DESC(loadcode, "load tuner microcode");
MODULE_PARM(mcfile,"s");
MODULE_PARM_DESC(mcfile, "where to find the microcode file");
MODULE_DESCRIPTION("TDLB7 DVB-T Frontend");
MODULE_AUTHOR("Juergen Peitz");
MODULE_LICENSE("GPL");
/*
Alps TDMB7 DVB OFDM frontend driver
Copyright (C) 2001-2002 Convergence Integrated Media GmbH
Holger Waechtler <holger@convergence.de>
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; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/init.h>
#include <linux/module.h>
#include "compat.h"
#include "dvb_frontend.h"
static int debug = 0;
#define dprintk if (debug) printk
static
struct dvb_frontend_info tdmb7_info = {
name: "Alps TDMB7",
type: FE_OFDM,
frequency_min: 470000000,
frequency_max: 860000000,
frequency_stepsize: 166667,
#if 0
frequency_tolerance: ???,
symbol_rate_min: ???,
symbol_rate_max: ???,
symbol_rate_tolerance: 500, /* ppm */
notifier_delay: 0,
#endif
caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64
};
static
inline void ddelay (int timeout)
{
current->state=TASK_INTERRUPTIBLE;
schedule_timeout(timeout);
}
static
u8 init_tab [] = {
0x04, 0x10,
0x05, 0x09,
0x06, 0x00,
0x08, 0x04,
0x09, 0x00,
0x0a, 0x01,
0x15, 0x40,
0x16, 0x10,
0x17, 0x87,
0x18, 0x17,
0x1a, 0x10,
0x25, 0x04,
0x2e, 0x00,
0x39, 0x00,
0x3a, 0x04,
0x45, 0x08,
0x46, 0x02,
0x47, 0x05,
};
static
int cx22700_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
{
int ret;
u8 buf [] = { reg, data };
struct i2c_msg msg = { addr: 0x43, flags: 0, buf: buf, len: 2 };
dprintk ("%s\n", __FUNCTION__);
ret = i2c->xfer (i2c, &msg, 1);
if (ret != 1)
printk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n",
__FUNCTION__, reg, data, ret);
return (ret != 1) ? -1 : 0;
}
static
u8 cx22700_readreg (struct dvb_i2c_bus *i2c, u8 reg)
{
int ret;
u8 b0 [] = { reg };
u8 b1 [] = { 0 };
struct i2c_msg msg [] = { { addr: 0x43, flags: 0, buf: b0, len: 1 },
{ addr: 0x43, flags: I2C_M_RD, buf: b1, len: 1 } };
dprintk ("%s\n", __FUNCTION__);
ret = i2c->xfer (i2c, msg, 2);
if (ret != 2)
printk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
return b1[0];
}
static
int pll_write (struct dvb_i2c_bus *i2c, u8 data [4])
{
struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 };
int ret;
cx22700_writereg (i2c, 0x0a, 0x00); /* open i2c bus switch */
ret = i2c->xfer (i2c, &msg, 1);
cx22700_writereg (i2c, 0x0a, 0x01); /* close i2c bus switch */
if (ret != 1)
printk("%s: i/o error (addr == 0x%02x, ret == %i)\n", __FUNCTION__, msg.addr, ret);
return (ret != 1) ? -1 : 0;
}
/**
* set up the downconverter frequency divisor for a
* reference clock comparision frequency of 125 kHz.
*/
static
int pll_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq)
{
u32 div = (freq + 36166667) / 166667;
#if 1 //ALPS_SETTINGS
u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, ((div >> 10) & 0x60) | 0x85,
freq < 592000000 ? 0x40 : 0x80 };
#else
u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, ((div >> 10) & 0x60) | 0x85,
freq < 470000000 ? 0x42 : freq < 862000000 ? 0x41 : 0x81 };
#endif
dprintk ("%s: freq == %i, div == %i\n", __FUNCTION__, freq, div);
return pll_write (i2c, buf);
}
static
int cx22700_init (struct dvb_i2c_bus *i2c)
{
int i;
dprintk("cx22700_init: init chip\n");
cx22700_writereg (i2c, 0x00, 0x02); /* soft reset */
cx22700_writereg (i2c, 0x00, 0x00);
ddelay (HZ/100);
for (i=0; i<sizeof(init_tab); i+=2)
cx22700_writereg (i2c, init_tab[i], init_tab[i+1]);
cx22700_writereg (i2c, 0x00, 0x01);
return 0;
}
static
int cx22700_set_inversion (struct dvb_i2c_bus *i2c, int inversion)
{
u8 val;
dprintk ("%s\n", __FUNCTION__);
switch (inversion) {
case INVERSION_AUTO:
return -EOPNOTSUPP;
case INVERSION_ON:
val = cx22700_readreg (i2c, 0x09);
return cx22700_writereg (i2c, 0x09, val | 0x01);
case INVERSION_OFF:
val = cx22700_readreg (i2c, 0x09);
return cx22700_writereg (i2c, 0x09, val & 0xfe);
default:
return -EINVAL;
}
}
static
int cx22700_set_tps (struct dvb_i2c_bus *i2c, struct dvb_ofdm_parameters *p)
{
static const u8 qam_tab [4] = { 0, 1, 0, 2 };
static const u8 fec_tab [6] = { 0, 1, 2, 0, 3, 4 };
u8 val;
dprintk ("%s\n", __FUNCTION__);
if (p->code_rate_HP < FEC_1_2 || p->code_rate_HP > FEC_7_8)
return -EINVAL;
if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8)
if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5)
return -EINVAL;
if (p->guard_interval < GUARD_INTERVAL_1_32 ||
p->guard_interval > GUARD_INTERVAL_1_4)
return -EINVAL;
if (p->transmission_mode != TRANSMISSION_MODE_2K &&
p->transmission_mode != TRANSMISSION_MODE_8K)
return -EINVAL;
if (p->constellation != QPSK &&
p->constellation != QAM_16 &&
p->constellation != QAM_64)
return -EINVAL;
if (p->hierarchy_information < HIERARCHY_NONE ||
p->hierarchy_information > HIERARCHY_4)
return -EINVAL;
if (p->bandwidth < BANDWIDTH_8_MHZ && p->bandwidth > BANDWIDTH_6_MHZ)
return -EINVAL;
if (p->bandwidth == BANDWIDTH_7_MHZ)
cx22700_writereg (i2c, 0x09, cx22700_readreg (i2c, 0x09 | 0x10));
else
cx22700_writereg (i2c, 0x09, cx22700_readreg (i2c, 0x09 & ~0x10));
val = qam_tab[p->constellation - QPSK];
val |= p->hierarchy_information - HIERARCHY_NONE;
cx22700_writereg (i2c, 0x04, val);
val = fec_tab[p->code_rate_HP - FEC_1_2] << 3;
val |= fec_tab[p->code_rate_LP - FEC_1_2];
cx22700_writereg (i2c, 0x05, val);
val = (p->guard_interval - GUARD_INTERVAL_1_32) << 2;
val |= p->transmission_mode - TRANSMISSION_MODE_2K;
cx22700_writereg (i2c, 0x06, val);
cx22700_writereg (i2c, 0x08, 0x04 | 0x02); /* use user tps parameters */
cx22700_writereg (i2c, 0x08, 0x04); /* restart aquisition */
return 0;
}
static
int cx22700_get_tps (struct dvb_i2c_bus *i2c, struct dvb_ofdm_parameters *p)
{
static const fe_modulation_t qam_tab [3] = { QPSK, QAM_16, QAM_64 };
static const fe_code_rate_t fec_tab [5] = { FEC_1_2, FEC_2_3, FEC_3_4,
FEC_5_6, FEC_7_8 };
u8 val;
dprintk ("%s\n", __FUNCTION__);
if (!(cx22700_readreg(i2c, 0x07) & 0x20)) /* tps valid? */
return -EAGAIN;
val = cx22700_readreg (i2c, 0x01);
if ((val & 0x7) > 4)
p->hierarchy_information = HIERARCHY_AUTO;
else
p->hierarchy_information = HIERARCHY_NONE + (val & 0x7);
if (((val >> 3) & 0x3) > 2)
p->constellation = QAM_AUTO;
else
p->constellation = qam_tab[(val >> 3) & 0x3];
val = cx22700_readreg (i2c, 0x02);
if ((val >> 3) > 4)
p->code_rate_HP = FEC_AUTO;
else
p->code_rate_HP = fec_tab[val >> 3];
if ((val & 0x7) > 4)
p->code_rate_LP = FEC_AUTO;
else
p->code_rate_LP = fec_tab[val >> 3];
val = cx22700_readreg (i2c, 0x03);
p->guard_interval = GUARD_INTERVAL_1_32 + ((val >> 6) & 0x3);
p->transmission_mode = TRANSMISSION_MODE_2K + ((val >> 5) & 0x1);
return 0;
}
static
int tdmb7_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
{
struct dvb_i2c_bus *i2c = fe->i2c;
dprintk ("%s\n", __FUNCTION__);
switch (cmd) {
case FE_GET_INFO:
memcpy (arg, &tdmb7_info, sizeof(struct dvb_frontend_info));
break;
case FE_READ_STATUS:
{
fe_status_t *status = (fe_status_t *) arg;
u16 rs_ber = (cx22700_readreg (i2c, 0x0d) << 9)
| (cx22700_readreg (i2c, 0x0e) << 1);
u8 sync = cx22700_readreg (i2c, 0x07);
*status = 0;
if (rs_ber < 0xff00)
*status |= FE_HAS_SIGNAL;
if (sync & 0x20)
*status |= FE_HAS_CARRIER;
if (sync & 0x10)
*status |= FE_HAS_VITERBI;
if (sync & 0x10)
*status |= FE_HAS_SYNC;
if (sync & 0x10)
*status |= FE_HAS_LOCK;
break;
}
case FE_READ_BER:
*((uint32_t*) arg) = cx22700_readreg (i2c, 0x0c) & 0x7f;
break;
case FE_READ_SIGNAL_STRENGTH:
{
u16 rs_ber = (cx22700_readreg (i2c, 0x0d) << 9)
| (cx22700_readreg (i2c, 0x0e) << 1);
*((uint16_t*) arg) = ~rs_ber;
break;
}
case FE_READ_SNR:
{
u16 rs_ber = (cx22700_readreg (i2c, 0x0d) << 9)
| (cx22700_readreg (i2c, 0x0e) << 1);
*((uint16_t*) arg) = ~rs_ber;
break;
}
case FE_READ_UNCORRECTED_BLOCKS:
*((uint32_t*) arg) = cx22700_readreg (i2c, 0x0f);
break;
case FE_SET_FRONTEND:
{
struct dvb_frontend_parameters *p = arg;
cx22700_writereg (i2c, 0x00, 0x02); /* XXX CHECKME: soft reset*/
cx22700_writereg (i2c, 0x00, 0x00);
pll_set_tv_freq (i2c, p->frequency);
cx22700_set_inversion (i2c, p->inversion);
cx22700_set_tps (i2c, &p->u.ofdm);
cx22700_writereg (i2c, 0x37, 0x01); /* PAL loop filter off */
cx22700_writereg (i2c, 0x00, 0x01); /* restart aquire */
break;
}
case FE_GET_FRONTEND:
{
struct dvb_frontend_parameters *p = arg;
u8 reg09 = cx22700_readreg (i2c, 0x09);
p->inversion = reg09 & 0x1 ? INVERSION_ON : INVERSION_OFF;
return cx22700_get_tps (i2c, &p->u.ofdm);
}
case FE_INIT:
return cx22700_init (i2c);
case FE_RESET:
break;
default:
return -EOPNOTSUPP;
};
return 0;
}
static
int tdmb7_attach (struct dvb_i2c_bus *i2c)
{
struct i2c_msg msg = { addr: 0x43, flags: 0, buf: NULL, len: 0 };
dprintk ("%s\n", __FUNCTION__);
if (i2c->xfer (i2c, &msg, 1) != 1)
return -ENODEV;
dvb_register_frontend (tdmb7_ioctl, i2c, NULL, &tdmb7_info);
return 0;
}
static
void tdmb7_detach (struct dvb_i2c_bus *i2c)
{
dprintk ("%s\n", __FUNCTION__);
dvb_unregister_frontend (tdmb7_ioctl, i2c);
}
static
int __init init_tdmb7 (void)
{
dprintk ("%s\n", __FUNCTION__);
return dvb_register_i2c_device (THIS_MODULE, tdmb7_attach, tdmb7_detach);
}
static
void __exit exit_tdmb7 (void)
{
dprintk ("%s\n", __FUNCTION__);
dvb_unregister_i2c_device (tdmb7_attach);
}
module_init (init_tdmb7);
module_exit (exit_tdmb7);
MODULE_PARM(debug,"i");
MODULE_PARM_DESC(debug, "enable verbose debug messages");
MODULE_DESCRIPTION("TDMB7 DVB Frontend driver");
MODULE_AUTHOR("Holger Waechtler");
MODULE_LICENSE("GPL");
...@@ -199,8 +199,8 @@ int ves1820_init (struct dvb_frontend *frontend) ...@@ -199,8 +199,8 @@ int ves1820_init (struct dvb_frontend *frontend)
u8 b0 [] = { 0xff }; u8 b0 [] = { 0xff };
u8 pwm; u8 pwm;
int i; int i;
struct i2c_msg msg [] = { { addr: 0x28, flags: 0, buf: b0, len: 1 }, struct i2c_msg msg [] = { { addr: 0x50, flags: 0, buf: b0, len: 1 },
{ addr: 0x28, flags: I2C_M_RD, buf: &pwm, len: 1 } }; { addr: 0x50, flags: I2C_M_RD, buf: &pwm, len: 1 } };
dprintk("VES1820: init chip\n"); dprintk("VES1820: init chip\n");
...@@ -433,12 +433,13 @@ int ves1820_ioctl (struct dvb_frontend *frontend, unsigned int cmd, void *arg) ...@@ -433,12 +433,13 @@ int ves1820_ioctl (struct dvb_frontend *frontend, unsigned int cmd, void *arg)
} }
case FE_READ_BER: case FE_READ_BER:
*((u32*) arg) = ves1820_readreg(frontend->i2c, 0x14) | {
u32 ber = ves1820_readreg(frontend->i2c, 0x14) |
(ves1820_readreg(frontend->i2c, 0x15) << 8) | (ves1820_readreg(frontend->i2c, 0x15) << 8) |
(ves1820_readreg(frontend->i2c, 0x16) << 16); ((ves1820_readreg(frontend->i2c, 0x16) & 0x0f) << 16);
/* XXX FIXME: scale!!*/ *((u32*) arg) = 10 * ber;
break; break;
}
case FE_READ_SIGNAL_STRENGTH: case FE_READ_SIGNAL_STRENGTH:
{ {
u8 gain = ves1820_readreg(frontend->i2c, 0x17); u8 gain = ves1820_readreg(frontend->i2c, 0x17);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment