341 lines
9.6 KiB
Diff
341 lines
9.6 KiB
Diff
From 77f5697167358c634bee38a98ad059f1b6b33dbf Mon Sep 17 00:00:00 2001
|
|
From: Romuald JEANNE <romuald.jeanne@st.com>
|
|
Date: Tue, 25 May 2021 20:18:25 +0200
|
|
Subject: [PATCH 6/7] ARM v2020.10-stm32mp-r1.1
|
|
|
|
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
|
|
---
|
|
Makefile | 2 +-
|
|
.../mach-stm32mp/cmd_stm32prog/stm32prog.c | 14 +-
|
|
.../mach-stm32mp/cmd_stm32prog/stm32prog.h | 5 -
|
|
.../cmd_stm32prog/stm32prog_serial.c | 163 +++---------------
|
|
4 files changed, 33 insertions(+), 151 deletions(-)
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
index 6bd0841c4b..59493deed3 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -3,7 +3,7 @@
|
|
VERSION = 2020
|
|
PATCHLEVEL = 10
|
|
SUBLEVEL =
|
|
-EXTRAVERSION = -stm32mp-r1
|
|
+EXTRAVERSION = -stm32mp-r1.1
|
|
NAME =
|
|
|
|
# *DOCUMENTATION*
|
|
diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
|
|
index 627bb52a11..7cd31462ba 100644
|
|
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
|
|
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
|
|
@@ -368,23 +368,24 @@ static int parse_flash_layout(struct stm32prog_data *data,
|
|
bool end_of_line, eof;
|
|
char *p, *start, *last, *col;
|
|
struct stm32prog_part_t *part;
|
|
+ struct image_header_s header;
|
|
int part_list_size;
|
|
int i;
|
|
|
|
data->part_nb = 0;
|
|
|
|
/* check if STM32image is detected */
|
|
- stm32prog_header_check((struct raw_header_s *)addr, &data->header);
|
|
- if (data->header.type == HEADER_STM32IMAGE) {
|
|
+ stm32prog_header_check((struct raw_header_s *)addr, &header);
|
|
+ if (header.type == HEADER_STM32IMAGE) {
|
|
u32 checksum;
|
|
|
|
addr = addr + BL_HEADER_SIZE;
|
|
- size = data->header.image_length;
|
|
+ size = header.image_length;
|
|
|
|
- checksum = stm32prog_header_checksum(addr, &data->header);
|
|
- if (checksum != data->header.image_checksum) {
|
|
+ checksum = stm32prog_header_checksum(addr, &header);
|
|
+ if (checksum != header.image_checksum) {
|
|
stm32prog_err("Layout: invalid checksum : 0x%x expected 0x%x",
|
|
- checksum, data->header.image_checksum);
|
|
+ checksum, header.image_checksum);
|
|
return -EIO;
|
|
}
|
|
}
|
|
@@ -1730,7 +1731,6 @@ void stm32prog_clean(struct stm32prog_data *data)
|
|
free(data->part_array);
|
|
free(data->otp_part);
|
|
free(data->buffer);
|
|
- free(data->header_data);
|
|
}
|
|
|
|
/* DFU callback: used after serial and direct DFU USB access */
|
|
diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
|
|
index fadcd1fa8f..eebc4d2e71 100644
|
|
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
|
|
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
|
|
@@ -134,14 +134,9 @@ struct stm32prog_data {
|
|
u32 *otp_part;
|
|
u8 pmic_part[PMIC_SIZE];
|
|
|
|
- /* STM32 header information */
|
|
- struct raw_header_s *header_data;
|
|
- struct image_header_s header;
|
|
-
|
|
/* SERIAL information */
|
|
u32 cursor;
|
|
u32 packet_number;
|
|
- u32 checksum;
|
|
u8 *buffer; /* size = USART_RAM_BUFFER_SIZE*/
|
|
int dfu_seq;
|
|
u8 read_phase;
|
|
diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
|
|
index 0c3c215b3d..a0bf7e1884 100644
|
|
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
|
|
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
|
|
@@ -59,6 +59,9 @@ const u8 cmd_id[] = {
|
|
|
|
#define NB_CMD sizeof(cmd_id)
|
|
|
|
+/* with 115200 bauds, 20 ms allow to receive the 256 bytes buffer */
|
|
+#define TIMEOUT_SERIAL_BUFFER 30
|
|
+
|
|
/* DFU support for serial *********************************************/
|
|
static struct dfu_entity *stm32prog_get_entity(struct stm32prog_data *data)
|
|
{
|
|
@@ -263,6 +266,7 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
|
|
{
|
|
struct dm_serial_ops *ops = serial_get_ops(down_serial_dev);
|
|
int err;
|
|
+ ulong start = get_timer(0);
|
|
|
|
do {
|
|
err = ops->getc(down_serial_dev);
|
|
@@ -272,6 +276,10 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
|
|
} else if (err == -EAGAIN) {
|
|
ctrlc();
|
|
WATCHDOG_RESET();
|
|
+ if (get_timer(start) > TIMEOUT_SERIAL_BUFFER) {
|
|
+ err = -ETIMEDOUT;
|
|
+ break;
|
|
+ }
|
|
} else {
|
|
break;
|
|
}
|
|
@@ -291,56 +299,6 @@ static void stm32prog_serial_putc(u8 w_byte)
|
|
}
|
|
|
|
/* Helper function ************************************************/
|
|
-
|
|
-static u8 stm32prog_header(struct stm32prog_data *data)
|
|
-{
|
|
- u8 ret;
|
|
- u8 boot = 0;
|
|
- struct dfu_entity *dfu_entity;
|
|
- u64 size = 0;
|
|
-
|
|
- dfu_entity = stm32prog_get_entity(data);
|
|
- if (!dfu_entity)
|
|
- return -ENODEV;
|
|
-
|
|
- printf("\nSTM32 download write %s\n", dfu_entity->name);
|
|
-
|
|
- /* force cleanup to avoid issue with previous read */
|
|
- dfu_transaction_cleanup(dfu_entity);
|
|
-
|
|
- stm32prog_header_check(data->header_data, &data->header);
|
|
-
|
|
- /* no stm32 image header : max size is partition size */
|
|
- if (data->header.type != HEADER_STM32IMAGE) {
|
|
- dfu_entity->get_medium_size(dfu_entity, &size);
|
|
- data->header.image_length = size;
|
|
- }
|
|
-
|
|
- /**** Flash the header if necessary for boot partition */
|
|
- if (data->phase < PHASE_FIRST_USER)
|
|
- boot = 1;
|
|
-
|
|
- /* write header if boot partition */
|
|
- if (boot) {
|
|
- if (ret) {
|
|
- stm32prog_err("invalid header (error %d)", ret);
|
|
- } else {
|
|
- ret = stm32prog_write(data,
|
|
- (u8 *)data->header_data,
|
|
- BL_HEADER_SIZE);
|
|
- }
|
|
- } else {
|
|
- if (ret)
|
|
- printf(" partition without checksum\n");
|
|
- ret = 0;
|
|
- }
|
|
-
|
|
- free(data->header_data);
|
|
- data->header_data = NULL;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
|
|
{
|
|
u8 ret = 0;
|
|
@@ -387,23 +345,6 @@ static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
|
|
data->dfu_seq = 0;
|
|
|
|
printf("\n received length = 0x%x\n", data->cursor);
|
|
- if (data->header.type == HEADER_STM32IMAGE) {
|
|
- if (data->cursor !=
|
|
- (data->header.image_length + BL_HEADER_SIZE)) {
|
|
- stm32prog_err("transmission interrupted (length=0x%x expected=0x%x)",
|
|
- data->cursor,
|
|
- data->header.image_length +
|
|
- BL_HEADER_SIZE);
|
|
- return -EIO;
|
|
- }
|
|
- if (data->header.image_checksum != data->checksum) {
|
|
- stm32prog_err("invalid checksum received (0x%x expected 0x%x)",
|
|
- data->checksum,
|
|
- data->header.image_checksum);
|
|
- return -EIO;
|
|
- }
|
|
- printf("\n checksum OK (0x%x)\n", data->checksum);
|
|
- }
|
|
|
|
/* update DFU with received flashlayout */
|
|
if (data->phase == PHASE_FLASHLAYOUT)
|
|
@@ -626,14 +567,12 @@ static void download_command(struct stm32prog_data *data)
|
|
u32 counter = 0x0, codesize = 0x0;
|
|
u8 *ramaddress = 0;
|
|
u8 rcv_data = 0x0;
|
|
- struct image_header_s *image_header = &data->header;
|
|
u32 cursor = data->cursor;
|
|
long size = 0;
|
|
u8 operation;
|
|
u32 packet_number;
|
|
u32 result = ACK_BYTE;
|
|
u8 ret;
|
|
- unsigned int i;
|
|
bool error;
|
|
int rcv;
|
|
|
|
@@ -667,13 +606,8 @@ static void download_command(struct stm32prog_data *data)
|
|
if (packet_number == 0) {
|
|
/* erase: re-initialize the image_header struct */
|
|
data->packet_number = 0;
|
|
- if (data->header_data)
|
|
- memset(data->header_data, 0, BL_HEADER_SIZE);
|
|
- else
|
|
- data->header_data = calloc(1, BL_HEADER_SIZE);
|
|
cursor = 0;
|
|
data->cursor = 0;
|
|
- data->checksum = 0;
|
|
/*idx = cursor;*/
|
|
} else {
|
|
data->packet_number++;
|
|
@@ -721,7 +655,7 @@ static void download_command(struct stm32prog_data *data)
|
|
printf("transmission error on packet %d, byte %d\n",
|
|
packet_number, codesize - counter);
|
|
/* waiting end of packet before flush & NACK */
|
|
- mdelay(30);
|
|
+ mdelay(TIMEOUT_SERIAL_BUFFER);
|
|
data->packet_number--;
|
|
result = NACK_BYTE;
|
|
goto end;
|
|
@@ -739,80 +673,33 @@ static void download_command(struct stm32prog_data *data)
|
|
/* wait to be sure that all data are received
|
|
* in the FIFO before flush
|
|
*/
|
|
- mdelay(30);
|
|
+ mdelay(TIMEOUT_SERIAL_BUFFER);
|
|
data->packet_number--;
|
|
result = NACK_BYTE;
|
|
goto end;
|
|
}
|
|
|
|
- /* Update current position in buffer */
|
|
- data->cursor += codesize;
|
|
-
|
|
- if (operation == PHASE_OTP) {
|
|
- size = data->cursor - cursor;
|
|
- /* no header for OTP */
|
|
- if (stm32prog_otp_write(data, cursor,
|
|
- data->buffer, &size))
|
|
- result = ABORT_BYTE;
|
|
- goto end;
|
|
- }
|
|
+ switch (operation) {
|
|
+ case PHASE_OTP:
|
|
+ size = codesize;
|
|
+ ret = stm32prog_otp_write(data, cursor, data->buffer, &size);
|
|
+ break;
|
|
|
|
- if (operation == PHASE_PMIC) {
|
|
- size = data->cursor - cursor;
|
|
- /* no header for PMIC */
|
|
- if (stm32prog_pmic_write(data, cursor,
|
|
- data->buffer, &size))
|
|
- result = ABORT_BYTE;
|
|
- goto end;
|
|
- }
|
|
+ case PHASE_PMIC:
|
|
+ size = codesize;
|
|
+ ret = stm32prog_pmic_write(data, cursor, data->buffer, &size);
|
|
+ break;
|
|
|
|
- if (cursor < BL_HEADER_SIZE) {
|
|
- /* size = portion of header in this chunck */
|
|
- if (data->cursor >= BL_HEADER_SIZE)
|
|
- size = BL_HEADER_SIZE - cursor;
|
|
- else
|
|
- size = data->cursor - cursor;
|
|
- memcpy((void *)((u32)(data->header_data) + cursor),
|
|
- data->buffer, size);
|
|
- cursor += size;
|
|
-
|
|
- if (cursor == BL_HEADER_SIZE) {
|
|
- /* Check and Write the header */
|
|
- if (stm32prog_header(data)) {
|
|
- result = ABORT_BYTE;
|
|
- goto end;
|
|
- }
|
|
- } else {
|
|
- goto end;
|
|
- }
|
|
+ default:
|
|
+ ret = stm32prog_write(data, data->buffer, codesize);
|
|
+ break;
|
|
}
|
|
|
|
- if (data->header.type == HEADER_STM32IMAGE) {
|
|
- if (data->cursor <= BL_HEADER_SIZE)
|
|
- goto end;
|
|
- /* compute checksum on payload */
|
|
- for (i = (unsigned long)size; i < codesize; i++)
|
|
- data->checksum += data->buffer[i];
|
|
-
|
|
- if (data->cursor >
|
|
- image_header->image_length + BL_HEADER_SIZE) {
|
|
- pr_err("expected size exceeded\n");
|
|
- result = ABORT_BYTE;
|
|
- goto end;
|
|
- }
|
|
-
|
|
- /* write data (payload) */
|
|
- ret = stm32prog_write(data,
|
|
- &data->buffer[size],
|
|
- codesize - size);
|
|
- } else {
|
|
- /* write all */
|
|
- ret = stm32prog_write(data,
|
|
- data->buffer,
|
|
- codesize);
|
|
- }
|
|
if (ret)
|
|
result = ABORT_BYTE;
|
|
+ else
|
|
+ /* Update current position in buffer */
|
|
+ data->cursor += codesize;
|
|
|
|
end:
|
|
stm32prog_serial_result(result);
|
|
--
|
|
2.17.1
|
|
|