sensor.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. typedef enum {
  17. OV9650_PID = 0x96,
  18. OV7725_PID = 0x77,
  19. OV2640_PID = 0x26,
  20. OV3660_PID = 0x3660,
  21. OV5640_PID = 0x5640,
  22. OV7670_PID = 0x76,
  23. NT99141_PID = 0x1410,
  24. GC2145_PID = 0x2145,
  25. GC032A_PID = 0x232a,
  26. GC0308_PID = 0x9b,
  27. BF3005_PID = 0x30,
  28. BF20A6_PID = 0x20a6,
  29. SC101IOT_PID = 0xda4a,
  30. SC030IOT_PID = 0x9a46,
  31. SC031GS_PID = 0x0031,
  32. MEGA_CCM_PID =0x039E,
  33. } camera_pid_t;
  34. typedef enum {
  35. CAMERA_OV7725,
  36. CAMERA_OV2640,
  37. CAMERA_OV3660,
  38. CAMERA_OV5640,
  39. CAMERA_OV7670,
  40. CAMERA_NT99141,
  41. CAMERA_GC2145,
  42. CAMERA_GC032A,
  43. CAMERA_GC0308,
  44. CAMERA_BF3005,
  45. CAMERA_BF20A6,
  46. CAMERA_SC101IOT,
  47. CAMERA_SC030IOT,
  48. CAMERA_SC031GS,
  49. CAMERA_MEGA_CCM,
  50. CAMERA_MODEL_MAX,
  51. CAMERA_NONE,
  52. } camera_model_t;
  53. typedef enum {
  54. OV2640_SCCB_ADDR = 0x30,// 0x60 >> 1
  55. OV5640_SCCB_ADDR = 0x3C,// 0x78 >> 1
  56. OV3660_SCCB_ADDR = 0x3C,// 0x78 >> 1
  57. OV7725_SCCB_ADDR = 0x21,// 0x42 >> 1
  58. OV7670_SCCB_ADDR = 0x21,// 0x42 >> 1
  59. NT99141_SCCB_ADDR = 0x2A,// 0x54 >> 1
  60. GC2145_SCCB_ADDR = 0x3C,// 0x78 >> 1
  61. GC032A_SCCB_ADDR = 0x21,// 0x42 >> 1
  62. GC0308_SCCB_ADDR = 0x21,// 0x42 >> 1
  63. BF3005_SCCB_ADDR = 0x6E,
  64. BF20A6_SCCB_ADDR = 0x6E,
  65. SC101IOT_SCCB_ADDR = 0x68,// 0xd0 >> 1
  66. SC030IOT_SCCB_ADDR = 0x68,// 0xd0 >> 1
  67. SC031GS_SCCB_ADDR = 0x30,
  68. MEGA_CCM_SCCB_ADDR = 0x1F, // 0x3E >> 1
  69. } camera_sccb_addr_t;
  70. typedef enum {
  71. PIXFORMAT_RGB565, // 2BPP/RGB565
  72. PIXFORMAT_YUV422, // 2BPP/YUV422
  73. PIXFORMAT_YUV420, // 1.5BPP/YUV420
  74. PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE
  75. PIXFORMAT_JPEG, // JPEG/COMPRESSED
  76. PIXFORMAT_RGB888, // 3BPP/RGB888
  77. PIXFORMAT_RAW, // RAW
  78. PIXFORMAT_RGB444, // 3BP2P/RGB444
  79. PIXFORMAT_RGB555, // 3BP2P/RGB555
  80. } pixformat_t;
  81. typedef enum {
  82. FRAMESIZE_96X96, // 96x96
  83. FRAMESIZE_QQVGA, // 160x120
  84. FRAMESIZE_128X128, // 128x128
  85. FRAMESIZE_QCIF, // 176x144
  86. FRAMESIZE_HQVGA, // 240x176
  87. FRAMESIZE_240X240, // 240x240
  88. FRAMESIZE_QVGA, // 320x240
  89. FRAMESIZE_320X320, // 320x320
  90. FRAMESIZE_CIF, // 400x296
  91. FRAMESIZE_HVGA, // 480x320
  92. FRAMESIZE_VGA, // 640x480
  93. FRAMESIZE_SVGA, // 800x600
  94. FRAMESIZE_XGA, // 1024x768
  95. FRAMESIZE_HD, // 1280x720
  96. FRAMESIZE_SXGA, // 1280x1024
  97. FRAMESIZE_UXGA, // 1600x1200
  98. // 3MP Sensors
  99. FRAMESIZE_FHD, // 1920x1080
  100. FRAMESIZE_P_HD, // 720x1280
  101. FRAMESIZE_P_3MP, // 864x1536
  102. FRAMESIZE_QXGA, // 2048x1536
  103. // 5MP Sensors
  104. FRAMESIZE_QHD, // 2560x1440
  105. FRAMESIZE_WQXGA, // 2560x1600
  106. FRAMESIZE_P_FHD, // 1080x1920
  107. FRAMESIZE_QSXGA, // 2560x1920
  108. FRAMESIZE_5MP, // 2592x1944
  109. FRAMESIZE_INVALID
  110. } framesize_t;
  111. typedef struct {
  112. const camera_model_t model;
  113. const char *name;
  114. const camera_sccb_addr_t sccb_addr;
  115. const camera_pid_t pid;
  116. const framesize_t max_size;
  117. const bool support_jpeg;
  118. } camera_sensor_info_t;
  119. typedef enum {
  120. ASPECT_RATIO_4X3,
  121. ASPECT_RATIO_3X2,
  122. ASPECT_RATIO_16X10,
  123. ASPECT_RATIO_5X3,
  124. ASPECT_RATIO_16X9,
  125. ASPECT_RATIO_21X9,
  126. ASPECT_RATIO_5X4,
  127. ASPECT_RATIO_1X1,
  128. ASPECT_RATIO_9X16
  129. } aspect_ratio_t;
  130. typedef enum {
  131. GAINCEILING_2X,
  132. GAINCEILING_4X,
  133. GAINCEILING_8X,
  134. GAINCEILING_16X,
  135. GAINCEILING_32X,
  136. GAINCEILING_64X,
  137. GAINCEILING_128X,
  138. } gainceiling_t;
  139. typedef struct {
  140. uint16_t max_width;
  141. uint16_t max_height;
  142. uint16_t start_x;
  143. uint16_t start_y;
  144. uint16_t end_x;
  145. uint16_t end_y;
  146. uint16_t offset_x;
  147. uint16_t offset_y;
  148. uint16_t total_x;
  149. uint16_t total_y;
  150. } ratio_settings_t;
  151. typedef struct {
  152. const uint16_t width;
  153. const uint16_t height;
  154. const aspect_ratio_t aspect_ratio;
  155. } resolution_info_t;
  156. // Resolution table (in sensor.c)
  157. extern const resolution_info_t resolution[];
  158. // camera sensor table (in sensor.c)
  159. extern const camera_sensor_info_t camera_sensor[];
  160. typedef struct {
  161. uint8_t MIDH;
  162. uint8_t MIDL;
  163. uint16_t PID;
  164. uint8_t VER;
  165. } sensor_id_t;
  166. typedef struct {
  167. framesize_t framesize;//0 - 10
  168. bool scale;
  169. bool binning;
  170. uint8_t quality;//0 - 63
  171. int8_t brightness;//-2 - 2
  172. int8_t contrast;//-2 - 2
  173. int8_t saturation;//-2 - 2
  174. int8_t sharpness;//-2 - 2
  175. uint8_t denoise;
  176. uint8_t special_effect;//0 - 6
  177. uint8_t wb_mode;//0 - 4
  178. uint8_t awb;
  179. uint8_t awb_gain;
  180. uint8_t aec;
  181. uint8_t aec2;
  182. int8_t ae_level;//-2 - 2
  183. uint16_t aec_value;//0 - 1200
  184. uint8_t agc;
  185. uint8_t agc_gain;//0 - 30
  186. uint8_t gainceiling;//0 - 6
  187. uint8_t bpc;
  188. uint8_t wpc;
  189. uint8_t raw_gma;
  190. uint8_t lenc;
  191. uint8_t hmirror;
  192. uint8_t vflip;
  193. uint8_t dcw;
  194. uint8_t colorbar;
  195. } camera_status_t;
  196. typedef struct _sensor sensor_t;
  197. typedef struct _sensor {
  198. sensor_id_t id; // Sensor ID.
  199. uint8_t slv_addr; // Sensor I2C slave address.
  200. pixformat_t pixformat;
  201. camera_status_t status;
  202. int xclk_freq_hz;
  203. // Sensor function pointers
  204. int (*init_status) (sensor_t *sensor);
  205. int (*reset) (sensor_t *sensor); // Reset the configuration of the sensor, and return ESP_OK if reset is successful
  206. int (*set_pixformat) (sensor_t *sensor, pixformat_t pixformat);
  207. int (*set_framesize) (sensor_t *sensor, framesize_t framesize);
  208. int (*set_contrast) (sensor_t *sensor, int level);
  209. int (*set_brightness) (sensor_t *sensor, int level);
  210. int (*set_saturation) (sensor_t *sensor, int level);
  211. int (*set_sharpness) (sensor_t *sensor, int level);
  212. int (*set_denoise) (sensor_t *sensor, int level);
  213. int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling);
  214. int (*set_quality) (sensor_t *sensor, int quality);
  215. int (*set_colorbar) (sensor_t *sensor, int enable);
  216. int (*set_whitebal) (sensor_t *sensor, int enable);
  217. int (*set_gain_ctrl) (sensor_t *sensor, int enable);
  218. int (*set_exposure_ctrl) (sensor_t *sensor, int enable);
  219. int (*set_hmirror) (sensor_t *sensor, int enable);
  220. int (*set_vflip) (sensor_t *sensor, int enable);
  221. int (*set_aec2) (sensor_t *sensor, int enable);
  222. int (*set_awb_gain) (sensor_t *sensor, int enable);
  223. int (*set_agc_gain) (sensor_t *sensor, int gain);
  224. int (*set_aec_value) (sensor_t *sensor, int gain);
  225. int (*set_special_effect) (sensor_t *sensor, int effect);
  226. int (*set_wb_mode) (sensor_t *sensor, int mode);
  227. int (*set_ae_level) (sensor_t *sensor, int level);
  228. int (*set_dcw) (sensor_t *sensor, int enable);
  229. int (*set_bpc) (sensor_t *sensor, int enable);
  230. int (*set_wpc) (sensor_t *sensor, int enable);
  231. int (*set_raw_gma) (sensor_t *sensor, int enable);
  232. int (*set_lenc) (sensor_t *sensor, int enable);
  233. int (*get_reg) (sensor_t *sensor, int reg, int mask);
  234. int (*set_reg) (sensor_t *sensor, int reg, int mask, int value);
  235. 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);
  236. int (*set_pll) (sensor_t *sensor, int bypass, int mul, int sys, int root, int pre, int seld5, int pclken, int pclk);
  237. int (*set_xclk) (sensor_t *sensor, int timer, int xclk);
  238. } sensor_t;
  239. camera_sensor_info_t *esp_camera_sensor_get_info(sensor_id_t *id);
  240. #ifdef __cplusplus
  241. }
  242. #endif
  243. #endif /* __SENSOR_H__ */