[systemd-devel] how to get a device name matching .device to use into a dynamic at .unit ?

Pablo Saratxaga pablo at walon.org
Thu Jun 13 04:20:47 PDT 2013


Hello,

I'm learning (and appreciating) the new systemd; and I'm currently trying to
make it work to load some firmware, in the most generic way.


The hardware needing that firmware is a cheap bluetooth usb dongle;
so cheap that without loading the firware it just plain doesn't work.

So, the idea is to have udev trigger a generic systemd .service unit
that will call the user space firmware loader with the right parameters.

by default the firmware loader uses the interface name (eg: "hci0"), but
that isn't right for a generic solution; what if it actually is named "hci1" ?

I can however use the bdaddr adress instead, and it seems udev provides it
(without the colons) as ID_SERIAL_SHORT

However, in order to have the service properly show when listing services
with systemctl status, etc; and have it removed when device in unplugged,
I made the service BindTo= the generated .device

Problem is the generated .device unit has the interface name "hci0" in its
name.

So my questions are:

- how to get the interface name of a given device to use in a generic systemd
  service unit ? can udev provide that ? if not how to retrieve it ?
- is the udev variable ID_SERIAL_SHORT always holding the bdaddr of a bluetooth
  device ? if not, what is the way to write an udev rule so that a given device
  can be specifically identified ?

And here are the udev rules and systemd service files I wrote so far:

---------- /etc/udev/rules.d/60-brcm_patchram_plus_usb.rules ----------
SUBSYSTEM!="usb", GOTO="brcm_patchram_plus_usb_end"
ACTION!="add", GOTO="brcm_patchram_plus_usb_end"
## FIXME: should be lines like this (with TAG+="systemd"), but I'm unable to make it work (old systemd at home?)
##SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="0a5c", ENV{ID_MODEL_ID}=="21e8", GROUP="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}="brcm_patchram_plus_usb@$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.service"
######
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e[1358b-d]", GROUP="usb", RUN+="/usr/bin/systemctl start brcm_patchram_plus_usb@$env{ID_VENDOR_ID}_$env{ID_MODEL_ID}.service"
# end
LABEL="brcm_patchram_plus_usb_end"
------------------------------------------------------------------------

---------- /etc/systemd/system/brcm_patchram_plus_usb at .service----------
[Unit]
Description=uploading firmware to Broadcom USB bluetooth device
# fixme: how to get the bluez device name? it could be hci1, hci2,...
Requires=sys-subsystem-bluetooth-devices-hci0.device
After=sys-subsystem-bluetooth-devices-hci0.device
BindTo=sys-subsystem-bluetooth-devices-hci0.device

[Service]
Type=simple
RemainAfterExit=yes
# fixme: how to get the bluez device name? it could be hci1, hci2,...
ExecStart=/usr/bin/brcm_patchram_plus_usb --patchram /lib/firmware/fw-%i.hcd hci0

[Install]
Alias=fw-upload-broadcom-bluetooth.service

[Service]
TimeoutSec=300
------------------------------------------------------------------------

(another question: is [Install] section needed at all? the service can be run
only when device is plugged, and has to be rerun again with each plug; so
doing systemctl {enable|disable} is pointless)

The automatically generated .device units are:
sys-devices-pci0000:00-0000:00:1a.0-usb1-1\x2d1-1\x2d1:1.0-bluetooth-hci0.device 
	loaded active plugged       /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1:1.0/bluetooth/hci0
sys-subsystem-bluetooth-devices-hci0.device
	loaded active plugged       /sys/subsystem/bluetooth/devices/hci0



Thanks

-- 
Ki ça vos våye bén,
Pablo Saratxaga

http://chanae.walon.org/pablo/		PGP Key available, key ID: 0xD9B85466
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20130613/dc481b76/attachment.pgp>


More information about the systemd-devel mailing list