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

Files at this revision

API Documentation at this revision

Comitter:
dflet
Date:
Mon Jul 13 08:20:40 2015 +0000
Parent:
12:7d75ba5deed1
Child:
14:90603ea1e85b
Commit message:
WIP commit 14 i2c not working correctly.

Changed in this revision

FreeRTOS/FreeRTOSConfig.h Show annotated file Show diff for this revision Revisions of this file
camera_app/camera_app.cpp Show annotated file Show diff for this revision Revisions of this file
camera_app/mt9d111/i2cconfig.cpp Show annotated file Show diff for this revision Revisions of this file
camera_app/mt9d111/i2cconfig.h Show annotated file Show diff for this revision Revisions of this file
camera_app/mt9d111/mt9d111.cpp Show annotated file Show diff for this revision Revisions of this file
camera_app/mt9d111/mt9d111.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
utils/app_config.h Show annotated file Show diff for this revision Revisions of this file
--- a/FreeRTOS/FreeRTOSConfig.h	Sun Jul 12 09:13:56 2015 +0000
+++ b/FreeRTOS/FreeRTOSConfig.h	Mon Jul 13 08:20:40 2015 +0000
@@ -86,8 +86,8 @@
 #define configCPU_CLOCK_HZ			( ( unsigned long ) SystemCoreClock )
 #define configTICK_RATE_HZ			( ( portTickType ) 1000 )
 #define configMINIMAL_STACK_SIZE	( ( unsigned short ) 130 )
-#define configTOTAL_HEAP_SIZE		( ( size_t ) (20 * 1024) )
-#define configMAX_TASK_NAME_LEN		( 16 )
+#define configTOTAL_HEAP_SIZE		( ( size_t ) (48 * 1024) )
+#define configMAX_TASK_NAME_LEN		( 24 )
 #define configUSE_TRACE_FACILITY	1
 #define configUSE_16_BIT_TICKS		0
 #define configIDLE_SHOULD_YIELD		1//0
--- a/camera_app/camera_app.cpp	Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/camera_app.cpp	Mon Jul 13 08:20:40 2015 +0000
@@ -272,6 +272,8 @@
     //   
     I2CInit();
     
+    getCamId();
+    
     //
     // Initialize camera sensor
     //
@@ -362,11 +364,11 @@
 //    HttpDebug("frame size = 0x%x \r\n",g_frame_size_in_bytes);
     
     uint8_t* Image = reinterpret_cast<uint8_t*>(&g_image.g_image_buffer);
-#if 0    
+//#if 0    
     for(int i =0;i< 10;i++){
     	HttpDebug("0x%x ",Image[i]);
     }
-#endif//if 0    
+//#endif//if 0    
     //
     // Create JPEG Header
     //
--- a/camera_app/mt9d111/i2cconfig.cpp	Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/i2cconfig.cpp	Mon Jul 13 08:20:40 2015 +0000
@@ -50,7 +50,7 @@
 #include "myBoardInit.h"
 
 I2C i2c(PB_9, PB_8);
-
+int fail_count;
 
 //*****************************************************************************
 //
@@ -63,7 +63,7 @@
 uint32_t I2CInit()
 {
 //    Uart_Write((uint8_t*)"I2CInit \n\r");
-    i2c.frequency (100000); 
+    i2c.frequency (400000); 
 
     return 0;
 }
@@ -84,30 +84,31 @@
 //! \return 0: Success, < 0: Failure.
 //
 //****************************************************************************
