@@ -105,6 +105,15 @@ static void SPI_CAM_ISR_ATTR spi_cam_post_trans_cb(spi_slave_transaction_t *spi_
105105{
106106 esp_cam_ctlr_spi_cam_t * ctlr = (esp_cam_ctlr_spi_cam_t * )spi_trans -> user ;
107107
108+ /**
109+ * Due to SPI slave does not support stop function,
110+ * we need to check if the controller is started,
111+ * if not started, we need to return immediately.
112+ */
113+ if (ctlr -> fsm != ESP_CAM_CTLR_SPI_CAM_FSM_STARTED ) {
114+ return ;
115+ }
116+
108117 if ((spi_trans -> rx_buffer != ctlr -> frame_buffer ) || ctlr -> bk_buffer_exposed ) {
109118 if (!ctlr -> auto_decode_dis ) {
110119 spi_cam_msg_t msg ;
@@ -206,12 +215,13 @@ static esp_err_t spi_cam_deinit_intf(esp_cam_ctlr_spi_cam_t *ctlr)
206215 * @param ctlr ESP CAM controller handle
207216 * @param src Source buffer pointer
208217 * @param dst Destination buffer pointer
218+ * @param decoded_size Decoded size pointer
209219 *
210220 * @return
211221 * - ESP_OK on success
212222 * - Others if failed
213223 */
214- static esp_err_t spi_cam_decode (esp_cam_ctlr_spi_cam_t * ctlr , uint8_t * src , uint8_t * dst )
224+ static esp_err_t spi_cam_decode (esp_cam_ctlr_spi_cam_t * ctlr , uint8_t * src , uint8_t * dst , uint32_t * decoded_size )
215225{
216226 bool decode_check_dis = ctlr -> decode_check_dis ;
217227
@@ -236,6 +246,8 @@ static esp_err_t spi_cam_decode(esp_cam_ctlr_spi_cam_t *ctlr, uint8_t *src, uint
236246 dst += line_data_size ;
237247 }
238248
249+ * decoded_size = ctlr -> bf_size_in_bytes ;
250+
239251 return ESP_OK ;
240252}
241253
@@ -257,20 +269,21 @@ static void spi_cam_task(void *arg)
257269 esp_err_t ret ;
258270 uint8_t * decoded_buffer ;
259271 uint8_t * rx_buffer = msg .recved_frame .buffer ;
272+ uint32_t decoded_size ;
260273
261274 if (rx_buffer == ctlr -> frame_buffer ) {
262- ret = spi_cam_decode (ctlr , rx_buffer , ctlr -> backup_buffer );
275+ ret = spi_cam_decode (ctlr , rx_buffer , ctlr -> backup_buffer , & decoded_size );
263276 decoded_buffer = ctlr -> backup_buffer ;
264277 } else {
265- ret = spi_cam_decode (ctlr , rx_buffer , rx_buffer );
278+ ret = spi_cam_decode (ctlr , rx_buffer , rx_buffer , & decoded_size );
266279 decoded_buffer = rx_buffer ;
267280 }
268281
269282 if (ret == ESP_OK ) {
270283 esp_cam_ctlr_trans_t trans = {0 };
271284
272285 trans .buffer = decoded_buffer ;
273- trans .buflen = ctlr -> bf_size_in_bytes ;
286+ trans .buflen = decoded_size ;
274287 trans .received_size = trans .buflen ;
275288 if (ctlr -> cbs .on_trans_finished ) {
276289 ctlr -> cbs .on_trans_finished (& (ctlr -> base ), & trans , ctlr -> cbs_user_data );
@@ -368,17 +381,15 @@ static esp_err_t spi_cam_start(esp_cam_ctlr_handle_t handle)
368381 */
369382static esp_err_t spi_cam_stop (esp_cam_ctlr_handle_t handle )
370383{
371- esp_err_t ret ;
372384 esp_cam_ctlr_spi_cam_t * ctlr = (esp_cam_ctlr_spi_cam_t * )handle ;
373385 ESP_RETURN_ON_FALSE (ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: handle is null" );
374386 ESP_RETURN_ON_FALSE (ctlr -> fsm == ESP_CAM_CTLR_SPI_CAM_FSM_STARTED , ESP_ERR_INVALID_STATE , TAG , "processor isn't in started state" );
375387
376- ret = esp_cam_spi_slave_disable (ctlr -> spi_port );
377- if (ret == ESP_OK ) {
378- ctlr -> fsm = ESP_CAM_CTLR_SPI_CAM_FSM_ENABLED ;
379- }
388+ /* SPI slave does not support stop function */
380389
381- return ret ;
390+ ctlr -> fsm = ESP_CAM_CTLR_SPI_CAM_FSM_ENABLED ;
391+
392+ return ESP_OK ;
382393}
383394
384395/**
@@ -615,18 +626,19 @@ esp_err_t esp_cam_new_spi_ctlr(const esp_cam_ctlr_spi_config_t *config, esp_cam_
615626 * @param src_len Source buffer length
616627 * @param dst Destination buffer pointer
617628 * @param dst_len Destination buffer length
629+ * @param decoded_size Decoded size pointer
618630 *
619631 * @return
620632 * - ESP_OK on success
621633 * - Others if failed
622634 */
623- esp_err_t esp_cam_spi_decode_frame (esp_cam_ctlr_handle_t handle , uint8_t * src , uint32_t src_len , uint8_t * dst , uint32_t dst_len )
635+ esp_err_t esp_cam_spi_decode_frame (esp_cam_ctlr_handle_t handle , uint8_t * src , uint32_t src_len , uint8_t * dst , uint32_t dst_len , uint32_t * decoded_size )
624636{
625637 esp_cam_ctlr_spi_cam_t * ctlr = (esp_cam_ctlr_spi_cam_t * )handle ;
626638 ESP_RETURN_ON_FALSE (ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: handle is null" );
627639 ESP_RETURN_ON_FALSE (ctlr -> auto_decode_dis , ESP_ERR_INVALID_STATE , TAG , "auto decode is enabled" );
628640 ESP_RETURN_ON_FALSE (src && dst , ESP_ERR_INVALID_ARG , TAG , "invalid argument: src or dst is null" );
629641 ESP_RETURN_ON_FALSE (src_len == ctlr -> fb_size_in_bytes && dst_len >= ctlr -> bf_size_in_bytes , ESP_ERR_INVALID_ARG , TAG , "invalid argument: src_len or dst_len is invalid" );
630642
631- return spi_cam_decode (ctlr , src , dst );
643+ return spi_cam_decode (ctlr , src , dst , decoded_size );
632644}
0 commit comments