Building OpenOCD for Windows with MSYS2-MINGW64

<rawat.s>
4 min readMar 5, 2020

--

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

บทความนี้เป็นบันทึกช่วยจำหลังจากที่ได้ติดตั้ง OpenOCD เพื่อนำมาใช้สำหรับระบบปฏิบัติการ Windows 10 (64-bit) โดยใช้ MSYS2 ร่วมกับ MINGW64 และทำขั้นตอน Build จากซอร์สโค้ดของ OpenOCD

ขั้นตอนการดำเนินการ

  • ติดตั้ง MSYS2 สำหรับระบบปฏิบัติการ Windows 10 (64-bit)
  • ติดตั้ง Packages ต่าง ๆ ที่จำเป็นต้องใช้สำหรับการคอมไพล์ OpenOCD Source Code
  • ทำขั้นตอน Build สำหรับ OpenOCD
  • ทดลองใช้งาน OpenOCD กับอุปกรณ์ ST-Link/V2 สำหรับบอร์ดไมโครคอนโทรลเลอร์ ATSAMD21G18 โดยเชื่อมต่อแบบ SWD

ดาวน์โหลดและติดตั้ง MSYS2 สำหรับ Windows 10 (64-bit)

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ไฟล์ MSYS2 Installer สามารถดาวน์โหลดได้จากเว็บ https://www.msys2.org/ แยกเป็นไฟล์สำหรับระบบ 32 บิต และ 64 บิต ในบทความนี้ได้ดาวน์โหลดไฟล์ msys2-x86_64–20190524.exe มาสำหรับการติดตั้งใช้งาน จากนั้นก็เริ่มต้นทำขั้นตอนติดตั้งไปตามลำดับ

เริ่มต้นขั้นตอนการติดตั้ง MSYS2 64-bit
เลือกไดเรกทอรีสำหรับติดตั้ง
รอจนกว่าจะทำขั้นตอนติดตั้งแล้วเสร็จ
เรียกใช้โปรแกรม MSYS2-MINGW64

เมื่อเปิดหน้าต่าง Shell / Terminal ของ MSYS2-MINGW64 ให้ทำคำสั่งต่อไปนี้ตามลำดับ เพื่ออัปเดตและอัปเกรดซอฟต์แวร์

$ pacman -Syu
$ pacman -Su
ตัวอย่างการทำคำสั่งเพื่ออัปเดตซอฟต์แวร์ของ MSYS2

จากนั้นก็ทำคำสั่งเพื่อติดตั้งโปรแกรมเพิ่มดังนี้

$ pacman -S --disable-download-timeout autoconf automake git make cmake nano libtool pkg-config texinfo p7zip tar$ pacman -S --disable-download-timeout mingw-w64-x86_64-toolchain$ pacman -S --disable-download-timeout mingw-w64-x86_64-libusb mingw-w64-x86_64-hidapi mingw-w64-x86_64-libftdi
ตัวอย่างขั้นตอนการติดตั้งโปรแกรม (Software Packages)

ดาวน์โหลดและคอมไพล์ซอร์สโค้ดสำหรับ OpenOCD

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ขั้นตอนถัดไปเป็นการดาวน์โหลดซอร์สโค้ดของ OpenOCD โดยใช้คำสั่ง git แล้วเริ่มขั้นตอน Build

$ git clone https://github.com/ntfreak/openocd.git$ cd openocd/$ ./bootstrap$ ./configure --disable-doxygen-html --disable-doxygen-pdf $ make && make install

ข้อสังเกต: ในการกรณีที่ต้องการใช้ OpenOCD ร่วมกับ ST-Link/V2 สำหรับชิปตระกูล ATSAMD21 ให้แก้ไขไฟล์ src/flash/nor/at91samd.c ของ OpenOCD ดังต่อไปนี้ ก่อนทำขั้นตอน make

ในโค้ดของฟังก์ชัน samd_issue_nvmctrl_command() ให้เปลี่ยนจากการใช้ฟังก์ชัน target_write_u16() แก้ไขเป็น target_write_u32()

ตัวอย่างข้อความเอาต์พุตหลังจากทำคำสั่ง ./configure สำหรับ OpenOCD ก่อนทำคำสั่ง make

เมื่อทำขั้นตอนทั้งหมดได้แล้ว ลองทำคำสั่งต่อไปนี้ เพื่อลองเรียกใช้คำสั่ง openocd

$ /mingw64/bin/openocd --version

และจะได้ตัวอย่างข้อความเอาต์พุตดังนี้

Open On-Chip Debugger 0.10.0+dev-01040... (2020-03-04-16:05)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html

ไฟล์ต่าง ๆ ที่เกี่ยวข้องกับการใช้งาน OpenOCD จะอยู่ภายใต้ไดเรกทอรี /mingw64/share/openocd/

ถ้าเราจะนำ OpenOCD ไปใช้แบบ Command Line เช่น ด้วยวิธีการเรียกใช้คำสั่งใน Windows Command Shell (ไม่ได้ใช้งานผ่าน MSYS2 Terminal) ก็ให้สร้างเป็นไดเรกทอรีใหม่ แล้วสำเนาไฟล์ที่จำเป็นสำหรับการใช้งาน OpenOCD ไปใส่ไว้ ตามตัวอย่างนี้ได้นำไปไว้ในไดเรกทอรีที่เราสร้างขึ้นมาใหม่คือ C:\Tools\OpenOCD ให้ทำคำสั่งใน MSYS2 Terminal ตามลำดับดังนี้

