+uint8_t SImage_Host_OpenSession(USB_ClassInfo_SI_Host_t* SIInterfaceInfo)\r
+{\r
+ if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))\r
+ return HOST_SENDCONTROL_DeviceDisconnect;\r
+\r
+ uint8_t ErrorCode;\r
+\r
+ SI_PIMA_Container_t PIMABlock = (SI_PIMA_Container_t)\r
+ {\r
+ .DataLength = PIMA_COMMAND_SIZE(0),\r
+ .Type = CType_CommandBlock,\r
+ .Code = 0x1002,\r
+ .Params = {},\r
+ };\r
+ \r
+ SIInterfaceInfo->State.TransactionID = 1;\r
+ \r
+ if ((ErrorCode = SImage_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)\r
+ return ErrorCode;\r
+ \r
+ if ((ErrorCode = SImage_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)\r
+ return ErrorCode;\r
+ \r
+ SIInterfaceInfo->State.IsSessionOpen = true;\r
+\r
+ return PIPE_RWSTREAM_NoError;\r
+}\r
+\r
+uint8_t SImage_Host_CloseSession(USB_ClassInfo_SI_Host_t* SIInterfaceInfo)\r
+{\r
+ if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))\r
+ return HOST_SENDCONTROL_DeviceDisconnect;\r
+\r
+ uint8_t ErrorCode;\r
+\r
+ SI_PIMA_Container_t PIMABlock = (SI_PIMA_Container_t)\r
+ {\r
+ .DataLength = PIMA_COMMAND_SIZE(0),\r
+ .Type = CType_CommandBlock,\r
+ .Code = 0x1003,\r
+ .Params = {},\r
+ };\r
+ \r
+ if ((ErrorCode = SImage_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)\r
+ return ErrorCode;\r
+ \r
+ if ((ErrorCode = SImage_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)\r
+ return ErrorCode;\r
+\r
+ SIInterfaceInfo->State.IsSessionOpen = false;\r
+\r
+ return PIPE_RWSTREAM_NoError;\r
+}\r
+\r