7
7
#include "ff.h"
8
8
#include "irq.h"
9
9
10
+ typedef struct {
11
+ volatile uint8_t State ;
12
+ uint8_t * DataBuffer ;
13
+ volatile uint32_t DataBufferSize ;
14
+
15
+ } JPEG_Data_BufferTypeDef ;
16
+
17
+ #define CHUNK_SIZE_IN ((uint32_t)(4 * 1024))
10
18
#define CHUNK_SIZE_OUT ((uint32_t)(64 * 1024))
11
- #define MAX_JPEG_SIZE (1024 * 1024)
19
+
20
+ #define JPEG_BUFFER_EMPTY 0
21
+ #define JPEG_BUFFER_FULL 1
22
+
23
+ #define NB_INPUT_DATA_BUFFERS 2
12
24
13
25
JPEG_HandleTypeDef JPEG_Handle ;
14
26
JPEG_ConfTypeDef JPEG_Info ;
15
27
16
28
volatile uint32_t Jpeg_HWDecodingEnd = 0 , Jpeg_HWDecodingError = 0 ;
17
29
18
30
uint32_t FrameBufferAddress ;
31
+ uint32_t size ;
19
32
20
- uint8_t * g_inputJpegBuffer = NULL ;
21
- uint32_t g_inputJpegSize = 0 ;
22
- uint32_t g_inputJpegOffset = 0 ;
33
+ uint8_t JPEG_Data_InBuffer0 [CHUNK_SIZE_IN ] __attribute__((aligned (4 )));
23
34
24
- uint8_t * g_outputBuffer = NULL ;
35
+ uint8_t JPEG_Data_InBuffer1 [CHUNK_SIZE_IN ] __attribute__((aligned (4 )));
36
+
37
+ JPEG_Data_BufferTypeDef Jpeg_IN_BufferTab [NB_INPUT_DATA_BUFFERS ] = {
38
+ {JPEG_BUFFER_EMPTY , JPEG_Data_InBuffer0 , 0 },
39
+ {JPEG_BUFFER_EMPTY , JPEG_Data_InBuffer1 , 0 }};
40
+
41
+ uint32_t JPEG_IN_Read_BufferIndex = 0 ;
42
+ uint32_t JPEG_IN_Write_BufferIndex = 0 ;
43
+ volatile uint32_t Input_Is_Paused = 0 ;
25
44
26
45
typedef struct {
27
46
FIL fatfs_file ;
@@ -44,26 +63,6 @@ int jpeg_decode_file_open(const char *path) {
44
63
return -1 ;
45
64
}
46
65
47
- int jpeg_decode_file_size (uint32_t * size ) {
48
- if (file_operation .mode == JPEG_FILE_LVGL ) {
49
- uint32_t curr_pos = 0 ;
50
- uint32_t file_size = 0 ;
51
- lv_fs_tell (& file_operation .lvgl_file , & curr_pos );
52
- if (lv_fs_seek (& file_operation .lvgl_file , 0 , LV_FS_SEEK_END ) !=
53
- LV_FS_RES_OK ) {
54
- return -1 ;
55
- }
56
- lv_fs_tell (& file_operation .lvgl_file , & file_size );
57
- lv_fs_seek (& file_operation .lvgl_file , curr_pos , LV_FS_SEEK_SET );
58
- * size = file_size ;
59
- return 0 ;
60
- } else if (file_operation .mode == JPEG_FILE_FATFS ) {
61
- * size = f_size (& file_operation .fatfs_file );
62
- return 0 ;
63
- }
64
- return -1 ;
65
- }
66
-
67
66
int jpeg_decode_file_read (uint8_t * buf , uint32_t len , uint32_t * read_len ) {
68
67
if (file_operation .mode == JPEG_FILE_LVGL ) {
69
68
return lv_fs_read (& file_operation .lvgl_file , buf , len , read_len );
@@ -94,7 +93,8 @@ void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg) {
94
93
/* Enable MDMA clock */
95
94
__HAL_RCC_MDMA_CLK_ENABLE ();
96
95
97
- NVIC_SetPriority (JPEG_IRQn , IRQ_PRI_JPEG );
96
+ // HAL_NVIC_SetPriority(JPEG_IRQn, 0x07, 0x00);
97
+ NVIC_SetPriority (MDMA_IRQn , IRQ_PRI_JPEG );
98
98
HAL_NVIC_EnableIRQ (JPEG_IRQn );
99
99
100
100
/* Input MDMA */
@@ -184,21 +184,98 @@ void MDMA_IRQHandler() {
184
184
HAL_MDMA_IRQHandler (JPEG_Handle .hdmaout );
185
185
}
186
186
187
+ uint32_t JPEG_InputHandler (JPEG_HandleTypeDef * hjpeg ) {
188
+ if (Jpeg_HWDecodingEnd == 0 && Jpeg_HWDecodingError == 0 ) {
189
+ if (Jpeg_IN_BufferTab [JPEG_IN_Write_BufferIndex ].State ==
190
+ JPEG_BUFFER_EMPTY ) {
191
+ if (jpeg_decode_file_read (
192
+ Jpeg_IN_BufferTab [JPEG_IN_Write_BufferIndex ].DataBuffer ,
193
+ CHUNK_SIZE_IN ,
194
+ (uint32_t * )(& Jpeg_IN_BufferTab [JPEG_IN_Write_BufferIndex ]
195
+ .DataBufferSize )) == FR_OK ) {
196
+ Jpeg_IN_BufferTab [JPEG_IN_Write_BufferIndex ].State = JPEG_BUFFER_FULL ;
197
+ } else {
198
+ return 1 ;
199
+ }
200
+
201
+ if ((Input_Is_Paused == 1 ) &&
202
+ (JPEG_IN_Write_BufferIndex == JPEG_IN_Read_BufferIndex )) {
203
+ Input_Is_Paused = 0 ;
204
+ HAL_JPEG_ConfigInputBuffer (
205
+ hjpeg , Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBuffer ,
206
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize );
207
+
208
+ HAL_JPEG_Resume (hjpeg , JPEG_PAUSE_RESUME_INPUT );
209
+ }
210
+
211
+ JPEG_IN_Write_BufferIndex ++ ;
212
+ if (JPEG_IN_Write_BufferIndex >= NB_INPUT_DATA_BUFFERS ) {
213
+ JPEG_IN_Write_BufferIndex = 0 ;
214
+ }
215
+ }
216
+ return 0 ;
217
+ } else {
218
+ return 1 ;
219
+ }
220
+ }
221
+
187
222
void HAL_JPEG_GetDataCallback (JPEG_HandleTypeDef * hjpeg ,
188
223
uint32_t NbDecodedData ) {
189
- g_inputJpegOffset += NbDecodedData ;
190
- if (g_inputJpegOffset < g_inputJpegSize ) {
191
- HAL_JPEG_ConfigInputBuffer (hjpeg , g_inputJpegBuffer + g_inputJpegOffset ,
192
- g_inputJpegSize - g_inputJpegOffset );
224
+ #if 0
225
+ if (NbDecodedData ==
226
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize ) {
227
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].State = JPEG_BUFFER_EMPTY ;
228
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize = 0 ;
229
+
230
+ JPEG_IN_Read_BufferIndex ++ ;
231
+ if (JPEG_IN_Read_BufferIndex >= NB_INPUT_DATA_BUFFERS ) {
232
+ JPEG_IN_Read_BufferIndex = 0 ;
233
+ }
234
+
235
+ if (Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].State ==
236
+ JPEG_BUFFER_EMPTY ) {
237
+ HAL_JPEG_Pause (hjpeg , JPEG_PAUSE_RESUME_INPUT );
238
+ Input_Is_Paused = 1 ;
239
+ } else {
240
+ HAL_JPEG_ConfigInputBuffer (
241
+ hjpeg , Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBuffer ,
242
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize );
243
+ }
244
+ } else {
245
+ HAL_JPEG_ConfigInputBuffer (
246
+ hjpeg ,
247
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBuffer + NbDecodedData ,
248
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize -
249
+ NbDecodedData );
250
+ }
251
+ #else
252
+ if (NbDecodedData ==
253
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize ) {
254
+ jpeg_decode_file_read (Jpeg_IN_BufferTab [0 ].DataBuffer , CHUNK_SIZE_IN ,
255
+ (uint32_t * )(& Jpeg_IN_BufferTab [0 ].DataBufferSize ));
256
+ HAL_JPEG_ConfigInputBuffer (hjpeg , Jpeg_IN_BufferTab [0 ].DataBuffer ,
257
+ Jpeg_IN_BufferTab [0 ].DataBufferSize );
258
+ } else if (NbDecodedData <
259
+ Jpeg_IN_BufferTab [JPEG_IN_Read_BufferIndex ].DataBufferSize ) {
260
+ HAL_JPEG_ConfigInputBuffer (
261
+ hjpeg , Jpeg_IN_BufferTab [0 ].DataBuffer + NbDecodedData ,
262
+ Jpeg_IN_BufferTab [0 ].DataBufferSize - NbDecodedData );
263
+ Jpeg_IN_BufferTab [0 ].DataBufferSize -= NbDecodedData ;
264
+ } else {
265
+ HAL_JPEG_ConfigInputBuffer (hjpeg , NULL , 0 );
266
+ Jpeg_IN_BufferTab [0 ].DataBufferSize = 0 ;
193
267
}
268
+
269
+ #endif
194
270
}
195
271
196
272
void HAL_JPEG_DataReadyCallback (JPEG_HandleTypeDef * hjpeg , uint8_t * pDataOut ,
197
273
uint32_t OutDataLength ) {
198
274
/* Update JPEG encoder output buffer address*/
199
- g_outputBuffer += OutDataLength ;
275
+ FrameBufferAddress += OutDataLength ;
200
276
201
- HAL_JPEG_ConfigOutputBuffer (hjpeg , g_outputBuffer , CHUNK_SIZE_OUT );
277
+ HAL_JPEG_ConfigOutputBuffer (hjpeg , (uint8_t * )FrameBufferAddress ,
278
+ CHUNK_SIZE_OUT );
202
279
}
203
280
204
281
void HAL_JPEG_InfoReadyCallback (JPEG_HandleTypeDef * hjpeg ,
@@ -220,47 +297,30 @@ void jpeg_init(void) {
220
297
void jpeg_decode_init (uint32_t address ) {
221
298
Jpeg_HWDecodingEnd = 0 ;
222
299
Jpeg_HWDecodingError = 0 ;
223
- g_outputBuffer = ( uint8_t * ) address ;
300
+ FrameBufferAddress = address ;
224
301
}
225
302
226
303
int jpeg_decode_start (const char * path ) {
227
304
if (jpeg_decode_file_open (path ) != 0 ) {
228
305
return -1 ;
229
306
}
230
- uint32_t file_size = 0 ;
231
- if (jpeg_decode_file_size (& file_size ) != 0 ) {
232
- jpeg_decode_file_close ();
233
- return -1 ;
234
- }
235
- if (file_size > MAX_JPEG_SIZE || file_size == 0 ) {
236
- jpeg_decode_file_close ();
237
- return -1 ;
238
- }
239
-
240
- g_inputJpegBuffer = lodepng_malloc (file_size );
241
- g_inputJpegOffset = 0 ;
242
- uint32_t state = disable_irq ();
243
- if (jpeg_decode_file_read (g_inputJpegBuffer , file_size , & g_inputJpegSize ) ==
244
- 0 ) {
245
- enable_irq (state );
307
+ if (jpeg_decode_file_read (
308
+ Jpeg_IN_BufferTab [0 ].DataBuffer , CHUNK_SIZE_IN ,
309
+ (uint32_t * )(& Jpeg_IN_BufferTab [0 ].DataBufferSize )) == 0 ) {
310
+ Jpeg_IN_BufferTab [0 ].State = JPEG_BUFFER_FULL ;
246
311
} else {
247
- enable_irq (state );
248
- lodepng_free (g_inputJpegBuffer );
249
- return -1 ;
250
- }
251
- if (g_inputJpegSize != file_size ) {
252
- lodepng_free (g_inputJpegBuffer );
253
312
return -1 ;
254
313
}
255
314
/* Start JPEG decoding with DMA method */
256
- HAL_JPEG_Decode_DMA (& JPEG_Handle , g_inputJpegBuffer , g_inputJpegSize ,
257
- g_outputBuffer , CHUNK_SIZE_OUT );
315
+ HAL_JPEG_Decode_DMA (& JPEG_Handle , Jpeg_IN_BufferTab [0 ].DataBuffer ,
316
+ Jpeg_IN_BufferTab [0 ].DataBufferSize ,
317
+ (uint8_t * )FrameBufferAddress , CHUNK_SIZE_OUT );
258
318
259
319
uint32_t time_started = HAL_GetTick ();
260
320
while ((jpeg_get_decode_state () == 0 ) && (jpeg_get_decode_error () == 0 )) {
261
321
if (HAL_GetTick () - time_started > 500 ) Jpeg_HWDecodingError = 1 ;
262
322
}
263
- lodepng_free ( g_inputJpegBuffer );
323
+
264
324
if (Jpeg_HWDecodingError ) {
265
325
return -2 ;
266
326
}
0 commit comments