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.

Cập nhật 1 phút đọc
USB cover

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→ 0xC0

Host 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ị.

Góp ý

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.