From: ntfreak at B. <nt...@ma...> - 2009-06-04 15:45:51
|
Author: ntfreak Date: 2009-06-04 15:45:50 +0200 (Thu, 04 Jun 2009) New Revision: 2051 Modified: trunk/src/target/arm_adi_v5.c trunk/src/target/arm_adi_v5.h trunk/src/target/cortex_m3.c Log: - add support for different TAR autotincrement sizes as per ARM ADI spec. - set TAR size to 12 bits for Cortex-M3. - Original patch submitted by Magnus Lundin [lu...@ml...]. Modified: trunk/src/target/arm_adi_v5.c =================================================================== --- trunk/src/target/arm_adi_v5.c 2009-06-04 13:18:07 UTC (rev 2050) +++ trunk/src/target/arm_adi_v5.c 2009-06-04 13:45:50 UTC (rev 2051) @@ -52,6 +52,18 @@ * are immediatley available. */ + +/* ARM ADI Specification requires at least 10 bits used for TAR autoincrement */ + +/* + u32 tar_block_size(u32 address) + Return the largest block starting at address that does not cross a tar block size alignment boundary +*/ +static u32 max_tar_block_size(u32 tar_autoincr_block, u32 address) +{ + return (tar_autoincr_block - ((tar_autoincr_block - 1) & address)) >> 2; +} + /*************************************************************************** * * * DPACC and APACC scanchain access through JTAG-DP * @@ -467,8 +479,8 @@ while (wcount > 0) { - /* Adjust to write blocks within 4K aligned boundaries */ - blocksize = (0x1000 - (0xFFF & address)) >> 2; + /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; @@ -517,8 +529,8 @@ { int nbytes; - /* Adjust to read within 4K block boundaries */ - blocksize = (0x1000 - (0xFFF & address)) >> 1; + /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; @@ -613,8 +625,8 @@ { int nbytes; - /* Adjust to read within 4K block boundaries */ - blocksize = (0x1000 - (0xFFF & address)); + /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; @@ -710,8 +722,8 @@ while (wcount > 0) { - /* Adjust to read within 4K block boundaries */ - blocksize = (0x1000 - (0xFFF & address)) >> 2; + /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; @@ -784,8 +796,8 @@ { int nbytes; - /* Adjust to read within 4K block boundaries */ - blocksize = (0x1000 - (0xFFF & address)) >> 1; + /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; @@ -879,8 +891,8 @@ { int nbytes; - /* Adjust to read within 4K block boundaries */ - blocksize = (0x1000 - (0xFFF & address)); + /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/ + blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address); if (wcount < blocksize) blocksize = wcount; Modified: trunk/src/target/arm_adi_v5.h =================================================================== --- trunk/src/target/arm_adi_v5.h 2009-06-04 13:18:07 UTC (rev 2050) +++ trunk/src/target/arm_adi_v5.h 2009-06-04 13:45:50 UTC (rev 2051) @@ -99,8 +99,17 @@ u8 ack; /* extra tck clocks for memory bus access */ u32 memaccess_tck; + /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */ + u32 tar_autoincr_block; + } swjdp_common_t; +/* Accessor function for currently selected DAP-AP number */ +static inline u8 dap_ap_get_select(swjdp_common_t *swjdp) +{ + return (u8)( swjdp ->apsel >> 24); +} + /* Internal functions used in the module, partial transactions, use with caution */ extern int dap_dp_write_reg(swjdp_common_t *swjdp, u32 value, u8 reg_addr); /* extern int swjdp_write_apacc(swjdp_common_t *swjdp, u32 value, u8 reg_addr); */ Modified: trunk/src/target/cortex_m3.c =================================================================== --- trunk/src/target/cortex_m3.c 2009-06-04 13:18:07 UTC (rev 2050) +++ trunk/src/target/cortex_m3.c 2009-06-04 13:45:50 UTC (rev 2051) @@ -1579,6 +1579,7 @@ armv7m->swjdp_info.ap_tar_value = -1; armv7m->swjdp_info.jtag_info = &cortex_m3->jtag_info; armv7m->swjdp_info.memaccess_tck = 8; + armv7m->swjdp_info.tar_autoincr_block = (1<<12); /* Cortex-M3 has 4096 bytes autoincrement range */ /* initialize arch-specific breakpoint handling */ |