se401.h 5.3 KB

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