On 02/06/2010 09:20 AM, Mike Frysinger wrote:
> On Friday 05 February 2010 01:23:28 Jie Zhang wrote:
>> gdbproxy does not work with the latest UrJTAG.
>
> how about this patch ?  seems to work for me ...

I think the concept of "endianness" does not apply in JTAG. It is not 
defined in the standard.

I prefer to "SHIFT_ORDER_STANDARD" and "SHIFT_ORDER_REVERSED". Or 
"SHIFT_LSB_FIRST" and "SHIFT_MSB_FIRST".

Jie

> -mike
>
> --- include/urjtag/data_register.h
> +++ include/urjtag/data_register.h
> @@ -25,6 +25,7 @@
>   #ifndef URJ_DATA_REGISTER_H
>   #define URJ_DATA_REGISTER_H
>
> +#include "jtag.h"
>   #include "types.h"
>
>   #define URJ_DATA_REGISTER_MAXLEN        32
> @@ -38,13 +39,24 @@ struct URJ_DATA_REGISTER
>   };
>
>   urj_data_register_t *urj_part_data_register_alloc (const char *name, int 
> len);
> +urj_data_register_t *urj_part_data_register_alloc_endian (const char *name, 
> int len, urj_endian_t);
>   void urj_part_data_register_free (urj_data_register_t *dr);
>
>   /**
> - * allocate a data register and initialize the relevant<code>part</code>  
> parts
> + * Allocate a big endian data register and initialize the relevant
> + *<code>part</code>  parts.
>    *
>    * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
>    */
>   int urj_part_data_register_define (urj_part_t *part, const char *name, int 
> len);
>
> +/**
> + * Allocate a data register with a specific endian and initialize the 
> relevant
> + *<code>part</code>  parts.
> + *
> + * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
> + */
> +int urj_part_data_register_define_endian (urj_part_t *part, const char *name,
> +                                          int len, urj_endian_t endian);
> +
>   #endif /* URJ_DATA_REGISTER_H */
> --- include/urjtag/tap_register.h
> +++ include/urjtag/tap_register.h
> @@ -25,6 +25,7 @@
>   #ifndef URJ_TAP_REGISTER_H
>   #define URJ_TAP_REGISTER_H
>
> +#include "jtag.h"
>   #include "types.h"
>   #include<stdint.h>
>
> @@ -33,9 +34,11 @@ struct URJ_TAP_REGISTER
>       char *data;         /* (public, r/w) register data */
>       int len;            /* (public, r/o) register length */
>       char *string;       /* (private) string representation of register data 
> */
> +    urj_endian_t endian;/* (private) endianness of the register */
>   };
>
>   urj_tap_register_t *urj_tap_register_alloc (int len);
> +urj_tap_register_t *urj_tap_register_alloc_endian (int len, urj_endian_t);
>   urj_tap_register_t *urj_tap_register_duplicate (const urj_tap_register_t 
> *tr);
>   void urj_tap_register_free (urj_tap_register_t *tr);
>   urj_tap_register_t *urj_tap_register_fill (urj_tap_register_t *tr, int val);
> --- src/tap/register.c
> +++ src/tap/register.c
> @@ -28,6 +28,7 @@
>   #include<stdlib.h>
>   #include<string.h>
>
> +#include<urjtag/jtag.h>
>   #include<urjtag/error.h>
>   #include<urjtag/log.h>
>   #include<urjtag/tap_register.h>
> @@ -158,7 +159,7 @@ urj_tap_register_set_string (urj_tap_reg
>   int
>   urj_tap_register_set_value (urj_tap_register_t *tr, uint64_t val)
>   {
> -    unsigned int bit;
> +    int i;
>
>       if (val>>  tr->len)
>       {
> @@ -168,8 +169,12 @@ urj_tap_register_set_value (urj_tap_regi
>           return URJ_STATUS_FAIL;
>       }
>
> -    for (bit = 0; bit<  tr->len; ++bit)
> -        tr->data[tr->len - 1 - bit] = !!(val&  (1<<  (tr->len - 1 - bit)));
> +    if (tr->endian == URJ_ENDIAN_BIG)
> +        for (i = 0; i<  tr->len; ++i)
> +            tr->data[tr->len - 1 - i] = (val>>  (tr->len - 1 - i))&  1;
> +    else
> +        for (i = 0; i<  tr->len; ++i)
> +            tr->data[i] = (val>>  (tr->len - 1 - i))&  1;
>
>       return URJ_STATUS_OK;
>   }
> @@ -191,22 +196,21 @@ urj_tap_register_get_string (const urj_t
>   uint64_t
>   urj_tap_register_get_value (const urj_tap_register_t *tr)
>   {
> +    uint64_t v;
>       int i;
> -    uint64_t l, b;
>
>       if (!tr)
>           return 0;
>
> -    l = 0;
> -    b = 1;
> -    for (i = 0; i<  tr->len; ++i)
> -    {
> -        if (tr->data[i]&  1)
> -            l |= b;
> -        b<<= 1;
> -    }
> +    v = 0;
> +    if (tr->endian == URJ_ENDIAN_BIG)
> +        for (i = tr->len - 1; i>= 0; --i)
> +            v = (v<<  1) | tr->data[i];
> +    else
> +        for (i = 0; i<  tr->len; ++i)
> +            v = (v<<  1) | tr->data[i];
>
> -    return l;
> +    return v;
>   }
>
>   int
> --- src/cmd/cmd_register.c
> +++ src/cmd/cmd_register.c
> @@ -43,12 +43,13 @@ cmd_register_run (urj_chain_t *chain, ch
>   {
>       urj_part_t *part;
>       long unsigned len;
> +    urj_endian_t endian = URJ_ENDIAN_BIG;
>
> -    if (urj_cmd_params (params) != 3)
> +    if (urj_cmd_params (params)<  3 || urj_cmd_params (params)>  4)
>       {
>           urj_error_set (URJ_ERROR_SYNTAX,
> -                       "%s: #parameters should be %d, not %d",
> -                       params[0], 3, urj_cmd_params (params));
> +                       _("%s: #parameters should be %d to %d, not %d"),
> +                       params[0], 3, 4, urj_cmd_params (params));
>           return URJ_STATUS_FAIL;
>       }
>
> @@ -62,18 +63,29 @@ cmd_register_run (urj_chain_t *chain, ch
>       if (urj_cmd_get_number (params[2],&len) != URJ_STATUS_OK)
>           return URJ_STATUS_FAIL;
>
> -    return urj_part_data_register_define (part, params[1], len);
> +    if (urj_cmd_params (params) == 4)
> +    {
> +        endian = urj_endian_from_string (params[3]);
> +        if (endian == URJ_ENDIAN_UNKNOWN)
> +        {
> +            urj_error_set (URJ_ERROR_SYNTAX, _("%s: invalid endian"), 
> params[0]);
> +            return URJ_STATUS_FAIL;
> +        }
> +    }
> +
> +    return urj_part_data_register_define_endian (part, params[1], len, 
> endian);
>   }
>
>   static void
>   cmd_register_help (void)
>   {
>       urj_log (URJ_LOG_LEVEL_NORMAL,
> -             _("Usage: %s NAME LENGTH\n"
> +             _("Usage: %s NAME LENGTH [ENDIAN]\n"
>                  "Define new data register with specified NAME and LENGTH.\n"
>                  "\n"
>                  "NAME          Data register name\n"
> -               "LENGTH        Data register length\n"),
> +               "LENGTH        Data register length\n"
> +               "ENDIAN        Data register endianness (default: Big 
> Endian)\n"),
>                "register");
>   }
>
> --- src/part/data_register.c
> +++ src/part/data_register.c
> @@ -34,7 +34,8 @@
>   #include<urjtag/error.h>
>
>   urj_data_register_t *
> -urj_part_data_register_alloc (const char *name, int len)
> +urj_part_data_register_alloc_endian (const char *name, int len,
> +                                     urj_endian_t endian)
>   {
>       urj_data_register_t *dr;
>
> @@ -79,6 +80,12 @@ urj_part_data_register_alloc (const char
>       return dr;
>   }
>
> +urj_data_register_t *
> +urj_part_data_register_alloc (const char *name, int len)
> +{
> +    return urj_part_data_register_alloc_endian (name, len, URJ_ENDIAN_BIG);
> +}
> +
>   void
>   urj_part_data_register_free (urj_data_register_t *dr)
>   {
> @@ -91,7 +98,8 @@ urj_part_data_register_free (urj_data_re
>   }
>
>   int
> -urj_part_data_register_define (urj_part_t *part, const char *name, int len)
> +urj_part_data_register_define_endian (urj_part_t *part, const char *name,
> +                                      int len, urj_endian_t endian)
>   {
>       urj_data_register_t *dr;
>
> @@ -102,7 +110,7 @@ urj_part_data_register_define (urj_part_
>           return URJ_STATUS_FAIL;
>       }
>
> -    dr = urj_part_data_register_alloc (name, len);
> +    dr = urj_part_data_register_alloc_endian (name, len, endian);
>       if (!dr)
>           // retain error state
>           return URJ_STATUS_FAIL;
> @@ -133,3 +141,9 @@ urj_part_data_register_define (urj_part_
>
>       return URJ_STATUS_OK;
>   }
> +
> +int
> +urj_part_data_register_define (urj_part_t *part, const char *name, int len)
> +{
> +    return urj_part_data_register_define_endian (part, name, len, 
> URJ_ENDIAN_BIG);
> +}
> --- data/analog/bf533/bf533
> +++ data/analog/bf533/bf533
> @@ -161,13 +161,13 @@ signal VROUT0
>   register    BSR     197
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf506/bf506
> +++ data/analog/bf506/bf506
> @@ -82,13 +82,13 @@ signal VDDINT5
>   register    BSR     119
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf561/bf561
> +++ data/analog/bf561/bf561
> @@ -235,13 +235,13 @@ signal GND_EXT18
>   register    BSR     355
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf518/bf518
> +++ data/analog/bf518/bf518
> @@ -176,13 +176,13 @@ signal VDDMEM7
>   register    BSR     200
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf527/bf527
> +++ data/analog/bf527/bf527
> @@ -290,13 +290,13 @@ signal AGND1
>   register    BSR     233
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf537/bf537
> +++ data/analog/bf537/bf537
> @@ -183,13 +183,13 @@ signal VROUT0
>   register    BSR     261
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf538/bf538
> +++ data/analog/bf538/bf538
> @@ -316,13 +316,13 @@ signal VROUT1
>   register    BSR     325
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>
> --- data/analog/bf548/bf548
> +++ data/analog/bf548/bf548
> @@ -401,13 +401,13 @@ signal USB_XI
>   register    BSR     636
>   register    BR      1
>   register    DIR     32
> -register     DBGSTAT 16
> -register     DBGCTL  16
> -register     EMUIR   32
> -register     EMUIR64 64
> -register     EMUDAT  32
> -register     EMUDAT40        40
> -register     EMUPC   32
> +register     DBGSTAT 16      little
> +register     DBGCTL  16      little
> +register     EMUIR   32      little
> +register     EMUIR64 64      little
> +register     EMUDAT  32      little
> +register     EMUDAT40        40      little
> +register     EMUPC   32      little
>
>   instruction length 5
>


------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
UrJTAG-development mailing list
UrJTAG-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/urjtag-development

Reply via email to