Except two typos (commented inline), reviewed-by: Ping Cheng <pingli...@gmail.com> for the patchset.
On Sun, Feb 14, 2010 at 5:35 PM, <ch...@cnpbagwell.com> wrote: > From: Chris Bagwell <ch...@cnpbagwell.com> > > common->tablet_id is used in wcmInit() to decide things > like defaulting to relative mode for bamboo P&T's but > it is not set until after return from first call to > wcmInit(). > > Now qeury and store the tablet_id at same time that we are query > discoverying its other features. discovering > > Call to get USB product ID is no longer needed in usbWcmInit() > since tablet_id contains correct value. > > Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com> > --- > src/wcmConfig.c | 9 +++++++-- > src/wcmUSB.c | 34 +++++++++++++--------------------- > src/wcmValidateDevice.c | 33 +++++++++++++++++++++++++++++++-- > 3 files changed, 51 insertions(+), 25 deletions(-) > > diff --git a/src/wcmConfig.c b/src/wcmConfig.c > index 30dafe1..b5d07f2 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 wcmAllocate(LocalDevicePtr local, char* name, int flag); > > @@ -323,6 +324,7 @@ static LocalDevicePtr wcmInit(InputDriverPtr drv, IDevPtr > dev, int flags) > static int numberWacom = 0; > int need_hotplug = 0; > unsigned long keys[NBITS(KEY_MAX)]; > + int tablet_id = 0; > > gWacomModule.wcmDrv = drv; > > @@ -338,7 +340,7 @@ static LocalDevicePtr wcmInit(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"); > @@ -365,6 +367,9 @@ static LocalDevicePtr wcmInit(InputDriverPtr drv, IDevPtr > dev, int flags) > > common->wcmDevice = device; > > + /* Hardware specific initialization relies on 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/wcmUSB.c b/src/wcmUSB.c > index 954af06..3d0ec45 100644 > --- a/src/wcmUSB.c > +++ b/src/wcmUSB.c > @@ -503,7 +503,6 @@ static struct > Bool usbWcmInit(LocalDevicePtr local, char* id, float *version) > { > int i; > - struct input_id sID; > unsigned long keys[NBITS(KEY_MAX)] = {0}; > WacomDevicePtr priv = (WacomDevicePtr)local->private; > WacomCommonPtr common = priv->common; > @@ -511,8 +510,7 @@ Bool usbWcmInit(LocalDevicePtr local, char* id, float > *version) > DBG(1, priv, "initializing USB tablet\n"); > *version = 0.0; > > - /* fetch vendor, product, and model name */ > - ioctl(local->fd, EVIOCGID, &sID); > + /* fetch model name */ > ioctl(local->fd, EVIOCGNAME(sizeof(id)), id); > > /* retrieve tool type, device type and buttons from the kernel */ > @@ -522,26 +520,20 @@ Bool usbWcmInit(LocalDevicePtr local, char* id, float > *version) > return FALSE; > } > > - /* vendor is wacom */ > - if (sID.vendor == WACOM_VENDOR_ID) > - { > - common->tablet_id = sID.product; > - > - for (i = 0; i < sizeof (WacomModelDesc) / sizeof > (WacomModelDesc [0]); i++) > - if (common->tablet_id == WacomModelDesc [i].model_id) > - { > - common->wcmModel = WacomModelDesc [i].model; > - common->wcmResolX = WacomModelDesc [i].xRes; > - common->wcmResolY = WacomModelDesc [i].yRes; > - } > - > - if (common->wcmModel && > - strstr(common->wcmModel->name, "TabletPC")) > + for (i = 0; i < sizeof (WacomModelDesc) / sizeof (WacomModelDesc > [0]); i++) > + if (common->tablet_id == WacomModelDesc [i].model_id) > { > - /* For penabled Tablet PCs, Tablet PC Button > - * are on by default */ > - common->wcmTPCButtonDefault = 1; > + common->wcmModel = WacomModelDesc [i].model; > + common->wcmResolX = WacomModelDesc [i].xRes; > + common->wcmResolY = WacomModelDesc [i].yRes; > } > + > + if (common->wcmModel && > + strstr(common->wcmModel->name, "TabletPC")) > + { > + /* For penabled Tablet PCs, Tablet PC Button > + * are on by default */ > + common->wcmTPCButtonDefault = 1; > } > > if (!common->wcmModel) > diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c > index 07632de..271f918 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); > > /* wcmCheckSource - 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 > @@ -184,7 +185,8 @@ Bool wcmIsAValidType(const char* type, unsigned long* > keys) > device ID. This matching only works for wacom devices (serial ID of > WACf), all others are simply assumed to be pen + erasor. > */ > -int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys) > +int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys, > + int* tablet_id) > { > int ret = 1; > int fd = -1; > @@ -201,6 +203,8 @@ int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned > long* keys) > return 0; > } > > + *tablet_id = 0; > + > /* serial ISDV4 devices */ > if (ioctl(fd, TIOCGSERIAL, &tmp) == 0) > { > @@ -248,9 +252,25 @@ int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned > long* keys) > keys[LONG(BTN_TOOL_PEN)] &= ~BIT(BTN_TOOL_PEN); > keys[LONG(BTN_TOOL_RUBBER)] &= ~BIT(BTN_TOOL_RUBBER); > } > + > + /* 0x9a and 0x9f are only detected by communicating > + * with device. This means tablet_id will be updated/refined > + * at later stage and true knowledge of capacitive > + * support will be delayed until that point. > + */ > + if (id >= 0x0 && id <= 0x7) > + *tablet_id = 0x90; > + else if (id >= 0x8 && id <= 0xa) > + *tablet_id = 0x93; > + else if (id >= 0xb && id <= 0xe) > + *tablet_id = 0xe3; > + else if (id == 0x10) > + *tablet_id = 0xe2; > } > else /* USB devices */ > { > + struct input_id wacom_id; > + > if (ioctl(fd, EVIOCGBIT(EV_KEY, (sizeof(unsigned long) > * NBITS(KEY_MAX))), keys) < 0) > { > @@ -258,6 +278,15 @@ 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; > -- > 1.6.6 > > > ------------------------------------------------------------------------------ > 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 > Linuxwacom-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel > ------------------------------------------------------------------------------ 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 Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel