ark1668e_vin.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #ifndef _ARK1668_VIDEO_H_
  2. #define _ARK1668_VIDEO_H_
  3. #include <linux/cdev.h>
  4. #include <linux/i2c.h>
  5. #include <linux/soc/arkmicro/ark1668e_lcdc_regs.h>
  6. #include <linux/soc/arkmicro/ark1668e_sys_resgs.h>
  7. #include <linux/soc/arkmicro/ark1668e_itu656_regs.h>
  8. #include <linux/soc/arkmicro/ark_scale.h>
  9. //#include <linux/soc/arkmicro/ark1668e_gpio.h>
  10. #define ITU656_FRAME_NUM 4
  11. #define ITU656_BUFFER_NUM 3
  12. #define ITU656_SCALE_FRAME_NUM 3
  13. #define ITU656_FRAME_NUM_MAX 8
  14. #define ARK_VIN_NAME "ark1668e_vin"
  15. #define PAL 0
  16. #define NTSC 1
  17. #define PAL_WIDTH 720
  18. #define PAL_HEIGHT 288
  19. #define NTSC_WIDTH 720
  20. #define NTSC_HEIGHT 240
  21. #define CVBS_WIDTH PAL_WIDTH
  22. #define CVBS_HEIGHT PAL_HEIGHT
  23. #define START_DISCARD_FRAME 6
  24. #define DISPLAY_WIDTH 1024
  25. #define DISPLAY_HEIGHT 600
  26. #define ITU656_FIELD_SIZE (CVBS_WIDTH*CVBS_HEIGHT*2)
  27. #define ITU656_FRAME_SIZE (ITU656_FIELD_SIZE*2)
  28. #define ITU656_PROGRESSIVE_FRAME_SIZE (1280*720*2)
  29. #define ITU656_PROGRESSIVE_FRAME_SIZE_1080P (1920*1080*3/2)
  30. #define ARK_IOW(num, dtype) _IOW('O', num, dtype)
  31. #define ARK_IOR(num, dtype) _IOR('O', num, dtype)
  32. #define ARK_IOWR(num, dtype) _IOWR('O', num, dtype)
  33. #define ARK_IO(num) _IO('O', num)
  34. //for v4l2 sd
  35. #define VIDIOC_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
  36. #define VIDIOC_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
  37. #define VIDIOC_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
  38. #define VIDIOC_ENTER_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 4, int)
  39. #define VIDIOC_EXIT_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 5, int)
  40. #define VIDIOC_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
  41. #define VIDIOC_SET_AVIN_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 7, int)
  42. #define TVOUT_LAYER 0
  43. #define DISPLAY_LAYER 1
  44. #define TRACK_LAYER 2
  45. #define vin_readl(reg) __raw_readl(g_ark1668e_vin->dvr_dev->context.itu656_base+(reg))
  46. #define vin_writel(reg, val) __raw_writel((val), g_ark1668e_vin->dvr_dev->context.itu656_base+(reg))
  47. #define vin_readl_sys(reg) __raw_readl(g_ark1668e_vin->dvr_dev->context.sys_base+(reg))
  48. #define vin_writel_sys(reg, val) __raw_writel((val), g_ark1668e_vin->dvr_dev->context.sys_base+(reg))
  49. #define vin_readl_dein(reg) __raw_readl(g_ark1668e_vin->dvr_dev->context.deinterlace_base+(reg))
  50. #define vin_writel_dein(reg, val) __raw_writel((val), g_ark1668e_vin->dvr_dev->context.deinterlace_base+(reg))
  51. #define vin_readl_lcd(reg) __raw_readl(g_ark1668e_vin->dvr_dev->context.lcd_base+(reg))
  52. #define vin_writel_lcd(reg, val) __raw_writel((val), g_ark1668e_vin->dvr_dev->context.lcd_base+(reg))
  53. enum vin_framebuf_status{
  54. FRAMEBUF_STATUS_FREE,
  55. FRAMEBUF_STATUS_BUSY,
  56. FRAMEBUF_STATUS_READY,
  57. };
  58. enum {
  59. TYPE_UNKNOWN = -1,
  60. TYPE_CVBS = 0,
  61. TYPE_720P,
  62. TYPE_1080P,
  63. };
  64. enum ark7116_channel {
  65. ARK7116_AV0,
  66. ARK7116_AV1,
  67. ARK7116_AV2,
  68. };
  69. enum itu656_channel {
  70. ITU656_CH0,
  71. ITU656_CH1,
  72. ITU656_CH2,
  73. };
  74. enum dvr_source {
  75. DVR_SOURCE_CAMERA,
  76. DVR_SOURCE_AUX,
  77. DVR_SOURCE_DVD,
  78. };
  79. enum itu656_mirror{
  80. MIRROR_NO = 0,
  81. MIRROR_LEVEL,
  82. MIRROR_VERTICAL,
  83. MIRROR_LEVEL_VERTICAL,
  84. MIRROR_END,
  85. };
  86. enum {
  87. TYPE_UNDEF = -1,
  88. TYPE_ARK7116 = 0,
  89. TYPE_RN6752,
  90. TYPE_PR2000,
  91. };
  92. struct vin_para{
  93. int xpos;
  94. int ypos;
  95. int width;
  96. int height;
  97. int source;
  98. int tvout;
  99. int hori_mirror;
  100. int vert_mirror;
  101. int left_blank;
  102. int right_blank;
  103. int top_blank;
  104. int bottom_blank;
  105. int progressive;
  106. int itu601en;
  107. };
  108. struct ark_itu656in_context {
  109. int itu656_irq;
  110. int deinterlace_irq;
  111. struct device *dev;
  112. void __iomem *itu656_base;
  113. void __iomem *sys_base;
  114. void __iomem *deinterlace_base;
  115. void __iomem *lcd_base;
  116. };
  117. struct dvr_dev{
  118. char *name;
  119. int work_status;
  120. int channel;
  121. int itu_channel;
  122. int system; //ntsc or pal
  123. int interlace;
  124. int itu601en;
  125. int chip_info;
  126. int discard_frame;
  127. int cur_buffer;
  128. int show_video;
  129. int deinter_status;
  130. int src_width;
  131. int src_height;
  132. int screen_width;
  133. int screen_height;
  134. int screen_xpos;
  135. int screen_ypos;
  136. int carback_exit_status;
  137. u8 *buffer_virtaddr;
  138. unsigned int buffer_size;
  139. unsigned int buffer_phyaddr;
  140. unsigned int scale_buffer_size;
  141. int scale_alloc_width;
  142. int scale_alloc_height;
  143. int *scale_out_yaddr;
  144. int scale_out_yphyaddr;
  145. int scale_in_yphyaddr;
  146. int carback_signal;
  147. int layer_status;
  148. int signal_flag;
  149. int vin_mirror_config;
  150. int vin_buffer_status;
  151. int first_show_flag;
  152. int dev_major, dev_minor;
  153. spinlock_t spin_lock;
  154. struct semaphore vin_sem;
  155. struct work_struct scale_work;
  156. struct workqueue_struct *scale_queue;
  157. struct work_struct detect_work;
  158. struct workqueue_struct *detect_queue;
  159. struct cdev cdev;
  160. struct i2c_client *client;
  161. struct vin_para itu656in;
  162. struct vin_para itu656in_back;
  163. struct timer_list timer;
  164. struct timer_list signal_timer;
  165. unsigned int framebuf_phyaddr[ITU656_FRAME_NUM_MAX];
  166. unsigned int framebuf_status[ITU656_FRAME_NUM_MAX];
  167. unsigned int scalebuf_phyaddr[ITU656_SCALE_FRAME_NUM];
  168. unsigned int framebuf_num;
  169. unsigned int scale_framebuf_num;
  170. unsigned int scale_framebuf_index;
  171. unsigned int cur_frame;
  172. unsigned int frame_finish[ITU656_FRAME_NUM_MAX];//store frame id
  173. int frame_finish_count;
  174. wait_queue_head_t frame_finish_waitq;
  175. struct ark_itu656in_context context;
  176. };
  177. struct vin_subdev_entity {
  178. struct v4l2_subdev *sd;
  179. struct v4l2_async_subdev *asd;
  180. struct v4l2_async_notifier notifier;
  181. u32 pfe_cfg0;
  182. struct list_head list;
  183. };
  184. struct vin_buffer {
  185. struct vb2_v4l2_buffer vb;
  186. struct list_head list;
  187. };
  188. struct ark1668e_vin_device {
  189. struct device *dev;
  190. struct v4l2_device v4l2_dev;
  191. struct video_device video_dev;
  192. struct vb2_queue vb2_vidq;
  193. spinlock_t ark_queue_lock;
  194. struct list_head ark_queue;
  195. struct vin_buffer *cur_frm;
  196. unsigned int sequence;
  197. unsigned int vin_status;
  198. unsigned int sd_init;
  199. unsigned int app_channel_set;
  200. bool stop;
  201. bool stream_flag;
  202. int aux_flag;
  203. int aux_status;
  204. struct completion comp;
  205. struct v4l2_format fmt;
  206. struct work_struct awb_work;
  207. struct mutex lock;
  208. struct vin_subdev_entity *current_subdev;
  209. struct list_head subdev_entities;
  210. struct dvr_dev *dvr_dev;
  211. };
  212. struct vin_screen {
  213. unsigned int disp_x;
  214. unsigned int disp_y;
  215. unsigned int disp_width;
  216. unsigned int disp_height;
  217. };
  218. #define ARK_DVR_IOC_MAGIC 'n'
  219. #define VIN_UPDATE_WINDOW _IOWR(ARK_DVR_IOC_MAGIC, 50, struct vin_screen)
  220. #define VIN_START _IO(ARK_DVR_IOC_MAGIC, 51)
  221. #define VIN_STOP _IO(ARK_DVR_IOC_MAGIC, 52)
  222. #define VIN_SWITCH_CHANNEL _IOWR(ARK_DVR_IOC_MAGIC, 53, int)
  223. #define VIN_CONFIG _IOWR(ARK_DVR_IOC_MAGIC, 54, struct vin_para)
  224. #define VIN_IOCTL_DOWN_IDLE _IO(ARK_DVR_IOC_MAGIC, 55)
  225. #define VIN_IOCTL_UP_IDLE _IO(ARK_DVR_IOC_MAGIC, 56)
  226. #endif