Tag Archive for 'udev'

Fixing webcam flicker in Linux with udev

I recently got a new Dell XPS 13 (9360) laptop for work and it’s running Fedora pretty much perfectly.

However, when I load up Cheese (or some other webcam program) the video from the webcam flickers. Given that I live in Australia, I had to change the powerline frequency from 60Hz to 50Hz to fix it.

sudo dnf install v4l2-ctl
v4l2-ctl --set-ctrl power_line_frequency=1

I wanted this to be permanent each time I turned my machine on, so I created a udev rule to handle that.

cat << EOF | sudo tee /etc/udev/rules.d/50-dell-webcam.rules
SUBSYSTEM=="video4linux", \
SUBSYSTEMS=="usb", \
ATTRS{idVendor}=="0c45", \
ATTRS{idProduct}=="670c", \
PROGRAM="/usr/bin/v4l2-ctl --set-ctrl \
power_line_frequency=1 --device /dev/%k", \
SYMLINK+="dell-webcam"
EOF

It’s easy to test. Just turn flicker back on, reload the rules and watch the flicker in Cheese automatically disappear 🙂

v4l2-ctl --set-ctrl power_line_frequency=0
sudo udevadm control --reload-rules && sudo udevadm trigger

Of course I also tested with a reboot.

It’s easy to do with any webcam, just take a look on the USB bus for the vendor and product IDs. For example, here’s a Logitech C930e (which is probably the nicest webcam I’ve ever used, and also works perfectly under Fedora).

Bus 001 Device 022: ID 046d:0843 Logitech, Inc. Webcam C930e

So you would replace the following in your udev rule:

  • ATTRS{idVendor}==“046d”
  • ATTRS{idProduct}==“0843”
  • SYMLINK+=“c930e”

Note that SYMLINK is not necessary, it just creates an extra /dev entry, such as /dev/c930e, which is useful if you have multiple webcams.

Telstra NextG working with MF626 USB modem

Essentially, these devices are detected as a SCSI CD device so that Windows and Mac users can install the drivers and software to make the device work and connect to the net. They then switch product ID to activate the device as a modem. Unfortunately this didn’t work properly in Ubuntu, and would only detect as a mass storage device. With this fix, it can be hot plugged and still work :-O

Thanks to a post in the Ubuntu forums, I finally got the Telstra NextG wireless working for a friend of Mike, on his Jaunty netbook.

Here’s what I did, for for future reference:

1) Install udev-extras which provides some extra hal scripts.
sudo apt-get install udev-extras

2) Install the Debian Sid i386 usb-modeswitch package, rather than build from scratch.
http://packages.debian.org/sid/usb-modeswitch
sudo dpkg -i usb-modeswitch_0.9.7-1_i386.deb

3) Uncommented the “ZTE MF626” entry of the usb-modeswitch config (including the # comments!).
sudo vim /etc/usb_modeswitch.conf

ZTE MF628+ (tested version from Telia / Sweden)
ZTE MF626

Contributor: Joakim Wennergren

DefaultVendor= 0x19d2
DefaultProduct= 0x2000

TargetVendor= 0x19d2
TargetProduct= 0x0031

MessageEndpoint=0x01
MessageContent=”55534243123456782000000080000c8501 0101180101010101000000000000″

4) Create new HAL rule to activate the device as a modem.
sudo vim /usr/share/hal/fdi/information/20thirdparty/20-zte-mf626.fdi

<!– -*- SGML -*- –>
<deviceinfo version=”0.2″>
<device>
<!– ZTE MF626 HSDPA USB Modem –>
<match key=”@info.parent:usb.vendor_

id” int=”0x19d2″>
<match key=”@info.parent:usb.product_id” int=”0x0031″>
<match key=”@info.parent:usb.interface.number” int=”3″>
<append key=”modem.command_sets” type=”strlist”>GSM-07.07</append>
<append key=”modem.command_sets” type=”strlist”>GSM-07.05</append>
<append key=”info.capabilities” type=”strlist”>modem</append>
</match>
</match>
</match>
</device>
</deviceinfo>

5) Create a new udev rule to auto run usb_modeswitch when the device is plugged in.
sudo vim /etc/udev/rules.d/90-zte.rules

ACTION!=”add”, GOTO=”ZTE_End”

SUBSYSTEM==”usb”, SYSFS{idProduct}==”2000″, SYSFS{idVendor}==”19d2″, GOTO=”ZTE_ZeroCD”

LABEL=”ZTE_ZeroCD”
RUN+=”/usr/sbin/usb_modeswitch -W -c /etc/usb_modeswitch.conf”

LABEL=”ZTE_End”

6) Remove the HAL FDI cache and reboot.
sudo rm /var/cache/hald/fdi-cache
sudo reboot

7) Then after a reboot, I plug in the device, wait for it to go blue, then connect to Telstra (Next G Card) in Network Manager.

Works!