Насчёт костыля для LinkE - в пакете USB_out USB_IN просто был другой байт, а остальные - те же, что и для
строенного в отладочную плату CH549. Я смотрел USB сниффером, никаких вопросов к libusb нет, дело лишь в прошивке инструмента. У тебя, судя по скриншоту в заглавном сообщении - WCH-Link-CH549. А у меня WCH-LinkE. И он третий байт во втором обмене даёт 0x86, тогда как у Link-CH549 он 0x06.
Я, бывало, так делал сам - когда по ходу разработки, нужно было добавить в пакет флагов и было ясно, что диапазон значений байта ограничен, добавлял флаги в старшие биты, чтобы не менять размеров посылки. Подумал - ведь 0x86 это то же самое, что и 0x06, если предположить, что 0x80 - это не число, а прицепленный поверх флаг.
В том switch() похожих кейсов не было, и число их было ограниченным. Поэтому внаглую добавил 0х86 к уже имеющемуся 0x06.