模块结构
- 通用模块图
%%{init: {'theme':'forest'}}%% classDiagram NSProxy_Proxy --|> NSProxy_NSUVC_Proxy NSProxy_NSUVC_InterfaceManager --|> NSProxy_NSUVC_Proxy NSProxy_NSUVC_Proxy --|> NSProxy_NSUVC_NSSRV_Proxy NSProxy_NSUVC_Proxy --|> NSProxy_NSUVC_NSCLI_Proxy NSProxy_Proxy o-- NSProxy_interface NSProxy_NSUVC_InterfaceManager o-- NSProxy_NSUVC_Interface
- 客户端服务端细化图
%%{init: {'theme':'forest'}}%% classDiagram NSProxy_NSUVC_Interface --|> NSProxy_NSUVC_VSInterface NSProxy_NSUVC_VSInterface --|> NSProxy_NSUVC_NSSRV_VSInterface NSProxy_NSUVC_VSInterface --|> NSProxy_NSUVC_NSCLI_VSInterface NSProxy_interface --|> NSProxy_UVCIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSSRV_UVCCliIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSSRV_UVCSrvIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSSRV_UVCOutIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSCLI_UVCCliIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSCLI_UVCSrvIntf NSProxy_UVCIntf --|> NSProxy_NSUVC_NSCLI_UVCOutIntf
- 功能模块图
%%{init: {'theme':'forest'}}%% classDiagram NSProxy_NSUVC_Proxy o-- UVCFilter NSProxy_NSUVC_Proxy o-- ReqManager NSProxy_NSUVC_VSInterface o-- ReqManager NSProxy_NSUVC_VSInterface o-- PictureCache NSProxy_NSUVC_VSInterface o-- PictureCache
流程
通用
初始化
%%{init: {'theme':'forest'}}%% flowchart LR Proxy::Proxy --> NSProxy::Proxy::Proxy Proxy::Proxy --> InterfaceManager::InterfaceManager Proxy::Proxy --> ReqManager::ReqManager Proxy::Proxy --> UVCFilter::UVCFilter Proxy::Proxy --> USB::UVC::GetDescriptorRsp::GetDescriptorRsp
数据初始化
%%{init: {'theme':'forest'}}%% flowchart LR Proxy::init --> Proxy::setInterface Proxy::setInterface --> USB::Configuration::getInterface Proxy::setInterface --> USB::Configuration::setInterfaceAlt Proxy::setInterface --> InterfaceManager::getInterface Proxy::setInterface --> Proxy::newInterface Proxy::setInterface --> InterfaceManager::setInterface Proxy::setInterface --> Interface::setInterfaceAlt_.virtual
开启关闭数据流
Interface 触发
- VSInterface::setInterfaceAlt 的时候,根据是否设置了数据流Interface判断
- 发起流程VSInterface::setInterfaceAlt
- 根据alt是否为0判断是开启还是关闭
- 无论开始还是关闭,都需要通过m_control的out接口,通知管理者
%%{init: {'theme':'forest'}}%% flowchart LR VSInterface::setInterfaceAlt --> Interface::setInterfaceAlt VSInterface::setInterfaceAlt --> VSInterface::startStream VSInterface::setInterfaceAlt --> VSInterface::stopStream VSInterface::startStream --> PictureCache::PictureCache VSInterface::startStream --> H264Coder::H264Coder VSInterface::startStream --> NSProxy::Interface::out_.UVC_CTRL_STREAMINGON VSInterface::stopStream --> PictureCache::Delete_.PictureCache VSInterface::stopStream --> H264Coder::Delete_.H264Coder VSInterface::stopStream --> ReqManager::deque VSInterface::stopStream --> NSProxy::Interface::out_.UVC_CTRL_STREAMINGOFF
客户端
初始化
%%{init: {'theme':'forest'}}%% flowchart LR Proxy::Proxy --> NSUVC_Proxy::Proxy::Proxy Proxy::Proxy --> UVCCliIntf::UVCCliIntf Proxy::Proxy --> UVCSrvIntf::UVCSrvIntf Proxy::Proxy --> UVCCtrlIntf::UVCCtrlIntf
服务端
请求响应
- 所有的请求,都是从NSProxy_NSUVC_NSSRV_UVCSrvIntf::in 进入的
- 该方法继承自NSProxy::Interface
- 目前有两套参数,分别支持 1个ksvd_iov参说 或者 1组 uint8_t* uint32_t 参数
- 服务端当前使用的是uint8_t* uint32_t 的参数模型
- 做完处理,没有执行透传,是否透传,需要Interface::onDataReq和HookReq::onReq自行决定
%%{init: {'theme':'forest'}}%% flowchart LR UVCSrvIntf::in --> UVCSrvIntf::onDataReq UVCSrvIntf::in --> UVCSrvIntf::onCtrlReq UVCSrvIntf::onDataReq --> Proxy::getInterfaceByEp UVCSrvIntf::onDataReq --> Interface::onDataReq UVCSrvIntf::onCtrlReq --> DataTpl::parse UVCSrvIntf::onCtrlReq --> HookReq::onReq
回复响应
- 所有的回复,都是从NSProxy_NSUVC_NSSRV_UVCSrvIntf::out 返回给上层的
- 该方法继承自NSProxy::Interface
- 目前有两套参数,分别支持 1个ksvd_iov参说 或者 1组 uint8_t* uint32_t 参数
- 服务端当前使用的是uint8_t* uint32_t 的参数模型
- 没有对Data请求做处理
- 做完处理,要继续投传到上层
%%{init: {'theme':'forest'}}%% flowchart LR UVCSrvIntf::out --> DataTpl::parse UVCSrvIntf::out --> HookReq::onRsp UVCSrvIntf::out --> NSProxy_UVCIntf::out
枚举
- 枚举的处理是在 HookReq::onRsp 这里,也就是回复响应
- 入口函数为 KSVD::ExGetDescriptor::onRsp
- 处理完DEVICE的CONFIG的解析后,进行init操作
- Proxy的init参考 通用中的数据初始化流程
%%{init: {'theme':'forest'}}%% flowchart LR KSVD::ExGetDescriptor::onRsp --> USB::GetDescriptorRsp::init KSVD::ExGetDescriptor::onRsp --> Proxy::init
Probe
- Probe的处理是在 HookReq::onReq 和 HookReq::onRsp 都会触发
- 根据UVC协议4.1.2 使用m_request->wIndex作为索引获取对应Interface
- 然后进行updateCommit操作
%%{init: {'theme':'forest'}}%% flowchart LR KSVD::ExProbe::onReq --> VSInterface::updateCommit KSVD::ExProbe::onRsp --> VSInterface::updateCommit KSVD::ExCommit::onReq --> VSInterface::updateCommit KSVD::ExCommit::onRsp --> VSInterface::updateCommit
适配器
Qemu适配
usbredir适配
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2023/02/22/kylin/usb/redir/uvc/fsd/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!