设计
【模块】页面
- 前台负责
【交互】页面&后台
通过配置文件交互
/home/kylin-ksvd/.ksvd/settings.${policy_uuid}
- 删除KSVD_NATIVE_USB_NUM KSVD_NATIVE_USB_MODE 字段
- 新增KSVD_NATIVE_USB_3 KSVD_NATIVE_USB_2 两个字段
/home/kylin-ksvd/.ksvd/usbSettings.${policy_uuid}
- 对应前台配置 绑定通道为 channel_id字段
- 对应前台配置 max_int_pkg_size字段
eg:
{
“name”:”fig”,
“lvl”:9,
“vid”:”0x735f”,
“pid”:”0x1302”,
“usb_scsi_readonly”:false,
“redirect_mode_usb”:true,
“usb_redirect_on_connect”:true,
“usb_redirect_auto”:true,
“usb_reset”:1,
“usb_scsi_fat”:false,
“redirect_mode_uvc”:false,
“uvc_frame_ctl_ratio”:100,
“channel_id”:2,
“max_int_pkg_size”:1024
}
升级
- 需要考虑字段变动引起的省级问题
【模块】后台
- 需要考虑配置文件的变动,读写和消息传递
【交互】后台&&客户端
交互消息结构改动
- 考虑是否变动
兼容性
- 如果有修改,需要考虑兼容性问题
【交互】后台&&qemu(uniqb-runatime)
- 应该不用修改,交互方面应该只是传配置文件
文件 /home/kylin-ksvd/.ksvd/settings.${policy_uuid}
【模块】客户端
- 需要确定是否受到影响
【模块】qemu(uniqb-runtime)
- 需要先弄清MIPS X86_64 AARCH64 区别于各自的参数
参数来自于Get_Mach_Arch,但是没找到定义,不过找到以下arch相关的东西,推测平台不止3个
KSVD/ThirdParty/qemu/qemu-2.3.0/target-arm/kvm.c:155:int kvm_arch_init(MachineState *ms, KVMState *s)
KSVD/ThirdParty/qemu/qemu-2.3.0/target-mips/kvm.c:43:int kvm_arch_init(MachineState *ms, KVMState *s)
KSVD/ThirdParty/qemu/qemu-2.3.0/target-s390x/kvm.c:245:int kvm_arch_init(MachineState *ms, KVMState *s)
KSVD/ThirdParty/qemu/qemu-2.3.0/target-ppc/kvm.c:98:int kvm_arch_init(MachineState *ms, KVMState *s)
KSVD/ThirdParty/qemu/qemu-2.3.0/target-i386/kvm.c:843:int kvm_arch_init(MachineState *ms, KVMState *s)
关注参数
那么先列出所有 平台下的参数
condtion 1: !(cfg.os_type == UNIQB_MACHTYPE_OS_WIN10 && runmode_installing)
condtion 2: cfg.usb_degrade
MODE | 参数 | X86_64 | ARM | MIPS | 其他 |
---|---|---|---|---|---|
3.0 | -device nec-usb-xhci,id=xhci | Y | Y | Y | Y |
,bus=pci, addr=0x6 | N | N | Y | N | |
-device usb-host,id=hostdev0, bus=xhci.0 | N | N | Y | N | |
{if(condtion 1) -device usb-table,bus=xhci.0 | Y | N | N | N | |
-device usb-redir,chardev=usbredirchardev%d,id=usbredirdev%d | Y | Y | Y | Y | |
,{if (condtion 2) filter={string} else ,filter-path={path}},usb_degrade={if(condtion 2) true else false} | Y | Y | Y | Y | |
2.0 | -device ich9-usb-ehci1,id=usb | Y | Y | Y | Y |
,bus=pci, addr=0x4.x07 | N | N | Y | N | |
-devcie ich9-usb-uhci{n/2+1},masterbus=usb.0,firstport={n}{if (n == 1),multifunction=on} | Y | Y | Y | Y | |
,bus=pci,addr=0x4.0x{n/2} | N | N | Y | N | |
-device usb-redir,chardev=usbredirchardev%d,id=usbredirdev%d | Y | Y | Y | Y | |
,{if (condtion 2) filter={string} else ,filter-path={path}},usb_degrade={if(condtion 2) true else false} | Y | Y | Y | Y | |
,bus=usb.0,port={n} | N | N | Y | N |
对比可以得出以下结论
- MIPS 的代码,通常指定了bus和addr,port参数
- -device usb-redir中 3.0模式下MIPS没有指定 有些奇怪
- X86 在非win10模式下,指定了-device usb-table,bus=xhci.0 参数
- 需要弄清pci设备bus和addr的指定【详见】qemu qdev初步解析
- usb-table [x86]设备,是hid设备。只有安装模式下开启,怀疑是guesttool安装之前,鼠标键盘使用的
- usb-host [MIPS]设备,看代码是直接基于libusb的设备,可以直接使用qemu运行机器上的外舍,出现在这里,也不知道是什么用处
分析:
经过目前分析,MIPS平台下,可能由于PCI插槽的资源比较紧缺,所以这里共用了插槽
由于uhci和ehci共用的pci同一个addr,所以最多能支持7个uhci(可能存在偏差)好在我们目前最多也不过需要那么多,但是之后如果进行32通道的研究,这里就要注意了
我们对照一个qemu进程来看
1 | /usr/libexec/qemu-kvm |
我们精简以下,只看它的device
1 | -device usb-tablet |
qemu的 qdev 有一个alias转换, 所以我们这里添加的virtio-serial其实等于virtio-serial-pci
具体有什么区别,暂时只做记录
1 | /* Please keep this table sorted by typename. */ |
主要新增函数
1 | void set_ksvd_redir_2_args(Launcher &kvm, int num) |
设备类型继承结构(qemu类图,部分)
- TYPE_OBJECT “object”
- TYPE_DEVICE “device”
- TYPE_PCI_DEVICE “pci-device”
- TYPE_PCI_EHCI “pci-ehci-usb”
- TYPE_UHCI “pci-uhci-usb”
- TYPE_XHCI “base-xhci”
- TYPE_NEC_XHCI “nec-usb-xhci”
- TYPE_QEMU_XHCI “qemu-xhci”
- “pci-serial”
- TYPE_USB_DEVICE “usb-device”
- TYPE_USB_REDIR “usb-redir”
- TYPE_KSVD_REDIR “ksvd_redir”
- TYPE_UVC_REDIR “uvc-redir”
- TYPE_USB_SERIAL “usb-serial-dev”
- TYPE_VIRTIO_SERIAL_PORT “virtio-serial-port”
- TYPE_VIRTIO_DEVICE “virtio-device”
- TYPE_BUS “bus”
- TYPE_USB_BUS “usb-bus”
- TYPE_PCI_BUS “PCI”
- TYPE_PCIE_BUS “PCIE”
- TYPE_PXB_PCIE_BUS “pxb-pcie-bus”
- TYPE_PXB_BUS “pxb-bus”
设备连接结构(qemu进程,设备结构图,部分)
- pci(TYPE_PCI_DEVICE?)
- pci.0(TYPE_PCI_BUS?)
- slot 0x4
- func 0x0
- noid (TYPE_UHCI)
- (link usb.0’s usbbus)
- func 0x1
- noid (TYPE_UHCI)
- (link usb.0’s usbbus)
- func 0x2
- noid (TYPE_UHCI)
- (link usb.0’s usbbus)
- func 0x7
- usb2(TYPE_PCI_EHCI)
- usb2.0(TYPE_USB_BUS)
- slot 0x0 func 0x0
- usb-redir0(TYPE_USB_REDIR)
- slot 0x1 func 0x0
- usb-redir1(TYPE_USB_REDIR)
- slot 0x2 func 0x0
- usb-redir2(TYPE_USB_REDIR)
- slot 0x3 func 0x0
- usb-redir3(TYPE_USB_REDIR)
- slot 0x4 func 0x0
- usb-redir4(TYPE_USB_REDIR)
- slot 0x5 func 0x0
- usb-redir5(TYPE_USB_REDIR)
- slot 0x6 func 0x0
- uvcredir0(TYPE_UVC_REDIR)
- slot 0x7 func 0x0
- uvcredir1(TYPE_UVC_REDIR)
- slot 0x8 func 0x0
- uvcredir2(TYPE_UVC_REDIR)
- slot 0x9 func 0x0
- uvcredir3(TYPE_UVC_REDIR)
- slot 0x5
- func 0x0
- usb3 (TYPE_NEC_XHCI)
- usb3.0 (TYPE_USB_BUS)
- slot 0x0 func 0x0
- usb-redir6(TYPE_USB_REDIR)
- slot 0x1 func 0x0
- usb-redir7(TYPE_USB_REDIR)
- slot 0x2 func 0x0
- usb-redir8(TYPE_USB_REDIR)
- slot 0x3 func 0x0
- usb-redir9(TYPE_USB_REDIR)
参考文献
Device & Bus & Driver
https://blog.csdn.net/u011364612/article/details/53809730
https://blog.csdn.net/weixin_30741653/article/details/98049607
https://www.cnblogs.com/r1ng0/p/12809667.html
问题
qemu-kvm: -device usb-redir,chardev=usbredirchardev6,id=usb-redir6,bus=xhci.0,port=1,usb_degrade=0,filter-path=/home/kylin-ksvd/.ksvd/usbSettings.f0554724-4b3e-46c3-938b-f5fffceeb12c: usb port 1 (bus xhci.0) not found (in use?)
参数
1 | -vnc unix:/var/run/ksvd/users/ygh/win10-test-ly/vnc.socket |
报错代码
1 | void usb_claim_port(USBDevice *dev, Error **errp) |
1 | void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp) |
realize的时候,使用usb_bus_new 创建了ehci.0的bus
通过usb_register_port注册port,port的path是index+1 也就是从1-portnr
问题解决
参数
参数 | 解释 | 范围 | 默认值 |
---|---|---|---|
KSVD_NATIVE_USB_2 | 2.0通道数 | [0-10] | 6 |
KSVD_NATIVE_USB_3 | 3.0通道数 | [0-10] | 4 |
KSVD_NATIVE_USB_PRIORITY | 优先使用2.0还是3.0 | [2|3] | 2 |
KSVD_NATIVE_UVC_AT | 摄像头位于 | [ehci|xhci] | ehci |
KSVD_NATIVE_USB_3_MODE | 摄像头3.0主控选择 | [nec|qemu] | nec |
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2022/04/28/kylin/usb/redir/usbpolicy/fsd/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!