USB Vendor Request qua EP0 là gì?
EP0 Vendor Request trên STM32: bmRequestType 0xC0, dispatch trong Composite_Setup, tại sao không được gọi CdcLog_Printf trong handler và pattern pending log flag.
Vendor Request là cách gửi lệnh tùy chỉnh từ host qua EP0 (Control endpoint) mà không cần endpoint riêng. Phù hợp cho command ngắn: đọc info, bật/tắt tính năng, arm dump.
bmRequestType = 0xC0
Bit 7: 1 = Device→Host (IN)Bit 6-5: 10 = VendorBit 4-0: 00000 = Device→ 0xC0Host gửi Setup packet với bmRequestType=0xC0, firmware trả response struct.
Dispatch trong Composite_Setup
uint8_t Composite_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req){ /* Vendor request là device-level, dispatch trước HID/CDC */ if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_VENDOR) { return VendorCmd_HandleSetup(pdev, req); } /* ... HID/CDC dispatch theo interface number ... */}Dispatch vendor request trước các class request vì vendor là device-level, không thuộc interface nào.
Không gọi CdcLog_Printf trong handler
VendorCmd_HandleSetup chạy trong USB stack context. CdcLog_Printf không
ISR-safe (dùng vsnprintf, không có lock). Phải dùng pending log flag:
/* Handler: chỉ set cờ */sPendingLog = VLOG_GET_INFO_OK;/* Main loop: flush thật */void VendorCmd_FlushPendingLog(void) { if (sPendingLog == VLOG_NONE) return; CdcLog_Printf("[VREQ] ...\r\n"); sPendingLog = VLOG_NONE;}Xem chi tiết: bài 7 Vendor Request và Bulk
Bài viết này hữu ích với bạn?
Chia sẻ, góp ý, hoặc ủng hộ nếu bạn thấy nội dung này có giá trị.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
USB Bulk Transfer cho debug dump là gì?
Bulk IN cho RAM dump trên STM32G0: state machine chunk 64 byte, DataIn callback pipeline, tại sao không dùng ZLP, Zadig cho Windows và throughput thực đo.
Vendor Request và Bulk IN trên STM32G0
EP0 vendor command và Bulk IN RAM dump trên STM32G0: pending log flag, tại sao không dùng ZLP, Zadig cho Windows, và output thật từ vendor_test.py.
STM32G0 USB Lab: Composite Device
USB composite device trên STM32G0B1RE: HID Keyboard + CDC log + EP0 Vendor Request + Vendor Bulk IN. Một codebase phát triển từ HID đơn đến debug tool hoàn chỉnh qua commit/tag.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.