[Xorg] Input device hotplug

Kristian Høgsberg krh at bitplanet.net
Fri Jun 25 06:48:46 PDT 2004


[ Joe, I'm cc'ing the list, I assume you meant to send to the list too ]

Joe Krahn wrote:
> Kristian Høgsberg wrote:
> ...
> 
>> One thing I'ld like to discuss is where to add the add and remove 
>> device interface -- I dont think XFree86-Misc is the right place.  My 
>> first approach to this was that the new functionality should be an 
>> Xorg private interface, but I'm thinking that maybe it would be better 
>> if it was a standardized extension to XInput.  In that case, is the 
>> proposed interface too Xorg specific?
> 
> 
> OK... the big problem is a total lack of XINPUT design docs. (Or at
> least that's how XFree86 was designed. I hope X.org is more interested
> in fixing this.)

Are you talking about the protocol design or the server internal 
(implementation) design? Or both?

> Improving XINPUT is definitely the place to do it correctly. I worked on
> this for a while some time ago, then Jim Gettys accepted the task as
> XFree86 XINPUT manager. I knew he could do a much better job than I,
> so I put it off until he had time to get going, but that never happened
> do to his time investment in freedesktop.org and x.org.
> 
> First, XINPUT has always had hotplugging ability. If you notice,
> the reference X server implementation has a list of "OffDevices".
> These are devices the server knows about, but are not available.

Yes, I did notice that list, but I think it is important that
hotplugging will work also for devices that wasn't previously 
configured.  If I buy a new device I should be able to just plug it in 
and use it without editing xorg.conf and restarting the server.

> XFree86 should have been designed to allow a configured-but-absent
> driver load, but remain OFF until the driver sees that it has become
> available. The current driver loading scheme has gotten mangled in
> this respect, because XFree86's XINPUT never had a written design
> plan. I think that needs to be done before a release contains
> hotplugging.

The configured-but-absent concept is useful, i.e. I don't want to 
configure my spaceball everytime I plug it in.  But I'm not sure the 
server needs to know about those devices.  The overall approach I have 
in mind is that the device detection mechanism/daemon is outside the 
server, and when an input device is found, this daemon tells the server 
to load the appropriate driver and add the device with a given list of 
options.

> One big problem in the current design is that the main Control()
> function is not used correctly. Driver loading and unloading should
> never open/close the actual device. That is the job of Control().
> Why is this important? Because a server that is switched away
> from it's VT is told to close and reopen it's devices via Control().

Sounds reasonable, I think one side effect of this problem is that there 
now is some confusion about what to do on DEVICE_INIT and what to do on 
DEVICE_ON.  In the current implementation it doesn't really matter 
because all devices are DEVICE_INIT'ed and then immediately DEVICE_OPEN'ed.

Another thing that confused me is PreInit() and DEVICE_INIT... are both 
really necessary?  Couldn't DEVICE_INIT code be moved to PreInit()?

> Some stuff I wrote up before:
> ---------------------------------------------------------------------
> Control() is intended to be the primary access point to the driver,
> named <device_name>Control. Here are it's functions:
> 
> <Name>Control:
> To keep things confusing, this function is pointed to by
> local->device_control, is called "deviceProc" in Xi docs, and is
> NOT related to XDeviceControl (that's the local->control_proc)
> 
> This process is to enable/disable/open/close a device.
> 
> DEVICE_INIT: Here is where you should make sure the device
> is present and working. If this fails, the driver should
> remain loaded, but the devices stays in the "Device OFF"
> list. OFF devices should get DEVICE_INIT called
> some time later to poll for the devices existence, such
> as just before replying to a ListDevices request.

Again, couldn't this be merged into PreInit()?

> DEVICE_ON: This is the signal to actually open the device.
> If local->flags & XI86_OPEN_ON_INIT, or it
> is a core device, this is called at initialization.
> Otherwise, open when XOpenDevice is first called.
> It is also called when restoring a VT switch.
> 
> DEVICE_OFF: Called by XFree86 only when switching to
> another VT. If the device is stateful, be sure to
> save state information to restore when DEVICE_ON is called.
> 
> DEVICE_CLOSE: Ideally, this should get called when
> XCloseDevice is called. Current XFree86 keeps all devices
> open at all times.
> 
> ---------------------------------------------------------------
> 
> Now, back to client commands for device controls:
> 
> Client controls should be via XChangeDeviceControl and
> XGetDeviceControl. But, this is the most incomplete command
> in the XINPUT spec. It is not very extensible.
> 
> One fix for these is to add more enums for the obviously-missing
> stuff like DEVICE_RESET, and specify a range of enums
> for private device-specific controls.
> 
> Or, instead of device-specific enums, just add a few enums
> for generic control commands similar to XClientMessage, that
> can send an ASCII control name, and an ASCII parameter value,
> or char/short/long binary data.
> 
> That still does not address the issue server notification for
> loading/unloading a driver. That part is more complicated that
> sending device control parameters, and probably is worth
> adding some new functions to XINPUT, such as XAddInputDevice.

I dont think XChangeDeviceControl is appropriate for adding and removing 
devices, since it operates on an pre-existing XDevice.  It should also 
work if you plug in a device that isn't mentioned in xorg.conf.

Another thing, I think that the options you specify with 
XAddInputDevice() should be the same or a subset of those you can change 
with the new verion of XChangeDeviceControl().  This way there would be 
only one option mechanism to implement.  I think the ASCII parameter 
name is nice, but I'm not sure the binary data is so useful... ASCII 
values should be sufficient I think.

> There are other issues as well: Relative versus absolute events
> are not handled correctly in XFree86. XChangePointerDevice and
> XChangeKeyboardDevice need to be redesigned with the idea of
> simultaneous core devices. etc, etc.

Right, so you basically toggle wether or not to send core events and 
drop the idea of a single core pointer?

> Anyone feel up to collaborating on ironing out the XINPUT
> implementation design docs, and potential XINPUT additions??

Yeah, I'm in.  I think there are two efforts here: documenting/cleaning 
up the XINPUT implementation and extending XINPUT to deal with hotplug 
and better device control.  We should  probably set up a wiki page where 
we can flesh out the proposed extensions and modifications to XINPUT.

Kristian




More information about the xorg mailing list