Bien, como encuentro interesante, por su facilidad de adaptación el
ejtag_p.cpp, , vamos a ir sacando detalles del mismo:
De la linea 28 a la 32 obtengo:
Señal -> nº de pin Db25; TMS-2,TCK-3,TDI-4,TRST-5,TDO-13,
De 35 a 39:
Podemos invertir, compilandolo posteriormente la polaridad de las señales.
De 46 a 49:
Algunas instrucciones del TAP, en este caso del STi5510.
En la 293 "EnterIRInst(5, 0xA);" utiliza intrucciones de 5 bits y pone 0xA, numérico
cuando ya lo había definido en la linea 48
En la 826 "EnterIRInst(5, 0x1)" es donde le mete la instrucción 0x1=IDCODE y en la siguiente linea lee el codigo del chip.
En la 847 "EnterIRInst(5, 0x3)"instrucción 0x3=IMPCODE y luego lee los 32 bits de implementación del chip.
En la 441 función para leer 16 bits de dirección adr, 450 selecionamos dirección (ADD_IR), 451 la colocamos, 454 - 455coloca en el CTRL_IR la palabra para lectura del DMA con lo que comienza la lectura de la posición de memoria seleccionada y si no ha habido error lo devuelve en la variale data.
Hay que tener claro que lo dicho anteriormente funciona con el STI5510.
Esto del ejtag_p.cpp para el STI5510
/* DMA State Machine Definitions */
#define ADDR_IR 0x8
#define DATA_IR 0x9
#define CTRL_IR 0xA
#define ALL_IR 0xB
/* DMA Control Reg Definintions */
#define DINC 1<<4
#define DLOCK 1<<5
#define DSZ0 1<<7
#define DSZ1 1<<8
#define DRWN 1<<9
#define DERR 1<<10
#define DSTRT 1<<11
#define EJTAGBRK 1<<12
#define DABORT 1<<13
#define SETDEV 1<<14
#define PROBEN 1<<15
#define PRRST 1<<16
#define DMAACC 1<<17
#define PERRST 1<<20
#define DNM 1<<28
Esto es de un Broadcom BCM4702
// --- Some EJTAG Instruction Registers ---
#define INSTR_EXTEST 0x00
#define INSTR_IDCODE 0x01
#define INSTR_SAMPLE 0x02
#define INSTR_IMPCODE 0x03
#define INSTR_ADDRESS 0x08
#define INSTR_DATA 0x09
#define INSTR_CONTROL 0x0A
#define INSTR_BYPASS 0xFF
// --- Some EJTAG Bit Masks ---
#define TOF (1 << 1 )
#define BRKST (1 << 3 )
#define DRWN (1 << 9 )
#define DERR (1 << 10)
#define DSTRT (1 << 11)
#define SETDEV (1 << 14)
#define PROBEN (1 << 15)
#define DMAACC (1 << 17)
#define PRACC (1 << 18)
#define PRNW (1 << 19)
#define DLOCK (1 << 5 )
#define TIF (1 << 2 )
#define SYNC (1 << 23)
#define PRRST (1 << 16)
#define PERRST (1 << 20)
#define JTAGBRK (1 << 12)
#define DNM (1 << 28)
#define ROCC (1 << 31)
Esto es de un atheros ar2312
instruction length 5
instruction BYPASS 11111 BR
instruction SAMPLE/PRELOAD 00010 BSR
instruction IDCODE 00001 DIR
instruction EJTAG_IMPCODE 00011 EJIMPCODE
instruction EJTAG_ADDRESS 01000 EJADDRESS
instruction EJTAG_DATA 01001 EJDATA
instruction EJTAG_CONTROL 01010 EJCONTROL
instruction EJTAG_ALL 01011 EJALL
instruction EJTAGBOOT 01100 BR
instruction NORMALBOOT 01101 BR
instruction EJTAG_FASTDATA 01110 EJFASTDATA
Esto es de un dec sa1100
instruction length 5
# mandatory instructions
instruction EXTEST 00000 BSR
instruction SAMPLE/PRELOAD 00001 BSR
instruction BYPASS 11111 BR
# optional instructions
instruction CLAMP 00100 BR
instruction HIGHZ 00101 BR
instruction IDCODE 00110 DIR
Vemos que son bastante similares.
Respecto de la busqueda del IDCODE por parte de manolo_321 puede que tenga otro codigo o no lo tenga.
Mala noticia:
De
http://www.linux-mips.org/wiki/JTAG
Decode IMPCODE
31:29 EJTAGver 010 Version 2.6
28 R4k/R3k 0 R4k
24 DINTsup 1 supported
22:21 ASIDsize 10 8-bit ASID
16 MIPS16e 0 not supported
14 NoDMA 1 No EJTAG DMA support
0 MIPS32/64 0 MIPS32
Que seria la explicación de los bits de implemetation y según manolo_321 es: Implentation=00C05288
los bits 15 - 12 valen 5 hex = 0101 bin de donde el bit 14 vale 1 (NoDMA 1 No EJTAG DMA support)
lo que lleva a la conclusión de que el ejtag_p.cpp no nos sirve, pues utiliza DMA.
Suponiendo que sea igual al del ADM5120 que es al que se refiere en esta página.
Aunque he probado a leer con el ejtag_p en un deco con el STI5518 y en implementation me da DB6C36DB
los bits 15 - 12 valen 3 hex = 0011 bin de donde el bit 14 vale 0 (NoDMA 1 No EJTAG DMA support)
con lo cual este si lo soporta.
Saludos.