Browse Source

update:i2c加入send后stop控制,不过没什么用,uart关闭后释放掉缓存

alienwalker 4 years ago
parent
commit
ec586b41c5

+ 1 - 1
application/src/luat_camera_air105.c

@@ -332,7 +332,7 @@ int luat_camera_init(luat_camera_conf_t *conf){
     prvCamera.PWMID = conf->pwm_id;
     luat_i2c_setup(conf->i2c_id,1,NULL);
     for(size_t i = 0; i < conf->init_cmd_size; i++){
-        if (luat_i2c_send(conf->i2c_id, conf->i2c_addr, &(conf->init_cmd[i]), 2))
+        if (luat_i2c_send(conf->i2c_id, conf->i2c_addr, &(conf->init_cmd[i]), 2,1))
         {
         	error = -ERROR_OPERATION_FAILED;
         }

+ 8 - 0
application/src/luat_crypto_air105.c

@@ -464,6 +464,14 @@ struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt,
 	Date_UserDataStruct Date;
 	Time_UserDataStruct Time;
 	Tamp2UTC(*tt, &Date, &Time, 0);
+	tm_buf->tm_year = Date.Year - 1900;
+	tm_buf->tm_mon = Date.Mon - 1;
+	tm_buf->tm_mday = Date.Day;
+	tm_buf->tm_hour = Time.Hour;
+	tm_buf->tm_min = Time.Min;
+	tm_buf->tm_sec = Time.Sec;
+	return tm_buf;
+
 }
 
 #endif

+ 2 - 1
application/src/luat_i2c_air105.c

@@ -49,7 +49,8 @@ int luat_i2c_close(int id) {
     return 0;
 }
 
-int luat_i2c_send(int id, int addr, void* buff, size_t len) {
+int luat_i2c_send(int id, int addr, void* buff, size_t len, uint8_t stop) {
+	if (!stop) I2C_SetTxStopFlag(id);
 	return I2C_BlockWrite(id, addr, (const uint8_t *)buff, len, 100, NULL, NULL);
     // I2C_Prepare(id, addr, 1, NULL, NULL);
     // I2C_MasterXfer(id, I2C_OP_WRITE, 0, buff, len, 20);

+ 24 - 2
bsp/air105/hal/core_i2c.c

@@ -58,6 +58,7 @@ typedef struct
 	uint8_t State;
 	uint8_t IsBusy;
 	uint8_t IsBlockMode;
+	uint8_t no_stop_end;
 }I2C_CtrlStruct;
 static I2C_CtrlStruct prvI2C = {
 		I2C0,
@@ -70,6 +71,7 @@ static void prvI2C_Done(uint8_t I2CID, int32_t Result)
 	prvI2C.State = I2C_STATE_FREE;
 	prvI2C.Result = Result;
 	prvI2C.IsBusy = 0;
+	prvI2C.no_stop_end = 0;
 #ifdef __BUILD_OS__
 	if (prvI2C.IsBlockMode) OS_MutexRelease(prvI2C.Sem);
 #endif
@@ -126,7 +128,14 @@ static void I2C_IrqHandle(int32_t IrqLine, void *pData)
 			}
 			else
 			{
-				I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[prvI2C.DataBuf.Pos]|I2C_IC_DATA_CMD_STOP;
+				if (!prvI2C.no_stop_end)
+				{
+					I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[prvI2C.DataBuf.Pos]|I2C_IC_DATA_CMD_STOP;
+				}
+				else
+				{
+					I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[prvI2C.DataBuf.Pos];
+				}
 			}
 			prvI2C.DataBuf.Pos++;
 		}
@@ -359,7 +368,14 @@ void I2C_MasterXfer(uint8_t I2CID, uint8_t Operate, uint8_t RegAddress, uint8_t
 		}
 		else
 		{
-			I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[0]|I2C_IC_DATA_CMD_STOP;
+			if (!prvI2C.no_stop_end)
+			{
+				I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[0]|I2C_IC_DATA_CMD_STOP;
+			}
+			else
+			{
+				I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[0];
+			}
 		}
 		prvI2C.DataBuf.Pos++;
 		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_TX_EMPTY|I2C_IC_INTR_MASK_M_STOP_DET|I2C_IC_INTR_MASK_M_TX_ABRT;
@@ -471,6 +487,12 @@ int32_t I2C_BlockRead(uint8_t I2CID, uint8_t ChipAddress, uint8_t *Reg, uint8_t
 	return Result;
 }
 
+void I2C_SetTxStopFlag(uint8_t I2CID)
+{
+	int32_t Result;
+	while(!I2C_WaitResult(I2CID, &Result)) {;}
+	prvI2C.no_stop_end = 1;
+}
 #ifdef __BUILD_APP__
 INIT_HW_EXPORT(I2C_GlobalInit, "1");
 #endif

+ 5 - 1
bsp/air105/hal/core_uart.c

@@ -259,6 +259,7 @@ void Uart_BaseInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, u
     if (IsRxCacheEnable)
     {
     	OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
+    	OS_ReInitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
 #ifdef __RX_USE_DMA__
     	for(i = 0; i < RX_BUF_BAND; i++)
     	{
@@ -319,7 +320,9 @@ void Uart_DeInit(uint8_t UartID)
     {
     	PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, 0);
     }
-
+	OS_DeInitBuffer(&prvUart[UartID].TxBuf);
+	OS_DeInitBuffer(&prvUart[UartID].TxCacheBuf);
+	OS_DeInitBuffer(&prvUart[UartID].RxBuf);
 }
 
 int Uart_DMATxInit(uint8_t UartID, uint8_t Stream, uint32_t Channel)
@@ -444,6 +447,7 @@ int32_t Uart_BufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
 	if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
 	{
 		// 只有少量数据,只靠FIFO就能填充满,就不需要重新分配内存
+
 		memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
 #ifdef __BUILD_OS__
 		prvUart[UartID].TxCacheBuf.Pos = 0;

+ 1 - 1
bsp/air105/test/test_zbar.c

@@ -490,7 +490,7 @@ static void zbar_task(void *pData)
 			memcpy(prvDecodeQR.TestBuf, string, len);
 			Core_VUartBufferTx(VIRTUAL_UART0, prvDecodeQR.TestBuf, len);
 			DBG("%.*s", len, string);
-			Core_PrintMemInfo();
+//			Core_PrintMemInfo();
 			Core_VHIDUploadData(USB_ID0, string, len);
 		}
 		zbar_destory(zbar);