From 2f68054525226343107f081dfc363c01ac9b5545 Mon Sep 17 00:00:00 2001 From: Sven Steudte Date: Sun, 11 Feb 2018 05:42:17 +0100 Subject: [PATCH] Fixed image sampling (stage 1, working, not finished yet) --- tracker/software/Makefile | 2 +- tracker/software/config.c | 17 +- tracker/software/drivers/ov5640.c | 1277 ++++++++++++------------ tracker/software/drivers/si446x.c | 9 +- tracker/software/mcuconf.h | 2 +- tracker/software/threads/radio/radio.c | 3 + 6 files changed, 651 insertions(+), 659 deletions(-) diff --git a/tracker/software/Makefile b/tracker/software/Makefile index 946b4574..f0947a39 100644 --- a/tracker/software/Makefile +++ b/tracker/software/Makefile @@ -66,7 +66,7 @@ endif # Stack size to the allocated to the Cortex-M main/exceptions stack. This # stack is used for processing interrupts and exceptions. ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x1000 + USE_EXCEPTIONS_STACKSIZE = 0x1500 endif # Enables the use of FPU (no, softfp, hard). diff --git a/tracker/software/config.c b/tracker/software/config.c index 744bf90e..3da34b4f 100644 --- a/tracker/software/config.c +++ b/tracker/software/config.c @@ -7,7 +7,7 @@ conf_t config = { // Primary position transmission thread .pos_pri = { .thread_conf = { - .active = true, + .active = false, .cycle = TIME_S2I(120) }, .radio_conf = { @@ -47,8 +47,9 @@ conf_t config = { // Primary image transmission thread .img_pri = { .thread_conf = { - .active = false, - .cycle = CYCLE_CONTINUOUSLY + .active = true, + .cycle = CYCLE_CONTINUOUSLY, + .init_delay = TIME_S2I(5) }, .radio_conf = { .pwr = 0x7F, @@ -60,9 +61,9 @@ conf_t config = { .call = "DL7AD-12", .path = "", - .res = RES_QVGA, + .res = RES_VGA, .quality = 4, - .buf_size = 32*1024 + .buf_size = 64*1024 }, // Secondary image transmission thread @@ -104,7 +105,7 @@ conf_t config = { }, .rx = { .thread_conf = { - .active = true + .active = false }, .radio_conf = { .pwr = 0x7F, @@ -113,8 +114,8 @@ conf_t config = { .preamble = 200 }, - .call = "VK2GJ-15", - .path = "WIDE2-1", + .call = "DL7AD-12", + .path = "WIDE1-1", .symbol = SYM_DIGIPEATER }, diff --git a/tracker/software/drivers/ov5640.c b/tracker/software/drivers/ov5640.c index a9c0b203..6a25d6b8 100644 --- a/tracker/software/drivers/ov5640.c +++ b/tracker/software/drivers/ov5640.c @@ -23,303 +23,303 @@ struct regval_list { static const struct regval_list OV5640YUV_Sensor_Dvp_Init[] = { { 0x4740, 0x24 }, + + { 0x4050, 0x6e }, + { 0x4051, 0x8f }, + + { 0x3008, 0x42 }, + { 0x3103, 0x03 }, + { 0x3017, 0x7f }, + { 0x3018, 0xff }, + { 0x302c, 0x02 }, + { 0x3108, 0x31 }, + { 0x3630, 0x2e },//2e + { 0x3632, 0xe2 }, + { 0x3633, 0x23 },//23 + { 0x3621, 0xe0 }, + { 0x3704, 0xa0 }, + { 0x3703, 0x5a }, + { 0x3715, 0x78 }, + { 0x3717, 0x01 }, + { 0x370b, 0x60 }, + { 0x3705, 0x1a }, + { 0x3905, 0x02 }, + { 0x3906, 0x10 }, + { 0x3901, 0x0a }, + { 0x3731, 0x12 }, + { 0x3600, 0x08 }, + { 0x3601, 0x33 }, + { 0x302d, 0x60 }, + { 0x3620, 0x52 }, + { 0x371b, 0x20 }, + { 0x471c, 0x50 }, + + { 0x3a18, 0x00 }, + { 0x3a19, 0xf8 }, + + { 0x3635, 0x1c },//1c + { 0x3634, 0x40 }, + { 0x3622, 0x01 }, + + { 0x3c04, 0x28 }, + { 0x3c05, 0x98 }, + { 0x3c06, 0x00 }, + { 0x3c07, 0x08 }, + { 0x3c08, 0x00 }, + { 0x3c09, 0x1c }, + { 0x3c0a, 0x9c }, + { 0x3c0b, 0x40 }, - { 0x4050, 0x6e }, - { 0x4051, 0x8f }, + { 0x3820, 0x41 }, + { 0x3821, 0x01 }, //07 - { 0x3008, 0x42 }, - { 0x3103, 0x03 }, - { 0x3017, 0x7f }, - { 0x3018, 0xff }, - { 0x302c, 0x02 }, - { 0x3108, 0x31 }, - { 0x3630, 0x2e },//2e - { 0x3632, 0xe2 }, - { 0x3633, 0x23 },//23 - { 0x3621, 0xe0 }, - { 0x3704, 0xa0 }, - { 0x3703, 0x5a }, - { 0x3715, 0x78 }, - { 0x3717, 0x01 }, - { 0x370b, 0x60 }, - { 0x3705, 0x1a }, - { 0x3905, 0x02 }, - { 0x3906, 0x10 }, - { 0x3901, 0x0a }, - { 0x3731, 0x12 }, - { 0x3600, 0x08 }, - { 0x3601, 0x33 }, - { 0x302d, 0x60 }, - { 0x3620, 0x52 }, - { 0x371b, 0x20 }, - { 0x471c, 0x50 }, - - { 0x3a18, 0x00 }, - { 0x3a19, 0xf8 }, - - { 0x3635, 0x1c },//1c - { 0x3634, 0x40 }, - { 0x3622, 0x01 }, - - { 0x3c04, 0x28 }, - { 0x3c05, 0x98 }, - { 0x3c06, 0x00 }, - { 0x3c07, 0x08 }, - { 0x3c08, 0x00 }, - { 0x3c09, 0x1c }, - { 0x3c0a, 0x9c }, - { 0x3c0b, 0x40 }, - - { 0x3820, 0x47 }, - { 0x3821, 0x00 }, //07 - - //windows setup - { 0x3800, 0x00 }, - { 0x3801, 0x00 }, - { 0x3802, 0x00 }, - { 0x3803, 0x04 }, - { 0x3804, 0x0a }, - { 0x3805, 0x3f }, - { 0x3806, 0x07 }, - { 0x3807, 0x9b }, - { 0x3808, 0x05 }, - { 0x3809, 0x00 }, - { 0x380a, 0x03 }, - { 0x380b, 0xc0 }, - { 0x3810, 0x00 }, - { 0x3811, 0x10 }, - { 0x3812, 0x00 }, - { 0x3813, 0x06 }, - { 0x3814, 0x31 }, - { 0x3815, 0x31 }, - - { 0x3034, 0x1a }, - { 0x3035, 0x11 }, //15fps - { 0x3036, 0x46 }, - { 0x3037, 0x03 }, - { 0x3038, 0x00 }, - { 0x3039, 0x00 }, - - { 0x380c, 0x07 }, - { 0x380d, 0x68 }, - { 0x380e, 0x03 }, //03 - { 0x380f, 0xd8 }, //d8 - - { 0x3c01, 0xb4 }, - { 0x3c00, 0x04 }, - { 0x3a08, 0x00 }, - { 0x3a09, 0x93 }, - { 0x3a0e, 0x06 }, - { 0x3a0a, 0x00 }, - { 0x3a0b, 0x7b }, - { 0x3a0d, 0x08 }, - - { 0x3a00, 0x3c }, //15fps-10fps - { 0x3a02, 0x05 }, - { 0x3a03, 0xc4 }, - { 0x3a14, 0x05 }, - { 0x3a15, 0xc4 }, - - { 0x3618, 0x00 }, - { 0x3612, 0x29 }, - { 0x3708, 0x64 }, - { 0x3709, 0x52 }, - { 0x370c, 0x03 }, - - { 0x4001, 0x02 }, - { 0x4004, 0x02 }, - { 0x3000, 0x00 }, - { 0x3002, 0x1c }, - { 0x3004, 0xff }, - { 0x3006, 0xc3 }, - { 0x300e, 0x58 }, - { 0x302e, 0x00 }, - { 0x4300, 0x30 }, - { 0x501f, 0x00 }, - { 0x4713, 0x03 }, - { 0x4407, 0x04 }, - { 0x460b, 0x35 }, - { 0x460c, 0x22 },//add by bright - { 0x3824, 0x01 },//add by bright - { 0x5001, 0xa3 }, - - { 0x3406, 0x01 },//awbinit - { 0x3400, 0x06 }, - { 0x3401, 0x80 }, - { 0x3402, 0x04 }, - { 0x3403, 0x00 }, - { 0x3404, 0x06 }, - { 0x3405, 0x00 }, - //awb - { 0x5180, 0xff }, - { 0x5181, 0xf2 }, - { 0x5182, 0x00 }, - { 0x5183, 0x14 }, - { 0x5184, 0x25 }, - { 0x5185, 0x24 }, - { 0x5186, 0x16 }, - { 0x5187, 0x16 }, - { 0x5188, 0x16 }, - { 0x5189, 0x62 }, - { 0x518a, 0x62 }, - { 0x518b, 0xf0 }, - { 0x518c, 0xb2 }, - { 0x518d, 0x50 }, - { 0x518e, 0x30 }, - { 0x518f, 0x30 }, - { 0x5190, 0x50 }, - { 0x5191, 0xf8 }, - { 0x5192, 0x04 }, - { 0x5193, 0x70 }, - { 0x5194, 0xf0 }, - { 0x5195, 0xf0 }, - { 0x5196, 0x03 }, - { 0x5197, 0x01 }, - { 0x5198, 0x04 }, - { 0x5199, 0x12 }, - { 0x519a, 0x04 }, - { 0x519b, 0x00 }, - { 0x519c, 0x06 }, - { 0x519d, 0x82 }, - { 0x519e, 0x38 }, - //color matrix - { 0x5381, 0x1e }, - { 0x5382, 0x5b }, - { 0x5383, 0x14 }, - { 0x5384, 0x06 }, - { 0x5385, 0x82 }, - { 0x5386, 0x88 }, - { 0x5387, 0x7c }, - { 0x5388, 0x60 }, - { 0x5389, 0x1c }, - { 0x538a, 0x01 }, - { 0x538b, 0x98 }, - //sharp&noise - { 0x5300, 0x08 }, - { 0x5301, 0x30 }, - { 0x5302, 0x3f }, - { 0x5303, 0x10 }, - { 0x5304, 0x08 }, - { 0x5305, 0x30 }, - { 0x5306, 0x18 }, - { 0x5307, 0x28 }, - { 0x5309, 0x08 }, - { 0x530a, 0x30 }, - { 0x530b, 0x04 }, - { 0x530c, 0x06 }, - //gamma - { 0x5480, 0x01 }, - { 0x5481, 0x06 }, - { 0x5482, 0x12 }, - { 0x5483, 0x24 }, - { 0x5484, 0x4a }, - { 0x5485, 0x58 }, - { 0x5486, 0x65 }, - { 0x5487, 0x72 }, - { 0x5488, 0x7d }, - { 0x5489, 0x88 }, - { 0x548a, 0x92 }, - { 0x548b, 0xa3 }, - { 0x548c, 0xb2 }, - { 0x548d, 0xc8 }, - { 0x548e, 0xdd }, - { 0x548f, 0xf0 }, - { 0x5490, 0x15 }, - //UV adjust - { 0x5580, 0x06 }, - { 0x5583, 0x40 }, - { 0x5584, 0x20 }, - { 0x5589, 0x10 }, - { 0x558a, 0x00 }, - { 0x558b, 0xf8 }, - //lens shading - { 0x5000, 0xa7 }, - { 0x5800, 0x20 }, - { 0x5801, 0x19 }, - { 0x5802, 0x17 }, - { 0x5803, 0x16 }, - { 0x5804, 0x18 }, - { 0x5805, 0x21 }, - { 0x5806, 0x0F }, - { 0x5807, 0x0A }, - { 0x5808, 0x07 }, - { 0x5809, 0x07 }, - { 0x580a, 0x0A }, - { 0x580b, 0x0C }, - { 0x580c, 0x0A }, - { 0x580d, 0x03 }, - { 0x580e, 0x01 }, - { 0x580f, 0x01 }, - { 0x5810, 0x03 }, - { 0x5811, 0x09 }, - { 0x5812, 0x0A }, - { 0x5813, 0x03 }, - { 0x5814, 0x01 }, - { 0x5815, 0x01 }, - { 0x5816, 0x03 }, - { 0x5817, 0x08 }, - { 0x5818, 0x10 }, - { 0x5819, 0x0A }, - { 0x581a, 0x06 }, - { 0x581b, 0x06 }, - { 0x581c, 0x08 }, - { 0x581d, 0x0E }, - { 0x581e, 0x22 }, - { 0x581f, 0x18 }, - { 0x5820, 0x13 }, - { 0x5821, 0x12 }, - { 0x5822, 0x16 }, - { 0x5823, 0x1E }, - { 0x5824, 0x64 }, - { 0x5825, 0x2A }, - { 0x5826, 0x2C }, - { 0x5827, 0x2A }, - { 0x5828, 0x46 }, - { 0x5829, 0x2A }, - { 0x582a, 0x26 }, - { 0x582b, 0x24 }, - { 0x582c, 0x26 }, - { 0x582d, 0x2A }, - { 0x582e, 0x28 }, - { 0x582f, 0x42 }, - { 0x5830, 0x40 }, - { 0x5831, 0x42 }, - { 0x5832, 0x08 }, - { 0x5833, 0x28 }, - { 0x5834, 0x26 }, - { 0x5835, 0x24 }, - { 0x5836, 0x26 }, - { 0x5837, 0x2A }, - { 0x5838, 0x44 }, - { 0x5839, 0x4A }, - { 0x583a, 0x2C }, - { 0x583b, 0x2a }, - { 0x583c, 0x46 }, - { 0x583d, 0xCE }, - - { 0x5688, 0x22 }, - { 0x5689, 0x22 }, - { 0x568a, 0x42 }, - { 0x568b, 0x24 }, - { 0x568c, 0x42 }, - { 0x568d, 0x24 }, - { 0x568e, 0x22 }, - { 0x568f, 0x22 }, - - { 0x5025, 0x00 }, - - { 0x3a0f, 0x30 }, - { 0x3a10, 0x28 }, - { 0x3a1b, 0x30 }, - { 0x3a1e, 0x28 }, - { 0x3a11, 0x61 }, - { 0x3a1f, 0x10 }, - - { 0x4005, 0x1a }, - { 0x3406, 0x00 },//awbinit - { 0x3503, 0x00 },//awbinit - { 0x3008, 0x02 }, - { 0xffff, 0xff }, + //windows setup + { 0x3800, 0x00 }, + { 0x3801, 0x00 }, + { 0x3802, 0x00 }, + { 0x3803, 0x04 }, + { 0x3804, 0x0a }, + { 0x3805, 0x3f }, + { 0x3806, 0x07 }, + { 0x3807, 0x9b }, + { 0x3808, 0x05 }, + { 0x3809, 0x00 }, + { 0x380a, 0x03 }, + { 0x380b, 0xc0 }, + { 0x3810, 0x00 }, + { 0x3811, 0x10 }, + { 0x3812, 0x00 }, + { 0x3813, 0x06 }, + { 0x3814, 0x31 }, + { 0x3815, 0x31 }, + + { 0x3034, 0x1a }, + { 0x3035, 0x11 }, //15fps + { 0x3036, 0x46 }, + { 0x3037, 0x03 }, + { 0x3038, 0x00 }, + { 0x3039, 0x00 }, + + { 0x380c, 0x07 }, + { 0x380d, 0x68 }, + { 0x380e, 0x03 }, //03 + { 0x380f, 0xd8 }, //d8 + + { 0x3c01, 0xb4 }, + { 0x3c00, 0x04 }, + { 0x3a08, 0x00 }, + { 0x3a09, 0x93 }, + { 0x3a0e, 0x06 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0x7b }, + { 0x3a0d, 0x08 }, + + { 0x3a00, 0x3c }, //15fps-10fps + { 0x3a02, 0x05 }, + { 0x3a03, 0xc4 }, + { 0x3a14, 0x05 }, + { 0x3a15, 0xc4 }, + + { 0x3618, 0x00 }, + { 0x3612, 0x29 }, + { 0x3708, 0x64 }, + { 0x3709, 0x52 }, + { 0x370c, 0x03 }, + + { 0x4001, 0x02 }, + { 0x4004, 0x02 }, + { 0x3000, 0x00 }, + { 0x3002, 0x1c }, + { 0x3004, 0xff }, + { 0x3006, 0xc3 }, + { 0x300e, 0x58 }, + { 0x302e, 0x00 }, + { 0x4300, 0x30 }, + { 0x501f, 0x00 }, + { 0x4713, 0x03 }, + { 0x4407, 0x04 }, + { 0x460b, 0x35 }, + { 0x460c, 0x22 },//add by bright + { 0x3824, 0x01 },//add by bright + { 0x5001, 0xa3 }, + + { 0x3406, 0x01 },//awbinit + { 0x3400, 0x06 }, + { 0x3401, 0x80 }, + { 0x3402, 0x04 }, + { 0x3403, 0x00 }, + { 0x3404, 0x06 }, + { 0x3405, 0x00 }, + //awb + { 0x5180, 0xff }, + { 0x5181, 0xf2 }, + { 0x5182, 0x00 }, + { 0x5183, 0x14 }, + { 0x5184, 0x25 }, + { 0x5185, 0x24 }, + { 0x5186, 0x16 }, + { 0x5187, 0x16 }, + { 0x5188, 0x16 }, + { 0x5189, 0x62 }, + { 0x518a, 0x62 }, + { 0x518b, 0xf0 }, + { 0x518c, 0xb2 }, + { 0x518d, 0x50 }, + { 0x518e, 0x30 }, + { 0x518f, 0x30 }, + { 0x5190, 0x50 }, + { 0x5191, 0xf8 }, + { 0x5192, 0x04 }, + { 0x5193, 0x70 }, + { 0x5194, 0xf0 }, + { 0x5195, 0xf0 }, + { 0x5196, 0x03 }, + { 0x5197, 0x01 }, + { 0x5198, 0x04 }, + { 0x5199, 0x12 }, + { 0x519a, 0x04 }, + { 0x519b, 0x00 }, + { 0x519c, 0x06 }, + { 0x519d, 0x82 }, + { 0x519e, 0x38 }, + //color matrix + { 0x5381, 0x1e }, + { 0x5382, 0x5b }, + { 0x5383, 0x14 }, + { 0x5384, 0x06 }, + { 0x5385, 0x82 }, + { 0x5386, 0x88 }, + { 0x5387, 0x7c }, + { 0x5388, 0x60 }, + { 0x5389, 0x1c }, + { 0x538a, 0x01 }, + { 0x538b, 0x98 }, + //sharp&noise + { 0x5300, 0x08 }, + { 0x5301, 0x30 }, + { 0x5302, 0x3f }, + { 0x5303, 0x10 }, + { 0x5304, 0x08 }, + { 0x5305, 0x30 }, + { 0x5306, 0x18 }, + { 0x5307, 0x28 }, + { 0x5309, 0x08 }, + { 0x530a, 0x30 }, + { 0x530b, 0x04 }, + { 0x530c, 0x06 }, + //gamma + { 0x5480, 0x01 }, + { 0x5481, 0x06 }, + { 0x5482, 0x12 }, + { 0x5483, 0x24 }, + { 0x5484, 0x4a }, + { 0x5485, 0x58 }, + { 0x5486, 0x65 }, + { 0x5487, 0x72 }, + { 0x5488, 0x7d }, + { 0x5489, 0x88 }, + { 0x548a, 0x92 }, + { 0x548b, 0xa3 }, + { 0x548c, 0xb2 }, + { 0x548d, 0xc8 }, + { 0x548e, 0xdd }, + { 0x548f, 0xf0 }, + { 0x5490, 0x15 }, + //UV adjust + { 0x5580, 0x06 }, + { 0x5583, 0x40 }, + { 0x5584, 0x20 }, + { 0x5589, 0x10 }, + { 0x558a, 0x00 }, + { 0x558b, 0xf8 }, + //lens shading + { 0x5000, 0xa7 }, + { 0x5800, 0x20 }, + { 0x5801, 0x19 }, + { 0x5802, 0x17 }, + { 0x5803, 0x16 }, + { 0x5804, 0x18 }, + { 0x5805, 0x21 }, + { 0x5806, 0x0F }, + { 0x5807, 0x0A }, + { 0x5808, 0x07 }, + { 0x5809, 0x07 }, + { 0x580a, 0x0A }, + { 0x580b, 0x0C }, + { 0x580c, 0x0A }, + { 0x580d, 0x03 }, + { 0x580e, 0x01 }, + { 0x580f, 0x01 }, + { 0x5810, 0x03 }, + { 0x5811, 0x09 }, + { 0x5812, 0x0A }, + { 0x5813, 0x03 }, + { 0x5814, 0x01 }, + { 0x5815, 0x01 }, + { 0x5816, 0x03 }, + { 0x5817, 0x08 }, + { 0x5818, 0x10 }, + { 0x5819, 0x0A }, + { 0x581a, 0x06 }, + { 0x581b, 0x06 }, + { 0x581c, 0x08 }, + { 0x581d, 0x0E }, + { 0x581e, 0x22 }, + { 0x581f, 0x18 }, + { 0x5820, 0x13 }, + { 0x5821, 0x12 }, + { 0x5822, 0x16 }, + { 0x5823, 0x1E }, + { 0x5824, 0x64 }, + { 0x5825, 0x2A }, + { 0x5826, 0x2C }, + { 0x5827, 0x2A }, + { 0x5828, 0x46 }, + { 0x5829, 0x2A }, + { 0x582a, 0x26 }, + { 0x582b, 0x24 }, + { 0x582c, 0x26 }, + { 0x582d, 0x2A }, + { 0x582e, 0x28 }, + { 0x582f, 0x42 }, + { 0x5830, 0x40 }, + { 0x5831, 0x42 }, + { 0x5832, 0x08 }, + { 0x5833, 0x28 }, + { 0x5834, 0x26 }, + { 0x5835, 0x24 }, + { 0x5836, 0x26 }, + { 0x5837, 0x2A }, + { 0x5838, 0x44 }, + { 0x5839, 0x4A }, + { 0x583a, 0x2C }, + { 0x583b, 0x2a }, + { 0x583c, 0x46 }, + { 0x583d, 0xCE }, + + { 0x5688, 0x22 }, + { 0x5689, 0x22 }, + { 0x568a, 0x42 }, + { 0x568b, 0x24 }, + { 0x568c, 0x42 }, + { 0x568d, 0x24 }, + { 0x568e, 0x22 }, + { 0x568f, 0x22 }, + + { 0x5025, 0x00 }, + + { 0x3a0f, 0x30 }, + { 0x3a10, 0x28 }, + { 0x3a1b, 0x30 }, + { 0x3a1e, 0x28 }, + { 0x3a11, 0x61 }, + { 0x3a1f, 0x10 }, + + { 0x4005, 0x1a }, + { 0x3406, 0x00 },//awbinit + { 0x3503, 0x00 },//awbinit + { 0x3008, 0x02 }, +{ 0xffff, 0xff }, }; @@ -327,328 +327,297 @@ static const struct regval_list OV5640YUV_Sensor_Dvp_Init[] = //2592x1944 QSXGA static const struct regval_list OV5640_JPEG_QSXGA[] = { - {0x3820, 0x47}, - {0x3821, 0x20}, - {0x3814, 0x11}, - {0x3815, 0x11}, - {0x3803, 0x00}, - {0x3807, 0x9f}, - {0x3808, 0x0a}, - {0x3809, 0x20}, - {0x380a, 0x07}, - {0x380b, 0x98}, - {0x380c, 0x0b}, - {0x380d, 0x1c}, - {0x380e, 0x07}, - {0x380f, 0xb0}, - {0x3813, 0x04}, - {0x3618, 0x04}, - {0x3612, 0x4b}, - {0x3708, 0x64}, - {0x3709, 0x12}, - {0x370c, 0x00}, - {0x3a02, 0x07}, - {0x3a03, 0xb0}, - {0x3a0e, 0x06}, - {0x3a0d, 0x08}, - {0x3a14, 0x07}, - {0x3a15, 0xb0}, - {0x4001, 0x02}, - {0x4004, 0x06}, - {0x3002, 0x00}, - {0x3006, 0xff}, - {0x3824, 0x04}, - {0x5001, 0x83}, - {0x3036, 0x69}, - {0x3035, 0x31}, - {0x4005, 0x1A}, - {0xffff, 0xff}, + {0x3820 ,0x40}, + {0x3821 ,0x26}, + {0x3814 ,0x11}, + {0x3815 ,0x11}, + {0x3803 ,0x00}, + {0x3807 ,0x9f}, + {0x3808 ,0x0a}, + {0x3809 ,0x20}, + {0x380a ,0x07}, + {0x380b ,0x98}, + {0x380c ,0x0b}, + {0x380d ,0x1c}, + {0x380e ,0x07}, + {0x380f ,0xb0}, + {0x3813 ,0x04}, + {0x3618 ,0x04}, + {0x3612 ,0x4b}, + {0x3708 ,0x64}, + {0x3709 ,0x12}, + {0x370c ,0x00}, + {0x3a02 ,0x07}, + {0x3a03 ,0xb0}, + {0x3a0e ,0x06}, + {0x3a0d ,0x08}, + {0x3a14 ,0x07}, + {0x3a15 ,0xb0}, + {0x4001 ,0x02}, + {0x4004 ,0x06}, + {0x3002 ,0x00}, + {0x3006 ,0xff}, + {0x3824 ,0x04}, + {0x5001 ,0x83}, + {0x3036 ,0x69}, + {0x3035 ,0x31}, + {0x4005 ,0x1A}, +{0xffff, 0xff}, }; //5MP static const struct regval_list OV5640_5MP_JPEG[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0xA }, - {0x3809, 0x20}, - {0x380a, 0x7 }, - {0x380b, 0x98}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0xA }, + {0x3809 ,0x20}, + {0x380a ,0x7 }, + {0x380b ,0x98}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //320x240 QVGA static const struct regval_list OV5640_QSXGA2QVGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x1 }, - {0x3809, 0x40}, - {0x380a, 0x0 }, - {0x380b, 0xf0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x1 }, + {0x3809 ,0x40}, + {0x380a ,0x0 }, + {0x380b ,0xf0}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //320x240 QQVGA static const struct regval_list OV5640_QSXGA2QQVGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x0 }, - {0x3809, 0xA0}, - {0x380a, 0x0 }, - {0x380b, 0x70}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x0 }, + {0x3809 ,0xA0}, + {0x380a ,0x0 }, + {0x380b ,0x70}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //640x480 VGA static const struct regval_list OV5640_QSXGA2VGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x2 }, - {0x3809, 0x80}, - {0x380a, 0x1 }, - {0x380b, 0xe0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, - {0xffff, 0xff}, -}; - -//640x480 VGA -static const struct regval_list OV5640_QSXGA2VGA_ZOOMED[] = -{ - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x2 }, - {0x3809, 0x80}, - {0x380a, 0x1 }, - {0x380b, 0xe0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, - {0xffff, 0xff}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x2 }, + {0x3809 ,0x80}, + {0x380a ,0x1 }, + {0x380b ,0xe0}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, +{0xffff, 0xff}, }; //800x480 WVGA static const struct regval_list OV5640_QSXGA2WVGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x3 }, - {0x3809, 0x20}, - {0x380a, 0x1 }, - {0x380b, 0xe0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x3 }, + {0x3809 ,0x20}, + {0x380a ,0x1 }, + {0x380b ,0xe0}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, {0x3810, 0x00}, {0x3811, 0x10}, {0x3812, 0x01}, {0x3813, 0x48}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //352x288 CIF static const struct regval_list OV5640_QSXGA2CIF[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x1 }, - {0x3809, 0x60}, - {0x380a, 0x1 }, - {0x380b, 0x20}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x1 }, + {0x3809 ,0x60}, + {0x380a ,0x1 }, + {0x380b ,0x20}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, {0x3810, 0x00}, {0x3811, 0x10}, {0x3812, 0x00}, {0x3813, 0x70}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //1280x960 SXGA static const struct regval_list OV5640_QSXGA2SXGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x5 }, - {0x3809, 0x0 }, - {0x380a, 0x3 }, - {0x380b, 0xc0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x5 }, + {0x3809 ,0x0 }, + {0x380a ,0x3 }, + {0x380b ,0xc0}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //2048x1536 QXGA static const struct regval_list OV5640_QSXGA2QXGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x8 }, - {0x3809, 0x0 }, - {0x380a, 0x6 }, - {0x380b, 0x0 }, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x8 }, + {0x3809 ,0x0 }, + {0x380a ,0x6 }, + {0x380b ,0x0 }, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; @@ -656,68 +625,68 @@ static const struct regval_list OV5640_QSXGA2QXGA[] = //1600x1200 UXGA static const struct regval_list OV5640_QSXGA2UXGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x6 }, - {0x3809, 0x40}, - {0x380a, 0x4 }, - {0x380b, 0xb0}, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x6 }, + {0x3809 ,0x40}, + {0x380a ,0x4 }, + {0x380b ,0xb0}, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; //1024x768 XGA static const struct regval_list OV5640_QSXGA2XGA[] = { - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0xA }, - {0x3805, 0x3f}, - {0x3806, 0x7 }, - {0x3807, 0x9f}, - {0x3808, 0x4 }, - {0x3809, 0x0 }, - {0x380a, 0x3 }, - {0x380b, 0x0 }, - {0x380c, 0xc }, - {0x380d, 0x80}, - {0x380e, 0x7 }, - {0x380f, 0xd0}, - {0x5001, 0xa3}, - {0x5680, 0x0 }, - {0x5681, 0x0 }, - {0x5682, 0xA }, - {0x5683, 0x20}, - {0x5684, 0x0 }, - {0x5685, 0x0 }, - {0x5686, 0x7 }, - {0x5687, 0x98}, + {0x3800 ,0x00}, + {0x3801 ,0x00}, + {0x3802 ,0x00}, + {0x3803 ,0x00}, + {0x3804 ,0xA }, + {0x3805 ,0x3f}, + {0x3806 ,0x7 }, + {0x3807 ,0x9f}, + {0x3808 ,0x4 }, + {0x3809 ,0x0 }, + {0x380a ,0x3 }, + {0x380b ,0x0 }, + {0x380c ,0xc }, + {0x380d ,0x80}, + {0x380e ,0x7 }, + {0x380f ,0xd0}, + {0x5001 ,0xa3}, + {0x5680 ,0x0 }, + {0x5681 ,0x0 }, + {0x5682 ,0xA }, + {0x5683 ,0x20}, + {0x5684 ,0x0 }, + {0x5685 ,0x0 }, + {0x5686 ,0x7 }, + {0x5687 ,0x98}, {0xffff, 0xff}, }; + // TODO: Implement a state machine instead of multiple flags static bool capture_finished; -static bool vsync; static bool dma_error; static uint32_t dma_flags; @@ -749,8 +718,7 @@ uint32_t OV5640_Snapshot2RAM(uint8_t* buffer, uint32_t size, resolution_t res) // Capture image until we get a good image (max 10 tries) do { // Clearing buffer - uint32_t i; - for(i=0; i Capture image"); @@ -761,6 +729,14 @@ uint32_t OV5640_Snapshot2RAM(uint8_t* buffer, uint32_t size, resolution_t res) while(!buffer[size_sampled] && size_sampled > 0) size_sampled--; + for(uint32_t i=0; i<(size_sampled+31)/32; i++) { + TRACE_DEBUG("0x%04x > %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + i*32, buffer[i*32+0 ], buffer[i*32+1 ], buffer[i*32+2 ], buffer[i*32+3 ], buffer[i*32+4 ], buffer[i*32+5 ], buffer[i*32+6 ], buffer[i*32+7 ], + buffer[i*32+8 ], buffer[i*32+9 ], buffer[i*32+10], buffer[i*32+11], buffer[i*32+12], buffer[i*32+13], buffer[i*32+14], buffer[i*32+15], + buffer[i*32+16], buffer[i*32+17], buffer[i*32+18], buffer[i*32+19], buffer[i*32+20], buffer[i*32+21], buffer[i*32+22], buffer[i*32+23], + buffer[i*32+24], buffer[i*32+25], buffer[i*32+26], buffer[i*32+27], buffer[i*32+28], buffer[i*32+29], buffer[i*32+30], buffer[i*32+31]); + } + TRACE_INFO("CAM > Image size: %d bytes", size_sampled); } while(!status && cntr--); @@ -772,7 +748,7 @@ const stm32_dma_stream_t *dmastp; #if OV5640_USE_DMA_DBM == TRUE uint16_t dma_index; uint16_t dma_buffers; -#define DMA_SEGMENT_SIZE 1024 +#define DMA_SEGMENT_SIZE 65535 #define DMA_FIFO_BURST_ALIGN 32 @@ -828,6 +804,7 @@ static void dma_interrupt(void *p, uint32_t flags) { * Disable timer DMA request and flag fault. */ TIM8->DIER &= ~TIM_DIER_CC1DE; + dma_stop(); dma_error = true; dmaStreamClearInterrupt(dmastp); return; @@ -850,6 +827,7 @@ static void dma_interrupt(void *p, uint32_t flags) { */ TIM8->DIER &= ~TIM_DIER_CC1DE; + dma_stop(); dma_error = true; dmaStreamClearInterrupt(dmastp); return; @@ -869,8 +847,7 @@ static void dma_interrupt(void *p, uint32_t flags) { * DMA will use new address at h/w DBM switch. */ - - if (dmaStreamGetCurrentTarget(dmastp) == 1) { + if(dmaStreamGetCurrentTarget(dmastp) == 1) { dmaStreamSetMemory0(dmastp, &dma_buffer[++dma_index * DMA_SEGMENT_SIZE]); } else { dmaStreamSetMemory1(dmastp, &dma_buffer[++dma_index * DMA_SEGMENT_SIZE]); @@ -886,14 +863,15 @@ static void dma_interrupt(void *p, uint32_t flags) { (void)p; dma_flags = flags; - dmaStreamClearInterrupt(dmastp); if(flags & (STM32_DMA_ISR_FEIF | STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) { /* * DMA transfer error, FIFO error or Direct mode error. * See 9.34.19 of RM0430. */ + dmaStreamClearInterrupt(dmastp); TIM8->DIER &= ~TIM_DIER_CC1DE; + dma_stop(); dma_error = true; return; } @@ -907,9 +885,11 @@ static void dma_interrupt(void *p, uint32_t flags) { * Dont stop the DMA here. Its going to be stopped by the leading edge of VSYNC. */ TIM8->DIER &= ~TIM_DIER_CC1DE; + dma_stop(); dma_error = true; return; } + dmaStreamClearInterrupt(dmastp); } #endif /* USE_OV5640_DMA_DBM */ @@ -918,13 +898,14 @@ static void dma_interrupt(void *p, uint32_t flags) { * VSYNC is asserted during a frame. * See OV5640 datasheet for details. */ +static uint8_t vsync_cntr; void vsync_cb(void *arg) { (void)arg; chSysLockFromISR(); // VSYNC handling - if(!vsync) { + if(!vsync_cntr) { /* * Rising edge of VSYNC after TIM8 has been initialised. * Start DMA channel. @@ -932,7 +913,7 @@ void vsync_cb(void *arg) { */ dma_start(); TIM8->DIER |= TIM_DIER_CC1DE; - vsync = true; + vsync_cntr++; } else { /* VSYNC leading with vsync true. * This means end of capture for the frame. @@ -958,7 +939,7 @@ void vsync_cb(void *arg) { bool OV5640_Capture(uint8_t* buffer, uint32_t size) { OV5640_setLightIntensity(); - +TRACE_DEBUG("A buffer_addr=%08x", buffer);chThdSleep(TIME_MS2I(10)); /* * Note: * If there are no Chibios devices enabled that use DMA then... @@ -966,6 +947,9 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) * UDEFS = -DSTM32_DMA_REQUIRED */ +TRACE_DEBUG("E");chThdSleep(TIME_MS2I(10)); + I2C_Lock(); // Lock I2C because it uses the same DMA + /* Setup DMA for transfer on TIM8_CH1 - DMA2 stream 2, channel 7 */ dmastp = STM32_DMA_STREAM(STM32_DMA_STREAM_ID(2, 2)); uint32_t dmamode = STM32_DMA_CR_CHSEL(7) | @@ -989,7 +973,7 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) #if OV5640_USE_DMA_DBM == TRUE dma_buffer = buffer; - +TRACE_DEBUG("B");chThdSleep(TIME_MS2I(10)); /* * Buffer address must be word aligned. * Also note requirement for burst transfers from FIFO. @@ -1011,7 +995,7 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) dmaStreamSetMemory0(dmastp, &buffer[0]); dmaStreamSetMemory1(dmastp, &buffer[DMA_SEGMENT_SIZE]); dmaStreamSetTransactionSize(dmastp, DMA_SEGMENT_SIZE); - +TRACE_DEBUG("C");chThdSleep(TIME_MS2I(10)); /* * Calculate the number of whole buffers. * TODO: Make this include remainder memory as partial buffer? @@ -1034,7 +1018,7 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) dma_error = false; dma_flags = 0; - +TRACE_DEBUG("D");chThdSleep(TIME_MS2I(10)); /* * Setup timer for PCLK * Setup timer to trigger DMA in capture mode. On rising edge, we will @@ -1050,24 +1034,25 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) TIM8->CCER = TIM_CCER_CC1E; capture_finished = false; - vsync = false; + vsync_cntr = 0; - I2C_Lock(); // Lock I2C because it uses the same DMA - - while(!palReadLine(LINE_CAM_VSYNC)); // Wait for current picture to finish transmission +TRACE_DEBUG("G");chThdSleep(TIME_MS2I(10)); // Enable VSYNC interrupt palSetLineCallback(LINE_CAM_VSYNC, (palcallback_t)vsync_cb, NULL); palEnableLineEvent(LINE_CAM_VSYNC, PAL_EVENT_MODE_RISING_EDGE); +TRACE_DEBUG("H");chThdSleep(TIME_MS2I(10)); // Wait for capture to be finished do { +TRACE_DEBUG("I");chThdSleep(TIME_MS2I(10)); chThdSleep(TIME_MS2I(10)); + TRACE_DEBUG("dma_error=%08x dma_flags=%08x", dma_error, dma_flags); } while(!capture_finished && !dma_error); - +TRACE_DEBUG("J");chThdSleep(TIME_MS2I(10)); // Capture done, unlock I2C I2C_Unlock(); - +TRACE_DEBUG("K");chThdSleep(TIME_MS2I(10)); if(dma_error) { if(dma_flags & STM32_DMA_ISR_HTIF) { @@ -1101,17 +1086,18 @@ bool OV5640_Capture(uint8_t* buffer, uint32_t size) */ void OV5640_InitGPIO(void) { - palSetLineMode(LINE_CAM_PCLK, PAL_MODE_ALTERNATE(3) | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_VSYNC, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_XCLK, PAL_MODE_ALTERNATE(0) | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D2, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D3, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D4, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D5, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D6, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D7, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D8, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - palSetLineMode(LINE_CAM_D9, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_PCLK, PAL_MODE_ALTERNATE(3)); + palSetLineMode(LINE_CAM_VSYNC, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_XCLK, PAL_MODE_ALTERNATE(0)); + palSetLineMode(LINE_CAM_D2, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D3, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D4, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D5, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D6, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D7, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D8, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(LINE_CAM_D9, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetLineMode(LINE_CAM_EN, PAL_MODE_OUTPUT_PUSHPULL); palSetLineMode(LINE_CAM_RESET, PAL_MODE_OUTPUT_PUSHPULL); @@ -1198,11 +1184,6 @@ void OV5640_SetResolution(resolution_t res) I2C_write8_16bitreg(OV5640_I2C_ADR, OV5640_QSXGA2VGA[i].reg, OV5640_QSXGA2VGA[i].val); break; - case RES_VGA_ZOOMED: - for(uint32_t i=0; (OV5640_QSXGA2VGA_ZOOMED[i].reg != 0xffff) || (OV5640_QSXGA2VGA_ZOOMED[i].val != 0xff); i++) - I2C_write8_16bitreg(OV5640_I2C_ADR, OV5640_QSXGA2VGA_ZOOMED[i].reg, OV5640_QSXGA2VGA_ZOOMED[i].val); - break; - case RES_XGA: for(uint32_t i=0; (OV5640_QSXGA2XGA[i].reg != 0xffff) || (OV5640_QSXGA2XGA[i].val != 0xff); i++) I2C_write8_16bitreg(OV5640_I2C_ADR, OV5640_QSXGA2XGA[i].reg, OV5640_QSXGA2XGA[i].val); diff --git a/tracker/software/drivers/si446x.c b/tracker/software/drivers/si446x.c index c5f0802c..e38945d2 100644 --- a/tracker/software/drivers/si446x.c +++ b/tracker/software/drivers/si446x.c @@ -665,6 +665,7 @@ static void Si446x_shutdown(void) static void lockRadio(void) { + TRACE_DEBUG("LOCK"); // Initialize mutex if(!radio_mtx_init) chMtxObjectInit(&radio_mtx); @@ -672,16 +673,19 @@ static void lockRadio(void) chMtxLock(&radio_mtx); nextTransmissionWaiting = true; - + TRACE_DEBUG("LOCKED1"); // Wait for old feeder thread to terminate if(feeder_thd != NULL) // No waiting on first use chThdWait(feeder_thd); + TRACE_DEBUG("LOCKED2"); } void unlockRadio(void) { + TRACE_DEBUG("UNLOCK"); nextTransmissionWaiting = false; chMtxUnlock(&radio_mtx); + TRACE_DEBUG("UNLOCKED"); } void lockRadioByCamera(void) @@ -1003,6 +1007,9 @@ THD_FUNCTION(si_fifo_feeder_afsk, arg) // Free packet object memory ax25_delete(pp); + + TRACE_DEBUG("FIFO Feeder finished"); + chThdExit(MSG_OK); } diff --git a/tracker/software/mcuconf.h b/tracker/software/mcuconf.h index 9598d6e6..dfc3fc83 100644 --- a/tracker/software/mcuconf.h +++ b/tracker/software/mcuconf.h @@ -58,7 +58,7 @@ #define STM32_MCO1SEL STM32_MCO1SEL_PLL #define STM32_MCO1PRE STM32_MCO1PRE_DIV1 #define STM32_MCO2SEL STM32_MCO2SEL_PLL -#define STM32_MCO2PRE STM32_MCO2PRE_DIV2 /* Camera XCLK 24MHz */ +#define STM32_MCO2PRE STM32_MCO2PRE_DIV4 /* Camera XCLK 24MHz */ #define STM32_I2SSRC STM32_I2SSRC_CKIN #define STM32_PLLI2SN_VALUE 192 #define STM32_PLLI2SR_VALUE 5 diff --git a/tracker/software/threads/radio/radio.c b/tracker/software/threads/radio/radio.c index ebea1d3d..5be97f81 100644 --- a/tracker/software/threads/radio/radio.c +++ b/tracker/software/threads/radio/radio.c @@ -45,6 +45,7 @@ void start_rx_thread(uint32_t freq, uint8_t rssi) { bool transmitOnRadio(packet_t pp, uint32_t freq, uint8_t pwr, mod_t mod) { + TRACE_DEBUG("A -------------------------------------------------"); if(freq == FREQ_APRS_DYNAMIC) freq = getAPRSRegionFrequency(); // Get transmission frequency by geofencing @@ -80,6 +81,8 @@ bool transmitOnRadio(packet_t pp, uint32_t freq, uint8_t pwr, mod_t mod) } + TRACE_DEBUG("B -------------------------------------------------"); + return true; }