debugbox

  debugbox는 개인 취미로 시작한 프로젝트로써 JTAG, SWD, AVR-ISP등 임베디드 시스템 개발시 필요한 USB 기반의 디버그 어댑터들의 모음이다. CY7C68013A USB 클라이언트 칩셋을 기반으로하는 단일 하드웨어에 아래 기능들을 모아 구현 하였다. 인터넷 어디선가 구할 수 있는 자료들을 기반으로 하였으며 소스가 있으면 해당 소스를 참고하여 포팅하고, 그렇지 못하면 관련 문서와 각종 포럼의 자료를 기반으로 그 기능을 모사 (emulation)하여 구현 하였다. 누군지도 모르는 웹 어디선가 자신의 삽질들을 공유 해준 덕분에 만들어 질 수 있었다. 내 삽질 또한 어느 누군가의 도움이 되길 바라며, 그간 진행해온 결과물을 소스 코드와 함께 공유한다. 좀더 나은 새로운 무언가가 만들어져 다시 또 내가 다른 형태의 도움을 받을 수 있는 선순환을 기대한다. (서두가 좀 거창한가?...)
  본 프로젝트에서는 사용자용 어플리케이션 소프트웨어를 새로 만들지 않는다. OpenOCD, avrdude등 기존에 잘 만들어져 사용되는 응용프로그램을 가능한 그대로 사용한다.

  소스코드와 미리 빌드된 펌웨어 다운로드 링크는 이 글 맨 아래쪽을 참고하면 된다.
  일반적인 JTAG 에뮬레이터의 TDI는 출력이고, TDO는 입력인데 타겟보드의 TDI는 이름 그대로 입력, TDO는 출력이다. JTAG 연합에서 왜 이렇게 만들었는지 모르겠으나 혼돈 스럽다. debugbox 프로젝트에서는 일반적인 JTAG 에듈레이터와 다르게 TDI는 모두 입력, TDO는 모두 출력으로 통일 시켰다.
  debugbox is my private project that is integration of useful USB based debug adapters such as JTAG, SWD, AVR-ISP and etcs with CY7C68013A USB client chip. My contribution is porting/migration/emulation and integration of USB debug bridge's firmware for CY7C68013A. In case of open-source based USB adapters, firmware is ported/migrated to CY7C68013A, if not, debug bridge functionalities are emulated through googled formal/informal documents and forum texts from World-Wide-Web with my trial and error. I'm sharing my debugbox project source code for hope to help someone who need it. 
Refer to download link at the end of this article.
  In general, target TDI is input and TDO is output but in JTAG emulator hardware, this naming is reversed. I have no idea why the JTAG assosiation defined such a confused naming. In my debugbox project, JTAG-TDI is input and JTAG-TDO is output.

