This is a good way to fix the issue. I don't think Peter has started
to clean the tablet_id code. So your patch should be fine. You might
want to update the tablet_ids for the ISDV4 devices as well.  Here is
a list of the existing serial IDs:

 WACf000 - WACf007
 penabled  (translated into 0x90)

   WACf008 - WACf00A
   penabled with 1FGT  (translated into 0x93)

   WACf00B - WACf00E
   penabled with 2FGT  (translated into 0xE3)

   WACf010
   2FGT only (translated into 0xE2)

Please make a patch for the master.

Ping

On Sat, Feb 13, 2010 at 6:18 PM, Chris Bagwell <[email protected]> wrote:
> OK, found my issue with staying in absolute mode and its same issue
> Jason/Ping already saw.  I hadn't ported one patch related to case
> when the Touch device happens to be first one processed by X driver.
>
> The main issue is that USB devices are not opened until after return
> from xf86WcmInit().  common->tablet_id is set only when you open USB
> device and so you can not rely on its value inside xf86WcmInit().
>
> There is work around code in linuxwacom's xf86WcmRegisterX11Devices()
> that basically duplicates logic that exists in xf86WcmInit().  Instead
> of duplicating logic, I'd prefer to get tablet_id set correctly at
> this early phase.
>
> Below is idea of my patch.  If its approved, I'll resubmit as git
> patch.  Also, it would lay the path to centralize all the default
> value inits in xf86WcmAllocate() instead of needing to have HW
> specific values *after* that function call since it took so long to
> get value of tablet_id.
>
> Peter, there was one mention on list of you redo'ing/cleaning up logic
> related to tablet_id.  Does this patch conflict with your future
> ideas?
>
> Chris
>
> diff --git a/src/wcmConfig.c b/src/wcmConfig.c
> index df4529d..ac8fbaf 100644
> --- a/src/wcmConfig.c
> +++ b/src/wcmConfig.c
> @@ -34,7 +34,8 @@ extern int wcmNeedAutoHotplug(LocalDevicePtr local,
>  extern int wcmAutoProbeDevice(LocalDevicePtr local);
>  extern int wcmParseOptions(LocalDevicePtr local, unsigned long* keys);
>  extern void wcmHotplugOthers(LocalDevicePtr local, unsigned long* keys);
> -extern int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys);
> +extern int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys,
> +                            int* tablet_id);
>
>  static int xf86WcmAllocate(LocalDevicePtr local, char* name, int flag);
>
> @@ -328,6 +329,7 @@ static LocalDevicePtr xf86WcmInit(InputDriverPtr
> drv, IDevPtr dev, int flags)
>        static int      numberWacom = 0;
>        int             need_hotplug = 0;
>        unsigned long   keys[NBITS(KEY_MAX)];
> +       int             tablet_id;
>
>        gWacomModule.wcmDrv = drv;
>
> @@ -343,7 +345,7 @@ static LocalDevicePtr xf86WcmInit(InputDriverPtr
> drv, IDevPtr dev, int flags)
>        xf86CollectInputOptions(local, default_options, NULL);
>
>        /* initialize supported keys */
> -       wcmDeviceTypeKeys(local, keys);
> +       wcmDeviceTypeKeys(local, keys, &tablet_id);
>
>        device = xf86SetStrOption(local->options, "Device", NULL);
>        type = xf86FindOptionValue(local->options, "Type");
> @@ -370,6 +372,10 @@ static LocalDevicePtr xf86WcmInit(InputDriverPtr
> drv, IDevPtr dev, int flags)
>
>        common->wcmDevice = device;
>
> +       /* Hardware specific initialization relies on tablet_id.  */
> +       if (!common->tablet_id)
> +               common->tablet_id = tablet_id;
> +
>        /* Auto-probe the device if required, otherwise just noop. */
>        if (numberWacom)
>                if (!wcmAutoProbeDevice(local))
> diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c
> index 18d2a66..cb9a8a6 100644
> --- a/src/wcmValidateDevice.c
> +++ b/src/wcmValidateDevice.c
> @@ -36,7 +36,8 @@ void wcmHotplugOthers(LocalDevicePtr local, unsigned
> long* keys);
>  int wcmAutoProbeDevice(LocalDevicePtr local);
>  int wcmParseOptions(LocalDevicePtr local, unsigned long* keys);
>  int wcmIsDuplicate(char* device, LocalDevicePtr local);
> -int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys);
> +int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys,
> +                     int* tablet_id);
>
>  /* xf86WcmCheckSource - Check if there is another source defined this device
>  * before or not: don't add the tool by hal/udev if user has defined at least
> @@ -179,13 +180,15 @@ Bool wcmIsAValidType(const char* type, unsigned
> long* keys)
>  }
>
>  /* Choose valid types according to device ID */
> -int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys)
> +int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys,
> +                     int* tablet_id)
>  {
>        int ret = 1, i;
>        int fd = -1, id = 0;
>        char* device, *stopstring;
>        char* str = strstr(local->name, "WACf");
>        struct serial_struct tmp;
> +       struct input_id wacom_id;
>
>        device = xf86SetStrOption(local->options, "Device", NULL);
>
> @@ -260,7 +263,16 @@ int wcmDeviceTypeKeys(LocalDevicePtr local,
> unsigned long* keys)
>                                "ioctl USB key bits.\n", local->name);
>                        ret = 0;
>                }
> +               if (ioctl(fd, EVIOCGID, &wacom_id) < 0)
> +               {
> +                       xf86Msg(X_ERROR, "%s: wcmDeviceTypeKeys unable to "
> +                               "ioctl Device ID.\n", local->name);
> +                       ret = 0;
> +               }
> +               else
> +                       *tablet_id = wacom_id.product;
>        }
> +
>        close(fd);
>        return ret;
>  }
>

------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to