Âm thanh I2S Jetson Nano: cách cài Raspiaudio Audio+

Để cài Raspiaudio Audio+ trên Jetson Nano, bạn bật các chân I2S4 trong jetson-io, ép chúng sang chế độ âm thanh mỗi lần khởi động và định tuyến I2S4 tới driver âm thanh. Bộ phát triển Jetson Nano dành cho AI và robot, nhưng không có đầu ra âm thanh analog. Bo Raspiaudio Audio+ là card âm thanh thiết kế cho Raspberry Pi và cũng vừa đầu nối 40 chân của Nano.

Hướng dẫn này trình bày mọi bước trên Jetson Nano B02 (2019). Khi hoàn tất, bạn sẽ nghe âm thanh từ cổng tai nghe Audio+.

Mastering bài hát chỉ trong vài giây
Tự động đạt -14 LUFS. Giữ nét riêng của bài hát. Âm thanh sẵn sàng phát trực tuyến mà vẫn giữ điều làm nhạc của bạn đặc biệt. Ngay trong trình duyệt.

Trước khi bắt đầu: mẫu Jetson Nano và khả năng tương thích Audio+

Thiết lập Jetson Nano trước. Nếu chưa làm, hãy theo hướng dẫn thiết lập Jetson Nano của NVIDIA. Bạn cần khởi động được Nano tới màn hình desktop bằng màn hình và bàn phím.

Bạn cần: một Jetson Nano B02 và một bo Raspiaudio Audio+. Đầu nối 40 chân Audio+ lắp trực tiếp lên hàng chân Nano. Ấn chắc để mọi chân tiếp xúc.

Hướng dẫn đã được thử trên bộ phát triển Jetson Nano B02 (2019), còn gọi là P3450 (mô-đun P3448 trên bo nền P3449). Bạn có thể nhận ra Jetson Nano qua tản nhiệt thụ động; các mẫu Jetson mới hơn dùng quạt. B02 còn có một hàng chân nhô ra thành một vùng nhỏ, không có trên mẫu A01 cũ.

Nếu dùng A01 cũ hoặc Jetson mới hơn, chỉ xem hướng dẫn này làm tham khảo vì các bước không áp dụng trực tiếp. Bạn có thể chia sẻ mẹo trong cộng đồng Raspiaudio.

Bo DAC I2S khác: Audio+ và các DAC Raspberry Pi tương tự không có giao diện điều khiển, chỉ có giao diện I2S. Như thảo luận trên diễn đàn NVIDIA về card âm thanh I2S Raspberry Pi cho Jetson Nano giải thích, các bo này được kỳ vọng hoạt động khi chân đã được cấu hình. Vì vậy, các bước dưới đây là điểm khởi đầu tốt cho DAC I2S cùng loại trên Nano B02.

Đặc biệt cảm ơn jas-mx vì bài đăng diễn đàn NVIDIA về bật đầu ra âm thanh I2S trên đầu nối 40 chân đã gợi ý cho hướng dẫn này.

Bước 1: bật các chân âm thanh I2S4 bằng jetson-io

Theo mặc định, Jetson Nano không dùng những chân này cho âm thanh. Khởi động Nano với màn hình và bàn phím, mở terminal rồi chạy:

sudo /opt/nvidia/jetson-io/jetson-io.py

Công cụ dạng menu sẽ mở:

  1. Dùng phím mũi tên lên/xuống để chọn "Configure Jetson 40pin Header" và nhấn Enter
  2. Chọn "Configure header pins manually" và nhấn Enter
  3. Trong danh sách ô đánh dấu, tìm "i2s4" (chân 12, 35, 38, 40) và "audio_mclk" (chân 7). Nhấn Space trên từng mục để đánh dấu sao [*].
  4. Chọn "Back"
  5. Chọn "Save pin changes"
  6. Chọn "Save and reboot to reconfigure pins"

Jetson Nano khởi động lại. Công cụ ghi cây thiết bị tùy chỉnh (DTB) gán những chân đó cho âm thanh, lưu tại /boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb.

Bước 2: kiểm tra các chân đang ở chế độ I2S

Sau khi khởi động lại, kiểm tra chế độ chân:

sudo cat /sys/kernel/debug/tegra_gpio | grep "J:"

Bạn nên thấy: J: 2:1 00 00 00 00 00 00 000000
Nếu thấy "f0" ở bất kỳ đâu, chẳng hạn "f0 00 00", bạn cần cách sửa bên dưới.
"00" nghĩa là các chân ở chế độ chức năng đặc biệt (SFIO) cho âm thanh I2S. "f0" nghĩa là chúng vẫn mắc ở chế độ GPIO.

Bước 3: sửa các chân bằng dịch vụ systemd nếu cần

Trên nhiều bo B02, các chân không chuyển sang chế độ âm thanh. Lệnh này sửa được:

sudo busybox devmem 0x6000d204 32 0

Nó ép chân sang chế độ đúng, nhưng chúng trở về GPIO khi khởi động lại. Để áp dụng mỗi lần khởi động, tạo dịch vụ systemd:

sudo tee /etc/systemd/system/fix-i2s4-pins.service <<EOF
[Unit]
Description=Fix I2S4 Pinmux for Jetson Nano
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/busybox devmem 0x6000d204 32 0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

Dịch vụ khởi động này ghi vào thanh ghi cấu hình GPIO 0x6000d204, ép các chân Port J sang chế độ SFIO cho I2S4.

