![[logo]](/images/suz.gif) ianjtag
 ianjtagこのページは、ianjtag を調べて、L-Router でどうしたら使えるかを考えるページ。
初期化の手順。
とりあえず、pjtag_sa1100_init を見てみる。
        /* Reset the TAP and bring it to the "run test idle" mode */
        jtag_reset();
        jtag_test_logic_reset();
        jtag_run_test_idle();
        /* Read the ID code */
        jtag_do_ir_dr_path(JTAG_CMD_IDCODE, &iro, IRSZ,
                                           dri, dro, IDRSZ);
        idcode = jtag_fillword(dro, 0, 32, 1);
これは一体なにをしているのか。
jtag_reset():
       volatile int i;
       _outp(lpt_address, 0);        /* nTRST pin down */
       for (i = 0; i < 100000; i++); /* hold it down for a while */
       _outp(lpt_address, 1<<3);     /* nTRST pin up again */
どうも、nTRST ピンを " -> 0 -> 1" としているらしい。
     ____ 
     TRST  なんて書いてられないので、以降 nTRST と表記
    jtag_test_logic_reset();
        putp(1, 1);
        putp(1, 1);
        putp(1, 1);
        putp(1, 1);
        putp(1, 1);
    /* should be at test_logic_reset by now,
           but give it a few more to be sure */
        putp(1, 1);
        putp(1, 1);
        putp(1, 1);
        putp(1, 1);
これは一体.. putp を見てみる。
putp(int tdi, int tms)
       /* TCK is low. Apply TMS and TDI */
        _outp(lpt_address, (1 << 3) | (tms << 2) | (tdi << 1) | 0);
        /* Rise TCK */
        _outp(lpt_address, (1 << 3) | (tms << 2) | (tdi << 1) | 1);
        /* Drop TCK */
        _outp(lpt_address, (1 << 3) | (tms << 2) | (tdi << 1) | 0);
        /* Read and return TDO */
        return !((int)_inp(lpt_address + 1) >> 7);      /* get TDO data */
putp は、TDI/TMS の状態に対して、TCK を 0 -> 1 -> 0 を行い、TDO の値を取って来るものらしい。
void
jtag_run_test_idle (void)
        jtag_test_logic_reset();
    putp(1,0);
    /* should be at run_test_idle by now,
           but give it a few more to be sure */
        putp(1,0);
        putp(1,0);
        putp(1,0);
これは、 A_Brief_Introductio_to_the_JTAG_Boundary_Scan_Interface
を見るとわかるけども、モード(TAP: Test Access Port)を初期状態にする。 TMS=0 で 3 回 TCLK を出せば 必ず 初期状態(run_test_idle) になる。 コメントでは、4 回だして確実にしているという意味か。
ここまでをまとめると ...
                          _____________________________________
  nTRST   ________________|
                                _   _   _            _   _   _
  TCK     _____________________| |_| |_| | ...._____| |_| |_| | ....
  TDO   ------------------------<v>-<v>-<v> ...
          ___________________________________
  TMS                                        |_______________________
  TDI = 1
という感じか。
        jtag_do_ir_dr_path(JTAG_CMD_IDCODE, &iro, IRSZ,
                                           dri, dro, IDRSZ);
これはなにをやっているのだろうか。
コードを見ると、
   * IRSZ(=5) bit の IR(instruction register) を JTAG_CMD_IDCODE(= 6)
     に設定。old value を、iro に入れる。
   * IDRSZ(=32) bit の ID レジスタ? の内容を dri の設定。
つぎに、こんなことをしている。
        /* Initialize all sa1110 pins to well known states */
        jtag_do_ir_dr_path(JTAG_CMD_SAMPLE, &iro, IRSZ,
                           bsr_defaults, dro, BSRSZ);
pjtag_sa1110.c につぎの関数があるのでそれを見てみる。
* Bus read and write functions: * flw32 - Perform a flash-write-word cycle to the given bus address * flw32n - Perform n flash-write-word-cycles to the given bus addresses * flr32 - Perform a flash-read-word cycle from the given bus address * flr32n - Perform n flash-read-word cycles from the given bus addresses
flr32 をみるとなんかこんなコードになっている。
        for (i=0; i<len; i++) {
                dri[BSR_nCS0_OUT] = 1;
                dri[BSR_nCS1_OUT] = 1;
                dri[BSR_nCS2_OUT] = 1;
                dri[BSR_nCS3_OUT] = 1;
                /* set address 0 thru 25 */
                for (j = 0; j < 26; j++)
                        dri[bsr_addrbus[j]] =
                                (unsigned char)((addr_array[i] >> j) & 1UL);
                dri[mkcs(addr_array[i])] = 0;
                jtag_do_dr_path(dri, dro, BSRSZ);
どういうことかと言うと ...
つうことですな。ということは ... たぶん vr4122 固有の情報が必要。
... うーん。BSR の詳細がわからんと 無理なのか....
メモ
それはともかく、VR 関係の情報はまったく出てこない。自分で見付けるの も無理、公開されるのを期待するのも無理という結果になりそう。
JTAG まとめ
ちょっとまとめてみる。JTAG を制御するのは、TAP Contoller といわれている。 、レジスタは、4 つ あって
こいつらは、全部 TDI --> レジスタ --> TDO という 関係の シフトレジスタの ように見える。
コマンド    SA1100(5bit)   Intel386 EX(4bit)   RM7000(3bit) PPC405GP(7bit)
BYPASS          11111           1111              111          1111111
EXTEST          00000           0000              000          0000000
SAMPLE          00001           0001              110          1111010
CLAMP           00100            ---                           1111110
HIGHZ           00101           1000                           1111101
IDCODE          00110           0010                           1111011
INTEST           ???            1001                           
                                            PRIVATE001-005     CUSTOM
  EXTEST  デバイスがあるかないか?
  IDCODE  デバイスの ID取得
  SAMPLE  BSR の状態を設定する。
  HIGHZ   BSR の状態を ハイインピーダンスにする?
  BYPASS  シフトレジスタのチェーンをバイパスする? ( BYPASS レジスタを選択?)
ここで、簡単そうなデバイス --- CPLD をちょっと調査
ID Register (10bits)
    SAMPLE/PRELOAD          0001010101
    EXTEST                  0000000000
    BYPASS                  1111111111
    IDCODE                  0001011001
    USERCODE                0000000111
    ... ISP Instructions    ... Hidden
IDCODE
           ver  --- part number --- Manufactuer's
                                    identify  
EPM3032A   0001 0111 0000 0011 0010 00001101110    1
EPM3064A   0001 0111 0000 0110 0100 00001101110    1
EPM3128A   0001 0111 0001 0010 1000 00001101110    1
EPM3256A   0001 0111 0010 0101 0110 00001101110    1
BSR Length EPM3032A 96 EPM3064A 192 EPM3128A 288 EPM3256A 480
なんか なにがわからなくて、どうすれば どこまでわかるかというイメージが できてきた。--- だからといって L-Router を復活できるとは思えないが...
とりあえず、やるべきこと とその順番
まんぞくしたら -- 終り。