Late January 2007 I found a promising product from Canada, called Epiphan KVM2USB. In our company we have various types of rackable servers and control computers which are all “headless”, i.e. without keyboard, video or mouse (KVM).

Our actual portable KVM solutions are either rackable 1U height server terminals (heavy iron that the strongest of us carry around) or some collection of small flat screens and industrial keyboards with trackballs. Epiphan’s KVM2USB has a completely different approach. In this post I will evaluate the product and estimate its usefulness to our work.

Product description

Epiphan KVM2USB with cablesEpiphan KVM2USB product is based on a VGA frame grabber hardware box with a capacity to vehicle keyboard and PS/2 mouse signals through it. You would connect the hardware box on a laptop computer and this way use its keyboard, screen and mouse to pilot the headless computer.

The product package contains following items:

  • a small 80 mm x 54 mm x 23 mm (3.15″ x 2.125″ x 0.91″) hardware interface box (see the picture on the right)
  • a typical KVM cable that contains both the VGA video, keyboard and PS/2 mouse signals. This cable is rather short, about 1.2 meters (47″)
  • USB (2.0) cable, again a short one with its 90 cm (35″)
  • Note that there is no power cable but the hardware interface box gets its power from the USB

There is also an instruction booklet for all three major frame grabber products and an installation CD. The latter contains but commercial material and what comes to the software you are kindly invited to “download the latest driver from Epiphan’s web site”, which is an obvious thing to do, anyway.

Installation

The hardware installation is self explanatory, you just connect the cables.

The software installation consists of downloading the software (today’s version was 3.0.16.0020), unzip it and run the setup. You would get a “VGA2USB” camera icon on your desktop. As soon as you connect the hardware interface box with the USB cable, Windows PX will auto detect it and install the driver through the usual “found new hardware” procedure.
Now you can click on the camera icon and the application starts.

Usage

Epiphan KVM2USB test with Dell Latitude D610I installed the software on a Dell Latitude D610 laptop computer.

The application is one-for-all type for all frame grabbers in the Epiphan’s product line. You can clearly see that the functionalities that are related to image capture have been there well before the KVM mode, which is evidently an after-thought. The good point with this is that you can use the device for VGA screen captures. But that is not our main interest and I will talk about the KVM-mode only.
You enter the KVM mode either through the application menu or by clicking the middle mouse button when the VGA2USB application is running. While you are in the KVM mode, you are a prisoner of the VGA2USB application window. If you like to use your PC again, you would press the mouse middle button again.

We are in the PC (and Microsoft) world here, right? You may wonder what happens if you press Ctrl-Alt-Del. You cannot give the infamous three finger salute when you are in the KVM mode but you have to leave the KVM mode by pressing the mouse middle button, then select “Send Ctrl-Alt-Del” from the KVM menu and the get back into the KVM mode to follow up what ever action the Ctrl-Alt-Del sequence takes on the target system.

I tested the functionality on several systems: Dell desktop computers, Dell rackable servers and on various industrial computers (see picture). When connected on a running system with graphical desktop or a command line prompt the functionality is correct. The hardware interface box gets synchronized rapidly and you are in control quickly enough. The mouse movements are a bit sloppy but at acceptable level. Same thing with the keyboard strokes; you cannot expect the application to be for any other use but for maintenance purposes.

And here is the problem: When your system is running and doing well, you can access it with NX or Windows Remote Desktop connection even from your home and with much better usability than through this KVM solution. Where the KVM2USB could be really useful is the installation and the maintenance work. Anyway, that was the main reason why we got interested in this product in the first place. But we were disappointed as soon as we rebooted any of our test systems with the KVM2USB hooked on it.

The slow synchronization of the KVM2USB to the constantly altering video signals spoils it all. When you turn the machine on, for example the fast BIOS boot has already passed before the video signal synchronization is ready. Meanwhile, you have missed all the important points in the BIOS startup and on most systems that I tested you can but dream to be able to hit Del or F2 buttons to get into the BIOS settings. The next thing is the hard disk boot. Unfortunately, for example Red Hat Enterprise 4 boot gets you four different video transitions: GRUB, kernel terminal output, Red Hat Anaconda splash-scree and finally X11. In all these transition points you have to wait until the hardware interface box gets synchronized. And while waiting, you are missing most of the important information that could help you to debug why the system is not getting up correctly.

SDK

(jump to Conclusion)
I went back to Epiphan’s site to get the promised SDK. I got the version 2.2.16. Frankly, there is not much in the SDK. I looked at the Windows version because I was testing on a Windows XP based laptop. Essentially the “SDK” is an example Visual-C application to capture an image using the access to the device driver. Let’s see what ioctl-functions we have available:


/*
* IOCTL_VGA2USB_VIDEOMODE
*
* Detects video mode. If cable is disconnected, width and height are zero.
* Note that the vertical refresh rate is measured in milliHertz.
* That is, the number 59900 represents 59.9 Hz.
*
* Support: Linux, Windows, MacOS X
*/
typedef struct ioctl_videomode {
V2U_INT32 width; /* screen width, pixels */
V2U_INT32 height; /* screen height, pixels */
V2U_INT32 vfreq; /* vertical refresh rate, mHz */
} V2U_VideoMode;


/*
* IOCTL_VGA2USB_DEFAULTPARAMS
* IOCTL_VGA2USB_GETPARAMS
* IOCTL_VGA2USB_SETPARAMS
*
* IOCTL_VGA2USB_DEFAULTPARAMS fills V2U_GrabParameters structure with
* default capture parameters automatically selected by the driver. flags
* field is returned as zero. The defaults may change over time, especially
* after parameters of the input VGA sugnal have changed.
*
* Support: MacOS X
* Windows, Linux (IOCTL_VGA2USB_SETPARAMS only)
*/



typedef struct ioctl_setparams {
V2U_UINT32 flags; /* Validity flags for fields below */
/* When any of the fields below is used, */
/* corresponding V2U_FLAG_VALID_* flag is set */
/* otherwise the field is ignored */
V2U_INT32 hshift; /* Shifts image left (<0) or right(>0). */
/* Valid range depends on the video mode. */
/* Invalid values are rounded to the nearest */
/* valid value */
V2U_UINT8 phase; /* Pixel sampling phase, [0,31] */
V2U_UINT8 gain_r; /* Gain for the red channel, [0,255] */
V2U_UINT8 gain_g; /* Gain for the green channel, [0,255] */
V2U_UINT8 gain_b; /* Gain for the blue channel, [0,255] */
V2U_UINT8 offset_r; /* Offset for the red channel, [0,63] */
V2U_UINT8 offset_g; /* Offset for the green channel, [0,63] */
V2U_UINT8 offset_b; /* Offset for the blue channel, [0,63] */
V2U_INT32 vshift; /* Shifts image up or down */
/* Valid range depends on the video mode. */
/* Invalid values are rounded to the nearest */
/* valid value */
V2U_INT32 pllshift; /* Adjusts the PLL value */
V2U_INT32 grab_flags; /* Sets grab_flags */
V2U_INT32 grab_flags_mask; /* Marks which bits from grab_flags are used */
} V2U_GrabParameters;


/*
* IOCTL_VGA2USB_GRABFRAME
*
* Support: Linux, Windows, MacOS X
*/



typedef struct ioctl_grabframe {
void * pixbuf; /* IN should be filled by user process */
V2U_INT32 pixbuflen; /* IN should be filled by user process */
V2U_INT32 width; /* OUT width in pixels */
V2U_INT32 height; /* OUT height in pixels */
V2U_INT32 bpp; /* IN/OUT bits per pixel (16 or 24) and flags */
} V2U_GrabFrame;



/*
* IOCTL_VGA2USB_GETSN
*
* Support: Windows, Linux, MacOS X
*/
typedef struct ioctl_getsn {
char sn[32]; /* OUT serial number string */
} V2U_GetSN;
#define IOCTL_VGA2USB_GETSN IOCTL_VGA2USB_R(7,V2U_GetSN)


/*
* IOCTL_VGA2USB_SENDPS2
*
* Support: Windows, Linux
*/
typedef struct ioctl_sendps2 {
short addr;
short len;
unsigned char buf[64];
} V2U_SendPS2;

The above interface definitions do not provide us with anything usable to limit the video synchronization times. Apart the sendps2() the entire driver is clearly frame grabber oriented.

Conclusion

Epiphan’s KVM2USB is clearly a co-product to their frame grabber series. It is not a dedicated KVM product. KVM2USB could have done maybe better with the same hardware but with a firmware that is optimized for KVM usage only. As it is today, it is almost unusable for maintenance work of server level system if the system has to be rebooted. It may be useful on other type of systems, for example on embedded Windows systems without a screen. On embedded Linux systems I would rather use a serial console on a Bluetooth channel to have a command prompt.