Ở bài trước, chúng ta đã tung hô JTAG tích hợp trên ESP32-S3 như một vị thần. Nhưng để nói chuyện được với vị thần đó, chúng ta cần một thông dịch viên. Và tên của người đó là OpenOCD - một người phiên dịch vừa giỏi giang, vừa khó tính. Bài hôm nay, chúng ta sẽ mổ xẻ mối quan hệ phức tạp giữa OpenOCD “zin”, bản độ của Espressif, và lý do tại sao chúng ta, những lập trình viên, lại buộc phải chọn “con riêng” của Espressif.
[MEME: Người đàn ông gãi đầu bối rối trước sơ đồ phức tạp]
OpenOCD - Người Phiên Dịch Khó Tính
Như đã cà khịa ở bài trước, OpenOCD (Open On-Chip Debugger) là cầu nối, là chất keo, là người phiên dịch đứng giữa GDB (nơi ta gõ lệnh) và con chip (phần cứng). Nó dịch những yêu cầu cao siêu của chúng ta thành những tín hiệu điện mà con chip có thể hiểu được. Nếu không có nó, GDB chỉ là một cái vỏ trống rỗng.
Mối Tình Tay Ba: OpenOCD “Zin”, Espressif “Fork”, và Lập Trình Viên
Hãy tưởng tượng OpenOCD “zin” (bản gốc, hay còn gọi là upstream) là một cuốn từ điển tiếng Anh chuẩn Oxford. Nó rất uyên bác, nhưng cập nhật từ mới rất chậm.
Espressif, với các dòng chip ra lò liên tục, không thể chờ đợi. Họ quyết định “fork” (tạo một nhánh riêng) và tạo ra một cuốn từ điển của riêng mình. Cuốn từ điển này giống như “Urban Dictionary” vậy:
- Nó lấy toàn bộ từ vựng của bản gốc.
- Nó thêm vào những từ lóng, thuật ngữ mới nhất mà chỉ dân “trong ngành” (chip ESP) mới hiểu.
- Nó sửa cả những lỗi phát âm, định nghĩa oái oăm mà chỉ có chip ESP mới mắc phải.
[MEME: 'Distracted Boyfriend' với bạn trai là 'Lập trình viên', bạn gái là 'OpenOCD Upstream', và cô gái đi ngang qua là 'OpenOCD của Espressif']
Và đây là lý do tại sao đại ca PHẢI DÙNG cuốn từ điển “hàng thửa” của Espressif:
- Hỗ trợ chip mới nhất: ESP32-S3, C3, C6… ra mắt là có hỗ trợ ngay. Bản gốc có khi cả năm sau mới có.
- Script xịn có sẵn: File
esp32s3-builtin.cfglà một “từ lóng” chỉ có trong từ điển của Espressif. Dùng bản gốc, đại ca tự mà định nghĩa lấy. - Vá lỗi “trời ơi đất hỡi”: Chỉ có cha đẻ mới hiểu hết những thói hư tật xấu của con mình. Espressif đã vá rất nhiều lỗi đặc thù của chip ESP trong bản OpenOCD của họ.
Cài Đặt “Hàng Tuyển”: Làm Sao Để Có OpenOCD của Espressif?
Có hai con đường để đến với OpenOCD phiên bản Espressif: một con đường cao tốc êm ru cho số đông, và một con đường mòn hiểm trở cho các “phượt thủ” thích khám phá.
Phương pháp 1: Đi theo Tour trọn gói ESP-IDF (Khuyên dùng cho người mới)
Đây là cách đơn giản, an toàn và đảm bảo thành công nhất. Việc cài đặt bộ công cụ ESP-IDF sẽ tự động tải về phiên bản OpenOCD đã được biên dịch sẵn, tương thích hoàn hảo với các công cụ khác.
- Ưu điểm: “Mì ăn liền”, không cần lo lắng về thư viện, phiên bản, hay lỗi biên dịch.
- Nhược điểm: Phải tải cả bộ ESP-IDF khá nặng (vài GB). Giống như muốn ăn phở mà phải mua cả cái nhà hàng.
Các bước thực hiện trên Linux/macOS:
- Clone ESP-IDF:
git clone --recursive https://github.com/espressif/esp-idf.git - Chạy script cài đặt:
cd esp-idf ./install.sh all - Kích hoạt môi trường (quan trọng!):
Mỗi khi mở một terminal mới, hãy chạy lệnh sau từ thư mục
esp-idf:. ./export.sh
Phương pháp 2: Tự nấu phở tại nhà (Dành cho “Dân Chơi”)
Cách này cho phép đại ca chỉ cài đặt OpenOCD mà không cần cả bộ ESP-IDF. Nhẹ hơn, tùy biến cao hơn, nhưng cũng dễ “toang” hơn nếu không cẩn thận.
- Ưu điểm: Chỉ cài thứ mình cần, có được phiên bản OpenOCD mới nhất từ repo.
- Nhược điểm: Phải tự xử lý các thư viện phụ thuộc và các lỗi có thể phát sinh khi biên dịch.
Các bước thực hiện trên Linux (Debian/Ubuntu):
- Cài đặt các “gia vị” cần thiết:
OpenOCD cần một số thư viện để có thể biên dịch.
sudo apt-get install git gdb libtool autoconf automake texinfo libusb-1.0-0-dev pkg-config - Lấy mã nguồn OpenOCD của Espressif:
git clone https://github.com/espressif/openocd-esp32.git cd openocd-esp32 - Nấu nướng (Biên dịch):
./bootstrap ./configure make - Dọn ra đĩa (Cài đặt):
Lệnh này sẽ cài
openocdvào hệ thống để đại ca có thể gọi ở bất cứ đâu.sudo make install
Sau khi hoàn tất, đại ca có thể gõ openocd --version để kiểm tra thành quả. Nếu nó hiện ra phiên bản có chữ esp, xin chúc mừng, đại ca đã “nấu phở” thành công!
Cắm Đúng Cổng - Cuộc Chiến Tưởng Dễ Mà Khó
Như đã nói, nhiều bo ESP32-S3 có 2 cổng USB. Cắm sai cổng thì có ngồi debug tới Tết Công-gô cũng không được.
Làm sao để biết cắm đúng?
Trên Linux, hãy mở terminal và gõ lệnh lsusb sau khi cắm cáp. Đại ca cần tìm một dòng có ID 303a:1001.
# Gõ lệnh này và tìm dòng có ID 303a:1001
lsusb
Output mong muốn:
Bus 001 Device 008: ID 303a:1001 Espressif Systems USB JTAG/serial debug unit
303a: Đây là mã nhà sản xuất (Vendor ID) của Espressif.1001: Đây là mã sản phẩm (Product ID) cho chế độ JTAG.
[MEME: Sherlock Holmes đang tìm kiếm manh mối]
Ủa, không thấy ID 1001 đâu thì sao?
Aha! Đây là một cái bẫy kinh điển. Nếu đại ca chắc chắn đã cắm đúng cổng USB native mà không thấy ID 303a:1001, thì 99% lý do là firmware đang chạy trên bo đã chiếm dụng cổng USB cho mục đích khác (ví dụ làm cổng Serial, làm bàn phím USB, v.v…).
Để giải quyết, chúng ta cần ngăn firmware cũ khởi động. Có 2 cách từ nhẹ tới nặng:
Giải pháp 1: Đưa về chế độ Bootloader (Cách nhẹ nhàng - NÊN THỬ TRƯỚC)
Cách này sẽ tạm thời ngăn firmware chính khởi động, cho phép JTAG tích hợp “trình diện”.
- Nhấn và giữ nút
BOOT(hoặcIO0) trên bo mạch. - Trong khi vẫn giữ nút
BOOT, nhấn rồi thả nútRESET(hoặcEN). - Thả nút
BOOT.
Bây giờ bo mạch đang ở chế độ Download. Hãy gõ lại lệnh lsusb, đại ca sẽ thấy ID 303a:1001 xuất hiện. Sau đó có thể chạy openocd và gdb bình thường.
Giải pháp 2: Xóa sạch Flash (Cách ‘bạo lực’ - KHI CÙNG ĐƯỜNG HÃY DÙNG)
Nếu cách trên vẫn không được, hoặc đại ca muốn “dọn dẹp” bo mạch về trạng thái ban đầu, chúng ta sẽ xóa sạch firmware cũ.
Lệnh này yêu cầu esptool.py (đã được cài cùng ESP-IDF).
# Đảm bảo bo mạch đang ở chế độ Download (làm theo các bước ở giải pháp 1)
esptool.py erase_flash
Lệnh này sẽ xóa toàn bộ bộ nhớ flash của chip. Sau khi chạy xong, rút cáp ra cắm lại, bo mạch sẽ trống trơn và ID 303a:1001 chắc chắn sẽ xuất hiện.
UDEV - “Giấy Thông Hành” Cho OpenOCD Trên Linux
Đây là “đặc sản” của Linux. Đại ca chạy openocd và nhận được lỗi permission denied hoặc libusb_open() failed.
Vấn đề là gì?
Mặc định, Linux không cho phép một chương trình thông thường (chạy bởi người dùng không phải root) truy cập trực tiếp vào phần cứng USB.
Giải pháp?
Chúng ta cần tạo một quy tắc (rule) cho udev (trình quản lý thiết bị của Linux), nói với nó rằng: “Này ông bảo vệ, cái thiết bị có ID 303a:1001 này là khách VIP đấy, cho nó vào tự do, đừng hỏi mật khẩu (sudo) nữa.”
Cách làm:
- Tạo một file rule mới:
sudo nano /etc/udev/rules.d/99-espressif.rules - Copy và dán nội dung sau vào file đó:
# Rule for ESP32-S3 Built-in JTAG SUBSYSTEM=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", MODE="0666" # Rule for other Espressif devices (optional but good to have) SUBSYSTEM=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="*", MODE="0666"Thuộc tính
MODE="0666"cho phép mọi người dùng đọc và ghi vào thiết bị. -
Lưu file và thoát (
Ctrl+X, sau đóY, rồiEnter). - Bảo “ông bảo vệ” đọc lại danh sách VIP:
sudo udevadm control --reload-rules sudo udevadm trigger
Bây giờ, rút cáp USB ra và cắm lại. OpenOCD của đại ca sẽ chạy mượt mà không cần sudo.
Lời Kết
Cài đặt đúng phiên bản OpenOCD và cấu hình udev là những bước “đau một lần rồi thôi”. Nhưng một khi đã xong, chúng sẽ tiết kiệm cho đại ca vô số giờ bực tức trong tương lai. Giờ thì đại ca đã có đủ bộ “bí kíp võ công” để chinh phục con ESP32-S3 rồi đấy. Chúc may mắn!