From a8e12a95fa65b1582871c3e2a7a8a8f584298843 Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 5 Jan 2009 09:32:23 +0000 Subject: John McCarthy pic32mx flash fixups and speedups git-svn-id: svn://svn.berlios.de/openocd/trunk@1301 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/target/mips32_pracc.c | 99 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 8 deletions(-) (limited to 'src/target/mips32_pracc.c') diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c index d641956d..2511b078 100644 --- a/src/target/mips32_pracc.c +++ b/src/target/mips32_pracc.c @@ -218,7 +218,10 @@ int mips32_pracc_read_mem(mips_ejtag_t *ejtag_info, u32 addr, int size, int coun case 2: return mips32_pracc_read_mem16(ejtag_info, addr, count, (u16*)buf); case 4: - return mips32_pracc_read_mem32(ejtag_info, addr, count, (u32*)buf); + if(count==1) + return mips32_pracc_read_u32(ejtag_info, addr, (u32*)buf); + else + return mips32_pracc_read_mem32(ejtag_info, addr, count, (u32*)buf); } return ERROR_OK; @@ -247,8 +250,8 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, u32 addr, int count, u32 * MIPS32_BEQ(0,10,9), /* beq 0, $10, end */ MIPS32_NOP, - MIPS32_LW(12,0,9), /* lw $12,0($9), Load $12 with the word @mem[$9] */ - MIPS32_SW(12,0,11), /* sw $12,0($11) */ + MIPS32_LW(8,0,9), /* lw $8,0($9), Load $8 with the word @mem[$9] */ + MIPS32_SW(8,0,11), /* sw $8,0($11) */ MIPS32_ADDI(10,10,NEG16(1)), /* $10-- */ MIPS32_ADDI(9,9,4), /* $1+=4 */ @@ -298,6 +301,47 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, u32 addr, int count, u32 * return retval; } +int mips32_pracc_read_u32(mips_ejtag_t *ejtag_info, u32 addr, u32 *buf) +{ + u32 code[] = { + /* start: */ + MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */ + MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)), /* $15 = MIPS32_PRACC_STACK */ + MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK)), + MIPS32_SW(8,0,15), /* sw $8,($15) */ + MIPS32_SW(9,0,15), /* sw $9,($15) */ + + MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)), /* $8 = MIPS32_PRACC_PARAM_IN */ + MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)), + MIPS32_LW(8,0,8), /* $8=mem[$8]; read addr */ + MIPS32_LUI(9,UPPER16(MIPS32_PRACC_PARAM_OUT)), /* $9=MIPS32_PRACC_PARAM_OUT */ + MIPS32_ORI(9,9,LOWER16(MIPS32_PRACC_PARAM_OUT)), + + MIPS32_LW(8,0,8), /* lw $8,0($8), Load $8 with the word @mem[$8] */ + MIPS32_SW(8,0,9), /* sw $8,0($9) */ + + MIPS32_LW(9,0,15), /* lw $9,($15) */ + MIPS32_LW(8,0,15), /* lw $8,($15) */ + MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */ + MIPS32_NOP, + MIPS32_B(NEG16(17)), /* b start */ + MIPS32_NOP, + }; + + int retval = ERROR_OK; + u32 param_in[1]; + + param_in[0] = addr; + + if ((retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, + sizeof(param_in)/sizeof(param_in[0]), param_in, sizeof(u32), buf, 1)) != ERROR_OK) + { + return retval; + } + + return retval; +} + int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, u32 addr, int count, u16 *buf) { u32 code[] = { @@ -321,8 +365,8 @@ int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, u32 addr, int count, u16 * MIPS32_BEQ(0,10,9), /* beq 0, $10, end */ MIPS32_NOP, - MIPS32_LHU(12,0,9), /* lw $12,0($9), Load $12 with the halfword @mem[$9] */ - MIPS32_SW(12,0,11), /* sw $12,0($11) */ + MIPS32_LHU(8,0,9), /* lw $8,0($9), Load $8 with the halfword @mem[$9] */ + MIPS32_SW(8,0,11), /* sw $8,0($11) */ MIPS32_ADDI(10,10,NEG16(1)), /* $10-- */ MIPS32_ADDI(9,9,2), /* $9+=2 */ @@ -400,8 +444,8 @@ int mips32_pracc_read_mem8(mips_ejtag_t *ejtag_info, u32 addr, int count, u8 *bu MIPS32_BEQ(0,10,9), /* beq 0, $10, end */ MIPS32_NOP, - MIPS32_LBU(12,0,9), /* lw $12,0($9), Load t4 with the byte @mem[t1] */ - MIPS32_SW(12,0,11), /* sw $12,0($11) */ + MIPS32_LBU(8,0,9), /* lw $8,0($9), Load t4 with the byte @mem[t1] */ + MIPS32_SW(8,0,11), /* sw $8,0($11) */ MIPS32_ADDI(10,10,NEG16(1)), /* $10-- */ MIPS32_ADDI(9,9,1), /* $9+=1 */ @@ -465,7 +509,10 @@ int mips32_pracc_write_mem(mips_ejtag_t *ejtag_info, u32 addr, int size, int cou case 2: return mips32_pracc_write_mem16(ejtag_info, addr, count,(u16*)buf); case 4: - return mips32_pracc_write_mem32(ejtag_info, addr, count, (u32*)buf); + if(count==1) + return mips32_pracc_write_u32(ejtag_info, addr, (u32*)buf); + else + return mips32_pracc_write_mem32(ejtag_info, addr, count, (u32*)buf); } return ERROR_OK; @@ -526,6 +573,42 @@ int mips32_pracc_write_mem32(mips_ejtag_t *ejtag_info, u32 addr, int count, u32 return ERROR_OK; } +int mips32_pracc_write_u32(mips_ejtag_t *ejtag_info, u32 addr, u32 *buf) +{ + u32 code[] = { + /* start: */ + MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */ + MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)), /* $15 = MIPS32_PRACC_STACK */ + MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK)), + MIPS32_SW(8,0,15), /* sw $8,($15) */ + MIPS32_SW(9,0,15), /* sw $9,($15) */ + + MIPS32_LUI(8,UPPER16((MIPS32_PRACC_PARAM_IN+4))), /* $8 = MIPS32_PRACC_PARAM_IN+4 */ + MIPS32_ORI(8,8,LOWER16((MIPS32_PRACC_PARAM_IN+4))), + MIPS32_LW(9,NEG16(4),8), /* Load write addr to $9 */ + + MIPS32_LW(8,0,8), /* lw $8,0($8), Load $8 with the word @mem[$8] */ + MIPS32_SW(8,0,9), /* sw $8,0($9) */ + + MIPS32_LW(9,0,15), /* lw $9,($15) */ + MIPS32_LW(8,0,15), /* lw $8,($15) */ + MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */ + MIPS32_NOP, + MIPS32_B(NEG16(15)), /* b start */ + MIPS32_NOP, + }; + + /* TODO remove array */ + u32 param_in[1+1]; + param_in[0] = addr; + param_in[1] = *buf; + + mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \ + sizeof(param_in)/sizeof(param_in[0]),param_in, 0, NULL, 1); + + return ERROR_OK; +} + int mips32_pracc_write_mem16(mips_ejtag_t *ejtag_info, u32 addr, int count, u16 *buf) { u32 code[] = { -- cgit v1.2.3