planb.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:11k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.     planb - v4l-compatible frame grabber driver for the PlanB hardware
  3.     PlanB is used in the 7x00/8x00 series of PowerMacintosh
  4.     Computers as video input DMA controller.
  5.     Copyright (C) 1998 - 2002  Michel Lanners <mailto:mlan@cpu.lu>
  6.     Based largely on the old bttv driver by Ralph Metzler
  7.     Additional debugging and coding by Takashi Oe <mailto:toe@unlserve.unl.edu>
  8.     For more information, see <http://www.cpu.lu/~mlan/planb.html>
  9.     This program is free software; you can redistribute it and/or modify
  10.     it under the terms of the GNU General Public License as published by
  11.     the Free Software Foundation; either version 2 of the License, or
  12.     (at your option) any later version.
  13.     This program is distributed in the hope that it will be useful,
  14.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.     GNU General Public License for more details.
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. /* $Id: planb.h,v 2.9 2002/04/03 15:57:57 mlan Exp mlan $ */
  22. #ifndef _PLANB_H_
  23. #define _PLANB_H_
  24. #define PLANB_DEVICE_NAME "Apple PlanB Video-In"
  25. #define PLANB_VBI_NAME "Apple PlanB VBI"
  26. #define PLANB_REV "2.11"
  27. #define APPLE_VENDOR_ID 0x106b
  28. #define PLANB_DEV_ID 0x0004
  29. #ifdef __KERNEL__
  30. //#define PLANB_GSCANLINE /* use this if apps have the notion of */
  31. /* grab buffer scanline */
  32. /* This should be safe for both PAL and NTSC */
  33. #define PLANB_MAXPIXELS 768
  34. #define PLANB_MAXLINES 576
  35. #define PLANB_NTSC_MAXLINES 480
  36. /* Max VBI data buffer size */
  37. #define VBI_LINESIZE 1024 /* on SAA7196, a line can be max. 1024 pixels */
  38. #define VBI_START 7 /* VBI starts at line 7 */
  39. #define VBI_MAXLINES 16 /* 16 lines per field */
  40. /* We have 2 of these, but return them one at a time */
  41. #define VBIBUF_SIZE (VBI_LINESIZE * VBI_MAXLINES)
  42. #define LINE_OFFSET 1 /* between line 1 and SAA's first valid line */
  43. /* Uncomment your preferred norm ;-) */
  44. #define PLANB_DEF_NORM VIDEO_MODE_PAL
  45. //#define PLANB_DEF_NORM VIDEO_MODE_NTSC
  46. //#define PLANB_DEF_NORM VIDEO_MODE_SECAM
  47. /* fields settings */
  48. #define PLANB_SIZE8 0x1 /*  8-bit mono? */
  49. #define PLANB_SIZE16 0x2 /* 16-bit mode */
  50. #define PLANB_SIZE32 0x4 /* 32-bit mode */
  51. #define PLANB_CLIPMASK 0x8 /* hardware clipmasking */
  52. /* misc. flags for PlanB DMA operation */
  53. #define CH_SYNC 0x1 /* synchronize channels (set by ch1;
  54.    cleared by ch2) */
  55. #define FIELD_SYNC 0x2     /* used for the start of each field
  56.    (0 -> 1 -> 0 for ch1; 0 -> 1 for ch2) */
  57. #define EVEN_FIELD 0x0 /* even field is detected if unset */
  58. #define DMA_ABORT 0x2 /* error or just out of sync if set */
  59. #define ODD_FIELD 0x4 /* odd field is detected if set */
  60. /* format info and correspondance */
  61. struct fmts {
  62. int bpp; /* bytes per pixel */
  63. int pb_fmt; /* planb format (DMA engine sub 0x40/0x44 ) */
  64. int saa_fmt; /* saa format: bit
  65.    SAA7196 sub 0x20: bits FS0 0
  66.       FS1 1
  67.    sub 0x30: bit  MCT 4
  68.   LLV 5 */
  69. };
  70. /* This is supposed to match the VIDEO_PALETTE_* defines in
  71.  * struct video_picture in videodev.h */
  72. static struct fmts palette2fmt[] = {
  73. { 0, 0,    0 },
  74. { 1, PLANB_SIZE8, 0x33 }, /* VIDEO_PALETTE_GREY */
  75. { 0, 0,    0 },
  76. { 0, 0,    0 },
  77. { 0, 0,    0 },
  78. { 4, PLANB_SIZE32,    2 }, /* VIDEO_PALETTE_RGB32 */
  79. { 2, PLANB_SIZE16,    0 }, /* VIDEO_PALETTE_RGB555 */
  80. { 2, PLANB_SIZE16, 0x21 }, /* VIDEO_PALETTE_YUV422 */
  81. { 0, 0,    0 },
  82. { 0, 0,    0 },
  83. { 0, 0,    0 },
  84. { 0, 0,    0 },
  85. { 0, 0,    0 },
  86. { 0, 0,    0 },
  87. { 0, 0,    0 },
  88. { 0, 0,    0 },
  89. { 0, 0,    0 },
  90. };
  91. #define PLANB_PALETTE_MAX (sizeof palette2fmt / sizeof (struct fmts))
  92. /* for capture operations */
  93. #define MAX_GBUFFERS 2
  94. /* note PLANB_MAX_FBUF must be divisible by PAGE_SIZE */
  95. #ifdef PLANB_GSCANLINE
  96. #define PLANB_MAX_FBUF 0x240000 /* 576 * 1024 * 4 */
  97. #define TAB_FACTOR (1)
  98. #else
  99. #define PLANB_MAX_FBUF 0x1b0000 /* 576 * 768 * 4 */
  100. #define TAB_FACTOR (2)
  101. #endif
  102. #endif /* __KERNEL__ */
  103. struct planb_saa_regs {
  104. unsigned char addr;
  105. unsigned char val;
  106. };
  107. struct planb_stat_regs {
  108. unsigned int ch1_stat;
  109. unsigned int ch2_stat;
  110. unsigned long ch1_cmdbase;
  111. unsigned long ch2_cmdbase;
  112. unsigned int ch1_cmdptr;
  113. unsigned int ch2_cmdptr;
  114. unsigned char saa_stat0;
  115. unsigned char saa_stat1;
  116. };
  117. struct planb_any_regs {
  118. unsigned int offset;
  119. unsigned int bytes;
  120. unsigned char data[128];
  121. };
  122. struct planb_buf_regs {
  123. unsigned int start;
  124. unsigned int end;
  125. };
  126. /* planb private ioctls */
  127. /* Read a saa7196 reg value */
  128. #define PLANBIOCGSAAREGS _IOWR('v', BASE_VIDIOCPRIVATE, struct planb_saa_regs)
  129. /* Set a saa7196 reg value */
  130. #define PLANBIOCSSAAREGS _IOW('v', BASE_VIDIOCPRIVATE + 1, struct planb_saa_regs)
  131. /* Read planb status */
  132. #define PLANBIOCGSTAT _IOR('v', BASE_VIDIOCPRIVATE + 2, struct planb_stat_regs)
  133. /* Get TV/VTR mode */
  134. #define PLANB_TV_MODE 1
  135. #define PLANB_VTR_MODE 2
  136. #define PLANBIOCGMODE _IOR('v', BASE_VIDIOCPRIVATE + 3, int)
  137. /* Set TV/VTR mode */
  138. #define PLANBIOCSMODE _IOW('v', BASE_VIDIOCPRIVATE + 4, int)
  139. #ifdef PLANB_GSCANLINE
  140. /* # of bytes per scanline in grab buffer */
  141. #define PLANBG_GRAB_BPL _IOR('v', BASE_VIDIOCPRIVATE + 5, int)
  142. #endif
  143. /* This doesn't really belong here, but until someone cleans up (or defines
  144.    in the first place ;-) the VBI API, it helps alevt... */
  145. #define BTTV_VBISIZE _IOR('v', BASE_VIDIOCPRIVATE + 8, int)
  146. /* Various debugging IOCTLs */
  147. #ifdef DEBUG
  148. /* call wake_up_interruptible() with appropriate actions */
  149. #define PLANB_INTR_DEBUG _IOW('v', BASE_VIDIOCPRIVATE + 20, int)
  150. /* investigate which reg does what */
  151. #define PLANB_INV_REGS _IOWR('v', BASE_VIDIOCPRIVATE + 21, struct planb_any_regs)
  152. /* Dump DBDMA command buffer from (int) to (int) */
  153. #define PLANBIOCGDBDMABUF _IOW('v', BASE_VIDIOCPRIVATE + 22, struct planb_buf_regs)
  154. #endif /* DEBUG */
  155. #ifdef __KERNEL__
  156. /* Potentially useful macros */
  157. #define PLANB_SET(x) ((x) << 16 | (x))
  158. #define PLANB_CLR(x) ((x) << 16)
  159. typedef volatile struct dbdma_cmd dbdma_cmd_t;
  160. typedef volatile struct dbdma_cmd *dbdma_cmd_ptr;
  161. typedef volatile struct dbdma_regs dbdma_regs_t;
  162. typedef volatile struct dbdma_regs *dbdma_regs_ptr;
  163. typedef struct gbuffer gbuf_t;
  164. typedef struct gbuffer *gbuf_ptr;
  165. /* grab buffer status */
  166. #define GBUFFER_UNUSED 0x00U
  167. #define GBUFFER_GRABBING 0x01U
  168. #define GBUFFER_DONE 0x02U
  169. /* planb interrupt status values (0x104: irq status) */
  170. #define PLANB_CLR_IRQ 0x00 /* clear Plan B interrupt */
  171. #define PLANB_GEN_IRQ 0x01 /* assert Plan B interrupt */
  172. #define PLANB_FRM_IRQ 0x0100 /* end of frame */
  173. #define PLANB_DUMMY 40 /* # of command buf's allocated for pre-capture seq. */
  174. /* This represents the physical register layout */
  175. struct planb_registers {
  176. dbdma_regs_t ch1; /* 0x00: video in */
  177. volatile u32 even; /* 0x40: even field setting */
  178. volatile u32 odd; /* 0x44; odd field setting */
  179. u32 pad1[14]; /* empty? */
  180. dbdma_regs_t ch2; /* 0x80: clipmask out */
  181. u32 pad2[16]; /* 0xc0: empty? */
  182. volatile u32 reg3; /* 0x100: ???? */
  183. volatile u32 intr_stat; /* 0x104: irq status */
  184. u32 pad3[1]; /* empty? */
  185. volatile u32 reg5; /* 0x10c: ??? */
  186. u32 pad4[60]; /* empty? */
  187. volatile u8 saa_addr; /* 0x200: SAA subadr */
  188. u8 pad5[3];
  189. volatile u8 saa_regval; /* SAA7196 write reg. val */
  190. u8 pad6[3];
  191. volatile u8 saa_status; /* SAA7196 status byte */
  192. /* There is more unused stuff here */
  193. };
  194. struct planb_window {
  195. int x, y;
  196. ushort width, height;
  197. ushort bpp, bpl, depth, pad;
  198. ushort swidth, sheight;
  199. int norm;
  200. int interlace;
  201. u32 color_fmt;
  202. int chromakey;
  203. int mode; /* used to switch between TV/VTR modes */
  204. };
  205. struct planb_suspend {
  206. int overlay;
  207. int frame;
  208. struct dbdma_cmd cmd;
  209. };
  210. /* Framebuffer info */
  211. struct planb_fb {
  212. unsigned long phys; /* Framebuffer phys. base address */
  213. int offset; /* offset of pixel 1 */
  214. };
  215. /* DBDMA command buffer descriptor */
  216. struct dbdma_cmd_buf {
  217. dbdma_cmd_ptr start;
  218. dbdma_cmd_ptr jumpaddr; /* where are we called from? */
  219. unsigned int size;
  220. unsigned long bus; /* start address as seen from the bus */
  221. };
  222. /* grab buffer descriptor */
  223. struct gbuffer {
  224. dbdma_cmd_ptr cap_cmd;
  225. dbdma_cmd_ptr last_cmd;
  226. dbdma_cmd_ptr pre_cmd;
  227. int idx;
  228. int need_pre_capture;
  229. int width;
  230. int height;
  231. unsigned int fmt;
  232. int norm_switch;
  233. #ifndef PLANB_GSCANLINE
  234. int l_fr_addr_idx;
  235. int lsize;
  236. int lnum;
  237. #endif
  238.         volatile unsigned int *status; /* ptr to status value */
  239. };
  240. struct planb {
  241. /* the video device: */
  242. struct video_device video_dev;
  243. struct video_picture picture; /* Current picture params */
  244. int vid_user; /* Users on video device */
  245. void *vid_raw; /* Org. alloc. mem for kfree */
  246. struct dbdma_cmd_buf vid_cbo; /* odd video dbdma cmd buf */
  247. struct dbdma_cmd_buf vid_cbe; /* even */
  248. void *clip_raw;
  249. struct dbdma_cmd_buf clip_cbo; /* odd clip dbdma cmd buf */
  250. struct dbdma_cmd_buf clip_cbe; /* even */
  251. dbdma_cmd_ptr overlay_last1;
  252. dbdma_cmd_ptr overlay_last2;
  253.   
  254. /* the hardware: */
  255. volatile struct planb_registers
  256. *planb_base; /* virt base of planb */
  257. struct planb_registers *planb_base_bus; /* phys base of planb */
  258. unsigned int tab_size;
  259. int      maxlines;
  260. unsigned int irq; /* interrupt number */
  261. volatile unsigned int intr_mask;
  262. struct planb_fb fb; /* Framebuffer info */
  263. /* generic stuff: */
  264. void *jump_raw; /* jump buffer raw space */
  265. dbdma_cmd_ptr jumpbuf; /* same, DBDMA_ALIGN'ed */
  266. struct semaphore lock;
  267. int overlay; /* overlay running? */
  268. struct planb_window win;
  269. volatile unsigned char *mask; /* Clipmask buffer */
  270. int suspend;
  271. wait_queue_head_t suspendq;
  272. struct planb_suspend suspended;
  273. int cmd_buff_inited; /* cmd buffer inited? */
  274. /* grabbing stuff: */ 
  275. int grabbing;
  276. unsigned int gcount;
  277. wait_queue_head_t capq;
  278. int last_fr;
  279. int prev_last_fr;
  280. unsigned char **rawbuf;
  281. int rawbuf_nchunks;
  282. struct gbuffer gbuf[MAX_GBUFFERS];
  283. #ifdef PLANB_GSCANLINE
  284. int gbytes_per_line;
  285. #else
  286. #define MAX_LNUM 576 /* change this if PLANB_MAXLINES or */
  287. /* PLANB_MAXPIXELS changes */
  288. unsigned char *l_to_addr[MAX_GBUFFERS][MAX_LNUM];
  289. int l_to_next_idx[MAX_GBUFFERS][MAX_LNUM];
  290. int l_to_next_size[MAX_GBUFFERS][MAX_LNUM];
  291. #endif /* PLANB_GSCANLINE */
  292. /* VBI stuff: */
  293. struct video_device vbi_dev; /* VBI data device */
  294. int vbi_user; /* Users on vbi device */
  295. void *vbi_raw;
  296. struct dbdma_cmd_buf vbi_cbo; /* odd VBI dbdma cmd buf */
  297. struct dbdma_cmd_buf vbi_cbe; /* even */
  298. int vbirunning;
  299. int vbip; /* pointer into VBI buffer */
  300. unsigned char *vbibuf; /* buffer for VBI data */
  301. wait_queue_head_t vbiq;
  302. };
  303. #endif /* __KERNEL__ */
  304. #endif /* _PLANB_H_ */