Browse Source

update:优化ioqueue的中断处理速度
add:为增加w5500做准备

alienwalker 4 năm trước cách đây
mục cha
commit
cff80becd8

+ 6 - 1
application/include/luat_conf_bsp.h

@@ -65,7 +65,11 @@
 #define LUAT_USE_FATFS 1
 #define LUAT_USE_I2CTOOLS 1
 #define LUAT_USE_SOFTKB 1
-
+#ifdef __DEBUG__
+#define LUAT_USE_W5500  1
+#define LUAT_USE_DHCP  1
+#define LUAT_USE_DNS  1
+#endif
 //----------------------------
 // 高通字体, 需配合芯片使用
 #define LUAT_USE_GTFONT 1
@@ -85,6 +89,7 @@
 // UI
 #define LUAT_USE_LCD
 #define LUAT_LCD_CMD_DELAY_US 7
+#define LUAT_USE_TJPGD
 #define LUAT_USE_EINK
 
 //---------------------

+ 3 - 0
application/src/luat_base_air105.c

@@ -201,6 +201,9 @@ static const luaL_Reg loadedlibs[] = {
 #endif
 #ifdef LUAT_USE_YMODEM
   {"ymodem", luaopen_ymodem},
+#endif
+#ifdef LUAT_USE_W5500
+  {"w5500", luaopen_w5500},
 #endif
   {"usbapp", luaopen_usbapp},
   {"audio", luaopen_multimedia_audio},

+ 32 - 2
application/src/luat_rtos_air105.c

@@ -31,8 +31,19 @@
 #include "luat_log.h"
 
 int luat_thread_start(luat_thread_t* thread){
-    Task_Create(thread->entry, NULL, thread->stack_size, thread->priority, thread->name);
-    return 0;
+	thread->handle = Task_Create(thread->task_fun, thread->userdata, thread->stack_size, thread->priority, thread->name);
+	return 0;
+}
+
+int luat_send_event_to_task(void* task_handle, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3)
+{
+	Task_SendEvent(task_handle, id, param1, param2, param3);
+	return 0;
+}
+
+int luat_wait_event_from_task(void* task_handle, uint32_t wait_event_id, void *out_event, void *call_back, uint32_t ms)
+{
+	return Task_GetEventByMS(task_handle, wait_event_id, out_event, call_back, ms);
 }
 
 int luat_sem_create(luat_sem_t* semaphore){
@@ -52,3 +63,22 @@ int luat_sem_release(luat_sem_t* semaphore){
     OS_MutexRelease(semaphore->userdata);
     return 0;
 }
+
+void *luat_create_rtos_timer(void *cb, void *param, void *task_handle)
+{
+	return Timer_Create(cb, param, task_handle);
+}
+
+int luat_start_rtos_timer(void *timer, uint32_t ms, uint8_t is_repeat)
+{
+	return Timer_StartMS(timer, ms, is_repeat);
+}
+
+void luat_stop_rtos_timer(void *timer)
+{
+	Timer_Stop(timer);
+}
+void luat_release_rtos_timer(void *timer)
+{
+	Timer_Release(timer);
+}

+ 7 - 1
application/src/luat_spi_air105.c

@@ -157,6 +157,12 @@ int luat_spi_setup(luat_spi_t* spi) {
     return 0;
 }
 
+int luat_spi_config_dma(int spi_id, uint32_t tx_channel, uint32_t rx_channel)
+{
+	SPI_DMATxInit(spi_id, (tx_channel >= 8)?ETH_SPI_TX_DMA_STREAM:tx_channel, 0);
+	SPI_DMARxInit(spi_id, (rx_channel >= 8)?ETH_SPI_RX_DMA_STREAM:rx_channel, 0);
+}
+
 //关闭SPI,成功返回0
 int luat_spi_close(int spi_id) {
     return 0;
@@ -166,7 +172,7 @@ int luat_spi_transfer(int spi_id, const char* send_buf, size_t send_length, char
     // LLOGD("SPI_MasterInit luat_spi%d:%d send_buf:%x recv_buf:%x length:%d ",spi_id,luat_spi[spi_id], *send_buf, *recv_buf, length);
     // while(luat_spi[spi_id].mark)
     luat_spi[spi_id].mark = 1;
-    if(luat_spi[spi_id].mode==1)
+    if(luat_spi[spi_id].mode==0)
         SPI_FlashBlockTransfer(luat_spi[spi_id].id, send_buf, send_length, recv_buf, recv_length);
     else
     	SPI_BlockTransfer(luat_spi[spi_id].id, send_buf, recv_buf, recv_length);

+ 198 - 1
bsp/air105/hal/core_hwtimer.c

@@ -109,10 +109,195 @@ static int32_t __FUNC_IN_RAM__ prvHWTimer_OperationQueuExti(void *pData, void *p
 	return 0;
 }
 
+typedef int (*queue_fun)(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin);
+#define OPERATION_GO_ON		(0)
+#define OPERATION_OUT_IRQ	(-1)
+#define OPERATION_RESET_TIMER	(1)
+static int __FUNC_IN_RAM__ prvHWTimer_OperationEnd(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->CurCount = 0;
+	HWTimer->RepeatCnt++;
+	if (HWTimer->TotalRepeat && (HWTimer->RepeatCnt >= HWTimer->TotalRepeat))
+	{
+		TIMM0->TIM[HWTimerID].ControlReg = 0;
+		TIMM0->TIM[HWTimerID].LoadCount = 24;
+
+		ISR_SetHandler(prvHWTimer[HWTimerID].IrqLine, prvHWTimer_IrqHandlerEndOperationQueue, HWTimerID);
+#ifdef __BUILD_OS__
+		ISR_SetPriority(prvHWTimer[HWTimerID].IrqLine, IRQ_LOWEST_PRIORITY - 1);
+#else
+		ISR_SetPriority(prvHWTimer[HWTimerID].IrqLine, 6);
+#endif
+		TIMM0->TIM[HWTimerID].ControlReg = TIMER_CONTROL_REG_TIMER_ENABLE|TIMER_CONTROL_REG_TIMER_MODE;
+		return OPERATION_OUT_IRQ;
+	}
+	else
+	{
+		return OPERATION_GO_ON;
+	}
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationDelayOnce(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->ContinueDelay = 0;
+	return OPERATION_RESET_TIMER;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationDelay(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->ContinueDelay = 1;
+	return OPERATION_RESET_TIMER;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationRepeatDelay(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->CurCount++;
+	return OPERATION_OUT_IRQ;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationSetGPIOOut(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	GPIO_Config(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 0, HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level);
+	GPIO_PullConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.PullMode, (HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.PullMode > 1)?0:1);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationSetGPIOIn(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	GPIO_PullConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.PullMode, (HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.PullMode > 1)?0:1);
+	GPIO_Config(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 1, 0);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationGPIOOut(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	GPIO_Output(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationGPIOIn(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level = GPIO_Input(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationGPIOInCB(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level = GPIO_Input(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay);
+	HWTimer->Cmd[HWTimer->CurCount].CB(HWTimerID, &HWTimer->Cmd[HWTimer->CurCount]);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationCB(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->Cmd[HWTimer->CurCount].CB(HWTimerID, HWTimer->Cmd[HWTimer->CurCount].uParam.pParam);
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationCaptureSet(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	GPIO_PullConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, HWTimer->Cmd[HWTimer->CurCount].uArg.ExitArg.PullMode, (HWTimer->Cmd[HWTimer->CurCount].uArg.ExitArg.PullMode > 1)?0:1);
+	GPIO_Config(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 1, 0);
+	TIMM0->TIM[HWTimerID].ControlReg = 0;
+	TIMM0->TIM[HWTimerID].LoadCount = HWTimer->Cmd[HWTimer->CurCount].uParam.MaxCnt;
+	TIMM0->TIM[HWTimerID].ControlReg = TIMER_CONTROL_REG_TIMER_ENABLE|TIMER_CONTROL_REG_TIMER_MODE;
+	GPIO_ExtiSetCB(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, prvHWTimer_OperationQueuExti, HWTimerID);
+	prvHWTimer[HWTimerID].ContinueDelay = 0;
+	switch(HWTimer->Cmd[HWTimer->CurCount].uArg.ExitArg.ExtiMode)
+	{
+	case OP_QUEUE_CMD_IO_EXTI_BOTH:
+		GPIO_ExtiConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 0, 1, 1);
+		break;
+	case OP_QUEUE_CMD_IO_EXTI_UP:
+		GPIO_ExtiConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 0, 1, 0);
+		break;
+	case OP_QUEUE_CMD_IO_EXTI_DOWN:
+		GPIO_ExtiConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 0, 0, 1);
+		break;
+	}
+
+	HWTimer->CurCount++;
+	return OPERATION_OUT_IRQ;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationCapture(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->Cmd[HWTimer->CurCount].PinOrDelay = Pin;
+	if (!TIMM0->TIM[HWTimerID].ControlReg)
+	{
+		HWTimer->Cmd[HWTimer->CurCount + 1].Operation = OP_QUEUE_CMD_CAPTURE_END;
+	}
+	else
+	{
+		HWTimer->Cmd[HWTimer->CurCount].uParam.MaxCnt = TIMM0->TIM[HWTimerID].LoadCount - TIMM0->TIM[HWTimerID].CurrentValue;
+		HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level = GPIO_Input(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay);
+	}
+	HWTimer->CurCount++;
+	if (OP_QUEUE_CMD_CAPTURE_END != HWTimer->Cmd[HWTimer->CurCount].Operation)
+	{
+		return OPERATION_OUT_IRQ;
+	}
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationCaptureCB(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	HWTimer->Cmd[HWTimer->CurCount].PinOrDelay = Pin;
+	if (!TIMM0->TIM[HWTimerID].ControlReg)
+	{
+		HWTimer->Cmd[HWTimer->CurCount + 1].Operation = OP_QUEUE_CMD_CAPTURE_END;
+	}
+	else
+	{
+		HWTimer->Cmd[HWTimer->CurCount].uParam.MaxCnt = TIMM0->TIM[HWTimerID].LoadCount - TIMM0->TIM[HWTimerID].CurrentValue;
+		HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level = GPIO_Input(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay);
+	}
+	HWTimer->Cmd[HWTimer->CurCount].CB(HWTimerID, &HWTimer->Cmd[HWTimer->CurCount]);
+	HWTimer->CurCount++;
+	if (OP_QUEUE_CMD_CAPTURE_END != HWTimer->Cmd[HWTimer->CurCount].Operation)
+	{
+		return OPERATION_OUT_IRQ;
+	}
+	return OPERATION_GO_ON;
+}
+
+static int __FUNC_IN_RAM__ prvHWTimer_OperationCaptureEnd(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
+{
+	GPIO_ExtiSetCB(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, NULL, NULL);
+	GPIO_ExtiConfig(HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, 0, 0, 0);
+	TIMM0->TIM[HWTimerID].ControlReg = 0;
+	HWTimer->CurCount++;
+	return OPERATION_GO_ON;
+}
+
+static queue_fun queueFunlist[] =
+{
+		prvHWTimer_OperationEnd,
+		prvHWTimer_OperationDelayOnce,	//只有一次delay
+		prvHWTimer_OperationDelay,	//连续delay,配合OP_QUEUE_CMD_REPEAT_DELAY使用
+		prvHWTimer_OperationRepeatDelay,	//重复OP_QUEUE_CMD_CONTINUE_DELAY
+		prvHWTimer_OperationSetGPIOOut,
+		prvHWTimer_OperationSetGPIOIn,
+		prvHWTimer_OperationGPIOOut,
+		prvHWTimer_OperationGPIOIn,
+		prvHWTimer_OperationGPIOInCB,
+		prvHWTimer_OperationCB,
+		prvHWTimer_OperationCaptureSet,
+		prvHWTimer_OperationCapture,
+		prvHWTimer_OperationCaptureCB,
+		prvHWTimer_OperationCaptureEnd,
+};
 
 static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HWTimer_CtrlStruct *HWTimer, uint8_t Pin)
 {
 	volatile uint32_t Period;
+	int result;
 	while(HWTimer->IsQueueRunning)
 	{
 
@@ -121,7 +306,17 @@ static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HW
 //				HWTimer->Cmd[HWTimer->CurCount].PinOrDelay, HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.Level,
 //				HWTimer->Cmd[HWTimer->CurCount].uArg.IOArg.PullMode, HWTimer->Cmd[HWTimer->CurCount].uArg.Time,
 //				HWTimer->Cmd[HWTimer->CurCount].CB);
-
+#if 1
+		result = queueFunlist[HWTimer->Cmd[HWTimer->CurCount].Operation](HWTimerID, HWTimer, Pin);
+		switch(result)
+		{
+		case OPERATION_OUT_IRQ:
+			return;
+		case OPERATION_RESET_TIMER:
+			goto START_HWTIMER;
+			break;
+		}
+#else
 		switch(HWTimer->Cmd[HWTimer->CurCount].Operation)
 		{
 		case OP_QUEUE_CMD_GPIO_OUT:
@@ -248,6 +443,8 @@ static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HW
 			}
 			break;
 		}
+#endif
+
 	}
 	return ;
 START_HWTIMER:

+ 2 - 0
bsp/air105/include/resource_map.h

@@ -53,6 +53,8 @@
 #define FLASH_SPI_RX_DMA_STREAM	DMA1_STREAM_5
 #define LCD_SPI_TX_DMA_STREAM	DMA1_STREAM_6
 #define LCD_SPI_RX_DMA_STREAM	DMA1_STREAM_7
+#define ETH_SPI_TX_DMA_STREAM	DMA1_STREAM_4
+#define ETH_SPI_RX_DMA_STREAM	DMA1_STREAM_5
 
 #define LUATOS_TASK_PRO		(configMAX_PRIORITIES - 4)
 #define HW_TASK_PRO		(configMAX_PRIORITIES - 1)

+ 59 - 0
bsp/common/include/bsp_common.h

@@ -160,6 +160,15 @@ enum
 	USB_APP_EVENT_ID_START = 0xf0300000,
 	USER_EVENT_ID_START = 0xf1000000,
 	INVALID_EVENT_ID = 0xffffffff,
+
+	NW_EVENT_CONNECTED = 0,
+	NW_EVENT_REMOTE_CLOSE,
+	NW_EVENT_RECV,
+	NW_EVENT_ERR,
+	NW_EVENT_SENT,
+	NW_EVENT_ACCEPT,
+	NW_EVENT_CLOSE_OK,
+
 };
 
 #define INVALID_HANDLE_VALUE  ((void *)0xffffffff)
@@ -206,6 +215,14 @@ typedef uint64_t LongInt;
 /* appliation initialization (rtgui application etc ...) */
 #define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")
 
+typedef struct
+{
+	uint32_t ID;
+	uint32_t Param1;
+	uint32_t Param2;
+	uint32_t Param3;
+}OS_EVENT;
+
 typedef struct
 {
 	CBFuncEx_t CB;
@@ -229,6 +246,48 @@ typedef struct
     uint8_t PinOrDelay;		//IO操作时为IOpin,delay操作时则为微调值,0~47,48为1us
 }OPQueue_CmdStruct;
 
+enum
+{
+    UDATA_TYPE_UNDEFINED = 0,
+	UDATA_MULTIPLE_RESOURCE,
+	UDATA_TYPE_STRING,
+	UDATA_TYPE_OPAQUE,
+	UDATA_TYPE_INTEGER,
+	UDATA_TYPE_DWORD,
+	UDATA_TYPE_WORD,
+	UDATA_TYPE_BYTE,
+	UDATA_TYPE_FLOAT,
+	UDATA_TYPE_BOOLEAN,
+	UDATA_TYPE_UNSIGNED,
+	UDATA_TYPE_UNUSD
+};
+
+typedef struct _u_data_t uData_t;
+
+struct _u_data_t
+{
+    union
+    {
+        uint8_t     asBoolean;
+        uint64_t	asUnsigned;
+        int64_t     asInteger;
+        PV_Union	asDword;
+        double      asFloat;
+        struct
+        {
+            size_t   length;
+            uint8_t *buffer;
+        } asBuffer;
+        struct
+        {
+            size_t       count;
+            uData_t 	*array;
+        } asChildren;
+    } value;
+	uint32_t ID;
+	uint8_t Type;
+};
+
 __attribute__((weak)) uint8_t OS_CheckInIrq(void);
 #ifdef __BUILD_OS__
 HANDLE OS_MutexCreate(void);

+ 3 - 10
bsp/common/include/core_task.h

@@ -21,18 +21,11 @@
 
 #ifndef __CORE_TASK_H__
 #define __CORE_TASK_H__
-typedef struct
-{
-	uint32_t ID;
-	uint32_t Param1;
-	uint32_t Param2;
-	uint32_t Param3;
-}Task_EventStruct;
-#define OS_EVENT Task_EventStruct
+#include "bsp_common.h"
 HANDLE Task_Create(TaskFun_t EntryFunction, void *Param, uint32_t StackSize, uint32_t Priority, const char *Name);
 void Task_SendEvent(HANDLE TaskHandle, uint32_t ID, uint32_t P1, uint32_t P2, uint32_t P3);
-int32_t Task_GetEvent(HANDLE TaskHandle, uint32_t TargetEventID, Task_EventStruct *OutEvent, CBFuncEx_t Callback, uint64_t Tick);
-int32_t Task_GetEventByMS(HANDLE TaskHandle, uint32_t TargetEventID, Task_EventStruct *OutEvent, CBFuncEx_t Callback, uint32_t ms);
+int32_t Task_GetEvent(HANDLE TaskHandle, uint32_t TargetEventID, OS_EVENT *OutEvent, CBFuncEx_t Callback, uint64_t Tick);
+int32_t Task_GetEventByMS(HANDLE TaskHandle, uint32_t TargetEventID, OS_EVENT *OutEvent, CBFuncEx_t Callback, uint32_t ms);
 HANDLE Task_GetCurrent(void);
 void Task_DelayTick(uint64_t Tick);
 void Task_DelayUS(uint32_t US);

+ 2 - 2
bsp/common/src/core_task.c

@@ -159,7 +159,7 @@ void Task_SendEvent(HANDLE TaskHandle, uint32_t ID, uint32_t P1, uint32_t P2, ui
 #endif
 }
 
-int32_t Task_GetEvent(HANDLE TaskHandle, uint32_t TargetEventID, Task_EventStruct *OutEvent, CBFuncEx_t Callback, uint64_t Tick)
+int32_t Task_GetEvent(HANDLE TaskHandle, uint32_t TargetEventID, OS_EVENT *OutEvent, CBFuncEx_t Callback, uint64_t Tick)
 {
 	uint64_t ToTick = 0;
 	Core_EventStruct *Event;
@@ -261,7 +261,7 @@ GET_EVENT_DONE:
 	return Result;
 }
 
-int32_t Task_GetEventByMS(HANDLE TaskHandle, uint32_t TargetEventID, Task_EventStruct *OutEvent, CBFuncEx_t Callback, uint32_t ms)
+int32_t Task_GetEventByMS(HANDLE TaskHandle, uint32_t TargetEventID, OS_EVENT *OutEvent, CBFuncEx_t Callback, uint32_t ms)
 {
 	uint64_t ToTick = ms;
 	ToTick *= SYS_TIMER_1MS;

+ 0 - 6
bsp/common/src/core_usb_app.c

@@ -558,11 +558,6 @@ static int32_t prvCore_SCSIWrite(uint8_t LUN, uint8_t *Data, uint32_t Len, void
 	return 0;
 }
 
-static int32_t prvCore_SCSIDoWrite(uint8_t LUN, void *pUserData)
-{
-	return 0;
-}
-
 static int32_t prvCore_SCSIUserCmd(USB_EndpointDataStruct *pEpData, MSC_SCSICtrlStruct *pMSC)
 {
 	return -1;
@@ -585,7 +580,6 @@ static const USB_StorageSCSITypeDef prvCore_SCSIFun =
 		prvCore_SCSIReadNext,
 		prvCore_SCSIPreWrite,
 		prvCore_SCSIWrite,
-		prvCore_SCSIDoWrite,
 		prvCore_SCSIUserCmd,
 		&prvCore_StandardInquiryData,
 		&prvCore_MSCPage00InquiryData,

+ 1 - 1
bsp/device/src/dev_sdhc_spi.c

@@ -313,7 +313,7 @@ static uint8_t CRC7(uint8_t * chr, int cnt)
 static void SDHC_SpiXfer(SDHC_SPICtrlStruct *Ctrl, uint8_t *Buf, uint16_t TxLen)
 {
 #ifdef __BUILD_OS__
-	Task_EventStruct Event;
+	OS_EVENT Event;
 #endif
 #ifdef __BUILD_OS__
 	if (Ctrl->NotifyTask && Ctrl->TaskCB)

+ 3 - 3
bsp/device/src/dev_spiflash.c

@@ -81,7 +81,7 @@ static int32_t SPIFlash_SpiIrqCB(void *pData, void *pParam)
 static void SPIFlash_Wait(SPIFlash_CtrlStruct *Ctrl, uint32_t Tick)
 {
 #ifdef __BUILD_OS__
-	Task_EventStruct Event;
+	OS_EVENT Event;
 	if (Ctrl->NotifyTask && Ctrl->TaskCB)
 	{
 		Task_GetEvent(Ctrl->NotifyTask, 0xffffffff, &Event, Ctrl->TaskCB, Tick);
@@ -426,7 +426,7 @@ int32_t SPIFlash_WriteSR(SPIFlash_CtrlStruct *Ctrl, uint8_t SR)
 int32_t SPIFlash_Read(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, uint8_t *Buf, uint32_t Length, uint8_t FastRead)
 {
 #ifdef __BUILD_OS__
-	Task_EventStruct Event;
+	OS_EVENT Event;
 #endif
 	Ctrl->FlashError = 0;
 	Ctrl->Tx[1] = (Address & 0x00ff0000) >> 16;
@@ -487,7 +487,7 @@ int32_t SPIFlash_Read(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, uint8_t *Buf,
 int32_t SPIFlash_Write(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, const uint8_t *Buf, uint32_t Length)
 {
 #ifdef __BUILD_OS__
-	Task_EventStruct Event;
+	OS_EVENT Event;
 #endif
 	uint32_t FlashAddress, DummyLen;
 	Ctrl->FlashError = 0;

+ 3 - 0
xmake.lua

@@ -329,6 +329,9 @@ if with_luatos then
     add_files(luatos.."components/io_queue/*.c")
     add_includedirs(luatos.."components/io_queue")
 
+    add_files(luatos.."components/tjpgd/*.c")
+    add_includedirs(luatos.."components/tjpgd")
+
     -- shell & cmux
     add_includedirs(luatos.."components/shell",{public = true})
     add_includedirs(luatos.."components/cmux",{public = true})