version 1.12, 2001/03/29 23:12:01
|
version 1.13, 2001/04/06 09:03:53
|
Line 1
|
Line 1
|
/* |
/* |
cvdv.c |
cvdv.c |
|
|
Copyright (C) Christian Wolff for convergence integrated media. |
Copyright (C) Christian Wolff |
|
Marcus Metzler for convergence integrated media. |
|
|
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 |
Line 577 static long margi_write(struct cvdv_card
|
Line 578 static long margi_write(struct cvdv_card
|
!card->nonblock && out < count){ |
!card->nonblock && out < count){ |
wc++; |
wc++; |
out += MargiPush(card, count, data); |
out += MargiPush(card, count, data); |
if (out < count || card->DMAABusy){ |
if (out < count){ |
interruptible_sleep_on(&card->wqA); |
interruptible_sleep_on(&card->wqA); |
} |
} |
} |
} |
Line 604 static long margi_write(struct cvdv_card
|
Line 605 static long margi_write(struct cvdv_card
|
void pes_write(uint8_t *buf, int count, void *priv) |
void pes_write(uint8_t *buf, int count, void *priv) |
{ |
{ |
struct cvdv_cards *card = (struct cvdv_cards *) priv; |
struct cvdv_cards *card = (struct cvdv_cards *) priv; |
|
int out; |
|
|
|
out = margi_write(card, buf, count, 0); |
|
#if 0 |
|
if (out != count) |
|
printk(KERN_ERR LOGNAME ": Yikes\n"); |
|
printk(KERN_ERR LOGNAME " l: 0x%X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n" , count, |
|
buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); |
|
#endif |
|
|
margi_write(card, buf, count, 0); |
|
} |
} |
|
|
|
|
Line 631 static unsigned int PSpoll(struct file *
|
Line 640 static unsigned int PSpoll(struct file *
|
return POLLERR; |
return POLLERR; |
} |
} |
|
|
|
static int |
|
OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc) |
|
{ |
|
|
|
switch (dc->cmd) { |
|
case OSD_Close: |
|
printk(KERN_DEBUG LOGNAME |
|
": OSD Close\n"); |
|
return OSDClose(card); |
|
case OSD_Open: // Open(x0,y0,x1,y1,BitPerPixel(2/4/8),mix(0..15)) |
|
return OSDOpen(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color & 0x0F, |
|
(dc->color >> 4) & |
|
0x0F); |
|
case OSD_Show: |
|
return OSDShow(card); |
|
case OSD_Hide: |
|
return OSDHide(card); |
|
case OSD_Clear: |
|
return OSDClear(card); |
|
case OSD_Fill: // Fill(color) |
|
return OSDFill(card, dc->color); |
|
case OSD_SetColor: // SetColor(color,R(x0),G(y0),B(x1),opacity(y1)) |
|
return (OSDSetColor |
|
(card, dc->color, dc->x0, |
|
dc->y0, dc->x1, 0, |
|
(dc->y1 != 255), |
|
(dc->y1 == 0)) >= 0); |
|
case OSD_SetPalette:// SetPalette(firstcolor{color},lastcolor{x0},data) |
|
return OSDSetPalette(card, |
|
dc->color, |
|
dc->x0, (uint8_t *) |
|
dc->data); |
|
case OSD_SetTrans: // SetTrans(transparency{color}) |
|
return OSDSetTrans(card, |
|
(dc->color >> 4) |
|
& 0x0F); |
|
case OSD_SetPixel: // SetPixel(x0,y0,color) |
|
return OSDSetPixel(card, dc->x0, |
|
dc->y0, |
|
dc->color); |
|
case OSD_GetPixel: // GetPixel(x0,y0); |
|
return OSDGetPixel(card, dc->x0, |
|
dc->y0); |
|
case OSD_SetRow: // SetRow(x0,y0,x1,(uint8_t*)data) |
|
return OSDSetRow(card, dc->x0, |
|
dc->y0, dc->x1, |
|
(uint8_t *) dc->data); |
|
case OSD_SetBlock: // SetBlock(x0,y0,x1,y1,(uint8_t*)data) |
|
return OSDSetBlock(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color, |
|
(uint8_t *) |
|
dc->data); |
|
case OSD_FillRow: // FillRow(x0,y0,x1,color) |
|
return OSDFillRow(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->color); |
|
case OSD_FillBlock: // FillRow(x0,y0,x1,y1,color) |
|
return OSDFillBlock(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color); |
|
case OSD_Line: // Line(x0,y0,x1,y1,color); |
|
return OSDLine(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, dc->color); |
|
case OSD_Query: // Query(x0,y0,x1,y1,aspect(color:11) |
|
return OSDQuery(card, &dc->x0, |
|
&dc->y0, &dc->x1, |
|
&dc->y1, |
|
&dc->color); |
|
case OSD_Test: |
|
return OSDTest(card); |
|
default: |
|
return -EINVAL; |
|
} |
|
} |
|
|
|
|
static int PSioctl(struct inode *inode, struct file *file, |
static int PSioctl(struct inode *inode, struct file *file, |
unsigned int cmd, unsigned long arg) |
unsigned int cmd, unsigned long arg) |
{ |
{ |
struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16 |
struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16 |
struct drawcmd *dc; |
osd_cmd_t *dc; |
struct decodercmd *command; |
struct decodercmd *command; |
uint16_t attr; |
uint16_t attr; |
|
|
Line 644 static int PSioctl(struct inode *inode,
|
Line 735 static int PSioctl(struct inode *inode,
|
if (_IOC_TYPE(cmd) == CVDV_IOCTL_MAGIC) |
if (_IOC_TYPE(cmd) == CVDV_IOCTL_MAGIC) |
switch (_IOC_NR(cmd)) { |
switch (_IOC_NR(cmd)) { |
case IOCTL_DRAW: // Drawing commands |
case IOCTL_DRAW: // Drawing commands |
dc = (struct drawcmd *) arg; |
dc = (osd_cmd_t *) arg; |
switch (dc->cmd) { |
return OSD_DrawCommand(card,dc); |
case OSD_Close: |
break; |
printk(KERN_DEBUG LOGNAME |
|
": OSD Close\n"); |
|
return OSDClose(card); |
|
case OSD_Open: // Open(x0,y0,x1,y1,BitPerPixel(2/4/8),mix(0..15)) |
|
return OSDOpen(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color & 0x0F, |
|
(dc->color >> 4) & |
|
0x0F); |
|
case OSD_Show: |
|
return OSDShow(card); |
|
case OSD_Hide: |
|
return OSDHide(card); |
|
case OSD_Clear: |
|
return OSDClear(card); |
|
case OSD_Fill: // Fill(color) |
|
return OSDFill(card, dc->color); |
|
case OSD_SetColor: // SetColor(color,R(x0),G(y0),B(x1),opacity(y1)) |
|
//printk(KERN_DEBUG LOGNAME ": OSD SetColor(%d,%d,%d,%d,%d)\n", |
|
//dc->color,dc->x0,dc->y0,dc->x1,dc->y1); |
|
return (OSDSetColor |
|
(card, dc->color, dc->x0, |
|
dc->y0, dc->x1, 0, |
|
(dc->y1 != 255), |
|
(dc->y1 == 0)) >= 0); |
|
case OSD_SetPalette: // SetPalette(firstcolor{color},lastcolor{x0},data) |
|
return OSDSetPalette(card, |
|
dc->color, |
|
dc->x0, (uint8_t *) |
|
dc->data); |
|
case OSD_SetTrans: // SetTrans(transparency{color}) |
|
return OSDSetTrans(card, |
|
(dc->color >> 4) |
|
& 0x0F); |
|
case OSD_SetPixel: // SetPixel(x0,y0,color) |
|
return OSDSetPixel(card, dc->x0, |
|
dc->y0, |
|
dc->color); |
|
case OSD_GetPixel: // GetPixel(x0,y0); |
|
return OSDGetPixel(card, dc->x0, |
|
dc->y0); |
|
case OSD_SetRow: // SetRow(x0,y0,x1,(uint8_t*)data) |
|
return OSDSetRow(card, dc->x0, |
|
dc->y0, dc->x1, |
|
(uint8_t *) dc->data); |
|
case OSD_SetBlock: // SetBlock(x0,y0,x1,y1,(uint8_t*)data) |
|
return OSDSetBlock(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color, |
|
(uint8_t *) |
|
dc->data); |
|
case OSD_FillRow: // FillRow(x0,y0,x1,color) |
|
return OSDFillRow(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->color); |
|
case OSD_FillBlock: // FillRow(x0,y0,x1,y1,color) |
|
return OSDFillBlock(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, |
|
dc->color); |
|
case OSD_Line: // Line(x0,y0,x1,y1,color); |
|
return OSDLine(card, dc->x0, |
|
dc->y0, dc->x1, |
|
dc->y1, dc->color); |
|
case OSD_Query: // Query(x0,y0,x1,y1,aspect(color:11) |
|
return OSDQuery(card, &dc->x0, |
|
&dc->y0, &dc->x1, |
|
&dc->y1, |
|
&dc->color); |
|
case OSD_Test: |
|
return OSDTest(card); |
|
default: |
|
return -EINVAL; |
|
} |
|
case IOCTL_DECODER: |
case IOCTL_DECODER: |
command = (struct decodercmd *) arg; |
command = (struct decodercmd *) arg; |
switch (command->cmd) { |
switch (command->cmd) { |
Line 829 static int PSioctl(struct inode *inode,
|
Line 844 static int PSioctl(struct inode *inode,
|
if (card->videoffwd) |
if (card->videoffwd) |
card->videoffwd = 0; |
card->videoffwd = 0; |
else |
else |
card->videoffwd = 2; |
card->videoffwd = 3; |
} else { |
} else { |
if (!command->param1) |
if (!command->param1) |
card->videoffwd = 0; |
card->videoffwd = 0; |
else |
else |
card->videoffwd = 2; |
card->videoffwd = 3; |
} |
} |
return 0; |
return 0; |
|
|
Line 1143 dvbdev_close(struct dvb_device *dvbdev,
|
Line 1158 dvbdev_close(struct dvb_device *dvbdev,
|
return ret; |
return ret; |
} |
} |
|
|
|
|
static ssize_t |
static ssize_t |
dvbdev_write(struct dvb_device *dvbdev, int num, |
dvbdev_write(struct dvb_device *dvbdev, int num, |
struct file *file, |
struct file *file, |
Line 1303 dvbdev_ioctl(struct dvb_device *dvbdev,
|
Line 1319 dvbdev_ioctl(struct dvb_device *dvbdev,
|
if (card->videostate.streamSource != |
if (card->videostate.streamSource != |
VIDEO_SOURCE_MEMORY) |
VIDEO_SOURCE_MEMORY) |
return -EPERM; |
return -EPERM; |
card->videoffwd = 2; |
card->videoffwd = 3; |
break; |
break; |
|
|
case VIDEO_SLOWMOTION: |
case VIDEO_SLOWMOTION: |
Line 1430 dvbdev_ioctl(struct dvb_device *dvbdev,
|
Line 1446 dvbdev_ioctl(struct dvb_device *dvbdev,
|
|
|
case DVB_DEVICE_DEMUX_0: |
case DVB_DEVICE_DEMUX_0: |
return DmxDevIoctl(&card->dmxdev, file, cmd, arg); |
return DmxDevIoctl(&card->dmxdev, file, cmd, arg); |
|
break; |
|
|
case DVB_DEVICE_OSD_0: |
case DVB_DEVICE_OSD_0: |
{ |
{ |
/* switch (cmd) { |
switch (cmd) { |
case OSD_SEND_CMD: |
case OSD_SEND_CMD: |
{ |
{ |
osd_cmd_t doc; |
osd_cmd_t doc; |
|
|
if(copy_from_user(&doc, parg, |
if(copy_from_user(&doc, parg, |
sizeof(osd_cmd_t))) |
sizeof(osd_cmd_t))) |
return -EFAULT; |
return -EFAULT; |
return OSD_DrawCommand(dvb, &doc); |
return OSD_DrawCommand(card, &doc); |
} |
} |
default: |
default: |
return -EINVAL; |
return -EINVAL; |
}*/ |
} |
break; |
break; |
} |
} |
default: |
default: |
Line 1509 static dvb_devs_t mdvb_devs = {
|
Line 1526 static dvb_devs_t mdvb_devs = {
|
-1, -1, |
-1, -1, |
DVB_DEVICE_DEMUX_0, DVB_DEVICE_DVR_0, |
DVB_DEVICE_DEMUX_0, DVB_DEVICE_DVR_0, |
-1, -1, |
-1, -1, |
-1//DVB_DEVICE_OSD, |
DVB_DEVICE_OSD_0, |
}, |
}, |
{ INFU, INFU, INFU, INFU, INFU, 1, 1, INFU, 1 }, |
{ INFU, INFU, INFU, INFU, INFU, 1, 1, INFU, 1 }, |
{ 1, 1, 1, 1, INFU, 1, 1, 1, 1} |
{ 1, 1, 1, 1, INFU, 1, 1, 1, 1} |
Line 1634 dvb_write_to_decoder(dvb_demux_feed_t *d
|
Line 1651 dvb_write_to_decoder(dvb_demux_feed_t *d
|
if (count != TS_SIZE) return -1; |
if (count != TS_SIZE) return -1; |
|
|
ts_to_pes( p, buf); // don't need count (=188) |
ts_to_pes( p, buf); // don't need count (=188) |
card->audiostate.AVSyncState=0; |
|
|
|
return 0; |
return 0; |
} |
} |
|
|