Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Jun 26 22:53:54 2015 +0000
Revision:
3:7643714ec664
Parent:
2:b92db44a29b4
Child:
4:c27adffcfec2
WIP commit 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // main.c
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // Reference code to demonstrate getting the current time using an NTP server.
dflet 0:50cedd586816 5 //
dflet 0:50cedd586816 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 7 //
dflet 0:50cedd586816 8 //
dflet 0:50cedd586816 9 // Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 10 // modification, are permitted provided that the following conditions
dflet 0:50cedd586816 11 // are met:
dflet 0:50cedd586816 12 //
dflet 0:50cedd586816 13 // Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 14 // notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 15 //
dflet 0:50cedd586816 16 // Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 17 // notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 18 // documentation and/or other materials provided with the
dflet 0:50cedd586816 19 // distribution.
dflet 0:50cedd586816 20 //
dflet 0:50cedd586816 21 // Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 22 // its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 23 // from this software without specific prior written permission.
dflet 0:50cedd586816 24 //
dflet 0:50cedd586816 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 30 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 31 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 32 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 34 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 35 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 36 //
dflet 0:50cedd586816 37 //*****************************************************************************
dflet 0:50cedd586816 38
dflet 0:50cedd586816 39 //****************************************************************************
dflet 0:50cedd586816 40 //
dflet 0:50cedd586816 41 //! \addtogroup main
dflet 0:50cedd586816 42 //! @{
dflet 0:50cedd586816 43 //
dflet 0:50cedd586816 44 //****************************************************************************
dflet 0:50cedd586816 45
dflet 0:50cedd586816 46 #include "mbed.h"
dflet 0:50cedd586816 47
dflet 0:50cedd586816 48 // SimpleLink include
dflet 0:50cedd586816 49 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 50 #include "cc3100.h"
dflet 0:50cedd586816 51
dflet 0:50cedd586816 52 #include "httpserverapp.h"
dflet 0:50cedd586816 53
dflet 0:50cedd586816 54 #include "stm32f4xx_hal.h"
dflet 0:50cedd586816 55 #include "stm32f4xx_hal_rcc.h"
dflet 0:50cedd586816 56
dflet 0:50cedd586816 57 /* Free-RTOS includes */
dflet 0:50cedd586816 58 #include "osi.h"
dflet 0:50cedd586816 59
dflet 0:50cedd586816 60 #include "cli_uart.h"
dflet 0:50cedd586816 61 #include "app_config.h"
dflet 0:50cedd586816 62 #include "myBoardInit.h"
dflet 0:50cedd586816 63
dflet 0:50cedd586816 64 using namespace mbed_cc3100;
dflet 0:50cedd586816 65
dflet 0:50cedd586816 66 static void SystemClock_Config(void);
dflet 0:50cedd586816 67 static void MX_DMA_Init(void);
dflet 0:50cedd586816 68 static void MX_DCMI_Init(void);
dflet 0:50cedd586816 69
dflet 0:50cedd586816 70 /**
dflet 0:50cedd586816 71 * Initializes the Global MSP.
dflet 0:50cedd586816 72 */
dflet 0:50cedd586816 73 //void HAL_MspInit(void)
dflet 0:50cedd586816 74 //{
dflet 0:50cedd586816 75 /* USER CODE BEGIN MspInit 0 */
dflet 0:50cedd586816 76
dflet 0:50cedd586816 77 /* USER CODE END MspInit 0 */
dflet 0:50cedd586816 78
dflet 0:50cedd586816 79 // HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
dflet 0:50cedd586816 80
dflet 0:50cedd586816 81 /* System interrupt init*/
dflet 0:50cedd586816 82 /* SysTick_IRQn interrupt configuration */
dflet 0:50cedd586816 83 // HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
dflet 0:50cedd586816 84
dflet 0:50cedd586816 85 /* USER CODE BEGIN MspInit 1 */
dflet 0:50cedd586816 86
dflet 0:50cedd586816 87 /* USER CODE END MspInit 1 */
dflet 0:50cedd586816 88 //}
dflet 0:50cedd586816 89
dflet 0:50cedd586816 90 DCMI_HandleTypeDef hdcmi;
dflet 0:50cedd586816 91 DMA_HandleTypeDef hdma_dcmi;
dflet 0:50cedd586816 92
dflet 0:50cedd586816 93 /** System Clock Configuration
dflet 0:50cedd586816 94 */
dflet 0:50cedd586816 95 static void SystemClock_Config(void)
dflet 0:50cedd586816 96 {
dflet 0:50cedd586816 97
dflet 0:50cedd586816 98 RCC_OscInitTypeDef RCC_OscInitStruct;
dflet 0:50cedd586816 99 RCC_ClkInitTypeDef RCC_ClkInitStruct;
dflet 3:7643714ec664 100 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;//Used for ov7670 test
dflet 3:7643714ec664 101
dflet 0:50cedd586816 102 __PWR_CLK_ENABLE();
dflet 0:50cedd586816 103
dflet 0:50cedd586816 104 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
dflet 0:50cedd586816 105
dflet 0:50cedd586816 106 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
dflet 0:50cedd586816 107 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
dflet 0:50cedd586816 108 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
dflet 0:50cedd586816 109 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
dflet 0:50cedd586816 110 RCC_OscInitStruct.PLL.PLLM = 8;
dflet 0:50cedd586816 111 RCC_OscInitStruct.PLL.PLLN = 336;
dflet 0:50cedd586816 112 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
dflet 0:50cedd586816 113 RCC_OscInitStruct.PLL.PLLQ = 7;
dflet 0:50cedd586816 114 HAL_RCC_OscConfig(&RCC_OscInitStruct);
dflet 0:50cedd586816 115
dflet 0:50cedd586816 116 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
dflet 0:50cedd586816 117 |RCC_CLOCKTYPE_PCLK2;
dflet 0:50cedd586816 118 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
dflet 0:50cedd586816 119 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
dflet 0:50cedd586816 120 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
dflet 0:50cedd586816 121 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
dflet 0:50cedd586816 122 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
dflet 0:50cedd586816 123
dflet 3:7643714ec664 124 //Used for ov7670 test
dflet 3:7643714ec664 125 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_PLLI2S;
dflet 3:7643714ec664 126 // PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
dflet 3:7643714ec664 127 // PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;
dflet 3:7643714ec664 128 // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
dflet 3:7643714ec664 129
dflet 1:1a80c1529aa3 130 /* RCC_MCODIV_5 33.6MHz mco output on pin PC_9 (cam xclk) */
dflet 1:1a80c1529aa3 131 /* RCC_MCODIV_4 42MHz mco output on pin PC_9 (cam xclk) */
dflet 1:1a80c1529aa3 132 /* RCC_MCODIV_3 56MHz mco output on pin PC_9 (cam xclk) */
dflet 2:b92db44a29b4 133 HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_5);
dflet 3:7643714ec664 134 //Used for ov7670 test
dflet 3:7643714ec664 135 /* RCC_MCODIV_4 24MHz mco output on pin PC_9 (cam xclk) */
dflet 3:7643714ec664 136 // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLLI2SCLK, RCC_MCODIV_4);
dflet 0:50cedd586816 137
dflet 0:50cedd586816 138 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
dflet 3:7643714ec664 139
dflet 3:7643714ec664 140 //Used for ov7670 test
dflet 3:7643714ec664 141 // HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
dflet 3:7643714ec664 142
dflet 0:50cedd586816 143 }
dflet 0:50cedd586816 144
dflet 0:50cedd586816 145 void MX_DCMI_Init()
dflet 0:50cedd586816 146 {
dflet 0:50cedd586816 147
dflet 0:50cedd586816 148 hdcmi.Instance = DCMI;
dflet 0:50cedd586816 149 hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
dflet 3:7643714ec664 150 hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;//FALLING
dflet 0:50cedd586816 151 hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
dflet 0:50cedd586816 152 hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
dflet 0:50cedd586816 153 hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
dflet 0:50cedd586816 154 hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
dflet 0:50cedd586816 155 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 156 hdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE;
dflet 0:50cedd586816 157 #else
dflet 0:50cedd586816 158 hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
dflet 0:50cedd586816 159 #endif
dflet 0:50cedd586816 160 HAL_DCMI_Init(&hdcmi);
dflet 0:50cedd586816 161
dflet 0:50cedd586816 162 }
dflet 0:50cedd586816 163
dflet 0:50cedd586816 164 /**
dflet 0:50cedd586816 165 * Enable DMA controller clock
dflet 0:50cedd586816 166 */
dflet 0:50cedd586816 167 void MX_DMA_Init(void)
dflet 0:50cedd586816 168 {
dflet 0:50cedd586816 169 /* DMA controller clock enable */
dflet 0:50cedd586816 170 __DMA2_CLK_ENABLE();
dflet 0:50cedd586816 171
dflet 0:50cedd586816 172 /* DMA interrupt init */
dflet 0:50cedd586816 173 HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
dflet 3:7643714ec664 174 // HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
dflet 0:50cedd586816 175
dflet 0:50cedd586816 176 }
dflet 0:50cedd586816 177
dflet 1:1a80c1529aa3 178 /* Warning if pin changes are made below then the same changes have to be made in the following files.
dflet 0:50cedd586816 179 * httpserverapp.cpp
dflet 0:50cedd586816 180 * HttpCore.cpp
dflet 0:50cedd586816 181 * HttpSocket.cpp
dflet 0:50cedd586816 182 * HttpStatic.cpp
dflet 0:50cedd586816 183 * fPtr_func.cpp
dflet 0:50cedd586816 184 */
dflet 0:50cedd586816 185
dflet 0:50cedd586816 186 /* Off board leds */
dflet 0:50cedd586816 187 DigitalOut led1(PB_15);
dflet 0:50cedd586816 188 DigitalOut led2(PB_14);
dflet 0:50cedd586816 189 //cc3100 _cc3100(NC, NC, PE_5, PE_4, PE_6, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck
dflet 0:50cedd586816 190 cc3100 _cc3100(NC, NC, PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck
dflet 0:50cedd586816 191
dflet 0:50cedd586816 192 void initLEDs(void);
dflet 0:50cedd586816 193 void toggleLed(int ind);
dflet 0:50cedd586816 194 static void DisplayBanner(char * AppName);
dflet 0:50cedd586816 195
dflet 0:50cedd586816 196 #define PRINT_BUF_LEN 128
dflet 0:50cedd586816 197 int8_t print_buf[PRINT_BUF_LEN];
dflet 0:50cedd586816 198
dflet 0:50cedd586816 199 //*****************************************************************************
dflet 0:50cedd586816 200 // LOCAL DEFINES
dflet 0:50cedd586816 201 //*****************************************************************************
dflet 0:50cedd586816 202 #define APP_NAME "WebSocket"
dflet 0:50cedd586816 203
dflet 0:50cedd586816 204 void initLEDs(void){
dflet 0:50cedd586816 205
dflet 0:50cedd586816 206 #if (THIS_BOARD == Seeed_Arch_Max)
dflet 0:50cedd586816 207 led1 = 0;
dflet 0:50cedd586816 208 led2 = 0;
dflet 0:50cedd586816 209 #endif
dflet 0:50cedd586816 210
dflet 0:50cedd586816 211 }
dflet 0:50cedd586816 212
dflet 0:50cedd586816 213 void toggleLed(int ind){
dflet 0:50cedd586816 214
dflet 0:50cedd586816 215 if(ind == 1){
dflet 0:50cedd586816 216 led1 = !led1;
dflet 0:50cedd586816 217 }
dflet 0:50cedd586816 218 if(ind == 2){
dflet 0:50cedd586816 219 led2 = !led2;
dflet 0:50cedd586816 220 }
dflet 0:50cedd586816 221
dflet 0:50cedd586816 222 }
dflet 0:50cedd586816 223
dflet 0:50cedd586816 224 //*****************************************************************************
dflet 0:50cedd586816 225 //
dflet 0:50cedd586816 226 //! Application startup display on UART
dflet 0:50cedd586816 227 //!
dflet 0:50cedd586816 228 //! \param none
dflet 0:50cedd586816 229 //!
dflet 0:50cedd586816 230 //! \return none
dflet 0:50cedd586816 231 //!
dflet 0:50cedd586816 232 //*****************************************************************************
dflet 0:50cedd586816 233
dflet 0:50cedd586816 234 //#ifndef NOTERM
dflet 0:50cedd586816 235 static void
dflet 0:50cedd586816 236 DisplayBanner(char * AppName)
dflet 0:50cedd586816 237 {
dflet 0:50cedd586816 238
dflet 0:50cedd586816 239 Report("\n\n\n\r");
dflet 0:50cedd586816 240 Report(" *************************************************\n\r");
dflet 0:50cedd586816 241 Report(" CC3100 %s Application \n\r", AppName);
dflet 0:50cedd586816 242 Report(" *************************************************\n\r");
dflet 0:50cedd586816 243 Report("\n\n\n\r");
dflet 0:50cedd586816 244 }
dflet 0:50cedd586816 245 //#endif
dflet 0:50cedd586816 246
dflet 0:50cedd586816 247 //****************************************************************************
dflet 0:50cedd586816 248 // MAIN FUNCTION
dflet 0:50cedd586816 249 //****************************************************************************
dflet 0:50cedd586816 250 int main(void) {
dflet 0:50cedd586816 251
dflet 0:50cedd586816 252 int rv = 0;
dflet 3:7643714ec664 253
dflet 0:50cedd586816 254 SystemClock_Config();
dflet 3:7643714ec664 255
dflet 0:50cedd586816 256 //
dflet 0:50cedd586816 257 // Configuring UART
dflet 0:50cedd586816 258 //
dflet 0:50cedd586816 259 CLI_Configure();
dflet 0:50cedd586816 260
dflet 0:50cedd586816 261 /* Initialize all configured peripherals */
dflet 0:50cedd586816 262 MX_DMA_Init();
dflet 0:50cedd586816 263 MX_DCMI_Init();
dflet 0:50cedd586816 264 initLEDs();
dflet 0:50cedd586816 265
dflet 0:50cedd586816 266 toggleLed(1);
dflet 0:50cedd586816 267 //#ifndef NOTERM
dflet 0:50cedd586816 268
dflet 0:50cedd586816 269 //
dflet 0:50cedd586816 270 // Configuring UART
dflet 0:50cedd586816 271 //
dflet 0:50cedd586816 272 // CLI_Configure();
dflet 0:50cedd586816 273
dflet 0:50cedd586816 274 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:50cedd586816 275 sprintf((char*) print_buf, " \r\nSystemCoreClock = %dMHz\r\n ", SystemCoreClock /1000000);
dflet 0:50cedd586816 276 rv = Uart_Write((uint8_t *) print_buf);
dflet 0:50cedd586816 277 if(rv < 0){
dflet 0:50cedd586816 278 while(1){
dflet 0:50cedd586816 279 toggleLed(1);
dflet 0:50cedd586816 280 wait(0.1);
dflet 0:50cedd586816 281 }
dflet 0:50cedd586816 282 }
dflet 0:50cedd586816 283
dflet 0:50cedd586816 284 //
dflet 0:50cedd586816 285 // Display Application Banner
dflet 0:50cedd586816 286 //
dflet 0:50cedd586816 287 DisplayBanner(APP_NAME);
dflet 0:50cedd586816 288
dflet 0:50cedd586816 289 //#endif
dflet 0:50cedd586816 290
dflet 0:50cedd586816 291 //
dflet 0:50cedd586816 292 // Start the SimpleLink Host
dflet 0:50cedd586816 293 //
dflet 0:50cedd586816 294 VStartSimpleLinkSpawnTask(SPAWN_TASK_PRIORITY);
dflet 0:50cedd586816 295 //
dflet 0:50cedd586816 296 // Start the HttpServer Task
dflet 0:50cedd586816 297 //
dflet 0:50cedd586816 298 //
dflet 0:50cedd586816 299
dflet 0:50cedd586816 300 osi_TaskCreate(HttpServerAppTask,
dflet 0:50cedd586816 301 "WebSocketApp",
dflet 0:50cedd586816 302 OSI_STACK_SIZE,
dflet 0:50cedd586816 303 NULL,
dflet 0:50cedd586816 304 HTTP_SERVER_APP_TASK_PRIORITY,
dflet 0:50cedd586816 305 NULL );
dflet 0:50cedd586816 306
dflet 0:50cedd586816 307 Uart_Write((uint8_t*)"HttpServerApp Initialized \n\r");
dflet 0:50cedd586816 308
dflet 0:50cedd586816 309 //
dflet 0:50cedd586816 310 // Start the task scheduler
dflet 0:50cedd586816 311 //
dflet 0:50cedd586816 312 osi_start();
dflet 0:50cedd586816 313
dflet 0:50cedd586816 314 return 0;
dflet 0:50cedd586816 315 }
dflet 0:50cedd586816 316
dflet 0:50cedd586816 317 //*****************************************************************************
dflet 0:50cedd586816 318 //
dflet 0:50cedd586816 319 // Close the Doxygen group.
dflet 0:50cedd586816 320 //! @}
dflet 0:50cedd586816 321 //
dflet 0:50cedd586816 322 //*****************************************************************************
dflet 0:50cedd586816 323