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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __LINUX_se401_H
  2. #define __LINUX_se401_H
  3. #include <asm/uaccess.h>
  4. #include <linux/videodev.h>
  5. #include <linux/smp_lock.h>
  6. #define se401_DEBUG /* Turn on debug messages */
  7. #ifdef se401_DEBUG
  8. #  define PDEBUG(level, fmt, args...) 
  9. if (debug >= level) info("[%s:%d] " fmt, __PRETTY_FUNCTION__, __LINE__ , ## args)
  10. #else
  11. #  define PDEBUG(level, fmt, args...) do {} while(0)
  12. #endif
  13. /* An almost drop-in replacement for sleep_on_interruptible */
  14. #define wait_interruptible(test, queue, wait) 
  15. add_wait_queue(queue, wait); 
  16. set_current_state(TASK_INTERRUPTIBLE); 
  17. if (test) 
  18. schedule(); 
  19. remove_wait_queue(queue, wait); 
  20. set_current_state(TASK_RUNNING); 
  21. if (signal_pending(current)) 
  22. break; 
  23. }
  24. #define SE401_REQ_GET_CAMERA_DESCRIPTOR 0x06
  25. #define SE401_REQ_START_CONTINUOUS_CAPTURE 0x41
  26. #define SE401_REQ_STOP_CONTINUOUS_CAPTURE 0x42
  27. #define SE401_REQ_CAPTURE_FRAME 0x43
  28. #define SE401_REQ_GET_BRT 0x44
  29. #define SE401_REQ_SET_BRT 0x45
  30. #define SE401_REQ_GET_WIDTH 0x4c
  31. #define SE401_REQ_SET_WIDTH 0x4d
  32. #define SE401_REQ_GET_HEIGHT 0x4e
  33. #define SE401_REQ_SET_HEIGHT 0x4f
  34. #define SE401_REQ_GET_OUTPUT_MODE 0x50
  35. #define SE401_REQ_SET_OUTPUT_MODE 0x51
  36. #define SE401_REQ_GET_EXT_FEATURE 0x52
  37. #define SE401_REQ_SET_EXT_FEATURE 0x53
  38. #define SE401_REQ_CAMERA_POWER 0x56
  39. #define SE401_REQ_LED_CONTROL 0x57
  40. #define SE401_REQ_BIOS 0xff
  41. #define SE401_BIOS_READ 0x07
  42. #define SE401_FORMAT_BAYER 0x40
  43. /* Hyundai hv7131b registers
  44.    7121 and 7141 should be the same (haven't really checked...) */
  45. /* Mode registers: */
  46. #define HV7131_REG_MODE_A 0x00
  47. #define HV7131_REG_MODE_B 0x01
  48. #define HV7131_REG_MODE_C 0x02
  49. /* Frame registers: */
  50. #define HV7131_REG_FRSU 0x10
  51. #define HV7131_REG_FRSL 0x11
  52. #define HV7131_REG_FCSU 0x12
  53. #define HV7131_REG_FCSL 0x13
  54. #define HV7131_REG_FWHU 0x14
  55. #define HV7131_REG_FWHL 0x15
  56. #define HV7131_REG_FWWU 0x16
  57. #define HV7131_REG_FWWL 0x17
  58. /* Timing registers: */
  59. #define HV7131_REG_THBU 0x20
  60. #define HV7131_REG_THBL 0x21
  61. #define HV7131_REG_TVBU 0x22
  62. #define HV7131_REG_TVBL 0x23
  63. #define HV7131_REG_TITU 0x25
  64. #define HV7131_REG_TITM 0x26
  65. #define HV7131_REG_TITL 0x27
  66. #define HV7131_REG_TMCD 0x28
  67. /* Adjust Registers: */
  68. #define HV7131_REG_ARLV 0x30
  69. #define HV7131_REG_ARCG 0x31
  70. #define HV7131_REG_AGCG 0x32
  71. #define HV7131_REG_ABCG 0x33
  72. #define HV7131_REG_APBV 0x34
  73. #define HV7131_REG_ASLP 0x54
  74. /* Offset Registers: */
  75. #define HV7131_REG_OFSR 0x50
  76. #define HV7131_REG_OFSG 0x51
  77. #define HV7131_REG_OFSB 0x52
  78. /* REset level statistics registers: */
  79. #define HV7131_REG_LOREFNOH 0x57
  80. #define HV7131_REG_LOREFNOL 0x58
  81. #define HV7131_REG_HIREFNOH 0x59
  82. #define HV7131_REG_HIREFNOL 0x5a
  83. /* se401 registers */
  84. #define SE401_OPERATINGMODE 0x2000
  85. /* size of usb transfers */
  86. #define SE401_PACKETSIZE 4096
  87. /* number of queued bulk transfers to use, should be about 8 */
  88. #define SE401_NUMSBUF 1
  89. /* read the usb specs for this one :) */
  90. #define SE401_VIDEO_ENDPOINT 1
  91. #define SE401_BUTTON_ENDPOINT 2
  92. /* number of frames supported by the v4l part */
  93. #define SE401_NUMFRAMES 2
  94. /* scratch buffers for passing data to the decoders */
  95. #define SE401_NUMSCRATCH 32
  96. /* maximum amount of data in a JangGu packet */
  97. #define SE401_VLCDATALEN 1024
  98. /* number of nul sized packets to receive before kicking the camera */
  99. #define SE401_MAX_NULLPACKETS 4000
  100. /* number of decoding errors before kicking the camera */
  101. #define SE401_MAX_ERRORS 200
  102. struct usb_device;
  103. struct se401_sbuf {
  104. unsigned char *data;
  105. };
  106. enum {
  107. FRAME_UNUSED, /* Unused (no MCAPTURE) */
  108. FRAME_READY, /* Ready to start grabbing */
  109. FRAME_GRABBING, /* In the process of being grabbed into */
  110. FRAME_DONE, /* Finished grabbing, but not been synced yet */
  111. FRAME_ERROR, /* Something bad happened while processing */
  112. };
  113. enum {
  114. FMT_BAYER,
  115. FMT_JANGGU,
  116. };
  117. enum {
  118. BUFFER_UNUSED,
  119. BUFFER_READY,
  120. BUFFER_BUSY,
  121. BUFFER_DONE,
  122. };
  123. struct se401_scratch {
  124. unsigned char *data;
  125. volatile int state;
  126. int offset;
  127. int length;
  128. };
  129. struct se401_frame {
  130. unsigned char *data; /* Frame buffer */
  131. volatile int grabstate; /* State of grabbing */
  132. unsigned char *curline;
  133. int curlinepix;
  134. int curpix;
  135. };
  136. struct usb_se401 {
  137. struct video_device vdev;
  138. /* Device structure */
  139. struct usb_device *dev;
  140. unsigned char iface;
  141. char *camera_name;
  142. int change;
  143. int brightness;
  144. int hue;
  145. int rgain;
  146. int ggain;
  147. int bgain;
  148. int expose_h;
  149. int expose_m;
  150. int expose_l;
  151. int resetlevel;
  152. int enhance;
  153. int format;
  154. int sizes;
  155. int *width;
  156. int *height;
  157. int cwidth; /* current width */
  158. int cheight; /* current height */
  159. int palette;
  160. int maxframesize;
  161. int cframesize; /* current framesize */
  162. struct semaphore lock;
  163. int user; /* user count for exclusive use */
  164. int removed; /* device disconnected */
  165. int streaming; /* Are we streaming video? */
  166. char *fbuf; /* Videodev buffer area */
  167. struct urb *urb[SE401_NUMSBUF];
  168. struct urb *inturb;
  169. int button;
  170. int buttonpressed;
  171. int curframe; /* Current receiving frame */
  172. struct se401_frame frame[SE401_NUMFRAMES];
  173. int readcount;
  174. int framecount;
  175. int error;
  176. int dropped;
  177. int scratch_next;
  178. int scratch_use;
  179. int scratch_overflow;
  180. struct se401_scratch scratch[SE401_NUMSCRATCH];
  181. /* Decoder specific data: */
  182. unsigned char vlcdata[SE401_VLCDATALEN];
  183. int vlcdatapos;
  184. int bayeroffset;
  185. struct se401_sbuf sbuf[SE401_NUMSBUF];
  186. wait_queue_head_t wq; /* Processes waiting */
  187. /* proc interface */
  188. struct proc_dir_entry *proc_entry; /* /proc/se401/videoX */
  189. int nullpackets;
  190. };
  191. static inline void usb_se401_remove_disconnected (struct usb_se401 *se401);
  192. #endif