Skip to content

Commit 6cd42c8

Browse files
authored
revert dc64e04 (#310)
1 parent 5c94af7 commit 6cd42c8

File tree

1 file changed

+118
-58
lines changed

1 file changed

+118
-58
lines changed

core/embed/trezorhal/jpeg_dma.c

Lines changed: 118 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,40 @@
77
#include "ff.h"
88
#include "irq.h"
99

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))
1018
#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
1224

1325
JPEG_HandleTypeDef JPEG_Handle;
1426
JPEG_ConfTypeDef JPEG_Info;
1527

1628
volatile uint32_t Jpeg_HWDecodingEnd = 0, Jpeg_HWDecodingError = 0;
1729

1830
uint32_t FrameBufferAddress;
31+
uint32_t size;
1932

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)));
2334

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;
2544

2645
typedef struct {
2746
FIL fatfs_file;
@@ -44,26 +63,6 @@ int jpeg_decode_file_open(const char *path) {
4463
return -1;
4564
}
4665

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-
6766
int jpeg_decode_file_read(uint8_t *buf, uint32_t len, uint32_t *read_len) {
6867
if (file_operation.mode == JPEG_FILE_LVGL) {
6968
return lv_fs_read(&file_operation.lvgl_file, buf, len, read_len);
@@ -94,7 +93,8 @@ void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg) {
9493
/* Enable MDMA clock */
9594
__HAL_RCC_MDMA_CLK_ENABLE();
9695

97-
NVIC_SetPriority(JPEG_IRQn, IRQ_PRI_JPEG);
96+
// HAL_NVIC_SetPriority(JPEG_IRQn, 0x07, 0x00);
97+
NVIC_SetPriority(MDMA_IRQn, IRQ_PRI_JPEG);
9898
HAL_NVIC_EnableIRQ(JPEG_IRQn);
9999

100100
/* Input MDMA */
@@ -184,21 +184,98 @@ void MDMA_IRQHandler() {
184184
HAL_MDMA_IRQHandler(JPEG_Handle.hdmaout);
185185
}
186186

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+
187222
void HAL_JPEG_GetDataCallback(JPEG_HandleTypeDef *hjpeg,
188223
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;
193267
}
268+
269+
#endif
194270
}
195271

196272
void HAL_JPEG_DataReadyCallback(JPEG_HandleTypeDef *hjpeg, uint8_t *pDataOut,
197273
uint32_t OutDataLength) {
198274
/* Update JPEG encoder output buffer address*/
199-
g_outputBuffer += OutDataLength;
275+
FrameBufferAddress += OutDataLength;
200276

201-
HAL_JPEG_ConfigOutputBuffer(hjpeg, g_outputBuffer, CHUNK_SIZE_OUT);
277+
HAL_JPEG_ConfigOutputBuffer(hjpeg, (uint8_t *)FrameBufferAddress,
278+
CHUNK_SIZE_OUT);
202279
}
203280

204281
void HAL_JPEG_InfoReadyCallback(JPEG_HandleTypeDef *hjpeg,
@@ -220,47 +297,30 @@ void jpeg_init(void) {
220297
void jpeg_decode_init(uint32_t address) {
221298
Jpeg_HWDecodingEnd = 0;
222299
Jpeg_HWDecodingError = 0;
223-
g_outputBuffer = (uint8_t *)address;
300+
FrameBufferAddress = address;
224301
}
225302

226303
int jpeg_decode_start(const char *path) {
227304
if (jpeg_decode_file_open(path) != 0) {
228305
return -1;
229306
}
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;
246311
} 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);
253312
return -1;
254313
}
255314
/* 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);
258318

259319
uint32_t time_started = HAL_GetTick();
260320
while ((jpeg_get_decode_state() == 0) && (jpeg_get_decode_error() == 0)) {
261321
if (HAL_GetTick() - time_started > 500) Jpeg_HWDecodingError = 1;
262322
}
263-
lodepng_free(g_inputJpegBuffer);
323+
264324
if (Jpeg_HWDecodingError) {
265325
return -2;
266326
}

0 commit comments

Comments
 (0)