- add support for different TAR autotincrement sizes as per ARM ADI spec.
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 4 Jun 2009 13:45:50 +0000 (13:45 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 4 Jun 2009 13:45:50 +0000 (13:45 +0000)
- set TAR size to 12 bits for Cortex-M3.
- Original patch submitted by Magnus Lundin [lundin@mlu.mine.nu].

git-svn-id: svn://svn.berlios.de/openocd/trunk@2051 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/arm_adi_v5.c
src/target/arm_adi_v5.h
src/target/cortex_m3.c

index 251f2581565647138c756a5cc48d0cd0ca7bf757..609518526acaf423366a43999ef2460c69b534ef 100644 (file)
  * 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 @@ int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre
 
        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 mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u3
        {
                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 mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32
        {
                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 @@ int mem_ap_read_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addres
 
        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 mem_ap_read_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32
        {
                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 mem_ap_read_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32
        {
                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;
index 06fe3287b0b135eb6176ade62bcc1e39fbedaefb..313598b12b67c5883657a570a2a40f3d70cc3676 100644 (file)
@@ -99,8 +99,17 @@ typedef struct swjdp_common_s
        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); */
index 40aadea2ed2bc0baa30baacca19ae015d3b90c77..d105fe3311461c4cec8f1138bf524fcf9b555538 100644 (file)
@@ -1579,6 +1579,7 @@ int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, jt
        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 */