--- 1/Makefile +++ 1/Makefile @@ -20,6 +20,10 @@ PREFIX=/usr PREFIX=$(DESTDIR)/usr +# USB_PRINTERID is also installed there because it is needed by the FWloader +FWLOADERDIR=$(DESTDIR)/sbin +FIRMWAREDIR=$(DESTDIR)/lib/firmware + # Pathnames for this package... BIN=$(PREFIX)/bin SHAREZJS=$(PREFIX)/share/foo2zjs @@ -661,21 +665,21 @@ fi; \ done # foo2zjs Firmware files (if any) - $(INSTALL) $(LPuid) $(LPgid) -m 775 -d $(SHAREZJS)/firmware/ + $(INSTALL) $(LPuid) $(LPgid) -m 775 -d $(FIRMWAREDIR)/ for i in sihp1*.img; do \ if [ -f $$i ]; then \ base=`basename $$i .img`; \ ./arm2hpdl $$i >$$base.dl; \ - $(INSTALL) -c -m 644 $$base.dl $(SHAREZJS)/firmware/; \ + $(INSTALL) -c -m 644 $$base.dl $(FIRMWAREDIR)/; \ fi; \ done # foo2xqx Firmware files (if any) - $(INSTALL) $(LPuid) $(LPgid) -m 775 -d $(SHAREXQX)/firmware/ + $(INSTALL) $(LPuid) $(LPgid) -m 775 -d $(FIRMWAREDIR)/ for i in sihpP*.img; do \ if [ -f $$i ]; then \ base=`basename $$i .img`; \ ./arm2hpdl $$i >$$base.dl; \ - $(INSTALL) -c -m 644 $$base.dl $(SHAREXQX)/firmware/; \ + $(INSTALL) -c -m 644 $$base.dl $(FIRMWAREDIR)/; \ fi; \ done # foo2oak ICM files (if any) @@ -818,6 +822,8 @@ UDEVDIR=$(DESTDIR)/etc/udev/rules.d RULES=hplj10xx.rules install-udev: + [ -d $(FWLOADERDIR) ] || install -d -m 755 $(FWLOADERDIR)/ + install -c -m 755 foo2zjs-loadfw $(FWLOADERDIR)/ [ -d $(UDEVDIR) ] || install -d -m 755 $(UDEVDIR)/ install -c -m 644 $(RULES) $(UDEVDIR)/11-$(RULES) --- foo2zjs-loadfw +++ foo2zjs-loadfw @@ -0,0 +1,151 @@ +#!/bin/sh + +# foo2zjs-loadfw: +# +# Hotplug script for 100[05],1018,1020,P100[5678],P1505,P1505n +# USB laser printers. The model number +# that this script deals with is determined from the udev env. +# +# Used to download firmware automatically into the printer when it +# is powered up or plugged into the USB port. +# +# The inspiration fo this script is from: +# Oscar Santacreu. Alicante-Spain (2002) +# Mike Morgan (2004) +# Modified by Stefan Schweizer (2005) to work as a udev-RUN-script + +# +# Directory to find downloadable HP firmware files sihpMMMM.dl +# +FWDIR=/lib/firmware + +# +# Program used to determine USB printer id information +# +USBID=/bin/usb_printerid + +# +# Timeout to load firmware +# +TIMEOUT=6 + +# +# Figure out how to log our messages +# +if [ -t 1 ]; then + # Running from a tty... + log() { + echo "$0: $@" + } +elif [ -x /usr/bin/logger ]; then + # Have logger... + log() { + logger -t "$0" -- "$@" + } +else + # No logger... + log() { + echo "$0: $@" >> /var/log/messages + } +fi + +# +# Figure out the model number from the argument of this script +# +MODELNAME='' +FWMODEL='' +case "$1" in +P1005) + MODEL=P1005 + ;; +P1006) + MODEL=P1006 + ;; +P1007) + MODEL=P1007 + FWMODEL=P1005 + ;; +P1008) + MODEL=P1008 + FWMODEL=P1006 + ;; +P1505) + MODEL=P1505 + ;; +P1505n) + MODEL=P1505n + FWMODEL=P1505 + ;; +1000) + MODEL=1000 + MODELNAME="hp LaserJet $MODEL" + ;; +1005) + MODEL=1005 + MODELNAME="hp LaserJet $MODEL" + ;; +1018) + MODEL=1018 + ;; +1020) + MODEL=1020 + ;; +*) + log "Only HP LaserJet 100[05],1018,1020,P100[5678],P1505,P1505n are supported" + log "You need to supply one of these on the cmdline: $0 10**" + exit + ;; +esac +: ${MODELNAME:="HP LaserJet $MODEL"} +: ${FWMODEL:="$MODEL"} + +if [ -n "$2" ]; then + DEVNAME=$2 +elif [ -n "$DEVNAME" ]; then + log 'using $DEVNAME' +else + log "You need to either have $DEVNAME set in the environment or supply it on the cmdline, like:" + log "$0 10** /dev/usb/lp0" + exit 1 +fi + +# +# Procedure to load a single device with firmware +# +load1() { + fw="$FWDIR/sihp$FWMODEL.dl" + if [ ! -f "$fw" ]; then + log "Missing HP LaserJet $MODEL firmware file $fw" + log "...read foo2zjs installation instructions and run ./getweb $MODEL" + return 1 + fi + + log "loading HP LaserJet $MODEL firmware $fw to $DEVNAME ..." + if cat $fw > $DEVNAME; then + sleep $TIMEOUT + log "... download successful." + else + log "... download failed." + fi + return 0 +} + +# +# OK, now download firmware to any printers that need it +# +if [ -x $USBID ]; then + if $USBID $DEVNAME | grep "$MODELNAME" 2> /dev/null; then + # This is a LaserJet 100x + if $USBID $DEVNAME | grep 'FWVER' 2> /dev/null; then + log "HP LaserJet $MODEL firmware already loaded into $DEVNAME" + else + # Firmware is not yet loaded + load1 "$DEVNAME" + fi + else + log "No supported printer found." + fi +else + log "HP LaserJet $MODEL firmware was not downloaded..." + log "...couldn't find $USBID" +fi --- hplj1000 +++ hplj1000 @@ -35,7 +35,7 @@ # # Directory to find downloadable HP firmware files sihpMMMM.dl # -FWDIR=/usr/share/foo2zjs/firmware +FWDIR=/lib/firmware # # Program used to determine USB printer id information --- hplj10xx.rules +++ hplj10xx.rules @@ -1,36 +1,21 @@ -#Own udev rule for HP Laserjet 1000 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="hp LaserJet 1000", NAME="usb/%k", \ - SYMLINK+="hplj1000-%n", MODE="0666", RUN+="/etc/hotplug/usb/hplj1000" -#Own udev rule for HP Laserjet 1005 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="hp LaserJet 1005 series", NAME="usb/%k", \ - SYMLINK+="hplj1005-%n", MODE="0666", RUN+="/etc/hotplug/usb/hplj1005" -#Own udev rule for HP Laserjet 1018 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet 1018", NAME="usb/%k", \ - SYMLINK+="hplj1018-%n", MODE="0666", RUN+="/etc/hotplug/usb/hplj1018" -#Own udev rule for HP Laserjet 1020 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet 1020", NAME="usb/%k", \ - SYMLINK+="hplj1020-%n", MODE="0666", RUN+="/etc/hotplug/usb/hplj1020" -#Own udev rule for HP Laserjet P1005 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet P1005", NAME="usb/%k", \ - SYMLINK+="hpljP1005-%n", MODE="0666", RUN+="/etc/hotplug/usb/hpljP1005" -#Own udev rule for HP Laserjet P1006 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet P1006", NAME="usb/%k", \ - SYMLINK+="hpljP1006-%n", MODE="0666", RUN+="/etc/hotplug/usb/hpljP1006" -#Own udev rule for HP Laserjet P1007 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet P1007", NAME="usb/%k", \ - SYMLINK+="hpljP1007-%n", MODE="0666", RUN+="/etc/hotplug/usb/hpljP1007" -#Own udev rule for HP Laserjet P1008 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet P1008", NAME="usb/%k", \ - SYMLINK+="hpljP1008-%n", MODE="0666", RUN+="/etc/hotplug/usb/hpljP1008" -#Own udev rule for HP Laserjet P1505 -KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", \ - SYSFS{product}=="HP LaserJet P1505", NAME="usb/%k", \ - SYMLINK+="hpljP1505-%n", MODE="0666", RUN+="/etc/hotplug/usb/hpljP1505" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="3d17", RUN+="/sbin/foo2zjs-loadfw P1005 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="3e17", RUN+="/sbin/foo2zjs-loadfw P1006 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="4817", RUN+="/sbin/foo2zjs-loadfw P1007 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="4917", RUN+="/sbin/foo2zjs-loadfw P1008 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="3f17", RUN+="/sbin/foo2zjs-loadfw P1505 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="4017", RUN+="/sbin/foo2zjs-loadfw P1505n $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="0517", RUN+="/sbin/foo2zjs-loadfw 1000 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="1317", RUN+="/sbin/foo2zjs-loadfw 1005 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="4117", RUN+="/sbin/foo2zjs-loadfw 1018 $tempnode" +ACTION=="add", KERNEL=="lp*", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", \ + ATTRS{idProduct}=="2b17", RUN+="/sbin/foo2zjs-loadfw 1020 $tempnode" +