Bật và khởi chạy dịch vụ:

sudo systemctl enable fix-i2s4-pins
sudo systemctl start fix-i2s4-pins

Cả hai lệnh đều nên hoàn thành không lỗi. Nếu thấy "Failed to start fix-i2s4-pins.service: Unit not found", tệp dịch vụ chưa được tạo đúng. Kiểm tra nhật ký:

sudo journalctl -u fix-i2s4-pins

Bước 4: định tuyến I2S4 tới driver âm thanh

Nối giao diện I2S4 với hệ thống âm thanh:

amixer -c tegrasndt210ref cset name='I2S4 Mux' ADMAIF1

Đầu ra nên kết thúc bằng values=1. Nếu báo lỗi "Invalid card", driver âm thanh chưa được tải. Khởi động lại rồi thử lại.

Việc này định tuyến giao diện ADMAIF1, nơi driver gửi âm thanh, tới I2S4, kết nối driver với các chân phần cứng.

Bước 5: phát âm thử

Lệnh này gửi sóng sin stereo 16 bit, 48 kHz qua giao diện I2S4:

speaker-test -D hw:tegrasndt210ref,0 -r 48000 -c 2 -F S16_LE -t sine

Bạn nên nghe âm liên tục từ tai nghe hoặc loa. Nhấn Ctrl+C để dừng.

Cách xác nhận bo Audio+ hoạt động

Nếu đã nghe âm thử, Raspiaudio Audio+ hoạt động trên Jetson Nano B02 của bạn. Nhờ dịch vụ từ Bước 3, cách sửa chân vẫn được áp dụng sau mỗi lần khởi động lại.

Bổ sung: cách nạp Jetson Nano bằng DTB tùy chỉnh

Cách trên dùng cho một thiết bị. Nếu cần nạp nhiều bo Jetson Nano để sản xuất, việc đi qua menu jetson-io trên từng bo sẽ mất công. Thay vào đó, nạp từng bo bằng tệp DTB (Device Tree Blob, tệp nhị phân cây thiết bị) tạo ở Bước 1 để cấu hình chân đã có sẵn:

/boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb

Sao chép tệp này sang máy tính. Khi nạp lại, chép về thư mục /boot/ trước lần khởi động đầu tiên.

Quan trọng: bạn đang dùng Jetson Nano nào?

Tệp DTB này chỉ khớp phiên bản bo nền mà nó được tạo trên đó. Phiên bản nằm cuối tên tệp, ở đây là b00. Nạp DTB của phiên bản khác có thể hỏng phân vùng khởi động và bạn có thể phải nạp lại toàn bộ từ máy tính chủ.

Cách nạp Jetson Nano dễ nhất là từ máy tính chủ chạy Linux, dùng NVIDIA SDK Manager hoặc NVIDIA Jetson Linux Driver Package (L4T). Tôi khuyên dùng L4T vì nó hoạt động trên nhiều bản phân phối Linux hơn. Quy trình đầy đủ có trong thảo luận diễn đàn NVIDIA về tải và nạp L4T thủ công. Dưới đây là bản ngắn gọn.

Tải L4T từ kho lưu trữ NVIDIA Jetson Linux. Với Jetson Nano, dùng dòng Jetson Linux 32.7.x thay vì nhánh JetPack mới hơn. Trên trang phát hành, tải Driver Package (BSP) và Sample Root Filesystem. Giải nén gói driver không dùng sudo, rồi giải nén hệ thống tệp gốc mẫu với sudo vào Linux_for_Tegra/rootfs/.

Sau đó, từ thư mục Linux_for_Tegra, áp dụng các tệp nhị phân NVIDIA:

sudo ./apply_binaries.sh

Tiếp theo, nối Jetson Nano với máy tính chủ qua micro USB. Nano phải được cấp bằng nguồn 5V riêng.

Đây là lệnh mẫu nạp Jetson Nano bằng tệp DTB tùy chỉnh. Chạy trên máy tính chủ sau khi chép tệp DTB từ Nano sang đó. Thay đường dẫn bằng đường dẫn của bạn.

sudo ./flash.sh -k DTB
-d /path/to/your/file/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb
jetson-nano-devkit mmcblk1p1

Để nạp, có thể bạn cần đưa Jetson Nano vào chế độ khôi phục:

  1. Cấp nguồn Jetson Nano bằng nguồn 5V, không qua micro USB.
  2. Nối chân "FC RCV" (ép khôi phục) với chân "GND" bằng dây jumper, kẹp giấy hoặc tua vít nhỏ.
  3. Nối chân "SYS_RST" (đặt lại hệ thống) với chân "GND" để khởi động lại Jetson Nano.
  4. Nối Nano với máy tính chủ qua micro USB.

Kiểm tra kết nối trên máy tính chủ bằng:

lsusb | grep -i nvidia

Sau khi nạp, bạn vẫn cần thêm dịch vụ systemd từ Bước 3 để các chân được đặt đúng mỗi lần khởi động.

Hướng dẫn liên quan

Khi bo phát được âm thanh, những hướng dẫn này trình bày dự án âm thanh neural cho máy tính đơn bo nhỏ:

Mastering bài hát chỉ trong vài giây
Tự động đạt -14 LUFS. Giữ nét riêng của bài hát. Âm thanh sẵn sàng phát trực tuyến mà vẫn giữ điều làm nhạc của bạn đặc biệt. Ngay trong trình duyệt.