LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - General (https://www.linuxquestions.org/questions/linux-general-1/)
-   -   loading firmware on USB device with udev (https://www.linuxquestions.org/questions/linux-general-1/loading-firmware-on-usb-device-with-udev-679598/)

559jmp 10-28-2008 12:58 PM

loading firmware on USB device with udev
 
Hi,

I am trying to use udev to load the firmware into a usb device that I have. The device is a high speed analog to digital converter. I was given the rule and accessloader.sh script from somebody (who is no longer around so I cannot ask him). In the rule the RUN command is issued(shown below)

1) how can I tell if the script is being called when udevruns ?


The path to the device varies when I connect the device :

/dev/bus/usb/00x/00y

When run udevtest it requires the path to the device

priceless:/home/jprice # ls /dev/bus/usb/003
001 016

priceless:/home/jprice # udevtest /dev/usb/bus/003
unable to open device '/dev/usb/bus/003'


I know one issue is figuring out why the device cannot be opened even
if the path is manually specified. Permission is not an issue. I run as root.

But the other issue is how can udev know what x and y are when it runs ?

(if I know what x and why are I can specify the full path to the device in the RUN command in the rule)



A) My rule file contains :

SUBSYSTEM=="usb", SYSFS{idVendor}=="1605", SYSFS{idProduct}=="8001", RUN+="/usr/share/usb/accesloader.sh --chmod --8001"


B)the script accesloader.sh is

It looks like he exected $DEVICE to be set already be set but am not sure where. I think he may have thought it was set by udev.



#!/bin/sh
#This script should work for all ACCES USB devices being produced at the time it was written.

echo performing operation: $1
echo performing on device: $DEVICE

#!/bin/sh

#This script should work for all ACCES USB devices being produced at the time it was written.
#A special thanks go to David Mattes (mattes AT nixnux.org) for providing a really simple version
#that this was built off of


echo performing operation: $1
echo performing on device: $DEVICE


if [ $1 == "--load" ]
then
case $2 in
"--8001") hexfile="/usr/share/usb/atod.hex";;
"--0010") hexfile="/usr/share/usb/atod.hex";;
"--0001") hexfile="/usr/share/usb/atod.hex";;
"--4001") hexfile="/usr/share/usb/atod.hex";;
"--0020") hexfile="/usr/share/usb/atod.hex";;
"--0040") hexfile="/usr/share/usb/atod.hex";;
"--0030") hexfile="/usr/share/usb/atod.hex";;
*) hexfile="invalid";;
esac
echo $hexfile
echo "attempting to fxload firmware"
`/sbin/fxload -t fx2 -D $DEVICE -I $hexfile`
fi

if [ $1 == "--chmod" ]
then
chmod 0666 $DEVICE
fi



C) when I run udevmonitor I see :

UEVENT[1225215075.017604] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2
UEVENT[1225215075.017766] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2/usbdev3.15_ep00
UEVENT[1225215075.017787] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2/3-2:1.0
UEVENT[1225215075.017806] add@/class/usb_device/usbdev3.15
UDEV [1225215075.070469] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2
UDEV [1225215075.100957] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2/usbdev3.15_ep00
UDEV [1225215075.179352] add@/devices/pci0000:00/0000:00:02.1/usb3/3-2/3-2:1.0
UDEV [1225215075.224303] add@/class/usb_device/usbdev3.15



Thank You for help

Jeff

pinniped 10-29-2008 06:49 AM

So the manufacturer hasn't updated the driver to use the kernel's firmware loader feature?

Anyway, what names do you expect in 'DEVICE'? It is obviously an environment variable, but you need to set that somehow - for example, something like this inside your udev rule:

ENV{DEVICE}="%k"

or

ENV{DEVICE}="/dev/bus/usb/$env{BUSNUM}/$env{DEVNUM}"

jmp559 11-09-2008 10:50 PM

thank you Pinniped , it works !
 
Thank You Pinniped !

Your suggestion solved it. I really appreciate it, and learned a bit about udev as well.

Just a small note :

I had to use $attr{busnum} $attr{devnum}

rather than $env(BUSNUM} $env{DEVNUM}


I am using : Redhat - Fedora release 9 (Sulphur)

Jeff


All times are GMT -5. The time now is 12:57 AM.