Thanks Eric--that was it exactly.  When I use the --attribute-walk option, I get all the right attributes and yes, the name of the serial attribute is "serial" not "idSerial".  Also, my vendor attribute is "vendor", not "idVendor".  Once I made these changes, your version of the rule works A-OK.

--patrick

On 03/16/2011 10:59 AM, Eric Perko wrote:
Since udev can match attributes from the lowest device level (ie the driver (ftdi_sio) ) or one level up the parent chain (so, say, generic USB at once point or even up to the PCI bus the USB connects to), you will also want to include the parent devices. To do this, include the "--attribute-walk" option when you run the udevadm query. See the attached udevadm output for a sample when I run "udevadm info -q all --attribute-walk" against my UVC webcam. Note that there are a number of "parent devices" that are more generic, such as the USB host controller in my PC. See http://reactivated.net/writing_udev_rules.html#udevinfo for the rules about using multiple parent devices when matching attributes in your udev rules. The short of it is that you have to pick a single parent device to match against.

Now, to address your earlier difficulty with the modification to that rule. I don't have an FTDI device handy, so I may be wrong, but is the serial you are trying to match actually on the same "parent device" as the idVendor attribute you are also matching against? If it's on a different parent device, that would be the source of the problem. If you aren't sure about it from the output (or if it looks correct), post the output of udevadm that you had above, but including the "--attribute-walk" option as well and I'll see if I spot anything weird. 

Though, thinking about it, I think the serial attribute would have to be on whatever device got selected by "idVendor" for me to include it later on in the %s{serial} bit in my symlink... Is it actually called "idSerial" or "serial" in the output from adding "--attribute-walk"?

Well... I was just handed an Arduino I had forgotten was around and checked udevadm. The issue is that the attribute you want to match on is called "serial" not "idSerial". Change your modification to the udev rule I posted accordingly and I would expect it to work just fine.

I definitely prefer the --attribute-walk version of udevadm since it outputs the actual names of the attributes (as udevinfo did) that you can match on in your udev rules.

- Eric