FILE
av7110_av.c
File preview with syntax highlighting.
linux-6.19.14/drivers/staging/media/av7110/av7110_av.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * driver for the SAA7146 based AV110 cards 4 * - audio and video MPEG decoder stuff 5 * 6 * Copyright (C) 1999-2002 Ralph Metzler 7 * & Marcus Metzler for convergence integrated media GmbH 8 * 9 * originally based on code by: 10 * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de> 11 * 12 * the project's page is at https://linuxtv.org 13 */ 14 15#include <linux/ethtool.h> 16#include <linux/types.h> 17#include <linux/kernel.h> 18#include <linux/string.h> 19#include <linux/delay.h> 20#include <linux/fs.h> 21 22#include "av7110.h" 23#include "av7110_hw.h" 24#include "av7110_av.h" 25#include "av7110_ipack.h" 26 27/* MPEG-2 (ISO 13818 / H.222.0) stream types */ 28#define PROG_STREAM_MAP 0xBC 29#define PRIVATE_STREAM1 0xBD 30#define PADDING_STREAM 0xBE 31#define PRIVATE_STREAM2 0xBF 32#define AUDIO_STREAM_S 0xC0 33#define AUDIO_STREAM_E 0xDF 34#define VIDEO_STREAM_S 0xE0 35#define VIDEO_STREAM_E 0xEF 36#define ECM_STREAM 0xF0 37#define EMM_STREAM 0xF1 38#define DSM_CC_STREAM 0xF2 39#define ISO13522_STREAM 0xF3 40#define PROG_STREAM_DIR 0xFF 41 42#define PTS_DTS_FLAGS 0xC0 43 44//pts_dts flags 45#define PTS_ONLY 0x80 46#define PTS_DTS 0xC0 47#define TS_SIZE 188 48#define TRANS_ERROR 0x80 49#define PAY_START 0x40 50#define TRANS_PRIO 0x20 51#define PID_MASK_HI 0x1F 52//flags 53#define TRANS_SCRMBL1 0x80 54#define TRANS_SCRMBL2 0x40 55#define ADAPT_FIELD 0x20 56#define PAYLOAD 0x10 57#define COUNT_MASK 0x0F 58 59// adaptation flags 60#define DISCON_IND 0x80 61#define RAND_ACC_IND 0x40 62#define ES_PRI_IND 0x20 63#define PCR_FLAG 0x10 64#define OPCR_FLAG 0x08 65#define SPLICE_FLAG 0x04 66#define TRANS_PRIV 0x02 67#define ADAP_EXT_FLAG 0x01 68 69// adaptation extension flags 70#define LTW_FLAG 0x80 71#define PIECE_RATE 0x40 72#define SEAM_SPLICE 0x20 73 74static void p_to_t(u8 const *buf, long length, u16 pid, 75 u8 *counter, struct dvb_demux_feed *feed); 76static int write_ts_to_decoder(struct av7110 *av7110, int type, const u8 *buf, size_t len); 77 78int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len) 79{ 80 struct dvb_demux_feed *dvbdmxfeed = p2t->priv; 81 82 if (!(dvbdmxfeed->ts_type & TS_PACKET)) 83 return 0; 84 if (buf[3] == 0xe0) { // video PES do not have a length in TS 85 buf[4] = 0; 86 buf[5] = 0; 87 } 88 if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) 89 return dvbdmxfeed->cb.ts(buf, len, NULL, 0, 90 &dvbdmxfeed->feed.ts, NULL); 91 else 92 return dvb_filter_pes2ts(p2t, buf, len, 1); 93} 94 95static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data) 96{ 97 struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)priv; 98 99 dvbdmxfeed->cb.ts(data, 188, NULL, 0, 100 &dvbdmxfeed->feed.ts, NULL); 101 return 0; 102} 103 104int av7110_av_start_record(struct av7110 *av7110, int av, 105 struct dvb_demux_feed *dvbdmxfeed) 106{ 107 int ret = 0; 108 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; 109 110 dprintk(2, "av7110:%p, dvb_demux_feed:%p\n", av7110, dvbdmxfeed); 111 112 if (av7110->playing || (av7110->rec_mode & av)) 113 return -EBUSY; 114 av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); 115 dvbdmx->recording = 1; 116 av7110->rec_mode |= av; 117 118 switch (av7110->rec_mode) { 119 case RP_AUDIO: 120 dvb_filter_pes2ts_init(&av7110->p2t[0], 121 dvbdmx->pesfilter[0]->pid, 122 dvb_filter_pes2ts_cb, 123 (void *)dvbdmx->pesfilter[0]); 124 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); 125 break; 126 127 case RP_VIDEO: 128 dvb_filter_pes2ts_init(&av7110->p2t[1], 129 dvbdmx->pesfilter[1]->pid, 130 dvb_filter_pes2ts_cb, 131 (void *)dvbdmx->pesfilter[1]); 132 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); 133 break; 134 135 case RP_AV: 136 dvb_filter_pes2ts_init(&av7110->p2t[0], 137 dvbdmx->pesfilter[0]->pid, 138 dvb_filter_pes2ts_cb, 139 (void *)dvbdmx->pesfilter[0]); 140 dvb_filter_pes2ts_init(&av7110->p2t[1], 141 dvbdmx->pesfilter[1]->pid, 142 dvb_filter_pes2ts_cb, 143 (void *)dvbdmx->pesfilter[1]); 144 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); 145 break; 146 } 147 return ret; 148} 149 150int av7110_av_start_play(struct av7110 *av7110, int av) 151{ 152 int ret = 0; 153 154 dprintk(2, "av7110:%p\n", av7110); 155 156 if (av7110->rec_mode) 157 return -EBUSY; 158 if (av7110->playing & av) 159 return -EBUSY; 160 161 av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); 162 163 if (av7110->playing == RP_NONE) { 164 av7110_ipack_reset(&av7110->ipack[0]); 165 av7110_ipack_reset(&av7110->ipack[1]); 166 } 167 168 av7110->playing |= av; 169 switch (av7110->playing) { 170 case RP_AUDIO: 171 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); 172 break; 173 case RP_VIDEO: 174 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); 175 av7110->sinfo = 0; 176 break; 177 case RP_AV: 178 av7110->sinfo = 0; 179 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); 180 break; 181 } 182 return ret; 183} 184 185int av7110_av_stop(struct av7110 *av7110, int av) 186{ 187 int ret = 0; 188 189 dprintk(2, "av7110:%p\n", av7110); 190 191 if (!(av7110->playing & av) && !(av7110->rec_mode & av)) 192 return 0; 193 av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); 194 if (av7110->playing) { 195 av7110->playing &= ~av; 196 switch (av7110->playing) { 197 case RP_AUDIO: 198 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); 199 break; 200 case RP_VIDEO: 201 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); 202 break; 203 case RP_NONE: 204 ret = av7110_set_vidmode(av7110, av7110->vidmode); 205 break; 206 } 207 } else { 208 av7110->rec_mode &= ~av; 209 switch (av7110->rec_mode) { 210 case RP_AUDIO: 211 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); 212 break; 213 case RP_VIDEO: 214 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); 215 break; 216 case RP_NONE: 217 break; 218 } 219 } 220 return ret; 221} 222 223int av7110_pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen) 224{ 225 int len; 226 u32 sync; 227 u16 blen; 228 229 if (!dlen) { 230 wake_up(&buf->queue); 231 return -1; 232 } 233 while (1) { 234 len = dvb_ringbuffer_avail(buf); 235 if (len < 6) { 236 wake_up(&buf->queue); 237 return -1; 238 } 239 sync = DVB_RINGBUFFER_PEEK(buf, 0) << 24; 240 sync |= DVB_RINGBUFFER_PEEK(buf, 1) << 16; 241 sync |= DVB_RINGBUFFER_PEEK(buf, 2) << 8; 242 sync |= DVB_RINGBUFFER_PEEK(buf, 3); 243 244 if (((sync & ~0x0f) == 0x000001e0) || 245 ((sync & ~0x1f) == 0x000001c0) || 246 (sync == 0x000001bd)) 247 break; 248 pr_info("resync\n"); 249 DVB_RINGBUFFER_SKIP(buf, 1); 250 } 251 blen = DVB_RINGBUFFER_PEEK(buf, 4) << 8; 252 blen |= DVB_RINGBUFFER_PEEK(buf, 5); 253 blen += 6; 254 if (len < blen || blen > dlen) { 255 //pr_info("buffer empty - avail %d blen %u dlen %d\n", len, blen, dlen); 256 wake_up(&buf->queue); 257 return -1; 258 } 259 260 dvb_ringbuffer_read(buf, dest, (size_t)blen); 261 262 dprintk(2, "pread=0x%08lx, pwrite=0x%08lx\n", 263 (unsigned long)buf->pread, (unsigned long)buf->pwrite); 264 wake_up(&buf->queue); 265 return blen; 266} 267 268int av7110_set_volume(struct av7110 *av7110, unsigned int volleft, 269 unsigned int volright) 270{ 271 unsigned int vol, val, balance = 0; 272 int err; 273 274 dprintk(2, "av7110:%p\n", av7110); 275 276 av7110->mixer.volume_left = volleft; 277 av7110->mixer.volume_right = volright; 278 279 switch (av7110->adac_type) { 280 case DVB_ADAC_TI: 281 volleft = (volleft * 256) / 1036; 282 volright = (volright * 256) / 1036; 283 if (volleft > 0x3f) 284 volleft = 0x3f; 285 if (volright > 0x3f) 286 volright = 0x3f; 287 err = SendDAC(av7110, 3, 0x80 + volleft); 288 if (err) 289 return err; 290 return SendDAC(av7110, 4, volright); 291 292 case DVB_ADAC_CRYSTAL: 293 volleft = 127 - volleft / 2; 294 volright = 127 - volright / 2; 295 i2c_writereg(av7110, 0x20, 0x03, volleft); 296 i2c_writereg(av7110, 0x20, 0x04, volright); 297 return 0; 298 299 case DVB_ADAC_MSP34x0: 300 vol = (volleft > volright) ? volleft : volright; 301 val = (vol * 0x73 / 255) << 8; 302 if (vol > 0) 303 balance = ((volright - volleft) * 127) / vol; 304 msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8); 305 msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */ 306 msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */ 307 return 0; 308 309 case DVB_ADAC_MSP34x5: 310 vol = (volleft > volright) ? volleft : volright; 311 val = (vol * 0x73 / 255) << 8; 312 if (vol > 0) 313 balance = ((volright - volleft) * 127) / vol; 314 msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8); 315 msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */ 316 return 0; 317 } 318 319 return 0; 320} 321 322int av7110_set_vidmode(struct av7110 *av7110, enum av7110_video_mode mode) 323{ 324 int ret; 325 326 dprintk(2, "av7110:%p\n", av7110); 327 328 ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); 329 330 if (!ret && !av7110->playing) { 331 ret = ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], 332 av7110->pids[DMX_PES_AUDIO], 333 av7110->pids[DMX_PES_TELETEXT], 334 0, av7110->pids[DMX_PES_PCR]); 335 if (!ret) 336 ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); 337 } 338 return ret; 339} 340 341static enum av7110_video_mode sw2mode[16] = { 342 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_NTSC, 343 AV7110_VIDEO_MODE_NTSC, AV7110_VIDEO_MODE_PAL, 344 AV7110_VIDEO_MODE_NTSC, AV7110_VIDEO_MODE_NTSC, 345 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_NTSC, 346 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_PAL, 347 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_PAL, 348 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_PAL, 349 AV7110_VIDEO_MODE_PAL, AV7110_VIDEO_MODE_PAL, 350}; 351 352static int get_video_format(struct av7110 *av7110, u8 *buf, int count) 353{ 354 int i; 355 int hsize, vsize; 356 int sw; 357 u8 *p; 358 int ret = 0; 359 360 dprintk(2, "av7110:%p\n", av7110); 361 362 if (av7110->sinfo) 363 return 0; 364 for (i = 7; i < count - 10; i++) { 365 p = buf + i; 366 if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3) 367 continue; 368 p += 4; 369 hsize = ((p[1] & 0xF0) >> 4) | (p[0] << 4); 370 vsize = ((p[1] & 0x0F) << 8) | (p[2]); 371 sw = (p[3] & 0x0F); 372 ret = av7110_set_vidmode(av7110, sw2mode[sw]); 373 if (!ret) { 374 dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw); 375 av7110->sinfo = 1; 376 } 377 break; 378 } 379 return ret; 380} 381 382/**************************************************************************** 383 * I/O buffer management and control 384 ****************************************************************************/ 385 386static inline long aux_ring_buffer_write(struct dvb_ringbuffer *rbuf, 387 const u8 *buf, unsigned long count) 388{ 389 unsigned long todo = count; 390 int free; 391 392 while (todo > 0) { 393 if (dvb_ringbuffer_free(rbuf) < 2048) { 394 if (wait_event_interruptible(rbuf->queue, 395 (dvb_ringbuffer_free(rbuf) >= 2048))) 396 return count - todo; 397 } 398 free = dvb_ringbuffer_free(rbuf); 399 if (free > todo) 400 free = todo; 401 dvb_ringbuffer_write(rbuf, buf, free); 402 todo -= free; 403 buf += free; 404 } 405 406 return count - todo; 407} 408 409static void play_video_cb(u8 *buf, int count, void *priv) 410{ 411 struct av7110 *av7110 = (struct av7110 *)priv; 412 413 dprintk(2, "av7110:%p\n", av7110); 414 415 if ((buf[3] & 0xe0) == 0xe0) { 416 get_video_format(av7110, buf, count); 417 aux_ring_buffer_write(&av7110->avout, buf, count); 418 } else { 419 aux_ring_buffer_write(&av7110->aout, buf, count); 420 } 421} 422 423static void play_audio_cb(u8 *buf, int count, void *priv) 424{ 425 struct av7110 *av7110 = (struct av7110 *)priv; 426 427 dprintk(2, "av7110:%p\n", av7110); 428 429 aux_ring_buffer_write(&av7110->aout, buf, count); 430} 431 432#define FREE_COND_TS (dvb_ringbuffer_free(rb) >= 4096) 433 434static ssize_t ts_play(struct av7110 *av7110, const char __user *buf, 435 unsigned long count, int nonblock, int type) 436{ 437 struct dvb_ringbuffer *rb; 438 u8 *kb; 439 unsigned long todo = count; 440 441 dprintk(2, "type %d cnt %lu\n", type, count); 442 443 rb = (type) ? &av7110->avout : &av7110->aout; 444 kb = av7110->kbuf[type]; 445 446 if (!kb) 447 return -ENOBUFS; 448 449 if (nonblock && !FREE_COND_TS) 450 return -EWOULDBLOCK; 451 452 while (todo >= TS_SIZE) { 453 if (!FREE_COND_TS) { 454 if (nonblock) 455 return count - todo; 456 if (wait_event_interruptible(rb->queue, FREE_COND_TS)) 457 return count - todo; 458 } 459 if (copy_from_user(kb, buf, TS_SIZE)) 460 return -EFAULT; 461 write_ts_to_decoder(av7110, type, kb, TS_SIZE); 462 todo -= TS_SIZE; 463 buf += TS_SIZE; 464 } 465 466 return count - todo; 467} 468 469#define FREE_COND (dvb_ringbuffer_free(&av7110->avout) >= 20 * 1024 && \ 470 dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024) 471 472static ssize_t dvb_play(struct av7110 *av7110, const char __user *buf, 473 unsigned long count, int nonblock, int type) 474{ 475 unsigned long todo = count, n; 476 477 dprintk(2, "av7110:%p\n", av7110); 478 479 if (!av7110->kbuf[type]) 480 return -ENOBUFS; 481 482 if (nonblock && !FREE_COND) 483 return -EWOULDBLOCK; 484 485 while (todo > 0) { 486 if (!FREE_COND) { 487 if (nonblock) 488 return count - todo; 489 if (wait_event_interruptible(av7110->avout.queue, 490 FREE_COND)) 491 return count - todo; 492 } 493 n = todo; 494 if (n > IPACKS * 2) 495 n = IPACKS * 2; 496 if (copy_from_user(av7110->kbuf[type], buf, n)) 497 return -EFAULT; 498 av7110_ipack_instant_repack(av7110->kbuf[type], n, 499 &av7110->ipack[type]); 500 todo -= n; 501 buf += n; 502 } 503 return count - todo; 504} 505 506static ssize_t dvb_play_kernel(struct av7110 *av7110, const u8 *buf, 507 unsigned long count, int nonblock, int type) 508{ 509 unsigned long todo = count, n; 510 511 dprintk(2, "av7110:%p\n", av7110); 512 513 if (!av7110->kbuf[type]) 514 return -ENOBUFS; 515 516 if (nonblock && !FREE_COND) 517 return -EWOULDBLOCK; 518 519 while (todo > 0) { 520 if (!FREE_COND) { 521 if (nonblock) 522 return count - todo; 523 if (wait_event_interruptible(av7110->avout.queue, 524 FREE_COND)) 525 return count - todo; 526 } 527 n = todo; 528 if (n > IPACKS * 2) 529 n = IPACKS * 2; 530 av7110_ipack_instant_repack(buf, n, &av7110->ipack[type]); 531 todo -= n; 532 buf += n; 533 } 534 return count - todo; 535} 536 537static ssize_t dvb_aplay(struct av7110 *av7110, const char __user *buf, 538 unsigned long count, int nonblock, int type) 539{ 540 unsigned long todo = count, n; 541 542 dprintk(2, "av7110:%p\n", av7110); 543 544 if (!av7110->kbuf[type]) 545 return -ENOBUFS; 546 if (nonblock && dvb_ringbuffer_free(&av7110->aout) < 20 * 1024) 547 return -EWOULDBLOCK; 548 549 while (todo > 0) { 550 if (dvb_ringbuffer_free(&av7110->aout) < 20 * 1024) { 551 if (nonblock) 552 return count - todo; 553 if (wait_event_interruptible(av7110->aout.queue, 554 (dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024))) 555 return count - todo; 556 } 557 n = todo; 558 if (n > IPACKS * 2) 559 n = IPACKS * 2; 560 if (copy_from_user(av7110->kbuf[type], buf, n)) 561 return -EFAULT; 562 av7110_ipack_instant_repack(av7110->kbuf[type], n, 563 &av7110->ipack[type]); 564 todo -= n; 565 buf += n; 566 } 567 return count - todo; 568} 569 570void av7110_p2t_init(struct av7110_p2t *p, struct dvb_demux_feed *feed) 571{ 572 memset(p->pes, 0, TS_SIZE); 573 p->counter = 0; 574 p->pos = 0; 575 p->frags = 0; 576 if (feed) 577 p->feed = feed; 578} 579 580static void clear_p2t(struct av7110_p2t *p) 581{ 582 memset(p->pes, 0, TS_SIZE); 583// p->counter = 0; 584 p->pos = 0; 585 p->frags = 0; 586} 587 588static int find_pes_header(u8 const *buf, long length, int *frags) 589{ 590 int c = 0; 591 int found = 0; 592 593 *frags = 0; 594 595 while (c < length - 3 && !found) { 596 if (buf[c] == 0x00 && buf[c + 1] == 0x00 && 597 buf[c + 2] == 0x01) { 598 switch (buf[c + 3]) { 599 case PROG_STREAM_MAP: 600 case PRIVATE_STREAM2: 601 case PROG_STREAM_DIR: 602 case ECM_STREAM: 603 case EMM_STREAM: 604 case PADDING_STREAM: 605 case DSM_CC_STREAM: 606 case ISO13522_STREAM: 607 case PRIVATE_STREAM1: 608 case AUDIO_STREAM_S ... AUDIO_STREAM_E: 609 case VIDEO_STREAM_S ... VIDEO_STREAM_E: 610 found = 1; 611 break; 612 613 default: 614 c++; 615 break; 616 } 617 } else { 618 c++; 619 } 620 } 621 if (c == length - 3 && !found) { 622 if (buf[length - 1] == 0x00) 623 *frags = 1; 624 if (buf[length - 2] == 0x00 && 625 buf[length - 1] == 0x00) 626 *frags = 2; 627 if (buf[length - 3] == 0x00 && 628 buf[length - 2] == 0x00 && 629 buf[length - 1] == 0x01) 630 *frags = 3; 631 return -1; 632 } 633 634 return c; 635} 636 637void av7110_p2t_write(u8 const *buf, long length, u16 pid, struct av7110_p2t *p) 638{ 639 int c, c2, l, add; 640 int check, rest; 641 642 c = 0; 643 c2 = 0; 644 if (p->frags) { 645 check = 0; 646 switch (p->frags) { 647 case 1: 648 if (buf[c] == 0x00 && buf[c + 1] == 0x01) { 649 check = 1; 650 c += 2; 651 } 652 break; 653 case 2: 654 if (buf[c] == 0x01) { 655 check = 1; 656 c++; 657 } 658 break; 659 case 3: 660 check = 1; 661 } 662 if (check) { 663 switch (buf[c]) { 664 case PROG_STREAM_MAP: 665 case PRIVATE_STREAM2: 666 case PROG_STREAM_DIR: 667 case ECM_STREAM: 668 case EMM_STREAM: 669 case PADDING_STREAM: 670 case DSM_CC_STREAM: 671 case ISO13522_STREAM: 672 case PRIVATE_STREAM1: 673 case AUDIO_STREAM_S ... AUDIO_STREAM_E: 674 case VIDEO_STREAM_S ... VIDEO_STREAM_E: 675 p->pes[0] = 0x00; 676 p->pes[1] = 0x00; 677 p->pes[2] = 0x01; 678 p->pes[3] = buf[c]; 679 p->pos = 4; 680 memcpy(p->pes + p->pos, buf + c, (TS_SIZE - 4) - p->pos); 681 c += (TS_SIZE - 4) - p->pos; 682 p_to_t(p->pes, (TS_SIZE - 4), pid, &p->counter, p->feed); 683 clear_p2t(p); 684 break; 685 686 default: 687 c = 0; 688 break; 689 } 690 } 691 p->frags = 0; 692 } 693 694 if (p->pos) { 695 c2 = find_pes_header(buf + c, length - c, &p->frags); 696 if (c2 >= 0 && c2 < (TS_SIZE - 4) - p->pos) 697 l = c2 + c; 698 else 699 l = (TS_SIZE - 4) - p->pos; 700 memcpy(p->pes + p->pos, buf, l); 701 c += l; 702 p->pos += l; 703 p_to_t(p->pes, p->pos, pid, &p->counter, p->feed); 704 clear_p2t(p); 705 } 706 707 add = 0; 708 while (c < length) { 709 c2 = find_pes_header(buf + c + add, length - c - add, &p->frags); 710 if (c2 >= 0) { 711 c2 += c + add; 712 if (c2 > c) { 713 p_to_t(buf + c, c2 - c, pid, &p->counter, p->feed); 714 c = c2; 715 clear_p2t(p); 716 add = 0; 717 } else { 718 add = 1; 719 } 720 } else { 721 l = length - c; 722 rest = l % (TS_SIZE - 4); 723 l -= rest; 724 p_to_t(buf + c, l, pid, &p->counter, p->feed); 725 memcpy(p->pes, buf + c + l, rest); 726 p->pos = rest; 727 c = length; 728 } 729 } 730} 731 732static int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length) 733{ 734 int i; 735 int c = 0; 736 int fill; 737 u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10 }; 738 739 fill = (TS_SIZE - 4) - length; 740 if (pes_start) 741 tshead[1] = 0x40; 742 if (fill) 743 tshead[3] = 0x30; 744 tshead[1] |= (u8)((pid & 0x1F00) >> 8); 745 tshead[2] |= (u8)(pid & 0x00FF); 746 tshead[3] |= ((*counter)++ & 0x0F); 747 memcpy(buf, tshead, 4); 748 c += 4; 749 750 if (fill) { 751 buf[4] = fill - 1; 752 c++; 753 if (fill > 1) { 754 buf[5] = 0x00; 755 c++; 756 } 757 for (i = 6; i < fill + 4; i++) { 758 buf[i] = 0xFF; 759 c++; 760 } 761 } 762 763 return c; 764} 765 766static void p_to_t(u8 const *buf, long length, u16 pid, u8 *counter, 767 struct dvb_demux_feed *feed) 768{ 769 int l, pes_start; 770 u8 obuf[TS_SIZE]; 771 long c = 0; 772 773 pes_start = 0; 774 if (length > 3 && 775 buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01) 776 switch (buf[3]) { 777 case PROG_STREAM_MAP: 778 case PRIVATE_STREAM2: 779 case PROG_STREAM_DIR: 780 case ECM_STREAM: 781 case EMM_STREAM: 782 case PADDING_STREAM: 783 case DSM_CC_STREAM: 784 case ISO13522_STREAM: 785 case PRIVATE_STREAM1: 786 case AUDIO_STREAM_S ... AUDIO_STREAM_E: 787 case VIDEO_STREAM_S ... VIDEO_STREAM_E: 788 pes_start = 1; 789 break; 790 791 default: 792 break; 793 } 794 795 while (c < length) { 796 memset(obuf, 0, TS_SIZE); 797 if (length - c >= (TS_SIZE - 4)) { 798 l = write_ts_header2(pid, counter, pes_start, 799 obuf, (TS_SIZE - 4)); 800 memcpy(obuf + l, buf + c, TS_SIZE - l); 801 c += TS_SIZE - l; 802 } else { 803 l = write_ts_header2(pid, counter, pes_start, 804 obuf, length - c); 805 memcpy(obuf + l, buf + c, TS_SIZE - l); 806 c = length; 807 } 808 feed->cb.ts(obuf, 188, NULL, 0, &feed->feed.ts, NULL); 809 pes_start = 0; 810 } 811} 812 813static int write_ts_to_decoder(struct av7110 *av7110, int type, const u8 *buf, size_t len) 814{ 815 struct ipack *ipack = &av7110->ipack[type]; 816 817 if (buf[1] & TRANS_ERROR) { 818 av7110_ipack_reset(ipack); 819 return -1; 820 } 821 822 if (!(buf[3] & PAYLOAD)) 823 return -1; 824 825 if (buf[1] & PAY_START) 826 av7110_ipack_flush(ipack); 827 828 if (buf[3] & ADAPT_FIELD) { 829 if (buf[4] > len - 1 - 4) 830 return 0; 831 len -= buf[4] + 1; 832 buf += buf[4] + 1; 833 } 834 835 av7110_ipack_instant_repack(buf + 4, len - 4, ipack); 836 return 0; 837} 838 839int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len) 840{ 841 struct dvb_demux *demux = feed->demux; 842 struct av7110 *av7110 = demux->priv; 843 844 dprintk(2, "av7110:%p\n", av7110); 845 846 if (av7110->full_ts && demux->dmx.frontend->source != DMX_MEMORY_FE) 847 return 0; 848 849 switch (feed->pes_type) { 850 case 0: 851 if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) 852 return -EINVAL; 853 break; 854 case 1: 855 if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) 856 return -EINVAL; 857 break; 858 default: 859 return -1; 860 } 861 862 return write_ts_to_decoder(av7110, feed->pes_type, buf, len); 863} 864 865/****************************************************************************** 866 * Video MPEG decoder events 867 ******************************************************************************/ 868void dvb_video_add_event(struct av7110 *av7110, struct video_event *event) 869{ 870 struct dvb_video_events *events = &av7110->video_events; 871 int wp; 872 873 spin_lock_bh(&events->lock); 874 875 wp = (events->eventw + 1) % MAX_VIDEO_EVENT; 876 if (wp == events->eventr) { 877 events->overflow = 1; 878 events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT; 879 } 880 881 //FIXME: timestamp? 882 memcpy(&events->events[events->eventw], event, sizeof(struct video_event)); 883 events->eventw = wp; 884 885 spin_unlock_bh(&events->lock); 886 887 wake_up_interruptible(&events->wait_queue); 888} 889 890static int dvb_video_get_event(struct av7110 *av7110, struct video_event *event, int flags) 891{ 892 struct dvb_video_events *events = &av7110->video_events; 893 894 if (events->overflow) { 895 events->overflow = 0; 896 return -EOVERFLOW; 897 } 898 if (events->eventw == events->eventr) { 899 int ret; 900 901 if (flags & O_NONBLOCK) 902 return -EWOULDBLOCK; 903 904 ret = wait_event_interruptible(events->wait_queue, 905 events->eventw != events->eventr); 906 if (ret < 0) 907 return ret; 908 } 909 910 spin_lock_bh(&events->lock); 911 912 memcpy(event, &events->events[events->eventr], 913 sizeof(struct video_event)); 914 events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT; 915 916 spin_unlock_bh(&events->lock); 917 918 return 0; 919} 920 921/****************************************************************************** 922 * DVB device file operations 923 ******************************************************************************/ 924 925static __poll_t dvb_video_poll(struct file *file, poll_table *wait) 926{ 927 struct dvb_device *dvbdev = file->private_data; 928 struct av7110 *av7110 = dvbdev->priv; 929 __poll_t mask = 0; 930 931 dprintk(2, "av7110:%p\n", av7110); 932 933 if ((file->f_flags & O_ACCMODE) != O_RDONLY) 934 poll_wait(file, &av7110->avout.queue, wait); 935 936 poll_wait(file, &av7110->video_events.wait_queue, wait); 937 938 if (av7110->video_events.eventw != av7110->video_events.eventr) 939 mask = EPOLLPRI; 940 941 if ((file->f_flags & O_ACCMODE) != O_RDONLY) { 942 if (av7110->playing) { 943 if (FREE_COND) 944 mask |= (EPOLLOUT | EPOLLWRNORM); 945 } else { 946 /* if not playing: may play if asked for */ 947 mask |= (EPOLLOUT | EPOLLWRNORM); 948 } 949 } 950 951 return mask; 952} 953 954static ssize_t dvb_video_write(struct file *file, const char __user *buf, 955 size_t count, loff_t *ppos) 956{ 957 struct dvb_device *dvbdev = file->private_data; 958 struct av7110 *av7110 = dvbdev->priv; 959 unsigned char c; 960 961 dprintk(2, "av7110:%p\n", av7110); 962 963 if ((file->f_flags & O_ACCMODE) == O_RDONLY) 964 return -EPERM; 965 966 if (av7110->videostate.stream_source != VIDEO_SOURCE_MEMORY) 967 return -EPERM; 968 969 if (get_user(c, buf)) 970 return -EFAULT; 971 if (c == 0x47 && count % TS_SIZE == 0) 972 return ts_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1); 973 else 974 return dvb_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1); 975} 976 977static __poll_t dvb_audio_poll(struct file *file, poll_table *wait) 978{ 979 struct dvb_device *dvbdev = file->private_data; 980 struct av7110 *av7110 = dvbdev->priv; 981 __poll_t mask = 0; 982 983 dprintk(2, "av7110:%p\n", av7110); 984 985 poll_wait(file, &av7110->aout.queue, wait); 986 987 if (av7110->playing) { 988 if (dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024) 989 mask |= (EPOLLOUT | EPOLLWRNORM); 990 } else { 991 /* if not playing: may play if asked for */ 992 mask = (EPOLLOUT | EPOLLWRNORM); 993 } 994 995 return mask; 996} 997 998static ssize_t dvb_audio_write(struct file *file, const char __user *buf, 999 size_t count, loff_t *ppos) 1000{ 1001 struct dvb_device *dvbdev = file->private_data; 1002 struct av7110 *av7110 = dvbdev->priv; 1003 unsigned char c; 1004 1005 dprintk(2, "av7110:%p\n", av7110); 1006 1007 if (av7110->audiostate.stream_source != AUDIO_SOURCE_MEMORY) { 1008 pr_err("not audio source memory\n"); 1009 return -EPERM; 1010 } 1011 1012 if (get_user(c, buf)) 1013 return -EFAULT; 1014 if (c == 0x47 && count % TS_SIZE == 0) 1015 return ts_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 0); 1016 else 1017 return dvb_aplay(av7110, buf, count, file->f_flags & O_NONBLOCK, 0); 1018} 1019 1020static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 }; 1021 1022#define MIN_IFRAME 400000 1023 1024static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock) 1025{ 1026 unsigned int i, n; 1027 int progressive = 0; 1028 int match = 0; 1029 1030 dprintk(2, "av7110:%p\n", av7110); 1031 1032 if (len == 0) 1033 return 0; 1034 1035 if (!(av7110->playing & RP_VIDEO)) { 1036 if (av7110_av_start_play(av7110, RP_VIDEO) < 0) 1037 return -EBUSY; 1038 } 1039 1040 /* search in buf for instances of 00 00 01 b5 1? */ 1041 for (i = 0; i < len; i++) { 1042 unsigned char c; 1043 1044 if (get_user(c, buf + i)) 1045 return -EFAULT; 1046 if (match == 5) { 1047 progressive = c & 0x08; 1048 match = 0; 1049 } 1050 if (c == 0x00) { 1051 match = (match == 1 || match == 2) ? 2 : 1; 1052 continue; 1053 } 1054 switch (match++) { 1055 case 2: 1056 if (c == 0x01) 1057 continue; 1058 break; 1059 case 3: 1060 if (c == 0xb5) 1061 continue; 1062 break; 1063 case 4: 1064 if ((c & 0xf0) == 0x10) 1065 continue; 1066 break; 1067 } 1068 match = 0; 1069 } 1070 1071 /* setting n always > 1, fixes problems when playing stillframes 1072 * consisting of I- and P-Frames 1073 */ 1074 n = MIN_IFRAME / len + 1; 1075 1076 /* FIXME: nonblock? */ 1077 dvb_play_kernel(av7110, iframe_header, sizeof(iframe_header), 0, 1); 1078 1079 for (i = 0; i < n; i++) 1080 dvb_play(av7110, buf, len, 0, 1); 1081 1082 av7110_ipack_flush(&av7110->ipack[1]); 1083 1084 if (progressive) 1085 return vidcom(av7110, AV_VIDEO_CMD_FREEZE, 1); 1086 else 1087 return 0; 1088} 1089 1090#ifdef CONFIG_COMPAT 1091struct compat_video_still_picture { 1092 compat_uptr_t iFrame; 1093 s32 size; 1094}; 1095 1096#define VIDEO_STILLPICTURE32 _IOW('o', 30, struct compat_video_still_picture) 1097 1098struct compat_video_event { 1099 __s32 type; 1100 /* unused, make sure to use atomic time for y2038 if it ever gets used */ 1101 compat_long_t timestamp; 1102 union { 1103 video_size_t size; 1104 unsigned int frame_rate; /* in frames per 1000sec */ 1105 unsigned char vsync_field; /* unknown/odd/even/progressive */ 1106 } u; 1107}; 1108 1109#define VIDEO_GET_EVENT32 _IOR('o', 28, struct compat_video_event) 1110 1111static int dvb_compat_video_get_event(struct av7110 *av7110, 1112 struct compat_video_event *event, int flags) 1113{ 1114 struct video_event ev; 1115 int ret; 1116 1117 ret = dvb_video_get_event(av7110, &ev, flags); 1118 1119 *event = (struct compat_video_event) { 1120 .type = ev.type, 1121 .timestamp = ev.timestamp, 1122 .u.size = ev.u.size, 1123 }; 1124 1125 return ret; 1126} 1127#endif 1128 1129static int dvb_video_ioctl(struct file *file, 1130 unsigned int cmd, void *parg) 1131{ 1132 struct dvb_device *dvbdev = file->private_data; 1133 struct av7110 *av7110 = dvbdev->priv; 1134 unsigned long arg = (unsigned long)parg; 1135 int ret = 0; 1136 1137 dprintk(1, "av7110:%p, cmd=%04x\n", av7110, cmd); 1138 1139 if ((file->f_flags & O_ACCMODE) == O_RDONLY) { 1140 if (cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT && 1141 cmd != VIDEO_GET_SIZE) { 1142 return -EPERM; 1143 } 1144 } 1145 1146 if (mutex_lock_interruptible(&av7110->ioctl_mutex)) 1147 return -ERESTARTSYS; 1148 1149 switch (cmd) { 1150 case VIDEO_STOP: 1151 av7110->videostate.play_state = VIDEO_STOPPED; 1152 if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) 1153 ret = av7110_av_stop(av7110, RP_VIDEO); 1154 else 1155 ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 1156 av7110->videostate.video_blank ? 0 : 1); 1157 if (!ret) 1158 av7110->trickmode = TRICK_NONE; 1159 break; 1160 1161 case VIDEO_PLAY: 1162 av7110->trickmode = TRICK_NONE; 1163 if (av7110->videostate.play_state == VIDEO_FREEZED) { 1164 av7110->videostate.play_state = VIDEO_PLAYING; 1165 ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1166 if (ret) 1167 break; 1168 } 1169 if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { 1170 if (av7110->playing == RP_AV) { 1171 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); 1172 if (ret) 1173 break; 1174 av7110->playing &= ~RP_VIDEO; 1175 } 1176 ret = av7110_av_start_play(av7110, RP_VIDEO); 1177 } 1178 if (!ret) 1179 ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1180 if (!ret) 1181 av7110->videostate.play_state = VIDEO_PLAYING; 1182 break; 1183 1184 case VIDEO_FREEZE: 1185 av7110->videostate.play_state = VIDEO_FREEZED; 1186 if (av7110->playing & RP_VIDEO) 1187 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); 1188 else 1189 ret = vidcom(av7110, AV_VIDEO_CMD_FREEZE, 1); 1190 if (!ret) 1191 av7110->trickmode = TRICK_FREEZE; 1192 break; 1193 1194 case VIDEO_CONTINUE: 1195 if (av7110->playing & RP_VIDEO) 1196 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); 1197 if (!ret) 1198 ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1199 if (!ret) { 1200 av7110->videostate.play_state = VIDEO_PLAYING; 1201 av7110->trickmode = TRICK_NONE; 1202 } 1203 break; 1204 1205 case VIDEO_SELECT_SOURCE: 1206 av7110->videostate.stream_source = (video_stream_source_t)arg; 1207 break; 1208 1209 case VIDEO_SET_BLANK: 1210 av7110->videostate.video_blank = (int)arg; 1211 break; 1212 1213 case VIDEO_GET_STATUS: 1214 memcpy(parg, &av7110->videostate, sizeof(struct video_status)); 1215 break; 1216 1217#ifdef CONFIG_COMPAT 1218 case VIDEO_GET_EVENT32: 1219 ret = dvb_compat_video_get_event(av7110, parg, file->f_flags); 1220 break; 1221#endif 1222 1223 case VIDEO_GET_EVENT: 1224 ret = dvb_video_get_event(av7110, parg, file->f_flags); 1225 break; 1226 1227 case VIDEO_GET_SIZE: 1228 memcpy(parg, &av7110->video_size, sizeof(video_size_t)); 1229 break; 1230 1231 case VIDEO_SET_DISPLAY_FORMAT: 1232 { 1233 video_displayformat_t format = (video_displayformat_t)arg; 1234 1235 switch (format) { 1236 case VIDEO_PAN_SCAN: 1237 av7110->display_panscan = VID_PAN_SCAN_PREF; 1238 break; 1239 case VIDEO_LETTER_BOX: 1240 av7110->display_panscan = VID_VC_AND_PS_PREF; 1241 break; 1242 case VIDEO_CENTER_CUT_OUT: 1243 av7110->display_panscan = VID_CENTRE_CUT_PREF; 1244 break; 1245 default: 1246 ret = -EINVAL; 1247 } 1248 if (ret < 0) 1249 break; 1250 av7110->videostate.display_format = format; 1251 ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType, 1252 1, av7110->display_panscan); 1253 break; 1254 } 1255 1256 case VIDEO_SET_FORMAT: 1257 if (arg > 1) { 1258 ret = -EINVAL; 1259 break; 1260 } 1261 av7110->display_ar = arg; 1262 ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetMonitorType, 1263 1, (u16)arg); 1264 break; 1265 1266#ifdef CONFIG_COMPAT 1267 case VIDEO_STILLPICTURE32: 1268 { 1269 struct compat_video_still_picture *pic = 1270 (struct compat_video_still_picture *)parg; 1271 av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY; 1272 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); 1273 ret = play_iframe(av7110, compat_ptr(pic->iFrame), 1274 pic->size, file->f_flags & O_NONBLOCK); 1275 break; 1276 } 1277#endif 1278 1279 case VIDEO_STILLPICTURE: 1280 { 1281 struct video_still_picture *pic = 1282 (struct video_still_picture *)parg; 1283 av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY; 1284 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); 1285 ret = play_iframe(av7110, pic->iFrame, pic->size, 1286 file->f_flags & O_NONBLOCK); 1287 break; 1288 } 1289 1290 case VIDEO_FAST_FORWARD: 1291 //note: arg is ignored by firmware 1292 if (av7110->playing & RP_VIDEO) 1293 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1294 __Scan_I, 2, AV_PES, 0); 1295 else 1296 ret = vidcom(av7110, AV_VIDEO_CMD_FFWD, arg); 1297 if (!ret) { 1298 av7110->trickmode = TRICK_FAST; 1299 av7110->videostate.play_state = VIDEO_PLAYING; 1300 } 1301 break; 1302 1303 case VIDEO_SLOWMOTION: 1304 if (av7110->playing & RP_VIDEO) { 1305 if (av7110->trickmode != TRICK_SLOW) 1306 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); 1307 if (!ret) 1308 ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1309 } else { 1310 ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1311 if (!ret) 1312 ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 0); 1313 if (!ret) 1314 ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1315 } 1316 if (!ret) { 1317 av7110->trickmode = TRICK_SLOW; 1318 av7110->videostate.play_state = VIDEO_PLAYING; 1319 } 1320 break; 1321 1322 case VIDEO_GET_CAPABILITIES: 1323 *(int *)parg = VIDEO_CAP_MPEG1 | VIDEO_CAP_MPEG2 | 1324 VIDEO_CAP_SYS | VIDEO_CAP_PROG; 1325 break; 1326 1327 case VIDEO_CLEAR_BUFFER: 1328 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); 1329 av7110_ipack_reset(&av7110->ipack[1]); 1330 if (av7110->playing == RP_AV) { 1331 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1332 __Play, 2, AV_PES, 0); 1333 if (ret) 1334 break; 1335 if (av7110->trickmode == TRICK_FAST) 1336 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1337 __Scan_I, 2, AV_PES, 0); 1338 if (av7110->trickmode == TRICK_SLOW) { 1339 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1340 __Slow, 2, 0, 0); 1341 if (!ret) 1342 ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1343 } 1344 if (av7110->trickmode == TRICK_FREEZE) 1345 ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 1); 1346 } 1347 break; 1348 1349 case VIDEO_SET_STREAMTYPE: 1350 break; 1351 1352 default: 1353 ret = -ENOIOCTLCMD; 1354 break; 1355 } 1356 1357 mutex_unlock(&av7110->ioctl_mutex); 1358 return ret; 1359} 1360 1361static int dvb_audio_ioctl(struct file *file, 1362 unsigned int cmd, void *parg) 1363{ 1364 struct dvb_device *dvbdev = file->private_data; 1365 struct av7110 *av7110 = dvbdev->priv; 1366 unsigned long arg = (unsigned long)parg; 1367 int ret = 0; 1368 1369 dprintk(1, "av7110:%p, cmd=%04x\n", av7110, cmd); 1370 1371 if (((file->f_flags & O_ACCMODE) == O_RDONLY) && 1372 (cmd != AUDIO_GET_STATUS)) 1373 return -EPERM; 1374 1375 if (mutex_lock_interruptible(&av7110->ioctl_mutex)) 1376 return -ERESTARTSYS; 1377 1378 switch (cmd) { 1379 case AUDIO_STOP: 1380 if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) 1381 ret = av7110_av_stop(av7110, RP_AUDIO); 1382 else 1383 ret = audcom(av7110, AUDIO_CMD_MUTE); 1384 if (!ret) 1385 av7110->audiostate.play_state = AUDIO_STOPPED; 1386 break; 1387 1388 case AUDIO_PLAY: 1389 if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) 1390 ret = av7110_av_start_play(av7110, RP_AUDIO); 1391 if (!ret) 1392 ret = audcom(av7110, AUDIO_CMD_UNMUTE); 1393 if (!ret) 1394 av7110->audiostate.play_state = AUDIO_PLAYING; 1395 break; 1396 1397 case AUDIO_PAUSE: 1398 ret = audcom(av7110, AUDIO_CMD_MUTE); 1399 if (!ret) 1400 av7110->audiostate.play_state = AUDIO_PAUSED; 1401 break; 1402 1403 case AUDIO_CONTINUE: 1404 if (av7110->audiostate.play_state == AUDIO_PAUSED) { 1405 av7110->audiostate.play_state = AUDIO_PLAYING; 1406 ret = audcom(av7110, AUDIO_CMD_UNMUTE | AUDIO_CMD_PCM16); 1407 } 1408 break; 1409 1410 case AUDIO_SELECT_SOURCE: 1411 av7110->audiostate.stream_source = (audio_stream_source_t)arg; 1412 break; 1413 1414 case AUDIO_SET_MUTE: 1415 { 1416 ret = audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE); 1417 if (!ret) 1418 av7110->audiostate.mute_state = (int)arg; 1419 break; 1420 } 1421 1422 case AUDIO_SET_AV_SYNC: 1423 av7110->audiostate.AV_sync_state = (int)arg; 1424 ret = audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF); 1425 break; 1426 1427 case AUDIO_SET_BYPASS_MODE: 1428 if (FW_VERSION(av7110->arm_app) < 0x2621) 1429 ret = -EINVAL; 1430 av7110->audiostate.bypass_mode = (int)arg; 1431 break; 1432 1433 case AUDIO_CHANNEL_SELECT: 1434 av7110->audiostate.channel_select = (audio_channel_select_t)arg; 1435 switch (av7110->audiostate.channel_select) { 1436 case AUDIO_STEREO: 1437 ret = audcom(av7110, AUDIO_CMD_STEREO); 1438 if (!ret) { 1439 if (av7110->adac_type == DVB_ADAC_CRYSTAL) 1440 i2c_writereg(av7110, 0x20, 0x02, 0x49); 1441 else if (av7110->adac_type == DVB_ADAC_MSP34x5) 1442 msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); 1443 } 1444 break; 1445 case AUDIO_MONO_LEFT: 1446 ret = audcom(av7110, AUDIO_CMD_MONO_L); 1447 if (!ret) { 1448 if (av7110->adac_type == DVB_ADAC_CRYSTAL) 1449 i2c_writereg(av7110, 0x20, 0x02, 0x4a); 1450 else if (av7110->adac_type == DVB_ADAC_MSP34x5) 1451 msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200); 1452 } 1453 break; 1454 case AUDIO_MONO_RIGHT: 1455 ret = audcom(av7110, AUDIO_CMD_MONO_R); 1456 if (!ret) { 1457 if (av7110->adac_type == DVB_ADAC_CRYSTAL) 1458 i2c_writereg(av7110, 0x20, 0x02, 0x45); 1459 else if (av7110->adac_type == DVB_ADAC_MSP34x5) 1460 msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210); 1461 } 1462 break; 1463 default: 1464 ret = -EINVAL; 1465 break; 1466 } 1467 break; 1468 1469 case AUDIO_GET_STATUS: 1470 memcpy(parg, &av7110->audiostate, sizeof(struct audio_status)); 1471 break; 1472 1473 case AUDIO_GET_CAPABILITIES: 1474 if (FW_VERSION(av7110->arm_app) < 0x2621) 1475 *(unsigned int *)parg = AUDIO_CAP_LPCM | AUDIO_CAP_MP1 | AUDIO_CAP_MP2; 1476 else 1477 *(unsigned int *)parg = AUDIO_CAP_LPCM | AUDIO_CAP_DTS | AUDIO_CAP_AC3 | 1478 AUDIO_CAP_MP1 | AUDIO_CAP_MP2; 1479 break; 1480 1481 case AUDIO_CLEAR_BUFFER: 1482 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); 1483 av7110_ipack_reset(&av7110->ipack[0]); 1484 if (av7110->playing == RP_AV) 1485 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1486 __Play, 2, AV_PES, 0); 1487 break; 1488 1489 case AUDIO_SET_ID: 1490 break; 1491 1492 case AUDIO_SET_MIXER: 1493 { 1494 struct audio_mixer *amix = (struct audio_mixer *)parg; 1495 1496 ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right); 1497 break; 1498 } 1499 1500 case AUDIO_SET_STREAMTYPE: 1501 break; 1502 1503 default: 1504 ret = -ENOIOCTLCMD; 1505 } 1506 1507 mutex_unlock(&av7110->ioctl_mutex); 1508 return ret; 1509} 1510 1511static int dvb_video_open(struct inode *inode, struct file *file) 1512{ 1513 struct dvb_device *dvbdev = file->private_data; 1514 struct av7110 *av7110 = dvbdev->priv; 1515 int err; 1516 1517 dprintk(2, "av7110:%p\n", av7110); 1518 1519 err = dvb_generic_open(inode, file); 1520 if (err < 0) 1521 return err; 1522 1523 if ((file->f_flags & O_ACCMODE) != O_RDONLY) { 1524 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); 1525 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); 1526 av7110->video_blank = 1; 1527 av7110->audiostate.AV_sync_state = 1; 1528 av7110->videostate.stream_source = VIDEO_SOURCE_DEMUX; 1529 1530 /* empty event queue */ 1531 av7110->video_events.eventr = 0; 1532 av7110->video_events.eventw = 0; 1533 } 1534 1535 return 0; 1536} 1537 1538static int dvb_video_release(struct inode *inode, struct file *file) 1539{ 1540 struct dvb_device *dvbdev = file->private_data; 1541 struct av7110 *av7110 = dvbdev->priv; 1542 1543 dprintk(2, "av7110:%p\n", av7110); 1544 1545 if ((file->f_flags & O_ACCMODE) != O_RDONLY) 1546 av7110_av_stop(av7110, RP_VIDEO); 1547 1548 return dvb_generic_release(inode, file); 1549} 1550 1551static int dvb_audio_open(struct inode *inode, struct file *file) 1552{ 1553 struct dvb_device *dvbdev = file->private_data; 1554 struct av7110 *av7110 = dvbdev->priv; 1555 int err = dvb_generic_open(inode, file); 1556 1557 dprintk(2, "av7110:%p\n", av7110); 1558 1559 if (err < 0) 1560 return err; 1561 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); 1562 av7110->audiostate.stream_source = AUDIO_SOURCE_DEMUX; 1563 return 0; 1564} 1565 1566static int dvb_audio_release(struct inode *inode, struct file *file) 1567{ 1568 struct dvb_device *dvbdev = file->private_data; 1569 struct av7110 *av7110 = dvbdev->priv; 1570 1571 dprintk(2, "av7110:%p\n", av7110); 1572 1573 av7110_av_stop(av7110, RP_AUDIO); 1574 return dvb_generic_release(inode, file); 1575} 1576 1577/****************************************************************************** 1578 * driver registration 1579 ******************************************************************************/ 1580 1581static const struct file_operations dvb_video_fops = { 1582 .owner = THIS_MODULE, 1583 .write = dvb_video_write, 1584 .unlocked_ioctl = dvb_generic_ioctl, 1585 .compat_ioctl = dvb_generic_ioctl, 1586 .open = dvb_video_open, 1587 .release = dvb_video_release, 1588 .poll = dvb_video_poll, 1589 .llseek = noop_llseek, 1590}; 1591 1592static struct dvb_device dvbdev_video = { 1593 .priv = NULL, 1594 .users = 6, 1595 .readers = 5, /* arbitrary */ 1596 .writers = 1, 1597 .fops = &dvb_video_fops, 1598 .kernel_ioctl = dvb_video_ioctl, 1599}; 1600 1601static const struct file_operations dvb_audio_fops = { 1602 .owner = THIS_MODULE, 1603 .write = dvb_audio_write, 1604 .unlocked_ioctl = dvb_generic_ioctl, 1605 .compat_ioctl = dvb_generic_ioctl, 1606 .open = dvb_audio_open, 1607 .release = dvb_audio_release, 1608 .poll = dvb_audio_poll, 1609 .llseek = noop_llseek, 1610}; 1611 1612static struct dvb_device dvbdev_audio = { 1613 .priv = NULL, 1614 .users = 1, 1615 .writers = 1, 1616 .fops = &dvb_audio_fops, 1617 .kernel_ioctl = dvb_audio_ioctl, 1618}; 1619 1620int av7110_av_register(struct av7110 *av7110) 1621{ 1622 av7110->audiostate.AV_sync_state = 0; 1623 av7110->audiostate.mute_state = 0; 1624 av7110->audiostate.play_state = AUDIO_STOPPED; 1625 av7110->audiostate.stream_source = AUDIO_SOURCE_DEMUX; 1626 av7110->audiostate.channel_select = AUDIO_STEREO; 1627 av7110->audiostate.bypass_mode = 0; 1628 1629 av7110->videostate.video_blank = 0; 1630 av7110->videostate.play_state = VIDEO_STOPPED; 1631 av7110->videostate.stream_source = VIDEO_SOURCE_DEMUX; 1632 av7110->videostate.video_format = VIDEO_FORMAT_4_3; 1633 av7110->videostate.display_format = VIDEO_LETTER_BOX; 1634 av7110->display_ar = VIDEO_FORMAT_4_3; 1635 av7110->display_panscan = VID_VC_AND_PS_PREF; 1636 1637 init_waitqueue_head(&av7110->video_events.wait_queue); 1638 spin_lock_init(&av7110->video_events.lock); 1639 av7110->video_events.eventw = 0; 1640 av7110->video_events.eventr = 0; 1641 av7110->video_events.overflow = 0; 1642 memset(&av7110->video_size, 0, sizeof(video_size_t)); 1643 1644 dvb_register_device(&av7110->dvb_adapter, &av7110->video_dev, 1645 &dvbdev_video, av7110, DVB_DEVICE_VIDEO, 0); 1646 1647 dvb_register_device(&av7110->dvb_adapter, &av7110->audio_dev, 1648 &dvbdev_audio, av7110, DVB_DEVICE_AUDIO, 0); 1649 1650 return 0; 1651} 1652 1653void av7110_av_unregister(struct av7110 *av7110) 1654{ 1655 dvb_unregister_device(av7110->audio_dev); 1656 dvb_unregister_device(av7110->video_dev); 1657} 1658 1659int av7110_av_init(struct av7110 *av7110) 1660{ 1661 void (*play[])(u8 *, int, void *) = { play_audio_cb, play_video_cb }; 1662 int i, ret; 1663 1664 for (i = 0; i < 2; i++) { 1665 struct ipack *ipack = av7110->ipack + i; 1666 1667 ret = av7110_ipack_init(ipack, IPACKS, play[i]); 1668 if (ret < 0) { 1669 if (i) 1670 av7110_ipack_free(--ipack); 1671 goto out; 1672 } 1673 ipack->data = av7110; 1674 } 1675 1676 dvb_ringbuffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN); 1677 dvb_ringbuffer_init(&av7110->aout, av7110->iobuf + AVOUTLEN, AOUTLEN); 1678 1679 av7110->kbuf[0] = (u8 *)(av7110->iobuf + AVOUTLEN + AOUTLEN + BMPLEN); 1680 av7110->kbuf[1] = av7110->kbuf[0] + 2 * IPACKS; 1681out: 1682 return ret; 1683} 1684 1685void av7110_av_exit(struct av7110 *av7110) 1686{ 1687 av7110_ipack_free(&av7110->ipack[0]); 1688 av7110_ipack_free(&av7110->ipack[1]); 1689}
~/
Read-only file preview.