$ export OPENOCD="/c/Tools/OpenOCD"$ mkdir -p $OPENOCD/bin $ cp /mingw64/bin/openocd.exe $OPENOCD/bin $ cp /mingw64/bin/libftdi1.dll $OPENOCD/bin$ cp /mingw64/bin/libhidapi-0.dll $OPENOCD/bin $ cp /mingw64/bin/libusb-1.0.dll $OPENOCD/bin $ mkdir -p $OPENOCD/share$ cp -R /mingw64/share/openocd $OPENOCD/share

การสาธิตใช้งาน OpenOCD for Windows ร่วมกับอุปกรณ์ ST-Link/V2

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เมื่อได้โปรแกรม OpenOCD สำหรับ Windows ไว้ใช้งานในเครื่องคอมพิวเตอร์ของเราแล้ว ถัดไปลองมาใช้คำสั่ง openocd สำหรับการเขียนไฟล์ Arduino Zero Bootloader ไปยังบอร์ดไมโครคอนโทรลเลอร์ RobotDyn SAMD21 M0-Mini โดยใช้อุปกรณ์ ST-Link/V2 (Clone) และใช้รูปแบบการเชื่อมต่อที่เรียกว่า SWD (Serial Wire Debug) โดยเชื่อมต่อสายเพียง 3 เส้นคือ {SWDIO, SWCLK, GND} ไม่จำเป็นต้องต่อขาไฟเลี้ยง 3.3V เนื่องจากจะใช้วิธีป้อนแรงดันไฟเลี้ยงให้บอร์ด SAMD21 M0-Mini ผ่านทางพอร์ต MicroUSB

ก่อนจะใช้งาน OpenOCD จะต้องสร้างไฟล์ openocd.cfg สำหรับการตั้งค่าใช้งาน OpenOCD Configuration ดังนี้

source [find interface/stlink.cfg]
transport select hla_swd
set CHIPNAME at91samd21g18
set CPUTAPID 0x0bc11477
set ENDIAN little
telnet_port disabled
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100
source [find target/at91samdXX.cfg]reset_config none

ถัดไปเป็นการทำคำสั่งเพื่อดาวน์โหลดไฟล์ Arduino Zero Bootloader จาก Github

$ wget https://github.com/arduino/ArduinoCore-samd/raw/master/bootloaders/zero/samd21_sam_ba.bin

จากนั้นให้เชื่อมต่อบอร์ด ATSAMD21 ผ่านอุปกรณ์ ST-Link/V2 ไปยังพอร์ต USB ของคอมพิวเตอร์ แล้วทำคำสั่งดังนี้

$ openocd -d2 -f ./openocd.cfg \
-c "init; targets; reset halt;" \
-c "at91samd chip-erase;" \
-c "at91samd bootloader 0;" \
-c "program samd21_sam_ba.bin verify reset;" \
-c "shutdown;"
ข้อความเอาต์พุตเมื่อทำคำสั่ง openocd เขียนข้อมูล Arduino Zero Bootloader ไปยังชิปเป้าหมาย

ไฟล์ samd21_sam_ba.bin จะถูกเขียนไว้ในหน่วยความจำ Flash ของชิป ATSAMD21G18 ในช่วงแอดเดรส 0x0000 ถึง 0x2000 (8192 ไบต์)

ถ้าเรามีไฟล์ .bin ที่ได้จากการแปลงหรือคอมไพล์โค้ดของ Arduino Sketch ตามตัวอย่างต่อไปนี้ (สำหรับตัวเลือกบอร์ด Arduino Zero — Programming Port) เราก็สามารถนำมาทดลองอัปโหลดไฟล์ .bin (ในตัวอย่างนี้ระบุชื่อไฟล์เป็น leds_blink.bin) ไปยังบอร์ด ATSAMD21 ได้

// Arduino Sketch demo for RobotDyn SAMD21 M0-Mini Board
#define LED0 13
#define LED1 25 // PB03
#define LED2 26 // PA7
#define INTERVAL_MSEC (50)
uint32_t ts; // used to save timestampvoid setup() {
pinMode( LED0, OUTPUT );
pinMode( LED1, OUTPUT );
pinMode( LED2, OUTPUT );
digitalWrite( LED1, HIGH ); // LED1 output high
digitalWrite( LED2, LOW ); // LED2 output low
ts = millis(); // get current timestamp (in msec)
}
int cnt = 0;void loop() {
if ( millis() - ts >= INTERVAL_MSEC ) {
ts += INTERVAL_MSEC;
digitalWrite( LED1, !digitalRead(LED1) );
digitalWrite( LED2, !digitalRead(LED2) );
cnt = (cnt+1) % 20;
if ( cnt == 0 ) {
digitalWrite( LED0, !digitalRead(LED0) );
}
}
}

ก่อนคำสั่งต่อไปนี้ ให้กดปุ่มรีเซตบนบอร์ดก่อนหนึ่งครั้ง

$ ARDUINO_BIN_FILE=leds_blink.bin
$ openocd -d2 -f ./openocd.cfg \
-c "init; targets; reset halt;" \
-c "program $ARDUINO_BIN_FILE verify 0x2000;" \
-c "reset run;" \
-c "reset run;" \
-c "shutdown;"
ข้อความเอาต์พุตเมื่อทำคำสั่ง openocd เขียนข้อมูลจากไฟล์ .bin ไปยังชิปเป้าหมาย
ตัวอย่างอุปกรณ์ที่ได้นำมาใช้ในการสาธิต

โดยสรุป: เราสามารถคอมไพล์ซอร์สโค้ดของ OpenOCD โดยใช้ MSYS2-MINGW64 และนำมาใช้สำหรับระบบปฏิบัติการ Windows 10 และยังได้ทดสอบการทำงานร่วมกับอุปกรณ์ ST-Link V2 (Clone) และบอร์ดไมโครคอนโทรลเลอร์ ATSAMD21G18

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet