~~META: status = suspended &relation firstimage = :project:vr.png ~~
We have Vuzix iWear VR920 and shutter glasses available for projects.
Edimensional controller se inicializuje barevnyma kodoma v horni casti obrazovky. Kody se zjisti z programu E-D.exe na adrese 0x004010A9. Program si uklada nastaveni do registru v rutine na adrese 0x00401491.
Aktivace synchronizace LEFT/RIGHT obrazu se signalizuje pres DDC na VGA konektoru.
# modprobe i2c-dev $ i2cdetect -l $ cat /sys/bus/i2c/devices/i2c-X/device/device/card0-VGA-1/edid
Bryle se ovladaji pres USB. USB descriptor zarizeni obsahuje krome audio kanalu a headtracking sensoru jeste display controller kterym lze prepinat obraz na levem a pravem oku.
Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 4 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 4 VR920 3D Stereo Control Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x05 EP 5 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 1
Ovladani displayu probiha na EP 5 OUT (0x05). Inicializace se provadi zpravou typu control transfer v nasledujicim nastaveni:
bmRequestType 0x40 bRequest 0x0009 wValue 0x0302 wIndex 0x0003 wLength 0x0010 data 0x02 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Kompletni inizializace zarizeni a ovladani leveho/praveho oka v PyUSB:
import usb # nalezeni zarizeni dev = usb.core.find(idVendor = 0x1bae, idProduct = 0x0002) if dev is None: raise ValueError('Device not found') for i in range(4): try: dev.detach_kernel_driver(i) dev.detach_kernel_head(i) except: pass # nalezeni EP 5 OUT epx = None dev.set_configuration(1) for cfg in dev: for intf in cfg: for ep in intf: if ep.bEndpointAddress is 0x05 : epx = ep if epx is None: raise ValueError('ep not found') # inicializace dev.ctrl_transfer(0x40, 0x9, 0x302, 0x3, "\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") dev.ctrl_transfer(0x40, 0x9, 0x302, 0x3, "\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") epx.write("\x00") dev.ctrl_transfer(0x40, 0x9, 0x302, 0x3, "\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") # ovladani displayu epx.write("\x00") epx.write("\x01")
Obraz je v displayi udrzovan dokud mu neprijde zprava o jeho obnoveni (0x00/0x01).