se401.h 5.3 KB

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