test_camera.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. /* OV2640 Registers definition when DSP bank selected (0xFF = 0x00) */
  23. //#define OV2640_DSP_R_BYPASS },05
  24. #define OV2640_DSP_Qs 0x44
  25. #define OV2640_DSP_CTRL 0x50
  26. #define OV2640_DSP_HSIZE1 0x51
  27. #define OV2640_DSP_VSIZE1 0x52
  28. #define OV2640_DSP_XOFFL 0x53
  29. #define OV2640_DSP_YOFFL 0x54
  30. #define OV2640_DSP_VHYX 0x55
  31. #define OV2640_DSP_DPRP 0x56
  32. #define OV2640_DSP_TEST 0x57
  33. #define OV2640_DSP_ZMOW 0x5A
  34. #define OV2640_DSP_ZMOH 0x5B
  35. #define OV2640_DSP_ZMHH 0x5C
  36. #define OV2640_DSP_BPADDR 0x7C
  37. #define OV2640_DSP_BPDATA 0x7D
  38. #define OV2640_DSP_CTRL2 0x86
  39. #define OV2640_DSP_CTRL3 0x87
  40. #define OV2640_DSP_SIZEL 0x8C
  41. #define OV2640_DSP_HSIZE2 0xC0
  42. #define OV2640_DSP_VSIZE2 0xC1
  43. #define OV2640_DSP_CTRL0 0xC2
  44. #define OV2640_DSP_CTRL1 0xC3
  45. #define OV2640_DSP_R_DVP_SP 0xD3
  46. #define OV2640_DSP_IMAGE_MODE 0xDA
  47. #define OV2640_DSP_RESET 0xE0
  48. #define OV2640_DSP_MS_SP 0xF0
  49. #define OV2640_DSP_SS_ID 0x7F
  50. #define OV2640_DSP_SS_CTRL 0xF8
  51. #define OV2640_DSP_MC_BIST 0xF9
  52. #define OV2640_DSP_MC_AL 0xFA
  53. #define OV2640_DSP_MC_AH 0xFB
  54. #define OV2640_DSP_MC_D 0xFC
  55. #define OV2640_DSP_P_STATUS 0xFE
  56. #define OV2640_DSP_RA_DLMT 0xFF
  57. /* OV2640 Registers definition when sensor bank selected (0xFF = 0x01) */
  58. #define OV2640_SENSOR_GAIN 0x00
  59. #define OV2640_SENSOR_COM1 0x03
  60. #define OV2640_SENSOR_REG04 0x04
  61. #define OV2640_SENSOR_REG08 0x08
  62. #define OV2640_SENSOR_COM2 0x09
  63. #define OV2640_SENSOR_PIDH 0x0A
  64. #define OV2640_SENSOR_PIDL 0x0B
  65. #define OV2640_SENSOR_COM3 0x0C
  66. #define OV2640_SENSOR_COM4 0x0D
  67. #define OV2640_SENSOR_AEC 0x10
  68. #define OV2640_SENSOR_CLKRC 0x11
  69. #define OV2640_SENSOR_COM7 0x12
  70. #define OV2640_SENSOR_COM8 0x13
  71. #define OV2640_SENSOR_COM9 0x14
  72. #define OV2640_SENSOR_COM10 0x15
  73. #define OV2640_SENSOR_HREFST 0x17
  74. #define OV2640_SENSOR_HREFEND 0x18
  75. #define OV2640_SENSOR_VSTART 0x19
  76. #define OV2640_SENSOR_VEND 0x1A
  77. #define OV2640_SENSOR_MIDH 0x1C
  78. #define OV2640_SENSOR_MIDL 0x1D
  79. #define OV2640_SENSOR_AEW 0x24
  80. #define OV2640_SENSOR_AEB 0x25
  81. #define OV2640_SENSOR_W 0x26
  82. #define OV2640_SENSOR_REG2A 0x2A
  83. #define OV2640_SENSOR_FRARL 0x2B
  84. #define OV2640_SENSOR_ADDVSL 0x2D
  85. #define OV2640_SENSOR_ADDVHS 0x2E
  86. #define OV2640_SENSOR_YAVG 0x2F
  87. #define OV2640_SENSOR_REG32 0x32
  88. #define OV2640_SENSOR_ARCOM2 0x34
  89. #define OV2640_SENSOR_REG45 0x45
  90. #define OV2640_SENSOR_FLL 0x46
  91. #define OV2640_SENSOR_FLH 0x47
  92. #define OV2640_SENSOR_COM19 0x48
  93. #define OV2640_SENSOR_ZOOMS 0x49
  94. #define OV2640_SENSOR_COM22 0x4B
  95. #define OV2640_SENSOR_COM25 0x4E
  96. #define OV2640_SENSOR_BD50 0x4F
  97. #define OV2640_SENSOR_BD60 0x50
  98. #define OV2640_SENSOR_REG5D 0x5D
  99. #define OV2640_SENSOR_REG5E 0x5E
  100. #define OV2640_SENSOR_REG5F 0x5F
  101. #define OV2640_SENSOR_REG60 0x60
  102. #define OV2640_SENSOR_HISTO_LOW 0x61
  103. #define OV2640_SENSOR_HISTO_HIGH 0x62
  104. #define GC032A_I2C_ADDRESS 0x21
  105. #define OV2640_I2C_ADDRESS 0x30
  106. static const I2C_CommonRegDataStruct GC032A_InitRegQueue[] =
  107. {
  108. {0xf3, 0xff},
  109. {0xf7, 0x01},
  110. {0xf8, 0x03},
  111. {0xf9, 0xce},
  112. {0xfa, 0x00},
  113. {0xfc, 0x02},
  114. {0xfe, 0x02},
  115. {0x81, 0x03},
  116. {0xfe,0x00},
  117. {0x03,0x01},
  118. {0x04,0xc2},
  119. {0x05,0x01},
  120. {0x06,0xc2},
  121. {0x07,0x00},
  122. {0x08,0x08},
  123. {0x0a,0x04},
  124. {0x0c,0x04},
  125. {0x0d,0x01},
  126. {0x0e,0xe8},
  127. {0x0f,0x02},
  128. {0x10,0x88},
  129. //{0x17,0x55},
  130. {0x17,0x54},
  131. {0x19,0x04},
  132. {0x1a,0x0a},
  133. {0x1f,0x40},
  134. {0x20,0x30},
  135. {0x2e,0x80},
  136. {0x2f,0x2b},
  137. {0x30,0x1a},
  138. {0xfe,0x02},
  139. {0x03,0x02},
  140. {0x06,0x60},
  141. {0x05,0xd7},
  142. {0x12,0x89},
  143. {0xfe,0x00},
  144. {0x18,0x02},
  145. {0xfe,0x02},
  146. {0x40,0x22},
  147. {0x45,0x00},
  148. {0x46,0x00},
  149. {0x49,0x20},
  150. {0xfe,0x01},
  151. {0x0a,0xc5},
  152. {0x45,0x00},
  153. {0xfe,0x00},
  154. {0x40,0xff},
  155. {0x41,0x25},
  156. {0x42,0x83},
  157. {0x43,0x10},
  158. // {0x44,0x90},
  159. {0x46,0x26},
  160. {0x49,0x03},
  161. {0x4f,0x01},
  162. {0xde,0x84},
  163. {0xfe,0x02},
  164. {0x22,0xf6},
  165. {0xfe,0x01},
  166. {0x12,0xa0},
  167. {0x13,0x3a},
  168. {0xc1,0x3c},
  169. {0xc2,0x50},
  170. {0xc3,0x00},
  171. {0xc4,0x32},
  172. {0xc5,0x24},
  173. {0xc6,0x16},
  174. {0xc7,0x08},
  175. {0xc8,0x08},
  176. {0xc9,0x00},
  177. {0xca,0x20},
  178. {0xdc,0x8a},
  179. {0xdd,0xa0},
  180. {0xde,0xa6},
  181. {0xdf,0x75},
  182. {0xfe,0x01},
  183. {0x7c,0x09},
  184. {0x65,0x00},
  185. {0x7c,0x08},
  186. {0x56,0xf4},
  187. {0x66,0x0f},
  188. {0x67,0x84},
  189. {0x6b,0x80},
  190. {0x6d,0x12},
  191. {0x6e,0xb0},
  192. {0x86,0x00},
  193. {0x87,0x00},
  194. {0x88,0x00},
  195. {0x89,0x00},
  196. {0x8a,0x00},
  197. {0x8b,0x00},
  198. {0x8c,0x00},
  199. {0x8d,0x00},
  200. {0x8e,0x00},
  201. {0x8f,0x00},
  202. {0x90,0xef},
  203. {0x91,0xe1},
  204. {0x92,0x0c},
  205. {0x93,0xef},
  206. {0x94,0x65},
  207. {0x95,0x1f},
  208. {0x96,0x0c},
  209. {0x97,0x2d},
  210. {0x98,0x20},
  211. {0x99,0xaa},
  212. {0x9a,0x3f},
  213. {0x9b,0x2c},
  214. {0x9c,0x5f},
  215. {0x9d,0x3e},
  216. {0x9e,0xaa},
  217. {0x9f,0x67},
  218. {0xa0,0x60},
  219. {0xa1,0x00},
  220. {0xa2,0x00},
  221. {0xa3,0x0a},
  222. {0xa4,0xb6},
  223. {0xa5,0xac},
  224. {0xa6,0xc1},
  225. {0xa7,0xac},
  226. {0xa8,0x55},
  227. {0xa9,0xc3},
  228. {0xaa,0xa4},
  229. {0xab,0xba},
  230. {0xac,0xa8},
  231. {0xad,0x55},
  232. {0xae,0xc8},
  233. {0xaf,0xb9},
  234. {0xb0,0xd4},
  235. {0xb1,0xc3},
  236. {0xb2,0x55},
  237. {0xb3,0xd8},
  238. {0xb4,0xce},
  239. {0xb5,0x00},
  240. {0xb6,0x00},
  241. {0xb7,0x05},
  242. {0xb8,0xd6},
  243. {0xb9,0x8c},
  244. {0xfe,0x01},
  245. {0xd0,0x40},
  246. {0xd1,0xf8},
  247. {0xd2,0x00},
  248. {0xd3,0xfa},
  249. {0xd4,0x45},
  250. {0xd5,0x02},
  251. {0xd6,0x30},
  252. {0xd7,0xfa},
  253. {0xd8,0x08},
  254. {0xd9,0x08},
  255. {0xda,0x58},
  256. {0xdb,0x02},
  257. {0xfe,0x00},
  258. {0xfe,0x00},
  259. {0xba,0x00},
  260. {0xbb,0x04},
  261. {0xbc,0x0a},
  262. {0xbd,0x0e},
  263. {0xbe,0x22},
  264. {0xbf,0x30},
  265. {0xc0,0x3d},
  266. {0xc1,0x4a},
  267. {0xc2,0x5d},
  268. {0xc3,0x6b},
  269. {0xc4,0x7a},
  270. {0xc5,0x85},
  271. {0xc6,0x90},
  272. {0xc7,0xa5},
  273. {0xc8,0xb5},
  274. {0xc9,0xc2},
  275. {0xca,0xcc},
  276. {0xcb,0xd5},
  277. {0xcc,0xde},
  278. {0xcd,0xea},
  279. {0xce,0xf5},
  280. {0xcf,0xff},
  281. {0xfe,0x00},
  282. {0x5a,0x08},
  283. {0x5b,0x0f},
  284. {0x5c,0x15},
  285. {0x5d,0x1c},
  286. {0x5e,0x28},
  287. {0x5f,0x36},
  288. {0x60,0x45},
  289. {0x61,0x51},
  290. {0x62,0x6a},
  291. {0x63,0x7d},
  292. {0x64,0x8d},
  293. {0x65,0x98},
  294. {0x66,0xa2},
  295. {0x67,0xb5},
  296. {0x68,0xc3},
  297. {0x69,0xcd},
  298. {0x6a,0xd4},
  299. {0x6b,0xdc},
  300. {0x6c,0xe3},
  301. {0x6d,0xf0},
  302. {0x6e,0xf9},
  303. {0x6f,0xff},
  304. {0xfe,0x00},
  305. {0x70,0x50},
  306. {0xfe,0x00},
  307. {0x4f,0x01},
  308. {0xfe,0x01},
  309. {0x44,0x04},
  310. {0x1f,0x30},
  311. {0x20,0x40},
  312. {0x26,0x9a},
  313. {0x27,0x02},
  314. {0x28,0x0d},
  315. {0x29,0x02},
  316. {0x2a,0x0d},
  317. {0x2b,0x02},
  318. {0x2c,0x58},
  319. {0x2d,0x07},
  320. {0x2e,0xd2},
  321. {0x2f,0x0b},
  322. {0x30,0x6e},
  323. {0x31,0x0e},
  324. {0x32,0x70},
  325. {0x33,0x12},
  326. {0x34,0x0c},
  327. {0x3c,0x20},
  328. {0x3e,0x20},
  329. {0x3f,0x2d},
  330. {0x40,0x40},
  331. {0x41,0x5b},
  332. {0x42,0x82},
  333. {0x43,0xb7},
  334. {0x04,0x0a},
  335. {0x02,0x79},
  336. {0x03,0xc0},
  337. {0xcc,0x08},
  338. {0xcd,0x08},
  339. {0xce,0xa4},
  340. {0xcf,0xec},
  341. {0xfe,0x00},
  342. {0x81,0xb8},
  343. {0x82,0x12},
  344. {0x83,0x0a},
  345. {0x84,0x01},
  346. {0x86,0x25},
  347. {0x87,0x18},
  348. {0x88,0x10},
  349. {0x89,0x70},
  350. {0x8a,0x20},
  351. {0x8b,0x10},
  352. {0x8c,0x08},
  353. {0x8d,0x0a},
  354. {0xfe,0x00},
  355. {0x8f,0xaa},
  356. {0x90,0x9c},
  357. {0x91,0x52},
  358. {0x92,0x03},
  359. {0x93,0x03},
  360. {0x94,0x08},
  361. {0x95,0x44},
  362. {0x97,0x00},
  363. {0x98,0x00},
  364. {0xfe,0x00},
  365. {0xa1,0x30},
  366. {0xa2,0x41},
  367. {0xa4,0x30},
  368. {0xa5,0x20},
  369. {0xaa,0x30},
  370. {0xac,0x32},
  371. {0xfe,0x00},
  372. {0xd1,0x3c},
  373. {0xd2,0x3c},
  374. {0xd3,0x38},
  375. {0xd6,0xf4},
  376. {0xd7,0x1d},
  377. {0xdd,0x73},
  378. {0xde,0x84},
  379. {0xfe,0x01},
  380. {0x13,0x20},
  381. {0xfe,0x00},
  382. {0x4f,0x00},
  383. {0x03,0x00},
  384. {0x04,0xa0},
  385. {0x71,0x60},
  386. {0x72,0x40},
  387. {0x42,0x80},
  388. {0x77,0x64},
  389. {0x78,0x40},
  390. {0x79,0x60},
  391. {0xfe, 0x00},
  392. {0x44, 0x06}, //改成RGB565输出
  393. {0x46, 0x0f}, //决定了VSYNC,HSYNC, pixclk
  394. };
  395. //800*480
  396. const const I2C_CommonRegDataStruct OV2640_InitRegQueue[]=
  397. {
  398. {0xff, 0x00},
  399. {0x2c, 0xff},
  400. {0x2e, 0xdf},
  401. {0xff, 0x01},
  402. {0x3c, 0x32},
  403. {0x11, 0x00},
  404. {0x09, 0x02},
  405. {0x04, 0x20|0x80}, //水平翻转
  406. {0x13, 0xe5},
  407. {0x14, 0x48},
  408. {0x2c, 0x0c},
  409. {0x33, 0x78},
  410. {0x3a, 0x33},
  411. {0x3b, 0xfB},
  412. {0x3e, 0x00},
  413. {0x43, 0x11},
  414. {0x16, 0x10},
  415. {0x4a, 0x81},
  416. {0x21, 0x99},
  417. {0x24, 0x40},
  418. {0x25, 0x38},
  419. {0x26, 0x82},
  420. {0x5c, 0x00},
  421. {0x63, 0x00},
  422. {0x46, 0x3f},
  423. {0x0c, 0x3c},
  424. {0x61, 0x70},
  425. {0x62, 0x80},
  426. {0x7c, 0x05},
  427. {0x20, 0x80},
  428. {0x28, 0x30},
  429. {0x6c, 0x00},
  430. {0x6d, 0x80},
  431. {0x6e, 0x00},
  432. {0x70, 0x02},
  433. {0x71, 0x94},
  434. {0x73, 0xc1},
  435. {0x3d, 0x34},
  436. {0x5a, 0x57},
  437. {0x12, 0x00},
  438. {0x11, 0x00},
  439. {0x17, 0x11},
  440. {0x18, 0x75},
  441. {0x19, 0x01},
  442. {0x1a, 0x97},
  443. {0x32, 0x36},
  444. {0x03, 0x0f},
  445. {0x37, 0x40},
  446. {0x4f, 0xbb},
  447. {0x50, 0x9c},
  448. {0x5a, 0x57},
  449. {0x6d, 0x80},
  450. {0x6d, 0x38},
  451. {0x39, 0x02},
  452. {0x35, 0x88},
  453. {0x22, 0x0a},
  454. {0x37, 0x40},
  455. {0x23, 0x00},
  456. {0x34, 0xa0},
  457. {0x36, 0x1a},
  458. {0x06, 0x02},
  459. {0x07, 0xc0},
  460. {0x0d, 0xb7},
  461. {0x0e, 0x01},
  462. {0x4c, 0x00},
  463. {0xff, 0x00},
  464. {0xe5, 0x7f},
  465. {0xf9, 0xc0},
  466. {0x41, 0x24},
  467. {0xe0, 0x14},
  468. {0x76, 0xff},
  469. {0x33, 0xa0},
  470. {0x42, 0x20},
  471. {0x43, 0x18},
  472. {0x4c, 0x00},
  473. {0x87, 0xd0},
  474. {0x88, 0x3f},
  475. {0xd7, 0x03},
  476. {0xd9, 0x10},
  477. {0xd3, 0x82},
  478. {0xc8, 0x08},
  479. {0xc9, 0x80},
  480. {0x7d, 0x00},
  481. {0x7c, 0x03},
  482. {0x7d, 0x48},
  483. {0x7c, 0x08},
  484. {0x7d, 0x20},
  485. {0x7d, 0x10},
  486. {0x7d, 0x0e},
  487. {0x90, 0x00},
  488. {0x91, 0x0e},
  489. {0x91, 0x1a},
  490. {0x91, 0x31},
  491. {0x91, 0x5a},
  492. {0x91, 0x69},
  493. {0x91, 0x75},
  494. {0x91, 0x7e},
  495. {0x91, 0x88},
  496. {0x91, 0x8f},
  497. {0x91, 0x96},
  498. {0x91, 0xa3},
  499. {0x91, 0xaf},
  500. {0x91, 0xc4},
  501. {0x91, 0xd7},
  502. {0x91, 0xe8},
  503. {0x91, 0x20},
  504. {0x92, 0x00},
  505. {0x93, 0x06},
  506. {0x93, 0xe3},
  507. {0x93, 0x02},
  508. {0x93, 0x02},
  509. {0x93, 0x00},
  510. {0x93, 0x04},
  511. {0x93, 0x00},
  512. {0x93, 0x03},
  513. {0x93, 0x00},
  514. {0x93, 0x00},
  515. {0x93, 0x00},
  516. {0x93, 0x00},
  517. {0x93, 0x00},
  518. {0x93, 0x00},
  519. {0x93, 0x00},
  520. {0x96, 0x00},
  521. {0x97, 0x08},
  522. {0x97, 0x19},
  523. {0x97, 0x02},
  524. {0x97, 0x0c},
  525. {0x97, 0x24},
  526. {0x97, 0x30},
  527. {0x97, 0x28},
  528. {0x97, 0x26},
  529. {0x97, 0x02},
  530. {0x97, 0x98},
  531. {0x97, 0x80},
  532. {0x97, 0x00},
  533. {0x97, 0x00},
  534. {0xc3, 0xef},
  535. {0xff, 0x00},
  536. {0xba, 0xdc},
  537. {0xbb, 0x08},
  538. {0xb6, 0x24},
  539. {0xb8, 0x33},
  540. {0xb7, 0x20},
  541. {0xb9, 0x30},
  542. {0xb3, 0xb4},
  543. {0xb4, 0xca},
  544. {0xb5, 0x43},
  545. {0xb0, 0x5c},
  546. {0xb1, 0x4f},
  547. {0xb2, 0x06},
  548. {0xc7, 0x00},
  549. {0xc6, 0x51},
  550. {0xc5, 0x11},
  551. {0xc4, 0x9c},
  552. {0xbf, 0x00},
  553. {0xbc, 0x64},
  554. {0xa6, 0x00},
  555. {0xa7, 0x1e},
  556. {0xa7, 0x6b},
  557. {0xa7, 0x47},
  558. {0xa7, 0x33},
  559. {0xa7, 0x00},
  560. {0xa7, 0x23},
  561. {0xa7, 0x2e},
  562. {0xa7, 0x85},
  563. {0xa7, 0x42},
  564. {0xa7, 0x33},
  565. {0xa7, 0x00},
  566. {0xa7, 0x23},
  567. {0xa7, 0x1b},
  568. {0xa7, 0x74},
  569. {0xa7, 0x42},
  570. {0xa7, 0x33},
  571. {0xa7, 0x00},
  572. {0xa7, 0x23},
  573. {0xc0, 0xc8},
  574. {0xc1, 0x96},
  575. {0x8c, 0x00},
  576. {0x86, 0x3d},
  577. {0x50, 0x92},
  578. {0x51, 0x90},
  579. {0x52, 0x2c},
  580. {0x53, 0x00},
  581. {0x54, 0x00},
  582. {0x55, 0x88},
  583. {0x5a, 0x50},
  584. {0x5b, 0x3c},
  585. {0x5c, 0x00},
  586. {0xd3, 0x04},
  587. {0x7f, 0x00},
  588. {0xda, 0x00},
  589. {0xe5, 0x1f},
  590. {0xe1, 0x67},
  591. {0xe0, 0x00},
  592. {0xdd, 0x7f},
  593. {0x05, 0x00},
  594. {0xff, 0x00},
  595. {0xe0, 0x04},
  596. {0xc0, 0xc8},
  597. {0xc1, 0x96},
  598. {0x86, 0x3d},
  599. {0x50, 0x92},
  600. {0x51, 0x90},
  601. {0x52, 0x2c},
  602. {0x53, 0x00},
  603. {0x54, 0x00},
  604. {0x55, 0x88},
  605. {0x57, 0x00},
  606. {0x5a, 0x50},
  607. {0x5b, 0x3c},
  608. {0x5c, 0x00},
  609. {0xd3, 0x04},//0x04,
  610. {0xe0, 0x00},
  611. {0xFF, 0x00},
  612. {0x05, 0x00},
  613. {0xDA, 0x08},
  614. {0xda, 0x09},
  615. {0x98, 0x00},
  616. {0x99, 0x00},
  617. {0x00, 0x00},
  618. // {0xff, 0x00},
  619. // {0xe0, 0x04},
  620. // {0xc0, 0xc8},
  621. // {0xc1, 0x96},
  622. // {0x86, 0x35},
  623. // {0x50, 0x80},//必须配置这个寄存器控制时钟
  624. // {0x51, 0x90},
  625. // {0x52, 0x2c},
  626. // {0x53, 0x00},
  627. // {0x54, 0x00},
  628. // {0x55, 0x88},
  629. // {0x57, 0x00},
  630. // {0x5a, 0x78},//480
  631. // {0x5b, 0x44},//272
  632. // {0x5c, 0x00},
  633. // {0xd3, 0x04},
  634. // {0xe0, 0x00},
  635. };
  636. static uint32_t prvVLen;
  637. static int32_t GC032A_InitDone(void *pData, void *pParam)
  638. {
  639. DBG("!");
  640. }
  641. static int32_t prvCamera_DCMICB(void *pData, void *pParam)
  642. {
  643. Buffer_Struct *RxBuf = (Buffer_Struct *)pData;
  644. if (!pData)
  645. {
  646. // DBG("%u", prvVLen);
  647. prvVLen = 0;
  648. return 0;
  649. }
  650. LCD_DrawStruct *draw = zalloc(sizeof(LCD_DrawStruct));
  651. if (!draw)
  652. {
  653. DBG("lcd flush no memory");
  654. return -1;
  655. }
  656. draw->Mode = SPI_MODE_0;
  657. draw->Speed = 48000000;
  658. draw->SpiID = HSPI_ID0;
  659. draw->CSPin = GPIOC_14;
  660. draw->DCPin = 72;
  661. draw->x1 = 0;
  662. draw->x2 = 239;
  663. draw->y1 = prvVLen;
  664. draw->y2 = prvVLen + 15;
  665. draw->xoffset = 0;
  666. draw->yoffset = 0;
  667. draw->Size = (draw->x2 - draw->x1 + 1) * (draw->y2 - draw->y1 + 1) * 2;
  668. draw->ColorMode = COLOR_MODE_RGB_565;
  669. draw->Data = OS_Malloc(draw->Size);
  670. if (!draw->Data)
  671. {
  672. DBG("lcd flush data no memory");
  673. OS_Free(draw);
  674. return -1;
  675. }
  676. // DBG_HexPrintf(RxBuf->Data, 8);
  677. memcpy(draw->Data, RxBuf->Data, draw->Size);
  678. Core_LCDDraw(draw);
  679. prvVLen += 16;
  680. return 0;
  681. }
  682. void GC032A_TestInit(void)
  683. {
  684. uint8_t Reg = 0xf0;
  685. uint8_t Data[2];
  686. uint32_t i;
  687. GPIO_Config(GPIOD_06, 0, 0);
  688. GPIO_Config(GPIOD_07, 0, 0);
  689. // GPIO_ExtiSetHWTimerCB(GC032A_IOCB, NULL);
  690. GPIO_Iomux(GPIOE_01, 3);
  691. GPIO_Iomux(GPIOE_02, 3);
  692. GPIO_Iomux(GPIOE_03, 3);
  693. GPIO_Iomux(GPIOD_01, 3);
  694. GPIO_Iomux(GPIOD_02, 3);
  695. GPIO_Iomux(GPIOD_03, 3);
  696. GPIO_Iomux(GPIOD_08, 3);
  697. GPIO_Iomux(GPIOD_09, 3);
  698. GPIO_Iomux(GPIOD_10, 3);
  699. GPIO_Iomux(GPIOD_11, 3);
  700. GPIO_Iomux(GPIOE_00, 3);
  701. GPIO_Iomux(GPIOE_06, 2);
  702. GPIO_Iomux(GPIOE_07, 2);
  703. GPIO_Iomux(GPIOA_05, 2);
  704. // GPIO_Config(GPIOE_03, 1, 1);
  705. // GPIO_ExtiConfig(GPIOE_03, 0, 1, 0);
  706. HWTimer_SetPWM(HW_TIMER5, 12000000, 0, 0);
  707. Task_DelayMS(1);
  708. GPIO_Output(GPIOD_06, 1);
  709. GPIO_Output(GPIOD_07, 1);
  710. Task_DelayUS(10);
  711. GPIO_Output(GPIOD_07, 0);
  712. I2C_MasterSetup(I2C_ID0, 400000);
  713. Data[0] = 0xf4;
  714. Data[1] = 0x10;
  715. I2C_BlockWrite(I2C_ID0, GC032A_I2C_ADDRESS, Data, 2, 10, NULL, 0);
  716. I2C_BlockRead(I2C_ID0, GC032A_I2C_ADDRESS, &Reg, 1, Data, 2, 10, NULL, 0);
  717. if ((0x23 == Data[0]) && (0x2a == Data[1]))
  718. {
  719. DBG("识别到GC032A控制芯片");
  720. }
  721. else
  722. {
  723. DBG("没有识别到GC032A控制芯片");
  724. return;
  725. }
  726. Data[0] = 0xfe;
  727. Data[1] = 0x00;
  728. Reg = 0x44;
  729. I2C_BlockWrite(I2C_ID0, GC032A_I2C_ADDRESS, Data, 2, 10, NULL, 0);
  730. I2C_BlockRead(I2C_ID0, GC032A_I2C_ADDRESS, &Reg, 1, Data, 2, 10, NULL, 0);
  731. DBG("%x,%x", Data[0], Data[1]);
  732. for(i = 0; i < sizeof(GC032A_InitRegQueue)/sizeof(I2C_CommonRegDataStruct); i++)
  733. {
  734. I2C_BlockWrite(I2C_ID0, GC032A_I2C_ADDRESS, GC032A_InitRegQueue[i].Data, 2, 10, NULL, 0);
  735. }
  736. Task_DelayMS(1000);
  737. // DBG("GC032A Init Done");
  738. // I2C_Prepare(I2C_ID0, GC032A_I2C_ADDRESS, 1, GC032A_InitDone, 0);
  739. // I2C_MasterWriteRegQueue(I2C_ID0, GC032A_InitRegQueue, sizeof(GC032A_InitRegQueue)/sizeof(I2C_CommonRegDataStruct), 10, 0);
  740. DCMI_Setup(0, 0, 0, 8, 0);
  741. DCMI_SetCallback(prvCamera_DCMICB, 0);
  742. DCMI_SetCROPConfig(1, (480-320)/2, ((640-240)/2)*2, 320 - 1, 2*240 - 1); //裁剪中间的240*320图像
  743. DCMI_CaptureSwitch(1, 1920, 0, 0, 0, NULL); //240 * 2 / 4 * 16,一次DMA传输有16行数据,一共传输20次
  744. prvVLen = 0;
  745. }
  746. void OV2640_TestInit(void)
  747. {
  748. uint8_t Reg = 0x1C;
  749. uint8_t Data[2];
  750. uint32_t i;
  751. GPIO_Config(GPIOD_06, 0, 0);
  752. GPIO_Config(GPIOD_07, 0, 0);
  753. // GPIO_ExtiSetHWTimerCB(GC032A_IOCB, NULL);
  754. GPIO_Iomux(GPIOE_01, 3);
  755. GPIO_Iomux(GPIOE_02, 3);
  756. GPIO_Iomux(GPIOE_03, 3);
  757. GPIO_Iomux(GPIOD_01, 3);
  758. GPIO_Iomux(GPIOD_02, 3);
  759. GPIO_Iomux(GPIOD_03, 3);
  760. GPIO_Iomux(GPIOD_08, 3);
  761. GPIO_Iomux(GPIOD_09, 3);
  762. GPIO_Iomux(GPIOD_10, 3);
  763. GPIO_Iomux(GPIOD_11, 3);
  764. GPIO_Iomux(GPIOE_00, 3);
  765. GPIO_Iomux(GPIOE_06, 2);
  766. GPIO_Iomux(GPIOE_07, 2);
  767. GPIO_Iomux(GPIOA_05, 2);
  768. // GPIO_Config(GPIOE_03, 1, 1);
  769. // GPIO_ExtiConfig(GPIOE_03, 0, 1, 0);
  770. HWTimer_SetPWM(HW_TIMER5, 24000000, 0, 0);
  771. Task_DelayMS(1);
  772. GPIO_Output(GPIOD_06, 1);
  773. GPIO_Output(GPIOD_07, 1);
  774. Task_DelayUS(10);
  775. GPIO_Output(GPIOD_07, 0);
  776. I2C_MasterSetup(I2C_ID0, 400000);
  777. Data[0] = 0xFF;
  778. Data[1] = 0x01;
  779. I2C_BlockWrite(I2C_ID0, OV2640_I2C_ADDRESS, Data, 2, 10, NULL, 0);
  780. I2C_BlockRead(I2C_ID0, OV2640_I2C_ADDRESS, &Reg, 1, Data, 2, 10, NULL, 0);
  781. if ((0x7F == Data[0]) && (0xA2 == Data[1]))
  782. {
  783. DBG("识别到OV2640控制芯片");
  784. }
  785. else
  786. {
  787. DBG("没有识别到OV2640控制芯片");
  788. return;
  789. }
  790. // Data[0] = 0xfe;
  791. // Data[1] = 0x00;
  792. // Reg = 0x44;
  793. // I2C_BlockWrite(I2C_ID0, GC032A_I2C_ADDRESS, Data, 2, 10, NULL, 0);
  794. // I2C_BlockRead(I2C_ID0, GC032A_I2C_ADDRESS, &Reg, Data, 2, 10, NULL, 0);
  795. // DBG("%x,%x", Data[0], Data[1]);
  796. for(i = 0; i < sizeof(OV2640_InitRegQueue)/sizeof(I2C_CommonRegDataStruct); i++)
  797. {
  798. I2C_BlockWrite(I2C_ID0, OV2640_I2C_ADDRESS, OV2640_InitRegQueue[i].Data, 2, 10, NULL, 0);
  799. }
  800. Task_DelayMS(2000);
  801. // DBG("GC032A Init Done");
  802. // I2C_Prepare(I2C_ID0, GC032A_I2C_ADDRESS, 1, GC032A_InitDone, 0);
  803. // I2C_MasterWriteRegQueue(I2C_ID0, GC032A_InitRegQueue, sizeof(GC032A_InitRegQueue)/sizeof(I2C_CommonRegDataStruct), 10, 0);
  804. DCMI_Setup(0, 0, 1, 8, 1);
  805. DCMI_SetCallback(prvCamera_DCMICB, 0);
  806. DCMI_SetCROPConfig(1, (800-320)/2, ((600-240)/2)*2, 320 - 1, 2*240 - 1); //裁剪中间的240*320图像
  807. DCMI_CaptureSwitch(1, 1920, 0, 0, 0, NULL); //240 * 2 / 4 * 16,一次DMA传输有16行数据,一共传输20次
  808. prvVLen = 0;
  809. }