diff --git a/src/copapy/_binwrite.py b/src/copapy/_binwrite.py index db1f15f..7ceca66 100644 --- a/src/copapy/_binwrite.py +++ b/src/copapy/_binwrite.py @@ -4,19 +4,20 @@ import struct ByteOrder = Literal['little', 'big'] -Command = Enum('Command', [('ALLOCATE_DATA', 1), ('COPY_DATA', 2), - ('ALLOCATE_CODE', 3), ('COPY_CODE', 4), - ('PATCH_FUNC', 0x1000), - ('PATCH_FUNC_ARM32_THM', 0x1005), - ('PATCH_OBJECT', 0x2000), - ('PATCH_OBJECT_HI21', 0x2001), - ('PATCH_OBJECT_ABS', 0x2002), - ('PATCH_OBJECT_REL', 0x2003), - ('PATCH_OBJECT_ARM32_ABS', 0x2004), - ('PATCH_OBJECT_ARM32_ABS_THM', 0x2006), - ('ENTRY_POINT', 7), - ('RUN_PROG', 64), ('READ_DATA', 65), - ('END_COM', 256), ('FREE_MEMORY', 257), ('DUMP_CODE', 258)]) +# header lengths in bytes, command id +Command = Enum('Command', [('ALLOCATE_DATA', 0x04_0001), ('COPY_DATA', 0x08_0002), + ('ALLOCATE_CODE', 0x04_0003), ('COPY_CODE', 0x08_0004), + ('PATCH_FUNC', 0x10_1000), + ('PATCH_FUNC_ARM32_THM', 0x10_1005), + ('PATCH_OBJECT', 0x10_2000), + ('PATCH_OBJECT_HI21', 0x10_2001), + ('PATCH_OBJECT_ABS', 0x10_2002), + ('PATCH_OBJECT_REL', 0x10_2003), + ('PATCH_OBJECT_ARM32_ABS', 0x10_2004), + ('PATCH_OBJECT_ARM32_ABS_THM', 0x10_2006), + ('ENTRY_POINT', 0x04_0007), + ('RUN_PROG', 0x00_0040), ('READ_DATA', 0x08_0041), + ('END_COM', 0x00_0100), ('FREE_MEMORY', 0x00_0101), ('DUMP_CODE', 0x00_0102)]) COMMAND_SIZE = 4 diff --git a/src/coparun/runmem.h b/src/coparun/runmem.h index 80c4252..897a306 100644 --- a/src/coparun/runmem.h +++ b/src/coparun/runmem.h @@ -22,28 +22,40 @@ #endif /* Command opcodes used by the parser */ -#define ALLOCATE_DATA 1 -#define COPY_DATA 2 -#define ALLOCATE_CODE 3 -#define COPY_CODE 4 -#define PATCH_FUNC 0x1000 -#define PATCH_FUNC_ARM32_THM 0x1005 -#define PATCH_OBJECT 0x2000 -#define PATCH_OBJECT_HI21 0x2001 -#define PATCH_OBJECT_ABS 0x2002 -#define PATCH_OBJECT_REL 0x2003 -#define PATCH_OBJECT_ARM32_ABS 0x2004 -#define PATCH_OBJECT_ARM32_ABS_THM 0x2006 -#define ENTRY_POINT 7 -#define RUN_PROG 64 -#define READ_DATA 65 -#define END_COM 256 -#define FREE_MEMORY 257 -#define DUMP_CODE 258 +#define ALLOCATE_DATA 0x040001 +#define COPY_DATA 0x080002 +#define ALLOCATE_CODE 0x040003 +#define COPY_CODE 0x080004 +#define PATCH_FUNC 0x101000 +#define PATCH_FUNC_ARM32_THM 0x101005 +#define PATCH_OBJECT 0x102000 +#define PATCH_OBJECT_HI21 0x102001 +#define PATCH_OBJECT_ABS 0x102002 +#define PATCH_OBJECT_REL 0x102003 +#define PATCH_OBJECT_ARM32_ABS 0x102004 +#define PATCH_OBJECT_ARM32_ABS_THM 0x102006 +#define ENTRY_POINT 0x040007 +#define RUN_PROG 0x000040 +#define READ_DATA 0x080041 +#define END_COM 0x000100 +#define FREE_MEMORY 0x000101 +#define DUMP_CODE 0x000102 /* Entry point type */ typedef int (*entry_point_t)(void); +/* rx_state */ +#define RX_STATE_IDLE 0 +#define RX_STATE_HEADER 1 +#define RX_STATE_DATA 2 + +/* state_flag */ +#define STATE_FLAG_NONE 0 +#define STATE_FLAG_END_COM 1 +#define STATE_FLAG_DUMP_CODE 2 +#define STATE_FLAG_UNKNOWN_COMMAND -1 +#define STATE_FLAG_MEM_DIST -4 //code and data memory to far apart + /* Struct for run-time memory state */ typedef struct runmem_s { uint8_t *data_memory; // Pointer to data memory @@ -52,13 +64,18 @@ typedef struct runmem_s { uint32_t executable_memory_len; // Length of executable memory int data_offs; // Offset of data memory relative to executable memory entry_point_t entr_point; // Entry point function pointer + int32_t rx_state; // State for receiving commands (idle, header, data) + int32_t state_flag; // Flag for result/error state + uint8_t *data_src; + uint8_t *data_dest; + uint32_t data_size; } runmem_t; /* Command parser: takes a pointer to the command stream and returns an error flag (0 on success according to current code) */ -int parse_commands(runmem_t *context, uint8_t *bytes); +int parse_commands(runmem_t *context, uint8_t *bytes, uint32_t lengths); /* Free program and data memory */ void free_memory(runmem_t *context); -#endif /* RUNMEM_H */ \ No newline at end of file +#endif /* RUNMEM_H */