[] debugbox features
  - USB-Blaster 1 (USB to JTAG)
    * UI Application: OpenOCD-JTAG (http://openocd.org)
    * Firmware: usb_blaster.ihx
  - USB-Blaster 2 (USB to JTAG)
    * UI Application: OpenOCD-JTAG (http://openocd.org)
    * Firmware: usb_blaster2.ihx
  - Versaloon-Link (USB to SWD)
    * UI Application: OpenOCD-SWD (http://openocd.org)
    * Firmware: vslswd.ihx
  - STK500 (USB AVRISP)
    * UI Application: avrdude (http://www.nongnu.org/avrdude)
    * Firmware: stk500.ihx
  - CP2112 (USB to SMBus/IIC)
    * UI Application: BE2Works (http://be2works.com)
    * Firmware: cp2112.ihx
  - JTAGIDER (JTAG pin identifier)
    * Firmware: jtagider.ihx



[Fig. 1] CY7C68013A Kit

[] Hardware
  앞서 이야기 한 것과 같이 USB 연동용 하드웨어는 CY7C68013A를 사용한다. [Fig. 1]와 같이 시중에 판매되는 CY7C68013A용 킷을 사다 사용해도 되고 나 처럼 CY7C68013A칩셋을 기반으로 하는 제품을 개조하여 사용 해도 된다. [Fig. 2]이 개조에 사용한 제품이며, Nvidia의 3D 비전용 적외선 방출장치를 개조하여 사용 하였다. VID/PID 저장용 IIC EEPROM은 제거 한다. PB[5:0]과 SMBus/IIC 통신을 위해 SCL/SDA를 인출 한다. 추가로 GND, 3.3V, 5V를 외부로 빼내어 하드웨어를 구성하면 된다. 개발을 위한 디버그 메시지가 필요하다면 UART 선도 외부로 인출하여 사용 한다.
  As I mentioned above, CY7C68013A is mandatory but IIC EEPROM (for VID/PID) is not needed. You may choose cheap CY7C68013A kit on the market for this project [Fig. 1]. In my case, I modified the commercial product IR emitter of 3D Vision which is CY7C68013A based small form factor housing from Nvidia [Fig. 2]. [Fig. 3] to [Fig. 6] are showing my modification. P1 is for probe pins and P2 is for 5V power output.

[Fig. 2] Nvidia IR Emitter for 3D Vision

[Fig. 3] PCB Top Side

[Fig. 4] PCB Bottom Side

[Fig. 5] Modification

[Fig. 6] Modification

[Fig. 7] Pull out PB[5:0], IIC and UART

[] P1 header pinout
  -------------------------------
   SDA  SCL  GND  RX0  TX0  3.3V
   PB0  PB1  PB2  PB3  PB4  PB5
  -------------------------------

[] Probe pin usage
  -------------------------------------------------------
   [PORT]  [JTAG]  [SWD]  [AVRISP]  [CP2112]  [JTAGIDER]
    PB5     TMS    SWDIO   -         -         Probe5
    PB4     TCK    SWCLK   SCK       -         Probe4
    PB3     TDO    -       MOSI      -         Probe3
    PB2     TDI    -       MISO      -         Probe2
    PB1     TRS    -       -         -         Probe1
    PB0     SRS    SRS     SRS       -         -
    SCL     -      -       -         SCL       -
    SDA     -      -       -         SDA       -
  -------------------------------------------------------

[] USB to SWD (Versaloon-Link)
  fxload를 이용해 'vslswd.ihx' 펌웨어를 CY7C68013A에 다운로드 하여 사용하면된다. 실제 Versaloon-Link 하드웨어는 출력 endpoint 주소로 0x03을 사용하여 구현되어 있다. 그러나 CY7C68013A 디바이스로 0x03 EP-OUT 구성이 불가능하여 'vslswd.ihx'펌웨어는 출력 endpoint로 0x04 주소를 사용해 구현 하였다. 때문에 OpenOCD의 소스 수정후 빌드하여 사용 해야 한다.
  CY7C68013A에 적재 가능한 코드 크기가 16KB로 제한되어 있어 모든 기능은 구현되지 않았으며 SWD 통신을 수행하는데 필요한 최소한의 기능만 구현되어 있다.
  Use 'vslswd.ihx' firmware for this function with fxload utility. The real Versaloon-Link's output endpoint address is 0x03, but 0x03 address is not applicable in CY7C68013A. Since I implemented output endpoint address as 0x04 instead 0x03 in 'vslswd.ihx', you should rebuild OpenOCD with modified address.
  Only SWD functions are implemented because of 16KB code memory limitation of CY7C68013A.

Edit OpenOCD source from
  ---------------------------------------------------------
   openocd/src/jtag/drivers/versaloon/versaloon_internal.h
   #define VERSALOON_OUTP 0x03
  ---------------------------------------------------------
to
  ---------------------------------------------------------
   openocd/src/jtag/drivers/versaloon/versaloon_internal.h
   #define VERSALOON_OUTP 0x04
  ---------------------------------------------------------



[Fig. 8] STM32F031 (from Syma 8X Drone) SWD Debugging

[] USB to JTAG (USB-Blaster 1/2)
  'usb_blaster.ihx' 혹은 'usb_blaster2.ihx' 펌웨어를 사용하여 OpenOCD와 연동하면 된다.
  Use 'usb_blaster.ihx' or 'usb_blaster2.ihx' with OpenOCD.


[Fig. 9] S5P6443 (from Car Navigation) JTAG Debugging

[] AVR-ISP (STK500)
  'stk500.ihx' 펌웨어와 avrdude를 사용하면 된다.
  Use 'stk500.ihx' firmware and avrdude.

[] USB to SMBus/IIC (CP2112)
  Silicon Labs의 CP2112라고 하는 'USB to SMBus/IIC' 컨버터를 모사한 기능으로 BE2Works 랩톱 배터리 모니터링 응용프로그램과 연동을 위해 만들었다. 'cp2112.ihx' 펌웨어를 사용하면 된다.
  This function is emulation of CP2112 USB to SMBus/IIC adapter from the Silicon Labs. You can communicate laptop battery with 'cp2112.ihx' firmware and BE2Works. I tested with demo version of BE2Works but the licensed version supports laptop battery reset, so you can replace battery cell by resetting error status and cycle count.

[Fig. 10] BE2Works

[Fig. 10] Laptop Battery Monitoring

[] JTAG Pin Identifier
  이 기능은 임베디드 보드의 JTAG 핀 배열을 모를때 TMS, TCK, TDO, TDI, TRS 핀의 위치를 자동으로 찾아주는 기능이다. 'jtagider.ihx'를 사용하면 되고 PC에서는 VCP (Virtual COM Port)로 인식된다. 해당 포트를 Teraterm과 같은 터미널로 연결하여 명령어를 입력하는 방식이다. [Fig. 11]은 [Fig. 9]의 메인보드상 S5P6443의 JTAG 핀 배열을 찾아낸 결과를 보여주고 있다. 보통 JTAG-TAP들은 Daisy-Chain 방식으로 연결 되어 있어 연결 방식을 감안하여 숫자를 입력 한다. S5P6443의 경우 ETM과 ARM 2개의 JTAG-TAP이 연동 되어 있으며 각 IR의 길이는 4-bit와 5-bit이다. 명령 입력은 '[pre-dcnt] [pre-irlen] [inst-len] [post-dcnt] [post-irlen]' 순서로 숫자만 입력한다. '0 0 4 1 5' 명령으로 ETM-TAP의 ID인 '0x2B900F0F'가 확인 되었으며 이때 핀 배열은 'RIOCM (Probe1~5:TRS/TDI/TDO/TCK/TMS)'로 확인 된다. '1 4 5 0 0' 명령으로 ARM11-TAP의 ID인 '0x07B76F0F'가 확인이 되고 핀 배열은 동일한 'RIOCM (
Probe1~5:TRS/TDI/TDO/TCK/TMS)'로 확인 되었다.
  You can use this function to identify JTAG pin order for unknown target board. Download firmware 'jtagider.ihx' and you may found a new VCP (Virtual COM Port) on your PC after download it to CY7C68013. Connect to that COM port with terminal emulator such as Teraterm and you can see prompt 'JID'. [Fig. 11] is my example result of [Fig. 9] S5P6443 based car navigation board. That board has JTAG port but the pin order is unknown. In the S5P6443 reference manual, there are daisy-chained 2 JTAG-TAPs, ETM and ARM11. Command order is '[pre-dcnt] [pre-irlen] [inst-len] [post-dcnt] [post-irlen]'. I could identify JTAG pin order 'RIOCM (Probe1~5:TRS/TDI/TDO/TCK/TMS)' by command '0 0 4 1 5' with detected ETM-TAP ID '0x2B900F0F'. Command '1 4 5 0 0' shows same JTAG pin order 'RIOCM (Probe1~5:TRS/TDI/TDO/TCK/TMS)' with detected ARM11-TAP ID '0x07B76F0F'.


  ----------------------------------------------
                 ETM-TAP       ARM11-TAP
                +--------+    +--------+
   JTAG_TDO ----+TDI  TDO+----+TDI  TDO+---+
                +--------+    +--------+   |
                 IR-4bit       IR-5bit     |
                                           |
   JTAG_TDI -------------------------------+

            [S5P6443 JTAG-TAP Chain]
  ----------------------------------------------

  * pre-dcnt  : Total device count of front side daisy-chain
  * pre-irlen : Total IR bit-length of front side daisy-chain
  * inst-len  : IR length to check ID
  * post-dcnt : Total device count of end side daisy-chain
  * post-irlen: Total IR bit-length of end side daisy-chain

[Fig. 11] S5P6443 Car Navigation Board JTAG Pin Identification

  CY7C68013의 아주 유용한 기능중 하나가 로직어날라저로 사용이 가능한데 sigrok (https://sigrok.org)을 사용하면 무려 16채널 24MHz 로직 어날라이저로도 사용 가능하다.
  Another very useful function is logic analyzer, you can check the sigrok (https://sigrok.org) to use the CY7C68013 as 16-Ch. 24MHz logic analyzer.

[] Downloads
  - Pre-built firmware: Download
  - Source code
: Download
  - Compiler used: sdcc-3.9.0

  소스는 개인적인 목적이라면 자유롭게 사용/수정/재배포 가능하며, 상업적 이용은 금지합니다.
  You can freely use/modify/republish my source code for private purpose, but DO NOT USE for commercial product. 

댓글 2개:

  1. 꾸준함으로 무식을 깨우고자 하고 있지만... 늘 노력이 부족 했나 싶습니다.
    멋지세요~

    답글삭제