av7110_av.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524
  1. /*
  2. * av7110_av.c: audio and video MPEG decoder stuff
  3. *
  4. * Copyright (C) 1999-2002 Ralph Metzler
  5. * & Marcus Metzler for convergence integrated media GmbH
  6. *
  7. * originally based on code by:
  8. * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License
  12. * as published by the Free Software Foundation; either version 2
  13. * of the License, or (at your option) any later version.
  14. *
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  25. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  26. *
  27. *
  28. * the project's page is at http://www.linuxtv.org/dvb/
  29. */
  30. #include <linux/types.h>
  31. #include <linux/kernel.h>
  32. #include <linux/string.h>
  33. #include <linux/delay.h>
  34. #include <linux/smp_lock.h>
  35. #include <linux/fs.h>
  36. #include "av7110.h"
  37. #include "av7110_hw.h"
  38. #include "av7110_av.h"
  39. #include "av7110_ipack.h"
  40. /* MPEG-2 (ISO 13818 / H.222.0) stream types */
  41. #define PROG_STREAM_MAP 0xBC
  42. #define PRIVATE_STREAM1 0xBD
  43. #define PADDING_STREAM 0xBE
  44. #define PRIVATE_STREAM2 0xBF
  45. #define AUDIO_STREAM_S 0xC0
  46. #define AUDIO_STREAM_E 0xDF
  47. #define VIDEO_STREAM_S 0xE0
  48. #define VIDEO_STREAM_E 0xEF
  49. #define ECM_STREAM 0xF0
  50. #define EMM_STREAM 0xF1
  51. #define DSM_CC_STREAM 0xF2
  52. #define ISO13522_STREAM 0xF3
  53. #define PROG_STREAM_DIR 0xFF
  54. #define PTS_DTS_FLAGS 0xC0
  55. //pts_dts flags
  56. #define PTS_ONLY 0x80
  57. #define PTS_DTS 0xC0
  58. #define TS_SIZE 188
  59. #define TRANS_ERROR 0x80
  60. #define PAY_START 0x40
  61. #define TRANS_PRIO 0x20
  62. #define PID_MASK_HI 0x1F
  63. //flags
  64. #define TRANS_SCRMBL1 0x80
  65. #define TRANS_SCRMBL2 0x40
  66. #define ADAPT_FIELD 0x20
  67. #define PAYLOAD 0x10
  68. #define COUNT_MASK 0x0F
  69. // adaptation flags
  70. #define DISCON_IND 0x80
  71. #define RAND_ACC_IND 0x40
  72. #define ES_PRI_IND 0x20
  73. #define PCR_FLAG 0x10
  74. #define OPCR_FLAG 0x08
  75. #define SPLICE_FLAG 0x04
  76. #define TRANS_PRIV 0x02
  77. #define ADAP_EXT_FLAG 0x01
  78. // adaptation extension flags
  79. #define LTW_FLAG 0x80
  80. #define PIECE_RATE 0x40
  81. #define SEAM_SPLICE 0x20
  82. static void p_to_t(u8 const *buf, long int length, u16 pid,
  83. u8 *counter, struct dvb_demux_feed *feed);
  84. int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len)
  85. {
  86. struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *) p2t->priv;
  87. if (!(dvbdmxfeed->ts_type & TS_PACKET))
  88. return 0;
  89. if (buf[3] == 0xe0) // video PES do not have a length in TS
  90. buf[4] = buf[5] = 0;
  91. if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
  92. return dvbdmxfeed->cb.ts(buf, len, NULL, 0,
  93. &dvbdmxfeed->feed.ts, DMX_OK);
  94. else
  95. return dvb_filter_pes2ts(p2t, buf, len, 1);
  96. }
  97. static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
  98. {
  99. struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *) priv;
  100. dvbdmxfeed->cb.ts(data, 188, NULL, 0,
  101. &dvbdmxfeed->feed.ts, DMX_OK);
  102. return 0;
  103. }
  104. int 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. dprintk(2, "av7110:%p, , dvb_demux_feed:%p\n", av7110, dvbdmxfeed);
  110. if (av7110->playing || (av7110->rec_mode & av))
  111. return -EBUSY;
  112. av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
  113. dvbdmx->recording = 1;
  114. av7110->rec_mode |= av;
  115. switch (av7110->rec_mode) {
  116. case RP_AUDIO:
  117. dvb_filter_pes2ts_init(&av7110->p2t[0],
  118. dvbdmx->pesfilter[0]->pid,
  119. dvb_filter_pes2ts_cb,
  120. (void *) dvbdmx->pesfilter[0]);
  121. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
  122. break;
  123. case RP_VIDEO:
  124. dvb_filter_pes2ts_init(&av7110->p2t[1],
  125. dvbdmx->pesfilter[1]->pid,
  126. dvb_filter_pes2ts_cb,
  127. (void *) dvbdmx->pesfilter[1]);
  128. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
  129. break;
  130. case RP_AV:
  131. dvb_filter_pes2ts_init(&av7110->p2t[0],
  132. dvbdmx->pesfilter[0]->pid,
  133. dvb_filter_pes2ts_cb,
  134. (void *) dvbdmx->pesfilter[0]);
  135. dvb_filter_pes2ts_init(&av7110->p2t[1],
  136. dvbdmx->pesfilter[1]->pid,
  137. dvb_filter_pes2ts_cb,
  138. (void *) dvbdmx->pesfilter[1]);
  139. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0);
  140. break;
  141. }
  142. return ret;
  143. }
  144. int av7110_av_start_play(struct av7110 *av7110, int av)
  145. {
  146. int ret = 0;
  147. dprintk(2, "av7110:%p, \n", av7110);
  148. if (av7110->rec_mode)
  149. return -EBUSY;
  150. if (av7110->playing & av)
  151. return -EBUSY;
  152. av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
  153. if (av7110->playing == RP_NONE) {
  154. av7110_ipack_reset(&av7110->ipack[0]);
  155. av7110_ipack_reset(&av7110->ipack[1]);
  156. }
  157. av7110->playing |= av;
  158. switch (av7110->playing) {
  159. case RP_AUDIO:
  160. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
  161. break;
  162. case RP_VIDEO:
  163. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
  164. av7110->sinfo = 0;
  165. break;
  166. case RP_AV:
  167. av7110->sinfo = 0;
  168. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0);
  169. break;
  170. }
  171. if (!ret)
  172. ret = av7110->playing;
  173. return ret;
  174. }
  175. int av7110_av_stop(struct av7110 *av7110, int av)
  176. {
  177. int ret = 0;
  178. dprintk(2, "av7110:%p, \n", av7110);
  179. if (!(av7110->playing & av) && !(av7110->rec_mode & av))
  180. return 0;
  181. av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
  182. if (av7110->playing) {
  183. av7110->playing &= ~av;
  184. switch (av7110->playing) {
  185. case RP_AUDIO:
  186. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
  187. break;
  188. case RP_VIDEO:
  189. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
  190. break;
  191. case RP_NONE:
  192. ret = av7110_set_vidmode(av7110, av7110->vidmode);
  193. break;
  194. }
  195. } else {
  196. av7110->rec_mode &= ~av;
  197. switch (av7110->rec_mode) {
  198. case RP_AUDIO:
  199. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
  200. break;
  201. case RP_VIDEO:
  202. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
  203. break;
  204. case RP_NONE:
  205. break;
  206. }
  207. }
  208. return ret;
  209. }
  210. int av7110_pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen)
  211. {
  212. int len;
  213. u32 sync;
  214. u16 blen;
  215. if (!dlen) {
  216. wake_up(&buf->queue);
  217. return -1;
  218. }
  219. while (1) {
  220. if ((len = dvb_ringbuffer_avail(buf)) < 6)
  221. return -1;
  222. sync = DVB_RINGBUFFER_PEEK(buf, 0) << 24;
  223. sync |= DVB_RINGBUFFER_PEEK(buf, 1) << 16;
  224. sync |= DVB_RINGBUFFER_PEEK(buf, 2) << 8;
  225. sync |= DVB_RINGBUFFER_PEEK(buf, 3);
  226. if (((sync &~ 0x0f) == 0x000001e0) ||
  227. ((sync &~ 0x1f) == 0x000001c0) ||
  228. (sync == 0x000001bd))
  229. break;
  230. printk("resync\n");
  231. DVB_RINGBUFFER_SKIP(buf, 1);
  232. }
  233. blen = DVB_RINGBUFFER_PEEK(buf, 4) << 8;
  234. blen |= DVB_RINGBUFFER_PEEK(buf, 5);
  235. blen += 6;
  236. if (len < blen || blen > dlen) {
  237. //printk("buffer empty - avail %d blen %u dlen %d\n", len, blen, dlen);
  238. wake_up(&buf->queue);
  239. return -1;
  240. }
  241. dvb_ringbuffer_read(buf, dest, (size_t) blen, 0);
  242. dprintk(2, "pread=0x%08lx, pwrite=0x%08lx\n",
  243. (unsigned long) buf->pread, (unsigned long) buf->pwrite);
  244. wake_up(&buf->queue);
  245. return blen;
  246. }
  247. int av7110_set_volume(struct av7110 *av7110, int volleft, int volright)
  248. {
  249. int err, vol, val, balance = 0;
  250. dprintk(2, "av7110:%p, \n", av7110);
  251. av7110->mixer.volume_left = volleft;
  252. av7110->mixer.volume_right = volright;
  253. switch (av7110->adac_type) {
  254. case DVB_ADAC_TI:
  255. volleft = (volleft * 256) / 1036;
  256. volright = (volright * 256) / 1036;
  257. if (volleft > 0x3f)
  258. volleft = 0x3f;
  259. if (volright > 0x3f)
  260. volright = 0x3f;
  261. if ((err = SendDAC(av7110, 3, 0x80 + volleft)))
  262. return err;
  263. return SendDAC(av7110, 4, volright);
  264. case DVB_ADAC_CRYSTAL:
  265. volleft = 127 - volleft / 2;
  266. volright = 127 - volright / 2;
  267. i2c_writereg(av7110, 0x20, 0x03, volleft);
  268. i2c_writereg(av7110, 0x20, 0x04, volright);
  269. return 0;
  270. case DVB_ADAC_MSP34x0:
  271. vol = (volleft > volright) ? volleft : volright;
  272. val = (vol * 0x73 / 255) << 8;
  273. if (vol > 0)
  274. balance = ((volright - volleft) * 127) / vol;
  275. msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8);
  276. msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
  277. msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */
  278. return 0;
  279. case DVB_ADAC_MSP34x5:
  280. vol = (volleft > volright) ? volleft : volright;
  281. val = (vol * 0x73 / 255) << 8;
  282. if (vol > 0)
  283. balance = ((volright - volleft) * 127) / vol;
  284. msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8);
  285. msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
  286. return 0;
  287. }
  288. return 0;
  289. }
  290. int av7110_set_vidmode(struct av7110 *av7110, int mode)
  291. {
  292. int ret;
  293. dprintk(2, "av7110:%p, \n", av7110);
  294. ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode);
  295. if (!ret && !av7110->playing) {
  296. ret = ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO],
  297. av7110->pids[DMX_PES_AUDIO],
  298. av7110->pids[DMX_PES_TELETEXT],
  299. 0, av7110->pids[DMX_PES_PCR]);
  300. if (!ret)
  301. ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
  302. }
  303. return ret;
  304. }
  305. static int sw2mode[16] = {
  306. VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL,
  307. VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC,
  308. VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
  309. VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
  310. };
  311. static int get_video_format(struct av7110 *av7110, u8 *buf, int count)
  312. {
  313. int i;
  314. int hsize, vsize;
  315. int sw;
  316. u8 *p;
  317. int ret = 0;
  318. dprintk(2, "av7110:%p, \n", av7110);
  319. if (av7110->sinfo)
  320. return 0;
  321. for (i = 7; i < count - 10; i++) {
  322. p = buf + i;
  323. if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3)
  324. continue;
  325. p += 4;
  326. hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4);
  327. vsize = ((p[1] &0x0F) << 8) | (p[2]);
  328. sw = (p[3] & 0x0F);
  329. ret = av7110_set_vidmode(av7110, sw2mode[sw]);
  330. if (!ret) {
  331. dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw);
  332. av7110->sinfo = 1;
  333. }
  334. break;
  335. }
  336. return ret;
  337. }
  338. /****************************************************************************
  339. * I/O buffer management and control
  340. ****************************************************************************/
  341. static inline long aux_ring_buffer_write(struct dvb_ringbuffer *rbuf,
  342. const char *buf, unsigned long count)
  343. {
  344. unsigned long todo = count;
  345. int free;
  346. while (todo > 0) {
  347. if (dvb_ringbuffer_free(rbuf) < 2048) {
  348. if (wait_event_interruptible(rbuf->queue,
  349. (dvb_ringbuffer_free(rbuf) >= 2048)))
  350. return count - todo;
  351. }
  352. free = dvb_ringbuffer_free(rbuf);
  353. if (free > todo)
  354. free = todo;
  355. dvb_ringbuffer_write(rbuf, buf, free);
  356. todo -= free;
  357. buf += free;
  358. }
  359. return count - todo;
  360. }
  361. static void play_video_cb(u8 *buf, int count, void *priv)
  362. {
  363. struct av7110 *av7110 = (struct av7110 *) priv;
  364. dprintk(2, "av7110:%p, \n", av7110);
  365. if ((buf[3] & 0xe0) == 0xe0) {
  366. get_video_format(av7110, buf, count);
  367. aux_ring_buffer_write(&av7110->avout, buf, count);
  368. } else
  369. aux_ring_buffer_write(&av7110->aout, buf, count);
  370. }
  371. static void play_audio_cb(u8 *buf, int count, void *priv)
  372. {
  373. struct av7110 *av7110 = (struct av7110 *) priv;
  374. dprintk(2, "av7110:%p, \n", av7110);
  375. aux_ring_buffer_write(&av7110->aout, buf, count);
  376. }
  377. #define FREE_COND (dvb_ringbuffer_free(&av7110->avout) >= 20 * 1024 && \
  378. dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024)
  379. static ssize_t dvb_play(struct av7110 *av7110, const u8 __user *buf,
  380. unsigned long count, int nonblock, int type)
  381. {
  382. unsigned long todo = count, n;
  383. dprintk(2, "av7110:%p, \n", av7110);
  384. if (!av7110->kbuf[type])
  385. return -ENOBUFS;
  386. if (nonblock && !FREE_COND)
  387. return -EWOULDBLOCK;
  388. while (todo > 0) {
  389. if (!FREE_COND) {
  390. if (nonblock)
  391. return count - todo;
  392. if (wait_event_interruptible(av7110->avout.queue,
  393. FREE_COND))
  394. return count - todo;
  395. }
  396. n = todo;
  397. if (n > IPACKS * 2)
  398. n = IPACKS * 2;
  399. if (copy_from_user(av7110->kbuf[type], buf, n))
  400. return -EFAULT;
  401. av7110_ipack_instant_repack(av7110->kbuf[type], n,
  402. &av7110->ipack[type]);
  403. todo -= n;
  404. buf += n;
  405. }
  406. return count - todo;
  407. }
  408. static ssize_t dvb_play_kernel(struct av7110 *av7110, const u8 *buf,
  409. unsigned long count, int nonblock, int type)
  410. {
  411. unsigned long todo = count, n;
  412. dprintk(2, "av7110:%p, \n", av7110);
  413. if (!av7110->kbuf[type])
  414. return -ENOBUFS;
  415. if (nonblock && !FREE_COND)
  416. return -EWOULDBLOCK;
  417. while (todo > 0) {
  418. if (!FREE_COND) {
  419. if (nonblock)
  420. return count - todo;
  421. if (wait_event_interruptible(av7110->avout.queue,
  422. FREE_COND))
  423. return count - todo;
  424. }
  425. n = todo;
  426. if (n > IPACKS * 2)
  427. n = IPACKS * 2;
  428. av7110_ipack_instant_repack(buf, n, &av7110->ipack[type]);
  429. todo -= n;
  430. buf += n;
  431. }
  432. return count - todo;
  433. }
  434. static ssize_t dvb_aplay(struct av7110 *av7110, const u8 __user *buf,
  435. unsigned long count, int nonblock, int type)
  436. {
  437. unsigned long todo = count, n;
  438. dprintk(2, "av7110:%p, \n", av7110);
  439. if (!av7110->kbuf[type])
  440. return -ENOBUFS;
  441. if (nonblock && dvb_ringbuffer_free(&av7110->aout) < 20 * 1024)
  442. return -EWOULDBLOCK;
  443. while (todo > 0) {
  444. if (dvb_ringbuffer_free(&av7110->aout) < 20 * 1024) {
  445. if (nonblock)
  446. return count - todo;
  447. if (wait_event_interruptible(av7110->aout.queue,
  448. (dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024)))
  449. return count-todo;
  450. }
  451. n = todo;
  452. if (n > IPACKS * 2)
  453. n = IPACKS * 2;
  454. if (copy_from_user(av7110->kbuf[type], buf, n))
  455. return -EFAULT;
  456. av7110_ipack_instant_repack(av7110->kbuf[type], n,
  457. &av7110->ipack[type]);
  458. todo -= n;
  459. buf += n;
  460. }
  461. return count - todo;
  462. }
  463. void av7110_p2t_init(struct av7110_p2t *p, struct dvb_demux_feed *feed)
  464. {
  465. memset(p->pes, 0, TS_SIZE);
  466. p->counter = 0;
  467. p->pos = 0;
  468. p->frags = 0;
  469. if (feed)
  470. p->feed = feed;
  471. }
  472. static void clear_p2t(struct av7110_p2t *p)
  473. {
  474. memset(p->pes, 0, TS_SIZE);
  475. // p->counter = 0;
  476. p->pos = 0;
  477. p->frags = 0;
  478. }
  479. static int find_pes_header(u8 const *buf, long int length, int *frags)
  480. {
  481. int c = 0;
  482. int found = 0;
  483. *frags = 0;
  484. while (c < length - 3 && !found) {
  485. if (buf[c] == 0x00 && buf[c + 1] == 0x00 &&
  486. buf[c + 2] == 0x01) {
  487. switch ( buf[c + 3] ) {
  488. case PROG_STREAM_MAP:
  489. case PRIVATE_STREAM2:
  490. case PROG_STREAM_DIR:
  491. case ECM_STREAM :
  492. case EMM_STREAM :
  493. case PADDING_STREAM :
  494. case DSM_CC_STREAM :
  495. case ISO13522_STREAM:
  496. case PRIVATE_STREAM1:
  497. case AUDIO_STREAM_S ... AUDIO_STREAM_E:
  498. case VIDEO_STREAM_S ... VIDEO_STREAM_E:
  499. found = 1;
  500. break;
  501. default:
  502. c++;
  503. break;
  504. }
  505. } else
  506. c++;
  507. }
  508. if (c == length - 3 && !found) {
  509. if (buf[length - 1] == 0x00)
  510. *frags = 1;
  511. if (buf[length - 2] == 0x00 &&
  512. buf[length - 1] == 0x00)
  513. *frags = 2;
  514. if (buf[length - 3] == 0x00 &&
  515. buf[length - 2] == 0x00 &&
  516. buf[length - 1] == 0x01)
  517. *frags = 3;
  518. return -1;
  519. }
  520. return c;
  521. }
  522. void av7110_p2t_write(u8 const *buf, long int length, u16 pid, struct av7110_p2t *p)
  523. {
  524. int c, c2, l, add;
  525. int check, rest;
  526. c = 0;
  527. c2 = 0;
  528. if (p->frags){
  529. check = 0;
  530. switch(p->frags) {
  531. case 1:
  532. if (buf[c] == 0x00 && buf[c + 1] == 0x01) {
  533. check = 1;
  534. c += 2;
  535. }
  536. break;
  537. case 2:
  538. if (buf[c] == 0x01) {
  539. check = 1;
  540. c++;
  541. }
  542. break;
  543. case 3:
  544. check = 1;
  545. }
  546. if (check) {
  547. switch (buf[c]) {
  548. case PROG_STREAM_MAP:
  549. case PRIVATE_STREAM2:
  550. case PROG_STREAM_DIR:
  551. case ECM_STREAM :
  552. case EMM_STREAM :
  553. case PADDING_STREAM :
  554. case DSM_CC_STREAM :
  555. case ISO13522_STREAM:
  556. case PRIVATE_STREAM1:
  557. case AUDIO_STREAM_S ... AUDIO_STREAM_E:
  558. case VIDEO_STREAM_S ... VIDEO_STREAM_E:
  559. p->pes[0] = 0x00;
  560. p->pes[1] = 0x00;
  561. p->pes[2] = 0x01;
  562. p->pes[3] = buf[c];
  563. p->pos = 4;
  564. memcpy(p->pes + p->pos, buf + c, (TS_SIZE - 4) - p->pos);
  565. c += (TS_SIZE - 4) - p->pos;
  566. p_to_t(p->pes, (TS_SIZE - 4), pid, &p->counter, p->feed);
  567. clear_p2t(p);
  568. break;
  569. default:
  570. c = 0;
  571. break;
  572. }
  573. }
  574. p->frags = 0;
  575. }
  576. if (p->pos) {
  577. c2 = find_pes_header(buf + c, length - c, &p->frags);
  578. if (c2 >= 0 && c2 < (TS_SIZE - 4) - p->pos)
  579. l = c2+c;
  580. else
  581. l = (TS_SIZE - 4) - p->pos;
  582. memcpy(p->pes + p->pos, buf, l);
  583. c += l;
  584. p->pos += l;
  585. p_to_t(p->pes, p->pos, pid, &p->counter, p->feed);
  586. clear_p2t(p);
  587. }
  588. add = 0;
  589. while (c < length) {
  590. c2 = find_pes_header(buf + c + add, length - c - add, &p->frags);
  591. if (c2 >= 0) {
  592. c2 += c + add;
  593. if (c2 > c){
  594. p_to_t(buf + c, c2 - c, pid, &p->counter, p->feed);
  595. c = c2;
  596. clear_p2t(p);
  597. add = 0;
  598. } else
  599. add = 1;
  600. } else {
  601. l = length - c;
  602. rest = l % (TS_SIZE - 4);
  603. l -= rest;
  604. p_to_t(buf + c, l, pid, &p->counter, p->feed);
  605. memcpy(p->pes, buf + c + l, rest);
  606. p->pos = rest;
  607. c = length;
  608. }
  609. }
  610. }
  611. static int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length)
  612. {
  613. int i;
  614. int c = 0;
  615. int fill;
  616. u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10 };
  617. fill = (TS_SIZE - 4) - length;
  618. if (pes_start)
  619. tshead[1] = 0x40;
  620. if (fill)
  621. tshead[3] = 0x30;
  622. tshead[1] |= (u8)((pid & 0x1F00) >> 8);
  623. tshead[2] |= (u8)(pid & 0x00FF);
  624. tshead[3] |= ((*counter)++ & 0x0F);
  625. memcpy(buf, tshead, 4);
  626. c += 4;
  627. if (fill) {
  628. buf[4] = fill - 1;
  629. c++;
  630. if (fill > 1) {
  631. buf[5] = 0x00;
  632. c++;
  633. }
  634. for (i = 6; i < fill + 4; i++) {
  635. buf[i] = 0xFF;
  636. c++;
  637. }
  638. }
  639. return c;
  640. }
  641. static void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter,
  642. struct dvb_demux_feed *feed)
  643. {
  644. int l, pes_start;
  645. u8 obuf[TS_SIZE];
  646. long c = 0;
  647. pes_start = 0;
  648. if (length > 3 &&
  649. buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01)
  650. switch (buf[3]) {
  651. case PROG_STREAM_MAP:
  652. case PRIVATE_STREAM2:
  653. case PROG_STREAM_DIR:
  654. case ECM_STREAM :
  655. case EMM_STREAM :
  656. case PADDING_STREAM :
  657. case DSM_CC_STREAM :
  658. case ISO13522_STREAM:
  659. case PRIVATE_STREAM1:
  660. case AUDIO_STREAM_S ... AUDIO_STREAM_E:
  661. case VIDEO_STREAM_S ... VIDEO_STREAM_E:
  662. pes_start = 1;
  663. break;
  664. default:
  665. break;
  666. }
  667. while (c < length) {
  668. memset(obuf, 0, TS_SIZE);
  669. if (length - c >= (TS_SIZE - 4)){
  670. l = write_ts_header2(pid, counter, pes_start,
  671. obuf, (TS_SIZE - 4));
  672. memcpy(obuf + l, buf + c, TS_SIZE - l);
  673. c += TS_SIZE - l;
  674. } else {
  675. l = write_ts_header2(pid, counter, pes_start,
  676. obuf, length - c);
  677. memcpy(obuf + l, buf + c, TS_SIZE - l);
  678. c = length;
  679. }
  680. feed->cb.ts(obuf, 188, NULL, 0, &feed->feed.ts, DMX_OK);
  681. pes_start = 0;
  682. }
  683. }
  684. int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len)
  685. {
  686. struct dvb_demux *demux = feed->demux;
  687. struct av7110 *av7110 = (struct av7110 *) demux->priv;
  688. struct ipack *ipack = &av7110->ipack[feed->pes_type];
  689. dprintk(2, "av7110:%p, \n", av7110);
  690. switch (feed->pes_type) {
  691. case 0:
  692. if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY)
  693. return -EINVAL;
  694. break;
  695. case 1:
  696. if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY)
  697. return -EINVAL;
  698. break;
  699. default:
  700. return -1;
  701. }
  702. if (!(buf[3] & 0x10)) /* no payload? */
  703. return -1;
  704. if (buf[1] & 0x40)
  705. av7110_ipack_flush(ipack);
  706. if (buf[3] & 0x20) { /* adaptation field? */
  707. len -= buf[4] + 1;
  708. buf += buf[4] + 1;
  709. if (!len)
  710. return 0;
  711. }
  712. av7110_ipack_instant_repack(buf + 4, len - 4, &av7110->ipack[feed->pes_type]);
  713. return 0;
  714. }
  715. /******************************************************************************
  716. * Video MPEG decoder events
  717. ******************************************************************************/
  718. void dvb_video_add_event(struct av7110 *av7110, struct video_event *event)
  719. {
  720. struct dvb_video_events *events = &av7110->video_events;
  721. int wp;
  722. spin_lock_bh(&events->lock);
  723. wp = (events->eventw + 1) % MAX_VIDEO_EVENT;
  724. if (wp == events->eventr) {
  725. events->overflow = 1;
  726. events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
  727. }
  728. //FIXME: timestamp?
  729. memcpy(&events->events[events->eventw], event, sizeof(struct video_event));
  730. events->eventw = wp;
  731. spin_unlock_bh(&events->lock);
  732. wake_up_interruptible(&events->wait_queue);
  733. }
  734. static int dvb_video_get_event (struct av7110 *av7110, struct video_event *event, int flags)
  735. {
  736. struct dvb_video_events *events = &av7110->video_events;
  737. if (events->overflow) {
  738. events->overflow = 0;
  739. return -EOVERFLOW;
  740. }
  741. if (events->eventw == events->eventr) {
  742. int ret;
  743. if (flags & O_NONBLOCK)
  744. return -EWOULDBLOCK;
  745. ret = wait_event_interruptible(events->wait_queue,
  746. events->eventw != events->eventr);
  747. if (ret < 0)
  748. return ret;
  749. }
  750. spin_lock_bh(&events->lock);
  751. memcpy(event, &events->events[events->eventr],
  752. sizeof(struct video_event));
  753. events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
  754. spin_unlock_bh(&events->lock);
  755. return 0;
  756. }
  757. /******************************************************************************
  758. * DVB device file operations
  759. ******************************************************************************/
  760. static unsigned int dvb_video_poll(struct file *file, poll_table *wait)
  761. {
  762. struct dvb_device *dvbdev = file->private_data;
  763. struct av7110 *av7110 = dvbdev->priv;
  764. unsigned int mask = 0;
  765. dprintk(2, "av7110:%p, \n", av7110);
  766. if ((file->f_flags & O_ACCMODE) != O_RDONLY)
  767. poll_wait(file, &av7110->avout.queue, wait);
  768. poll_wait(file, &av7110->video_events.wait_queue, wait);
  769. if (av7110->video_events.eventw != av7110->video_events.eventr)
  770. mask = POLLPRI;
  771. if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
  772. if (av7110->playing) {
  773. if (FREE_COND)
  774. mask |= (POLLOUT | POLLWRNORM);
  775. } else /* if not playing: may play if asked for */
  776. mask |= (POLLOUT | POLLWRNORM);
  777. }
  778. return mask;
  779. }
  780. static ssize_t dvb_video_write(struct file *file, const char __user *buf,
  781. size_t count, loff_t *ppos)
  782. {
  783. struct dvb_device *dvbdev = file->private_data;
  784. struct av7110 *av7110 = dvbdev->priv;
  785. dprintk(2, "av7110:%p, \n", av7110);
  786. if ((file->f_flags & O_ACCMODE) == O_RDONLY)
  787. return -EPERM;
  788. if (av7110->videostate.stream_source != VIDEO_SOURCE_MEMORY)
  789. return -EPERM;
  790. return dvb_play(av7110, buf, count, file->f_flags & O_NONBLOCK, 1);
  791. }
  792. static unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
  793. {
  794. struct dvb_device *dvbdev = file->private_data;
  795. struct av7110 *av7110 = dvbdev->priv;
  796. unsigned int mask = 0;
  797. dprintk(2, "av7110:%p, \n", av7110);
  798. poll_wait(file, &av7110->aout.queue, wait);
  799. if (av7110->playing) {
  800. if (dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024)
  801. mask |= (POLLOUT | POLLWRNORM);
  802. } else /* if not playing: may play if asked for */
  803. mask = (POLLOUT | POLLWRNORM);
  804. return mask;
  805. }
  806. static ssize_t dvb_audio_write(struct file *file, const char __user *buf,
  807. size_t count, loff_t *ppos)
  808. {
  809. struct dvb_device *dvbdev = file->private_data;
  810. struct av7110 *av7110 = dvbdev->priv;
  811. dprintk(2, "av7110:%p, \n", av7110);
  812. if (av7110->audiostate.stream_source != AUDIO_SOURCE_MEMORY) {
  813. printk(KERN_ERR "not audio source memory\n");
  814. return -EPERM;
  815. }
  816. return dvb_aplay(av7110, buf, count, file->f_flags & O_NONBLOCK, 0);
  817. }
  818. static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 };
  819. #define MIN_IFRAME 400000
  820. static int play_iframe(struct av7110 *av7110, u8 __user *buf, unsigned int len, int nonblock)
  821. {
  822. int i, n;
  823. dprintk(2, "av7110:%p, \n", av7110);
  824. if (!(av7110->playing & RP_VIDEO)) {
  825. if (av7110_av_start_play(av7110, RP_VIDEO) < 0)
  826. return -EBUSY;
  827. }
  828. /* setting n always > 1, fixes problems when playing stillframes
  829. consisting of I- and P-Frames */
  830. n = MIN_IFRAME / len + 1;
  831. /* FIXME: nonblock? */
  832. dvb_play_kernel(av7110, iframe_header, sizeof(iframe_header), 0, 1);
  833. for (i = 0; i < n; i++)
  834. dvb_play(av7110, buf, len, 0, 1);
  835. av7110_ipack_flush(&av7110->ipack[1]);
  836. return 0;
  837. }
  838. static int dvb_video_ioctl(struct inode *inode, struct file *file,
  839. unsigned int cmd, void *parg)
  840. {
  841. struct dvb_device *dvbdev = file->private_data;
  842. struct av7110 *av7110 = dvbdev->priv;
  843. unsigned long arg = (unsigned long) parg;
  844. int ret = 0;
  845. dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd);
  846. if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
  847. if ( cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT &&
  848. cmd != VIDEO_GET_SIZE ) {
  849. return -EPERM;
  850. }
  851. }
  852. switch (cmd) {
  853. case VIDEO_STOP:
  854. av7110->videostate.play_state = VIDEO_STOPPED;
  855. if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY)
  856. ret = av7110_av_stop(av7110, RP_VIDEO);
  857. else
  858. ret = vidcom(av7110, AV_VIDEO_CMD_STOP,
  859. av7110->videostate.video_blank ? 0 : 1);
  860. if (!ret)
  861. av7110->trickmode = TRICK_NONE;
  862. break;
  863. case VIDEO_PLAY:
  864. av7110->trickmode = TRICK_NONE;
  865. if (av7110->videostate.play_state == VIDEO_FREEZED) {
  866. av7110->videostate.play_state = VIDEO_PLAYING;
  867. ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0);
  868. if (ret)
  869. break;
  870. }
  871. if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) {
  872. if (av7110->playing == RP_AV) {
  873. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
  874. if (ret)
  875. break;
  876. av7110->playing &= ~RP_VIDEO;
  877. }
  878. ret = av7110_av_start_play(av7110, RP_VIDEO);
  879. }
  880. if (!ret)
  881. ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0);
  882. if (!ret)
  883. av7110->videostate.play_state = VIDEO_PLAYING;
  884. break;
  885. case VIDEO_FREEZE:
  886. av7110->videostate.play_state = VIDEO_FREEZED;
  887. if (av7110->playing & RP_VIDEO)
  888. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0);
  889. else
  890. ret = vidcom(av7110, AV_VIDEO_CMD_FREEZE, 1);
  891. if (!ret)
  892. av7110->trickmode = TRICK_FREEZE;
  893. break;
  894. case VIDEO_CONTINUE:
  895. if (av7110->playing & RP_VIDEO)
  896. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0);
  897. if (!ret)
  898. ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0);
  899. if (!ret) {
  900. av7110->videostate.play_state = VIDEO_PLAYING;
  901. av7110->trickmode = TRICK_NONE;
  902. }
  903. break;
  904. case VIDEO_SELECT_SOURCE:
  905. av7110->videostate.stream_source = (video_stream_source_t) arg;
  906. break;
  907. case VIDEO_SET_BLANK:
  908. av7110->videostate.video_blank = (int) arg;
  909. break;
  910. case VIDEO_GET_STATUS:
  911. memcpy(parg, &av7110->videostate, sizeof(struct video_status));
  912. break;
  913. case VIDEO_GET_EVENT:
  914. ret = dvb_video_get_event(av7110, parg, file->f_flags);
  915. break;
  916. case VIDEO_GET_SIZE:
  917. memcpy(parg, &av7110->video_size, sizeof(video_size_t));
  918. break;
  919. case VIDEO_SET_DISPLAY_FORMAT:
  920. {
  921. video_displayformat_t format = (video_displayformat_t) arg;
  922. u16 val = 0;
  923. switch (format) {
  924. case VIDEO_PAN_SCAN:
  925. val = VID_PAN_SCAN_PREF;
  926. break;
  927. case VIDEO_LETTER_BOX:
  928. val = VID_VC_AND_PS_PREF;
  929. break;
  930. case VIDEO_CENTER_CUT_OUT:
  931. val = VID_CENTRE_CUT_PREF;
  932. break;
  933. default:
  934. ret = -EINVAL;
  935. }
  936. if (ret < 0)
  937. break;
  938. av7110->videostate.display_format = format;
  939. ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
  940. 1, (u16) val);
  941. break;
  942. }
  943. case VIDEO_SET_FORMAT:
  944. if (arg > 1) {
  945. ret = -EINVAL;
  946. break;
  947. }
  948. av7110->display_ar = arg;
  949. ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetMonitorType,
  950. 1, (u16) arg);
  951. break;
  952. case VIDEO_STILLPICTURE:
  953. {
  954. struct video_still_picture *pic =
  955. (struct video_still_picture *) parg;
  956. av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY;
  957. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
  958. ret = play_iframe(av7110, pic->iFrame, pic->size,
  959. file->f_flags & O_NONBLOCK);
  960. break;
  961. }
  962. case VIDEO_FAST_FORWARD:
  963. //note: arg is ignored by firmware
  964. if (av7110->playing & RP_VIDEO)
  965. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
  966. __Scan_I, 2, AV_PES, 0);
  967. else
  968. ret = vidcom(av7110, AV_VIDEO_CMD_FFWD, arg);
  969. if (!ret) {
  970. av7110->trickmode = TRICK_FAST;
  971. av7110->videostate.play_state = VIDEO_PLAYING;
  972. }
  973. break;
  974. case VIDEO_SLOWMOTION:
  975. if (av7110->playing&RP_VIDEO) {
  976. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
  977. if (!ret)
  978. ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg);
  979. } else {
  980. ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0);
  981. if (!ret)
  982. ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 0);
  983. if (!ret)
  984. ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg);
  985. }
  986. if (!ret) {
  987. av7110->trickmode = TRICK_SLOW;
  988. av7110->videostate.play_state = VIDEO_PLAYING;
  989. }
  990. break;
  991. case VIDEO_GET_CAPABILITIES:
  992. *(int *)parg = VIDEO_CAP_MPEG1 | VIDEO_CAP_MPEG2 |
  993. VIDEO_CAP_SYS | VIDEO_CAP_PROG;
  994. break;
  995. case VIDEO_CLEAR_BUFFER:
  996. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
  997. av7110_ipack_reset(&av7110->ipack[1]);
  998. if (av7110->playing == RP_AV) {
  999. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
  1000. __Play, 2, AV_PES, 0);
  1001. if (ret)
  1002. break;
  1003. if (av7110->trickmode == TRICK_FAST)
  1004. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
  1005. __Scan_I, 2, AV_PES, 0);
  1006. if (av7110->trickmode == TRICK_SLOW) {
  1007. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
  1008. __Slow, 2, 0, 0);
  1009. if (!ret)
  1010. ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg);
  1011. }
  1012. if (av7110->trickmode == TRICK_FREEZE)
  1013. ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 1);
  1014. }
  1015. break;
  1016. case VIDEO_SET_STREAMTYPE:
  1017. break;
  1018. default:
  1019. ret = -ENOIOCTLCMD;
  1020. break;
  1021. }
  1022. return ret;
  1023. }
  1024. static int dvb_audio_ioctl(struct inode *inode, struct file *file,
  1025. unsigned int cmd, void *parg)
  1026. {
  1027. struct dvb_device *dvbdev = file->private_data;
  1028. struct av7110 *av7110 = dvbdev->priv;
  1029. unsigned long arg = (unsigned long) parg;
  1030. int ret = 0;
  1031. dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd);
  1032. if (((file->f_flags & O_ACCMODE) == O_RDONLY) &&
  1033. (cmd != AUDIO_GET_STATUS))
  1034. return -EPERM;
  1035. switch (cmd) {
  1036. case AUDIO_STOP:
  1037. if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY)
  1038. ret = av7110_av_stop(av7110, RP_AUDIO);
  1039. else
  1040. ret = audcom(av7110, AUDIO_CMD_MUTE);
  1041. if (!ret)
  1042. av7110->audiostate.play_state = AUDIO_STOPPED;
  1043. break;
  1044. case AUDIO_PLAY:
  1045. if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY)
  1046. ret = av7110_av_start_play(av7110, RP_AUDIO);
  1047. if (!ret)
  1048. ret = audcom(av7110, AUDIO_CMD_UNMUTE);
  1049. if (!ret)
  1050. av7110->audiostate.play_state = AUDIO_PLAYING;
  1051. break;
  1052. case AUDIO_PAUSE:
  1053. ret = audcom(av7110, AUDIO_CMD_MUTE);
  1054. if (!ret)
  1055. av7110->audiostate.play_state = AUDIO_PAUSED;
  1056. break;
  1057. case AUDIO_CONTINUE:
  1058. if (av7110->audiostate.play_state == AUDIO_PAUSED) {
  1059. av7110->audiostate.play_state = AUDIO_PLAYING;
  1060. ret = audcom(av7110, AUDIO_CMD_UNMUTE | AUDIO_CMD_PCM16);
  1061. }
  1062. break;
  1063. case AUDIO_SELECT_SOURCE:
  1064. av7110->audiostate.stream_source = (audio_stream_source_t) arg;
  1065. break;
  1066. case AUDIO_SET_MUTE:
  1067. {
  1068. ret = audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE);
  1069. if (!ret)
  1070. av7110->audiostate.mute_state = (int) arg;
  1071. break;
  1072. }
  1073. case AUDIO_SET_AV_SYNC:
  1074. av7110->audiostate.AV_sync_state = (int) arg;
  1075. ret = audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF);
  1076. break;
  1077. case AUDIO_SET_BYPASS_MODE:
  1078. if (FW_VERSION(av7110->arm_app) < 0x2621)
  1079. ret = -EINVAL;
  1080. av7110->audiostate.bypass_mode = (int)arg;
  1081. break;
  1082. case AUDIO_CHANNEL_SELECT:
  1083. av7110->audiostate.channel_select = (audio_channel_select_t) arg;
  1084. switch(av7110->audiostate.channel_select) {
  1085. case AUDIO_STEREO:
  1086. ret = audcom(av7110, AUDIO_CMD_STEREO);
  1087. if (!ret) {
  1088. if (av7110->adac_type == DVB_ADAC_CRYSTAL)
  1089. i2c_writereg(av7110, 0x20, 0x02, 0x49);
  1090. else if (av7110->adac_type == DVB_ADAC_MSP34x5)
  1091. msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220);
  1092. }
  1093. break;
  1094. case AUDIO_MONO_LEFT:
  1095. ret = audcom(av7110, AUDIO_CMD_MONO_L);
  1096. if (!ret) {
  1097. if (av7110->adac_type == DVB_ADAC_CRYSTAL)
  1098. i2c_writereg(av7110, 0x20, 0x02, 0x4a);
  1099. else if (av7110->adac_type == DVB_ADAC_MSP34x5)
  1100. msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200);
  1101. }
  1102. break;
  1103. case AUDIO_MONO_RIGHT:
  1104. ret = audcom(av7110, AUDIO_CMD_MONO_R);
  1105. if (!ret) {
  1106. if (av7110->adac_type == DVB_ADAC_CRYSTAL)
  1107. i2c_writereg(av7110, 0x20, 0x02, 0x45);
  1108. else if (av7110->adac_type == DVB_ADAC_MSP34x5)
  1109. msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210);
  1110. }
  1111. break;
  1112. default:
  1113. ret = -EINVAL;
  1114. break;
  1115. }
  1116. break;
  1117. case AUDIO_GET_STATUS:
  1118. memcpy(parg, &av7110->audiostate, sizeof(struct audio_status));
  1119. break;
  1120. case AUDIO_GET_CAPABILITIES:
  1121. if (FW_VERSION(av7110->arm_app) < 0x2621)
  1122. *(unsigned int *)parg = AUDIO_CAP_LPCM | AUDIO_CAP_MP1 | AUDIO_CAP_MP2;
  1123. else
  1124. *(unsigned int *)parg = AUDIO_CAP_LPCM | AUDIO_CAP_DTS | AUDIO_CAP_AC3 |
  1125. AUDIO_CAP_MP1 | AUDIO_CAP_MP2;
  1126. break;
  1127. case AUDIO_CLEAR_BUFFER:
  1128. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
  1129. av7110_ipack_reset(&av7110->ipack[0]);
  1130. if (av7110->playing == RP_AV)
  1131. ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
  1132. __Play, 2, AV_PES, 0);
  1133. break;
  1134. case AUDIO_SET_ID:
  1135. break;
  1136. case AUDIO_SET_MIXER:
  1137. {
  1138. struct audio_mixer *amix = (struct audio_mixer *)parg;
  1139. ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right);
  1140. break;
  1141. }
  1142. case AUDIO_SET_STREAMTYPE:
  1143. break;
  1144. default:
  1145. ret = -ENOIOCTLCMD;
  1146. }
  1147. return ret;
  1148. }
  1149. static int dvb_video_open(struct inode *inode, struct file *file)
  1150. {
  1151. struct dvb_device *dvbdev = file->private_data;
  1152. struct av7110 *av7110 = dvbdev->priv;
  1153. int err;
  1154. dprintk(2, "av7110:%p, \n", av7110);
  1155. if ((err = dvb_generic_open(inode, file)) < 0)
  1156. return err;
  1157. if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
  1158. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
  1159. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
  1160. av7110->video_blank = 1;
  1161. av7110->audiostate.AV_sync_state = 1;
  1162. av7110->videostate.stream_source = VIDEO_SOURCE_DEMUX;
  1163. /* empty event queue */
  1164. av7110->video_events.eventr = av7110->video_events.eventw = 0;
  1165. }
  1166. return 0;
  1167. }
  1168. static int dvb_video_release(struct inode *inode, struct file *file)
  1169. {
  1170. struct dvb_device *dvbdev = file->private_data;
  1171. struct av7110 *av7110 = dvbdev->priv;
  1172. dprintk(2, "av7110:%p, \n", av7110);
  1173. if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
  1174. av7110_av_stop(av7110, RP_VIDEO);
  1175. }
  1176. return dvb_generic_release(inode, file);
  1177. }
  1178. static int dvb_audio_open(struct inode *inode, struct file *file)
  1179. {
  1180. struct dvb_device *dvbdev = file->private_data;
  1181. struct av7110 *av7110 = dvbdev->priv;
  1182. int err = dvb_generic_open(inode, file);
  1183. dprintk(2, "av7110:%p, \n", av7110);
  1184. if (err < 0)
  1185. return err;
  1186. dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
  1187. av7110->audiostate.stream_source = AUDIO_SOURCE_DEMUX;
  1188. return 0;
  1189. }
  1190. static int dvb_audio_release(struct inode *inode, struct file *file)
  1191. {
  1192. struct dvb_device *dvbdev = file->private_data;
  1193. struct av7110 *av7110 = dvbdev->priv;
  1194. dprintk(2, "av7110:%p, \n", av7110);
  1195. av7110_av_stop(av7110, RP_AUDIO);
  1196. return dvb_generic_release(inode, file);
  1197. }
  1198. /******************************************************************************
  1199. * driver registration
  1200. ******************************************************************************/
  1201. static struct file_operations dvb_video_fops = {
  1202. .owner = THIS_MODULE,
  1203. .write = dvb_video_write,
  1204. .ioctl = dvb_generic_ioctl,
  1205. .open = dvb_video_open,
  1206. .release = dvb_video_release,
  1207. .poll = dvb_video_poll,
  1208. };
  1209. static struct dvb_device dvbdev_video = {
  1210. .priv = NULL,
  1211. .users = 6,
  1212. .readers = 5, /* arbitrary */
  1213. .writers = 1,
  1214. .fops = &dvb_video_fops,
  1215. .kernel_ioctl = dvb_video_ioctl,
  1216. };
  1217. static struct file_operations dvb_audio_fops = {
  1218. .owner = THIS_MODULE,
  1219. .write = dvb_audio_write,
  1220. .ioctl = dvb_generic_ioctl,
  1221. .open = dvb_audio_open,
  1222. .release = dvb_audio_release,
  1223. .poll = dvb_audio_poll,
  1224. };
  1225. static struct dvb_device dvbdev_audio = {
  1226. .priv = NULL,
  1227. .users = 1,
  1228. .writers = 1,
  1229. .fops = &dvb_audio_fops,
  1230. .kernel_ioctl = dvb_audio_ioctl,
  1231. };
  1232. int av7110_av_register(struct av7110 *av7110)
  1233. {
  1234. av7110->audiostate.AV_sync_state = 0;
  1235. av7110->audiostate.mute_state = 0;
  1236. av7110->audiostate.play_state = AUDIO_STOPPED;
  1237. av7110->audiostate.stream_source = AUDIO_SOURCE_DEMUX;
  1238. av7110->audiostate.channel_select = AUDIO_STEREO;
  1239. av7110->audiostate.bypass_mode = 0;
  1240. av7110->videostate.video_blank = 0;
  1241. av7110->videostate.play_state = VIDEO_STOPPED;
  1242. av7110->videostate.stream_source = VIDEO_SOURCE_DEMUX;
  1243. av7110->videostate.video_format = VIDEO_FORMAT_4_3;
  1244. av7110->videostate.display_format = VIDEO_CENTER_CUT_OUT;
  1245. av7110->display_ar = VIDEO_FORMAT_4_3;
  1246. init_waitqueue_head(&av7110->video_events.wait_queue);
  1247. spin_lock_init(&av7110->video_events.lock);
  1248. av7110->video_events.eventw = av7110->video_events.eventr = 0;
  1249. av7110->video_events.overflow = 0;
  1250. memset(&av7110->video_size, 0, sizeof (video_size_t));
  1251. dvb_register_device(&av7110->dvb_adapter, &av7110->video_dev,
  1252. &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
  1253. dvb_register_device(&av7110->dvb_adapter, &av7110->audio_dev,
  1254. &dvbdev_audio, av7110, DVB_DEVICE_AUDIO);
  1255. return 0;
  1256. }
  1257. void av7110_av_unregister(struct av7110 *av7110)
  1258. {
  1259. dvb_unregister_device(av7110->audio_dev);
  1260. dvb_unregister_device(av7110->video_dev);
  1261. }
  1262. int av7110_av_init(struct av7110 *av7110)
  1263. {
  1264. void (*play[])(u8 *, int, void *) = { play_audio_cb, play_video_cb };
  1265. int i, ret;
  1266. for (i = 0; i < 2; i++) {
  1267. struct ipack *ipack = av7110->ipack + i;
  1268. ret = av7110_ipack_init(ipack, IPACKS, play[i]);
  1269. if (ret < 0) {
  1270. if (i)
  1271. av7110_ipack_free(--ipack);
  1272. goto out;
  1273. }
  1274. ipack->data = av7110;
  1275. }
  1276. dvb_ringbuffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN);
  1277. dvb_ringbuffer_init(&av7110->aout, av7110->iobuf + AVOUTLEN, AOUTLEN);
  1278. av7110->kbuf[0] = (u8 *)(av7110->iobuf + AVOUTLEN + AOUTLEN + BMPLEN);
  1279. av7110->kbuf[1] = av7110->kbuf[0] + 2 * IPACKS;
  1280. out:
  1281. return ret;
  1282. }
  1283. void av7110_av_exit(struct av7110 *av7110)
  1284. {
  1285. av7110_ipack_free(&av7110->ipack[0]);
  1286. av7110_ipack_free(&av7110->ipack[1]);
  1287. }