-uint32_t I2CBufferRead(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferRead(int32_t ucDevAddr, uint8_t *ucBuffer,
                             int32_t ulSize, unsigned char ucFlags)
 {
 //	Uart_Write((uint8_t*)"I2CBufferRead \n\r");
 //    uint32_t ulNdx;
-    bool err;
-/*    if(ucFlags == I2C_SEND_START){
+    int ack;
+//    if(ucFlags == I2C_SEND_START){
     	i2c.start(); 	   
-    }
-*/    
+//    }
+    
     // Set I2C slave address
-    err = i2c.read(0xBB, ucBuffer, ulSize);
-/*    
+    ack = i2c.read(ucDevAddr, (char*)ucBuffer, ulSize);
+    wait_us(20);
     if(ucFlags == I2C_SEND_STOP){
     	i2c.stop();
     }
-*/    
+    
 //    for(int i = 0;i<ulSize;i++){
 //    	printf("0x%x ",ucBuffer[i]);
 //    }
 //    printf("\r\n");	
-//    if(err){
-//    	return 1;
-//    }
+    if(ack != 0){
+    	printf("NAK returned\r\n");
+    	return -1;
+    }
     
     return 0;
 }
@@ -128,30 +129,58 @@
 //
 //****************************************************************************
 
-uint32_t I2CBufferWrite(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferWrite(int32_t ucDevAddr, uint8_t *ucBuffer,
                              int32_t ulSize,unsigned char ucFlags)
 {
 //	Uart_Write((uint8_t*)"I2CBufferWrite \n\r");
 //    uint32_t ulNdx;
-    bool err;
-/*    if(ucFlags == I2C_SEND_START){
+    
+    int ack;
+//    if(ucFlags == I2C_SEND_START){
     	i2c.start(); 	   
-    }
-*/    
+//    }
+    
    // Set I2C slave address
-    err = i2c.write(ucDevAddr, ucBuffer, ulSize);
-/*    
+    ack = i2c.write(ucDevAddr, (char*)ucBuffer, ulSize);
+    wait_us(20);
     if(ucFlags == I2C_SEND_STOP){
     	i2c.stop();
     }
+    fail_count++;
+/*
+   for(int i = 0;i<ulSize;i++){
+    	printf("0x%x ",ucBuffer[i]);
+    }
+    printf("\r\n");	
 */    
-//    if(!err){
-//    	return 1;
-//    }
+    if(ack != 0){
+    	printf("NAK returned on write %d\r\n",fail_count);
+    	return -1;
+    }
 
     return 0;
 }
 
+void I2CBufferWriteByte(char dat){
+    
+    int ack, ack2 = 0;
+    
+//    i2c.start();
+	ack = i2c.write((int)dat);
+	wait_us(20);
+	if(ack == 1){		
+		ack2 = i2c.write((int)0x00);
+		wait_us(20);
+//		i2c.stop();
+	}else{
+//		i2c.stop();
+		printf("NAK received\r\n");
+	}
+	if(ack2 != 1){
+		printf("NAK received\r\n");
+	}		
+}	
+
 //*****************************************************************************
 //
 // Close the Doxygen group.
--- a/camera_app/mt9d111/i2cconfig.h	Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/i2cconfig.h	Mon Jul 13 08:20:40 2015 +0000
@@ -60,11 +60,11 @@
 // APIs
 //******************************************************************************
 uint32_t I2CInit(void);
-uint32_t I2CBufferRead(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferRead(int32_t ucDevAddr, uint8_t *ucBuffer,
                             int32_t ulSize,unsigned char ucFlags);
-uint32_t I2CBufferWrite(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferWrite(int32_t ucDevAddr, uint8_t *ucBuffer,
                              int32_t ulSize,unsigned char ucFlags);
-
+void I2CBufferWriteByte(char dat);
 //*****************************************************************************
 //
 // Mark the end of the C bindings section for C++ compilers.
--- a/camera_app/mt9d111/mt9d111.cpp	Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/mt9d111.cpp	Mon Jul 13 08:20:40 2015 +0000
@@ -44,17 +44,19 @@
 #include <stdio.h>
 #include <stdbool.h>
 #include <stdint.h>
+#include "mbed.h"
 #include "mt9d111.h"
 
 #include "i2cconfig.h"
 #include "cc3100_sl_common.h"
 #include "cli_uart.h"
+#include "HttpDebug.h"
 
 #define RET_OK                  0
 #define RET_ERROR               -1
 #define SENSOR_PAGE_REG         0xF0
-#define CAM_I2C_SLAVE_ADDR      0xBA//((0xBA >> 1))//Write
-//#define CAM_I2C_SLAVE_ADDR      0xBB((0xBB >> 1))//Read
+#define CAM_I2C_SLAVE_WRITE     0x5D//((0xBA >> 1))//Write
+#define CAM_I2C_SLAVE_READ      0x5E//((0xBB >> 1))//Read
 
 #ifndef ENABLE_JPEG
 static const s_RegList preview_on_cmd_list[]= {
@@ -290,6 +292,27 @@
     {1, 0xC8, 0x0005    }, // SEQ_CMD
 };
 
+void getCamId(){
+    
+    uint16_t Id = 0;
+    uint8_t ucBuffer[20];
+    
+    ucBuffer[0] = 0x00;
+    ucBuffer[1] = 0x00;
+//    i2c.start();
+    I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,1,1);
+//    I2CBufferWrite(CAM_I2C_SLAVE_WRITE,);
+//    i2c.stop();
+//    i2c.start();
+//    I2CBufferWriteByte();            
+    I2CBufferRead(CAM_I2C_SLAVE_READ,ucBuffer,2,1);
+//    i2c.stop();    
+    Id = (uint16_t)ucBuffer[0] << 8 | (uint16_t)ucBuffer[1];
+
+    HttpDebug("\r\nCamera ID = 0x%x\r\n",Id);
+    
+}    
+
 //*****************************************************************************
 //
 //! This function initilizes the camera sensor
@@ -418,7 +441,7 @@
     unsigned int       ulNdx;
     unsigned short      usTemp;
     unsigned char       i;
-    char       ucBuffer[20];
+    uint8_t       ucBuffer[20];
     unsigned int       ulSize;
     int lRetVal = -1;
 
@@ -433,6 +456,7 @@
         {
             // PageAddr == 100, insret a delay equal to reg value 
             wait_ms(pRegLst->usValue);// * 80000/3);
+//            HttpDebug("usValue = 0x%x \n\r",pRegLst->usValue);
         }
         else if(pRegLst->ucPageAddr == 111)
         {
@@ -440,35 +464,37 @@
             do
             {
                 ucBuffer[0] = pRegLst->ucRegAddr;
-                lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,1);
+                printf("pRegLst->ucRegAddr = 0x%x \r\n",pRegLst->ucRegAddr);
+                lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,1,I2C_SEND_STOP);
                 ASSERT_ON_ERROR(lRetVal);
-                if(I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,1))
+                if(0 != I2CBufferWrite(CAM_I2C_SLAVE_READ,ucBuffer,2,I2C_SEND_STOP))
                 {
-                    Uart_Write((uint8_t*)"\n\rError reading ucBuffer \n\r");
+                    Uart_Write((uint8_t*)"\n\rError reading pRegLst->ucRegAddr \n\r");
                     return RET_ERROR;
                 }
 
                 usTemp = ucBuffer[0] << 8;
                 usTemp |= ucBuffer[1];
-                usTemp = pRegLst->usValue;//Temp debug
+//                usTemp = pRegLst->usValue;//Temp debug
             }while(usTemp != pRegLst->usValue);
         }
         else
         {
             // Set the page 
-            ucBuffer[0] = SENSOR_PAGE_REG;
+            ucBuffer[0] = SENSOR_PAGE_REG;//0xF0
             ucBuffer[1] = 0x00;
-            ucBuffer[2] = (unsigned char)(pRegLst->ucPageAddr);
-            if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,3,I2C_SEND_STOP))
+            ucBuffer[2] = pRegLst->ucPageAddr;
+            printf("pRegLst->ucRegAddr = 0x%x \r\n",pRegLst->ucRegAddr);
+            if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 3, I2C_SEND_STOP))
             {
                 Uart_Write((uint8_t*)"\n\rError writing SENSOR_PAGE_REG \n\r");
                 return RET_ERROR;
             }
 
             ucBuffer[0] = SENSOR_PAGE_REG;
