USB adapter for RCD-Programmer

  이번 글은 기존에 자작하여 사용하고 있는 RCD-Programmer에 CY7C68013A USB 어댑터를 부착하여 기본 동작을 확인한 결과에 대한 내용이다. 일반적인 USB PIC 프로그래머들은 VPP 생성을 위해 부스트 컨버터를 내장 하고 있으나 RCD-Programmer는 RS-232 출력단의 전압을 Charge-pump로 승압시켜 사용 하는 구조이다. RCD-Programmer를 재사용 하므로 별도 부스트 컨버터는 필요치 않다. 다만 RS-232 신호 레벨 생성을 위한 트랜시버가 필요 하다. 프로그래밍용 어플리케이션과 USB 프로토콜은 usbpicprog라고 하는 프로젝트를 응용하였다.
  In this article, I introduce my initial test result about USB adapter for RCD-Programmer. General USB based PIC programmer has a DC/DC boost converter to make VPP voltage but the RS-232 based RCD-Programmer uses RS-232 signals to charge-pump VPP voltage and programming ICSP protocol by bit-banging. This test was started with hope to re-use my RCD-Programmer in USB. I adapted usbpicprog project for PIC programming PC application and USB protocol.

==========================================================================

 +------------+       +-----------+       +--------+        +---------+
 | usbpicprog +-------+ CY7C68013 +-------+ ADM213 +--------+ RCD-Pgm |
 +------------+  USB  +-----------+  TTL  +--------+ RS-232 +---------+
       |                    |                  |                 |
       PC              USB-adapter       Transceiver       PIC-Programmer
==========================================================================

[Fig. 1] My RCD-Programmer

[Fig. 2] BF810 USB to Serial

[Fig. 3] PCB Top Side

[Fig. 4] PCB Bottom Side

[Fig. 5] Modification

[Fig. 6] ADM213 Pinout for BF810 and CY7C68013


  RS-232 트랜시버 사용을 위해 BF810이라고 하는 USB to Serial 컨버터를 개조하여 사용 했다. [Fig. 2] 처럼 생긴놈을 분해하면 PL2303 USB 칩과 ADM213 RS-232 트랜시버 칩이 있는데 필요 없는 PL2303은 떼어 낸다. RCD-Programmer는 RS-232 신호중 TXD, DTR, RTS, CTS 신호선을 사용하므로 해당 신호선들을 찾아 CY7C68013의 PB[5:2] 포트와 연결한다. 펌웨어 개발은 일전에 공개한 debugbox 프로젝트에 포함 시켜 만들었다. AVRISP와 다르게 PIC 프로그래밍 프로토콜은 칩 모델마다 조금씩 다르게 구성 되어 있어 일반화된 프로그래밍 알고리즘 구현이 힘들다. 우선 'PIC12F629/675/PIC16F630/676 Memory Programming (DS41191D)' 메뉴얼의 프로그래밍 알고리즘을 구현하여 PIC16F676 디바이스로 테스트 해보았으며 [Fig. 8]와 같이 읽고 쓰기가 가능하였다.
  I used ADM213 RS-232 transceiver from BF810 USB to Serial converter. If you disassemble the BF810, you can see PL2303 and ADM213 chip on board. Remove PL2303 and connect to PB[5:2] port of CY7C68013A. In contrast to AVRISP, PIC programming algorithms are different from device to device. My initial implementation is for 'PIC12F629/675/PIC16F630/676 Memory Programming Manual (DS41191D)' and I could successfully read and write PIC16F676 device. Initial test code was developed with my debugbox project.

[Fig. 7] Integration

[Fig. 8] PIC16F676 R/W Test Result

[] Downloads
  - Pre-built firmware: Download
  - Source code: Download
  - just copy to debugbox project source directory and use it

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.