sensor.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * This file is part of the OpenMV project.
  3. * Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
  4. * This work is licensed under the MIT license, see the file LICENSE for details.
  5. *
  6. * Sensor abstraction layer.
  7. *
  8. */
  9. #ifndef __SENSOR_H__
  10. #define __SENSOR_H__
  11. #include <stdint.h>
  12. #include <stdbool.h>
  13. #define NT99141_PID (0x14)
  14. #define OV9650_PID (0x96)
  15. #define OV7725_PID (0x77)
  16. #define OV2640_PID (0x26)
  17. #define OV3660_PID (0x36)
  18. #define OV5640_PID (0x56)
  19. #define OV7670_PID (0x76)
  20. typedef enum {
  21. PIXFORMAT_RGB565, // 2BPP/RGB565
  22. PIXFORMAT_YUV422, // 2BPP/YUV422
  23. PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE
  24. PIXFORMAT_JPEG, // JPEG/COMPRESSED
  25. PIXFORMAT_RGB888, // 3BPP/RGB888
  26. PIXFORMAT_RAW, // RAW
  27. PIXFORMAT_RGB444, // 3BP2P/RGB444
  28. PIXFORMAT_RGB555, // 3BP2P/RGB555
  29. } pixformat_t;
  30. typedef enum {
  31. FRAMESIZE_96X96, // 96x96
  32. FRAMESIZE_QQVGA, // 160x120
  33. FRAMESIZE_QCIF, // 176x144
  34. FRAMESIZE_HQVGA, // 240x176
  35. FRAMESIZE_240X240, // 240x240
  36. FRAMESIZE_QVGA, // 320x240
  37. FRAMESIZE_CIF, // 400x296
  38. FRAMESIZE_HVGA, // 480x320
  39. FRAMESIZE_VGA, // 640x480
  40. FRAMESIZE_SVGA, // 800x600
  41. FRAMESIZE_XGA, // 1024x768
  42. FRAMESIZE_HD, // 1280x720
  43. FRAMESIZE_SXGA, // 1280x1024
  44. FRAMESIZE_UXGA, // 1600x1200
  45. // 3MP Sensors
  46. FRAMESIZE_FHD, // 1920x1080
  47. FRAMESIZE_P_HD, // 720x1280
  48. FRAMESIZE_P_3MP, // 864x1536
  49. FRAMESIZE_QXGA, // 2048x1536
  50. // 5MP Sensors
  51. FRAMESIZE_QHD, // 2560x1440
  52. FRAMESIZE_WQXGA, // 2560x1600
  53. FRAMESIZE_P_FHD, // 1080x1920
  54. FRAMESIZE_QSXGA, // 2560x1920
  55. FRAMESIZE_INVALID
  56. } framesize_t;
  57. typedef enum {
  58. ASPECT_RATIO_4X3,
  59. ASPECT_RATIO_3X2,
  60. ASPECT_RATIO_16X10,
  61. ASPECT_RATIO_5X3,
  62. ASPECT_RATIO_16X9,
  63. ASPECT_RATIO_21X9,
  64. ASPECT_RATIO_5X4,
  65. ASPECT_RATIO_1X1,
  66. ASPECT_RATIO_9X16
  67. } aspect_ratio_t;
  68. typedef enum {
  69. GAINCEILING_2X,
  70. GAINCEILING_4X,
  71. GAINCEILING_8X,
  72. GAINCEILING_16X,
  73. GAINCEILING_32X,
  74. GAINCEILING_64X,
  75. GAINCEILING_128X,
  76. } gainceiling_t;
  77. typedef struct {
  78. uint16_t max_width;
  79. uint16_t max_height;
  80. uint16_t start_x;
  81. uint16_t start_y;
  82. uint16_t end_x;
  83. uint16_t end_y;
  84. uint16_t offset_x;
  85. uint16_t offset_y;
  86. uint16_t total_x;
  87. uint16_t total_y;
  88. } ratio_settings_t;
  89. typedef struct {
  90. const uint16_t width;
  91. const uint16_t height;
  92. const aspect_ratio_t aspect_ratio;
  93. } resolution_info_t;
  94. // Resolution table (in sensor.c)
  95. extern const resolution_info_t resolution[];
  96. typedef struct {
  97. uint8_t MIDH;
  98. uint8_t MIDL;
  99. uint8_t PID;
  100. uint8_t VER;
  101. } sensor_id_t;
  102. typedef struct {
  103. framesize_t framesize;//0 - 10
  104. bool scale;
  105. bool binning;
  106. uint8_t quality;//0 - 63
  107. int8_t brightness;//-2 - 2
  108. int8_t contrast;//-2 - 2
  109. int8_t saturation;//-2 - 2
  110. int8_t sharpness;//-2 - 2
  111. uint8_t denoise;
  112. uint8_t special_effect;//0 - 6
  113. uint8_t wb_mode;//0 - 4
  114. uint8_t awb;
  115. uint8_t awb_gain;
  116. uint8_t aec;
  117. uint8_t aec2;
  118. int8_t ae_level;//-2 - 2
  119. uint16_t aec_value;//0 - 1200
  120. uint8_t agc;
  121. uint8_t agc_gain;//0 - 30
  122. uint8_t gainceiling;//0 - 6
  123. uint8_t bpc;
  124. uint8_t wpc;
  125. uint8_t raw_gma;
  126. uint8_t lenc;
  127. uint8_t hmirror;
  128. uint8_t vflip;
  129. uint8_t dcw;
  130. uint8_t colorbar;
  131. } camera_status_t;
  132. typedef struct _sensor sensor_t;
  133. typedef struct _sensor {
  134. sensor_id_t id; // Sensor ID.
  135. uint8_t slv_addr; // Sensor I2C slave address.
  136. pixformat_t pixformat;
  137. camera_status_t status;
  138. int xclk_freq_hz;
  139. // Sensor function pointers
  140. int (*init_status) (sensor_t *sensor);
  141. int (*reset) (sensor_t *sensor);
  142. int (*set_pixformat) (sensor_t *sensor, pixformat_t pixformat);
  143. int (*set_framesize) (sensor_t *sensor, framesize_t framesize);
  144. int (*set_contrast) (sensor_t *sensor, int level);
  145. int (*set_brightness) (sensor_t *sensor, int level);
  146. int (*set_saturation) (sensor_t *sensor, int level);
  147. int (*set_sharpness) (sensor_t *sensor, int level);
  148. int (*set_denoise) (sensor_t *sensor, int level);
  149. int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling);
  150. int (*set_quality) (sensor_t *sensor, int quality);
  151. int (*set_colorbar) (sensor_t *sensor, int enable);
  152. int (*set_whitebal) (sensor_t *sensor, int enable);
  153. int (*set_gain_ctrl) (sensor_t *sensor, int enable);
  154. int (*set_exposure_ctrl) (sensor_t *sensor, int enable);
  155. int (*set_hmirror) (sensor_t *sensor, int enable);
  156. int (*set_vflip) (sensor_t *sensor, int enable);
  157. int (*set_aec2) (sensor_t *sensor, int enable);
  158. int (*set_awb_gain) (sensor_t *sensor, int enable);
  159. int (*set_agc_gain) (sensor_t *sensor, int gain);
  160. int (*set_aec_value) (sensor_t *sensor, int gain);
  161. int (*set_special_effect) (sensor_t *sensor, int effect);
  162. int (*set_wb_mode) (sensor_t *sensor, int mode);
  163. int (*set_ae_level) (sensor_t *sensor, int level);
  164. int (*set_dcw) (sensor_t *sensor, int enable);
  165. int (*set_bpc) (sensor_t *sensor, int enable);
  166. int (*set_wpc) (sensor_t *sensor, int enable);
  167. int (*set_raw_gma) (sensor_t *sensor, int enable);
  168. int (*set_lenc) (sensor_t *sensor, int enable);
  169. int (*get_reg) (sensor_t *sensor, int reg, int mask);
  170. int (*set_reg) (sensor_t *sensor, int reg, int mask, int value);
  171. int (*set_res_raw) (sensor_t *sensor, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning);
  172. int (*set_pll) (sensor_t *sensor, int bypass, int mul, int sys, int root, int pre, int seld5, int pclken, int pclk);
  173. int (*set_xclk) (sensor_t *sensor, int timer, int xclk);
  174. } sensor_t;
  175. #endif /* __SENSOR_H__ */