-            lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,I2C_SEND_STOP);
+            lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 1, I2C_SEND_STOP);
             ASSERT_ON_ERROR(lRetVal);
-            lRetVal = I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,I2C_SEND_STOP);
+            lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_READ, ucBuffer, 2, I2C_SEND_STOP);
             ASSERT_ON_ERROR(lRetVal);
 
             ucBuffer[0] = pRegLst->ucRegAddr;
@@ -498,7 +524,7 @@
                 ucBuffer[2] = (unsigned char)(pRegLst->usValue & 0xFF);
             }
 
-            if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,
+            if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,
                                                       ulSize,I2C_SEND_STOP))
             {
                 Uart_Write((uint8_t*)"\n\rError i2c write \n\r");
--- a/camera_app/mt9d111/mt9d111.h	Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/mt9d111.h	Mon Jul 13 08:20:40 2015 +0000
@@ -19,6 +19,8 @@
     unsigned short usValue;
 } s_RegList;
 
+void getCamId(void);
+
 /*!
     \brief                      This function initilizes the camera sensor
 
--- a/main.cpp	Sun Jul 12 09:13:56 2015 +0000
+++ b/main.cpp	Mon Jul 13 08:20:40 2015 +0000
@@ -114,12 +114,12 @@
 //  HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4);
 
   /* RCC_MCODIV_1 16MHz mco1 output on pin PA_8 (cam xclk) */
-  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1);
+//  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1);
 
   /* RCC_MCODIV_1 8MHz mco2 output on pin PC_9 (cam xclk) */ 
   /* RCC_MCODIV_2 4MHz mco2 output on pin PC_9 (cam xclk) */ 
   /* RCC_MCODIV_4 2MHz mco2 output on pin PC_9 (cam xclk) */  
-//  HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_HSE, RCC_MCODIV_1);
+  HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_HSE, RCC_MCODIV_1);
 
   //Used for ov7670 test
   /* RCC_MCODIV_4 24MHz mco2 output on pin PC_9 (cam xclk) */
--- a/utils/app_config.h	Sun Jul 12 09:13:56 2015 +0000
+++ b/utils/app_config.h	Mon Jul 13 08:20:40 2015 +0000
@@ -6,7 +6,7 @@
 #define SPAWN_TASK_PRIORITY            7//9
 #define HTTP_SERVER_APP_TASK_PRIORITY  1//1
 #define CAMERA_SERVICE_PRIORITY        1
-#define OSI_STACK_SIZE                 16 * 1024
+#define OSI_STACK_SIZE                 8 * 1024