Ignore:
Timestamp:
Feb 6, 2011, 10:48:27 PM (14 years ago)
Author:
demin
Message:

improve jtag i/o timing and call usb blaster functions directly from jbitag.c

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sandbox/JamPlayerUSB/jbistub.c

    r109 r110  
    163163/******************************************************************/
    164164
    165 void usb_blaster_buf_flush()
     165void usb_blaster_wait(int count, int tms)
    166166{
    167167    DWORD cnt;
    168     int len;
    169  
    170     if(usb_buf_pos > 0)
    171     {
    172         len = usb_buf_pos >> 3;
    173         usb_buf[0] = len | 0x80;
    174 
    175         usb_blaster_buf_write(usb_buf, len + 1, &cnt);
    176         usb_buf_pos = 0;
     168
     169    BYTE buf[64];
     170
     171    int i, len, extra;
     172
     173    printf("usb_blaster_wait (count tms)  -> (%d %d)\n", count, tms);
     174    fflush(stdout);
     175
     176    if (count <= 0) return;
     177   
     178    memset(buf, 0, 64);
     179
     180    extra = (count & 7);
     181
     182    buf[0] = 0x0C | (tms ? 0x02 : 0);
     183    usb_blaster_buf_write(buf, 1, &cnt);
     184
     185    while (count > 0)
     186    {
     187        if (count > 504)
     188        {
     189            len = 63;
     190            count -= 504;
     191        }
     192        else
     193        {
     194            len = count >> 3;
     195            count = 0;
     196        }
     197 
     198        if (len > 0)
     199        {
     200            buf[0] = len | 0x80;
     201            usb_blaster_buf_write(buf, len + 1, &cnt);           
     202        }
     203    }
     204    for (i = 0; i < extra; i++)
     205    {
     206        jbi_jtag_io(tms, 0, 0);
    177207    }
    178208}
     
    180210/******************************************************************/
    181211
    182 void usb_blaster_buf_fill(int tdi)
    183 {
    184     int index, shift;
    185 
    186     if (usb_buf_pos >= 504) usb_blaster_buf_flush();
    187 
    188     index = (usb_buf_pos >> 3) + 1;
    189     shift = (usb_buf_pos & 7);
    190 
    191     if (shift == 0) usb_buf[index] = 0;
    192 
    193     usb_buf[index] |= ((tdi&0x01) << shift);
    194 
    195     ++usb_buf_pos;
     212void usb_blaster_scan(int count, unsigned char *tdi, unsigned char *tdo)
     213{
     214    DWORD cnt;
     215
     216    BYTE buf[64];
     217   
     218    unsigned char extra_bits;
     219   
     220    int i, len, pos, extra, tdo_bit, read_tdo;
     221
     222    read_tdo = (tdo != NULL);
     223
     224    printf("usb_blaster_scan (count read)  -> (%d %d)\n", count, read_tdo);
     225    fflush(stdout);
     226
     227    if (count <= 0) return;
     228
     229    pos = 0;
     230    extra = (count & 7);
     231
     232    if (extra == 0)
     233    {
     234        count -= 8;
     235        extra = 8;
     236    }
     237   
     238    extra_bits = tdi[count >> 3];
     239       
     240    while (count > 0)
     241    {
     242        if (count > 504)
     243        {
     244            len = 63;
     245            count -= 504;
     246        }
     247        else
     248        {
     249            len = count >> 3;
     250            count = 0;
     251        }
     252 
     253        if (len > 0)
     254        {
     255            buf[0] = len | 0x80 | (read_tdo ? 0x40 : 0);
     256            memcpy(buf + 1, tdi + pos, len);
     257            usb_blaster_buf_write(buf, len + 1, &cnt);           
     258            if (read_tdo)
     259            {
     260                usb_blaster_buf_read(tdo + pos, len, &cnt);
     261            }
     262            pos += len;
     263        }
     264    }
     265    for (i = 0; i < extra; i++)
     266    {
     267        tdo_bit = jbi_jtag_io(
     268            (i == extra - 1),
     269            extra_bits & (1 << (i & 7)),
     270            read_tdo);
     271
     272        if (read_tdo)
     273        {
     274            if (tdo_bit)
     275            {
     276                tdo[pos] |= (1 << (i & 7));
     277            }
     278            else
     279            {
     280                tdo[pos] &= ~(unsigned int) (1 << (i & 7));
     281            }
     282        }
     283    }
    196284}
    197285
     
    205293*/
    206294
    207 int jbi_jtag_io(int tms, int tdi, int read_tdo, int flag)
    208 {
    209     BYTE buf[2];
     295int jbi_jtag_io(int tms, int tdi, int read_tdo)
     296{
     297    BYTE buf[3];
    210298    DWORD count;
    211299
     
    219307    }
    220308
    221     if (flag == 0 || read_tdo)
    222     {
    223 /*
    224         printf("(tms tdi read flag)  -> (%d %d %d %d)\n", tms, tdi, read_tdo, flag);
    225         fflush(stdout);
    226 */
    227         usb_blaster_buf_flush();
    228 
    229         data = (tdi ? 0x10 : 0) | (tms ? 0x02 : 0);
    230 
    231         buf[0] = data | 0x0C;
    232         buf[1] = data | 0x01 | 0x0C | (read_tdo ? 0x40 : 0);
    233         usb_blaster_buf_write(buf, 2, &count);
    234 
    235         if (read_tdo)
    236         {
    237             usb_blaster_buf_read(buf, 1, &count);
    238             tdo = buf[0]&0x01;
    239 /*
    240             printf("(tdo)  -> (%d)\n", tdo);
    241             fflush(stdout);
    242 */
    243         }
    244     }
    245     else
    246     {
    247         usb_blaster_buf_fill(tdi ? 1 : 0);
     309    data = (tdi ? 0x10 : 0) | (tms ? 0x02 : 0);
     310
     311    buf[0] = data | 0x0C | (read_tdo ? 0x40 : 0);
     312    buf[1] = data | 0x0C | 0x01;
     313    buf[2] = data | 0x0C;
     314    usb_blaster_buf_write(buf, 3, &count);
     315
     316    if (read_tdo)
     317    {
     318        usb_blaster_buf_read(buf, 1, &count);
     319        tdo = buf[0]&0x01;
    248320    }
    249321
Note: See TracChangeset for help on using the changeset viewer.