#ifndef SAA713x_USER_H #define SAA713x_USER_H #include /* IOR and friends */ #include "saa713x_reg.h" /* Size of largest video frame that can be captured = SAA_VCAP_FRAME_MAX_SZ * Layout of mmap space: * T0_OFFSET to T0_OFFSET + T0_SIZE - Task0 Frame * T1_OFFSET to T1_OFFSET + T1_SIZE - Task1 Frame * STS_OFFSET to STS_SIZE - struct saa_sts */ #define SAA_VCAP_FRAME_MAX_BPP 4 /* dont change this */ #define SAA_VCAP_FRAME_MAX_SZ (4096 * 1024) /* 4 Mb - Max */ /* Affects multibuf option */ #define SAA_ACAP_FRAME_MAX_SZ (1024 * 1024) /* 1 Mb - Max */ #define SAA_MMAP_T0_OFFSET 0 #define SAA_MMAP_T0_SZ SAA_VCAP_FRAME_MAX_SZ #define SAA_MMAP_T1_OFFSET SAA_VCAP_FRAME_MAX_SZ #define SAA_MMAP_T1_SZ SAA_VCAP_FRAME_MAX_SZ #define SAA_MMAP_STS_OFFSET (SAA_VCAP_FRAME_MAX_SZ * 2) #define SAA_MMAP_STS_SZ 4096 #define SAA_MMAP_ACAP_OFFSET (SAA_MMAP_STS_OFFSET + SAA_MMAP_STS_SZ) #define SAA_MMAP_ACAP_SZ SAA_ACAP_FRAME_MAX_SZ struct saa_video_opt { uint8_t svo_flag_wpoff; enum FUSE svo_fuse; enum MODE svo_input_mode; uint8_t svo_flag_dtv, svo_flag_copyprotsrc, svo_flag_cpoff, svo_flag_holdg, svo_flag_fixgain; uint16_t svo_adc1_gain, svo_adc2_gain; enum FRATE svo_feild_rate; enum HTCMODE svo_htc_mode; uint8_t svo_flag_nonpll_mode; enum VNOMODE svo_vno_mode; uint8_t svo_flag_byps, svo_flag_ycomb, svo_flag_lubw; uint8_t svo_lufi; uint8_t svo_brightness, svo_contrast, svo_saturation, svo_hue; uint8_t svo_flag_no_acgc, svo_chroma_gain; uint8_t svo_flag_cdto; enum CSTD svo_cstd; uint8_t svo_flag_dcvf, svo_flag_fctc, svo_flag_ccomb; uint8_t svo_offv, svo_offu, svo_flag_chbw, svo_lcbw; uint8_t svo_ydel, svo_hdel; uint8_t svo_flag_forcecolor; uint8_t svo_apck, svo_aosl, svo_flag_uptcv, svo_flag_cm99; uint8_t svo_laty; enum ADETECT svo_adetect_std; }; struct saa_video_std { uint8_t std_flag_dfid, std_flag_no_dved, std_flag_dhed; uint16_t std_first_linenum; uint16_t std_video_xinstart, std_video_xinstop, std_video_yinstart, std_video_yinstop; uint16_t std_vbi_xinstart, std_vbi_xinstop, std_vbi_yinstart, std_vbi_yinstop; uint16_t std_brightness, std_contrast, std_saturation; enum VBIRAWSRC std_vbi_raw_src; }; #define VFMT_FLAG_MASK (0xff << 8) #define VFMT_FLAG_SHIFT 8 #define VFMT_YUV (1 << 8) #define VFMT_PLANAR (1 << 9) #define VFMT_ALPHA (1 << 10) #define VFMT_BPP_MASK (0xff << 16) /* BITS per pixel*/ #define VFMT_BPP_SHIFT 16 #define VFMT_UVP_MASK (0xff << 24) #define VFMT_UVP_SHIFT 24 #define VFMT_UVP0 (0 << 24) #define VFMT_UVP1 (1 << 24) #define VFMT_UVP2 (2 << 24) #define VFMT_UVP3 (3 << 24) #define VFMT_FMT_MASK (0xff << 0) #define VFMT_FMT_SHIFT 0 /* XXX Todo: Fourcc mapping */ enum VIDEOFMT { VFMT_YUV422 = 0x00 | VFMT_YUV | (16 << 16), VFMT_YUV444 = 0x01 | VFMT_YUV | VFMT_ALPHA | (32 << 16), VFMT_YUV411 = 0x03 | VFMT_YUV | (12 << 16), VFMT_Y8 = 0x06 | VFMT_YUV | (8 << 16), VFMT_RGB565 = 0x10 | (16 << 16), VFMT_RGB24 = 0x11 | (24 << 16), VFMT_RGBa888 = 0x12 | VFMT_ALPHA | (32 << 16), VFMT_RGBa555 = 0x13 | VFMT_ALPHA | (16 << 16), VFMT_RGB55a5 = 0x14 | VFMT_ALPHA | (16 << 16), /* * Special Hack, due to VFMT_YUV, MACON (ie. YUV->RGB filter) * will not be activated causing RGB24 to be UYV24 ... * B - maps to U, G to Y and R to V * YUV akin of RGBa888 is YUV444 */ VFMT_UYV24 = 0x11 | VFMT_YUV | (24 << 16), VFMT_aUYV555 = 0x13 | VFMT_YUV | VFMT_ALPHA | (16 << 16), VFMT_UaYV55a5 = 0x14 | VFMT_YUV | VFMT_ALPHA | (16 << 16), /* End Packed modes, start Planar */ VFMT_PLANAR_YUV444 = 0x08 | VFMT_PLANAR | VFMT_YUV | (24 << 16), VFMT_PLANAR_YUV422 = 0x09 | VFMT_PLANAR | VFMT_YUV | (16 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV422_UVP1 = 0x09 | VFMT_PLANAR | VFMT_YUV | (16 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV420 = 0x0a | VFMT_PLANAR | VFMT_YUV | (12 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV420_UVP1 = 0x0a | VFMT_PLANAR | VFMT_YUV | (12 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV420_UVL1 = 0x0c | VFMT_PLANAR | VFMT_YUV | (12 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV420_UVL1_UVP1 = 0x0c | VFMT_PLANAR | VFMT_YUV | (12 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV9 = 0x0b | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV9_UVP1 = 0x0b | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV9_UVP2 = 0x0b | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP2, VFMT_PLANAR_YUV9_UVP3 = 0x0b | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP3, VFMT_PLANAR_YUV9_UVL1 = 0x0d | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV9_UVL1_UVP1 = 0x0d | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV9_UVL1_UVP2 = 0x0d | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP2, VFMT_PLANAR_YUV9_UVL1_UVP3 = 0x0d | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP3, VFMT_PLANAR_YUV9_UVL2 = 0x0f | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP0, VFMT_PLANAR_YUV9_UVL2_UVP1 = 0x0f | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP1, VFMT_PLANAR_YUV9_UVL2_UVP2 = 0x0f | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP2, VFMT_PLANAR_YUV9_UVL2_UVP3 = 0x0f | VFMT_PLANAR | VFMT_YUV | (9 << 16) | VFMT_UVP3, }; /* Packed RGB */ /* #define FOURCC_0x00000000 BI_RGB VFMT_RGB[8,16,24,32] #define FOURCC_0x32424752 RGB VFMT_RGB[8,16,24,32] #define FOURCC_0x00000003 BI_BITFIELDS VFMT_RGB[8,15,16,24,32] + BSWAP #define FOURCC_0x41424752 RGBA VFMT_RGB[16,32] + ALPHA #define FOURCC_0x54424752 RGBT VFMT_RGB[16,32] + ALPHA */ /* Packed YUV */ /* #define FOURCC_0x57615349 RAW VFMT_Y444 or VFMT_UYV24 #define FOURCC_0x59455247 GREY VFMT_Y8 #define FOURCC_0x56595549 IUYV VFMT_Y8 + Weave #define FOURCC_0x31345949 IY41 VFMT_YUV411 + Weave #define FOURCC_0x31555949 IYU2 VFMT_UYV24 #define FOURCC_0x564E5955 UYNV VFMT_YUV422 #define FOURCC_0x59565955 UYVY VFMT_YUV422 #define FOURCC_0x59555956 VYUY VFMT_YUV422 + BSWAP #define FOURCC_0x32323459 Y422 VFMT_YUV422 #define FOURCC_0x32323459 YUY2 VFMT_YUV422 + BSWAP #define FOURCC_0x564E5559 YUNV VFMT_YUV422 + BSWAP #define FOURCC_0x55595659 YVYU VFMT_YUV422 + BSWAP #define FOURCC_0x50313459 Y41P VFMT_YUV411 #define FOURCC_0x30303859 Y800 VFMT_Y8 #define FOURCC_0x20203859 Y8 VFMT_Y8 */ /* Planar YUV */ /* #define FOURCC_0x39555659 YVU9 VFMT_PLANAR_YUV9 #define FOURCC_0x39565559 YUV9 VFMT_PLANAR_YUV9 #define FOURCC_0x36315659 YV16 VFMT_PLANAR_YUV422 #define FOURCC_0x32315659 YV12 VFMT_PLANAR_YUV420 #define FOURCC_0x30323449 I420 VFMT_PLANAR_YUV420 + Offseting #define FOURCC_0x56555949 IYUV VFMT_PLANAR_YUV420 + Offseting */ /* Check on IMV1 & IMC3 */ #define VSPEC_FLAG_DITHER (1 << 0) #define VSPEC_FLAG_CAPTURE_SIGNAL (1 << 1) #define VSPEC_FLAG_CAPTURE_SHM (1 << 2) #define VSPEC_FLAG_STATUS_SIGNAL (1 << 3) /* Valid for overlay too */ #define VSPEC_FLAG_CAPTURE_MULTIBUF (1 << 4) #define VSPEC_FLAG_NO_HSCALE (1 << 5) #define VSPEC_FLAG_NO_VSCALE (1 << 6) #define VSPEC_FLAG_CAPTURE_SIGFLD (1 << 7) #define VSPEC_FLAG_OVERLAY_DROPODD (1 << 8) #define VSPEC_FLAG_OVERLAY_DROPEVEN (1 << 9) #define VSPEC_FLAG_FRAMELOCK (1 << 10) #define VSPEC_FLAG_CAPTURE_ONEFEILD (1 << 11) #define VSPEC_FLAG_CAPTURE_EVENFEILD_FIRST (1 << 12) #define STS_VIDEO_LOADERR IEN_LOADERR #define STS_VIDEO_TRIGERR IEN_TRIGERR #define STS_VIDEO_CONFERR IEN_CONFERR #define STS_VIDEO_RDCAP IEN_RDCAP #define STS_VIDEO_INTL IEN_INTL #define STS_VIDEO_50HZ IEN_FIDT #define STS_ALL (STS_VIDEO_LOADERR | \ STS_VIDEO_TRIGERR | \ STS_VIDEO_CONFERR | \ STS_VIDEO_RDCAP | \ STS_VIDEO_INTL | \ STS_VIDEO_50HZ) struct saa_clip { uint16_t x, y, w, h; }; struct saa_video_cliplist { uint32_t svcl_count; struct saa_clip svcl_clip[SAA_MAX_CLIPS]; }; struct saa_alphaclip_info { uint8_t acl; // alpha value of clipped region uint8_t ancl; // alpha value of non clipped region }; struct saa_fixedclip_info { uint8_t red; uint8_t green; uint8_t blue; }; struct saa_video_clipmode { enum CLIPMODE svcm_mode; uint8_t svcm_flag_intlcd; /* Interlaced clipping */ uint8_t svcm_flag_clinv; /* Clipping invert */ union { struct saa_alphaclip_info ai; struct saa_fixedclip_info fi; } svcm_info; }; struct saa_video_spec { enum VIDEOFMT svs_vfmt; uint32_t svs_flags; uint8_t svs_cap_nrtasks; uint8_t svs_cap_frameskip[2]; uint32_t svs_cap_shmid[2]; uint32_t svs_cap_sigmask; uint8_t svs_cap_mb_limit; enum SWAPBYTES svs_cap_swapbytes; uint32_t svs_cap_bufsz; /* used only in non SHM mode */ /* 0 imples VCAP_FRAME_MAX */ /* Output window specs */ caddr_t svs_buf_base; uint32_t svs_buf_offset[2][3]; uint16_t svs_buf_pitch[3]; uint16_t svs_buf_width, svs_buf_height; struct saa_video_clipmode svs_clipmode; struct saa_video_cliplist svs_cliplist; uint32_t svs_cap_mbufsz; /* Useful for hardare PIP */ }; /* this structure has to be less than 4096 bytes */ struct saa_status { uint32_t ssts_sig_video; uint32_t ssts_sig_audio; uint32_t ssts_sig_sts; uint32_t ssts_video_sts; /* STS_VIDEO_* */ uint32_t ssts_video_lasttask; uint32_t ssts_video_framectr; uint32_t ssts_video_t1_framectr; uint32_t ssts_video_t2_framectr; uint32_t ssts_video_framesz; uint32_t ssts_video_mb_count; /* always <= mb_limit */ uint32_t ssts_video_mb_cur[2]; /* always < mb_count */ /* 2 because Task A, B */ uint32_t ssts_video_feild; /* Vaild on for SIGFLD */ uint32_t ssts_audio_framesz; uint32_t ssts_audio_framectr; uint32_t ssts_audio_mb_count; uint32_t ssts_audio_mb_cur; uint32_t ssts_audio_vptr; /* Audio virtual address ptr */ uint32_t ssts_irep; uint32_t ssts_audio_lastbuf; uint32_t ssts_video_mbufsz; /* this is mb_pitch */ uint32_t ssts_video_vptr; /* Video virtual address ptr */ uint32_t ssts_video_sig_count; uint32_t ssts_audio_sig_count; }; struct saa_video_clipinfo { struct saa_video_clipmode svci_clipmode; struct saa_video_cliplist svci_cliplist; }; #define OVERLAYON _IOW('v', 1, struct saa_video_spec) #define OVERLAYOFF _IOW('v', 2, int) #define SETVIDEOOPT _IOW('v', 3, struct saa_video_opt) #define GETVIDEOOPT _IOR('v', 4, struct saa_video_opt) #define SETVIDEOSTD _IOW('v', 5, struct saa_video_std) #define GETVIDEOSTD _IOR('v', 6, struct saa_video_std) #define CAPTUREON _IOW('v', 7, struct saa_video_spec) #define CAPTUREOFF _IOW('v', 8, int) /* * These are valid only when capture/overlay is on */ #define SETCLIPINFO _IOW('v', 9, struct saa_video_clipinfo) /* * Use when changing channels, while capture/overlay is on */ #define VIDEODMAPAUSE _IOW('v', 10, int) #define VIDEODMACONT _IOW('v', 11, int) #define GETVIDEOSTS _IOR('v', 12, int) #define GETVIDEOVPTR _IOR('v', 13, uint32_t) struct saa_audio_opt { uint8_t sao_flag_idarea; enum IDMOD sao_idmod; enum CH1MODE sao_ch1mode; enum CH2MODE sao_ch2mode; enum FLTBW sao_fltbw; uint32_t sao_siffreq1; uint32_t sao_siffreq2; uint8_t sao_flag_hpen; uint8_t sao_sifp; enum SIFA sao_sifa; uint8_t sao_sifgain; uint8_t sao_flag_sifagc_off; uint8_t sao_flag_sifagc_slow; uint8_t sao_flag_fmdsch1; enum FMDSC1 sao_fmdsch1; uint8_t sao_flag_fmdsch2; enum FMDSC2 sao_fmdsch2; uint8_t sao_flag_idswfm; enum FMDMSEL sao_fmdmsel; enum SDOS sao_dac_sdos; enum AVL sao_dac_avl; enum SDGS sao_dac_ogain; uint8_t sao_flag_aasdma; enum CSM sao_dsp_csm; uint8_t sao_flag_ch1_2vrms; uint8_t sao_flag_ch2_2vrms; }; struct saa_audio_monctrl { enum MSS sam_mss; enum MCSM sam_mcsm; uint8_t sam_flag_peak; }; #define ASPEC_FLAG_VLOCK (0x1 << 0) #define ASPEC_FLAG_CAPTURE_SIGNAL (0x1 << 1) #define ASPEC_FLAG_STATUS_SIGNAL (0x1 << 2) #define ASPEC_FLAG_CAPTURE_MULTIBUF (0x1 << 3) #define ASPEC_FLAG_NTSC (0x1 << 4) enum ACLKFREQ { ACLKFREQ_32p11MHZ = 0, ACLKFREQ_24p576MHZ = 1 }; struct saa_audio_spec { uint32_t sas_cap_sampcount; enum AUDFMT sas_audfmt; uint8_t sas_flag_samp2complement; enum AUDSAMP sas_audsamp; enum AUDSEL sas_audsel; enum SFS sas_sfs; uint8_t sas_icsch; /* 0 or 1 */ uint8_t sas_flags; uint8_t sas_cap_mb_limit; enum ACLKFREQ sas_aclkfreq; }; #define SETAUDIOOPT _IOW('s', 93, struct saa_audio_opt) #define GETAUDIOOPT _IOR('s', 94, struct saa_audio_opt) #define ACAPTUREON _IOW('s', 97, struct saa_audio_spec) #define ACAPTUREOFF _IOW('s', 98, int) #define GETSIFAUDIOLVL _IOR('s', 100, int) #define GETFMAUDIOSTS _IOR('s', 101, int) #define GETAUDIOCH1LVL _IOR('s', 102, int) #define SETAUDIOCH1LVL _IOW('s', 103, int) #define GETAUDIOCH2LVL _IOR('s', 104, int) #define SETAUDIOCH2LVL _IOW('s', 105, int) #define GETAUDIOMIXER _IOR('s', 106, enum OCS) #define SETAUDIOMIXER _IOW('s', 107, enum OCS) #define SETAUDIOMUTE _IOW('s', 108, int) #define SETMONITORCTRL _IOW('s', 109, struct saa_audio_monctrl) #define GETMONITORLVL _IOR('s', 110, int) #define GETAUDIOVPTR _IOR('s', 111, uint32_t) /* * Common IOCTLs - accessible via both saa and sau devices */ #define GETGPIODIR _IOR('g', 120, uint32_t) #define SETGPIODIR _IOW('g', 121, uint32_t) #define GETGPIODATA _IOR('g', 122, uint32_t) #define SETGPIODATA _IOW('g', 123, uint32_t) #endif