2012年04月15日 EPSON PM-3500C をUSB接続で利用する場合の注意
_ EPSON PM-3500C をUSB接続で利用する場合の注意
PM-3500Cを含む多くのEPSONプリンタでは、単純にUSBポートに接続するだけでは、カーネルはちゃんと認識しているが、いざデータを送っても全く反応しない。Linux USB FAQ:My Epson printer doesn't print anything.によると、以下のデータをプリンタに送ってやらないとパラレルモードからUSBモードに切り替わらないということらしい。
echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20\x0a" >/dev/usblp0
実際、上記の操作を行ったら、
echo -e "aaa\f" >/dev/usblp0
で "aaa" が印字された。
_ LPRng-3.8.35
Slackware-11.0 + kernel-2.6.17.14という若干古めな環境に、EPSON PM-3500CをUSBで接続することにしたのだが、そのマシンというのは、このmyh.no-ip.orgのこと。常時起動マシンに繋げるのだから、lpd的なものを立ち上げてネットワーク越しに、奥さん(Linux)や息子のPC(Windows7)から常に印字できるようにしたい。
さすがにSlackware-11.0という古い環境でも、プリント環境はCUPSになっている。しかしこちらはlpd止まりの知識しか持ち合わせていない。また、このマシンはXorgは起動していないので、ブラウザベースで管理するCUPSではちと勝手が悪い...。
と、都合の良い理由をつけて、(いにしえの)LPRngをインストールした。
LPRng-3.8.35
- tar xvzf LPRng-3.8.35.tgz
- cd LPRng-3.8.35
- vi Makefile.in
*** Makefile.in.ORG 2012-04-15 21:13:45.000000000 +0900 --- Makefile.in 2012-04-15 21:14:28.000000000 +0900 *************** *** 45,51 **** LPD_CONF_PATH=\"@LPD_CONF_PATH@\" PRINTCAP_PATH=\"@PRINTCAP_PATH@\" LPD_PATH=\"@LPD_DIR@/lpd\" ! SHELL="@SHELL@" LOCKFILE=\"@LOCKFILE@\" CONFIG_SUBDIR="@CONFIG_SUBDIR@" PSHOWALL="@PSHOWALL@" --- 45,51 ---- LPD_CONF_PATH=\"@LPD_CONF_PATH@\" PRINTCAP_PATH=\"@PRINTCAP_PATH@\" LPD_PATH=\"@LPD_DIR@/lpd\" ! SHELL=@SHELL@ LOCKFILE=\"@LOCKFILE@\" CONFIG_SUBDIR="@CONFIG_SUBDIR@" PSHOWALL="@PSHOWALL@"
- make
- su
- make install
/etc/group
lpdがユーザdaemonの権限で動き、USBプリンタのデバイスが、
$ ls -al /dev/usb/lp0 crw-rw-r-- 1 root lp 180, 0 2012-04-15 21:21 /dev/usb/lp0
という状況なので、vipw -gにて
lp::7:lp,daemon
と設定する。
スプールディレクトリの作成
- mkdir /var/spool/lpd; chown daemon.daemon /var/spool/lpd; chmod 775 /var/spool/lpd
- mkdir /var/spool/lpd/lp; chown daemon.daemon /var/spool/lpd/lp; chmod 700 /var/spool/lpd/lp
- mkdir /var/spool/lpd/lpraw; chown daemon.daemon /var/spool/lpd/lpraw; chmod 700 /var/spool/lpd/lpraw
一通りできたら、root権限でcheckpcを実行してみると良い。パーミッション等で不適切な状態があれば指摘してくれる。
/usr/local/etc/printcap
.common:
:sd=/var/spool/lpd/%P
:sh:mx=0:mc=0
#
lp:lp=/dev/usblp0:\
:tc=.common:\
:filter=/usr/libexec/filters/lp-filter.sh:
#
lpraw:lp=/dev/usblp0:\
:tc=.common:\
:filter=/usr/libexec/filters/lpraw-filter.sh:
:ff=:
lpはローカルから打ち出すためのプリンタ定義。lprawはネットワーク越しに他のPCからの印字を受けるプリンタ定義。フィルタは以前の設定を参照。
pips3500-2.1.2
EPSONから提供されているフィルタを使うのだが、メンテはとっくに止まっている感じ。コンパイル時もエラーが出た。下記のパッチをあてればコンパイルは通る。
*** ekpstm/ekpstm-1.0.2/src/main.c.ORG 2012-04-15 11:52:39.000000000 +0900
--- ekpstm/ekpstm-1.0.2/src/main.c 2012-04-15 11:53:15.000000000 +0900
***************
*** 72,77 ****
--- 72,79 ----
break;
default:
+ break;
+
}
}
ただし、printcapに、
# written for pips3500 pm3500c:\ :sd=/var/spool/lpd/pm3500c:\ :mx#0:\ :sh:\ :lp=/var/ekpd/ekplp0:\ :if=/usr/local/EPKowa/PM3500C/filter3500: # pips3500 end
の定義をいれると、lprで印字できない。/var/ekpd/ekplp0でSystem call interruptみたいなメッセージがでる。なので、この定義はコメントアウトしておき、/etc/rc.d/rc.localに追加されている/etc/rc.d/rc.ekpdの起動部分もコメントアウトしておく。
/etc/rc.d/rc.lprng
#!/bin/sh
case "$1" in
start)
# Start daemons.
/usr/bin/echo "Starting lpd"; /usr/local/sbin/lpd; /usr/bin/echo "";
;;
stop)
# Stop daemons.
/usr/bin/printf "Shutting down lpd: "
pkill lpd
/usr/bin/echo "done"
;;
*)
echo "Usage: lpd {start|stop}"
;;
esac
/usr/libexec/filters/initepsonusb.sh
#! /bin/sh /usr/bin/echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20"
/usr/libexec/filters/lp-filter.sh
#! /bin/sh
#
# txt, ps, jpg, gif
#
PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH
#
# FUNCTION
#
function terminate(){
rm /tmp/prfilter.*.$$.tmp
exit 0
}
#
initepsonusb.sh
#
cat >/tmp/prfilter.1.$$.tmp
fileattr=`file /tmp/prfilter.1.$$.tmp`
#
# mt=$1 # PLAIN SFINE PMPHOTO
# re=$2 # 360 720
# ql=$3 # STD FINE PHOTO
# hs=$4 # ON OFF
# in=$5 # COLOR MONO
# cc=$6 # PHOTO GRAPH NONE
#
# POSTSCRIPT file
#
if [ "X`echo $fileattr|grep -i ' postscript'`" != "X" ]
then
cat /tmp/prfilter.1.$$.tmp |\
psfilter.sh PLAIN 360 STD ON COLOR PHOTO
terminate
fi
#
# JPEG file
#
if [ "X`echo $fileattr|grep -i ' jpeg'`" != "X" -o \
"X`echo $fileattr|grep -i ' jfif'`" != "X" ]
then
djpeg -pnm /tmp/prfilter.1.$$.tmp |\
pnmtops -nocenter |\
psfilter.sh PLAIN 360 STD ON COLOR PHOTO
terminate
fi
#
# GIF file
#
if [ "X`echo $fileattr|grep -i ' gif'`" != "X" ]
then
giftopnm /tmp/prfilter.1.$$.tmp |\
pnmtops -nocenter |\
psfilter.sh PLAIN 360 STD ON COLOR PHOTO
terminate
fi
#DEL_#
#DEL_# OBJ(Tgif) file
#DEL_#
#DEL_if [ "X`echo $fileattr|grep -i ' tgif'`" != "X" ]
#DEL_then
#DEL_ cp /tmp/prfilter.1.$$.tmp /tmp/prfilter.1.$$.obj
#DEL_ tgif -print -color -o/tmp -ps -stdout /tmp/prfilter.1.$$.obj 2>/dev/null |\
#DEL_ psfilter.sh PLAIN 360 STD ON COLOR PHOTO
#DEL_ rm /tmp/prfilter.1.$$.obj
#DEL_ terminate
#DEL_fi
#
# TEXT file
#
if [ "X`echo $fileattr|grep -i ' text'`" != "X" ]
then
PROVDIR=/usr/local/prov; export PROVDIR
${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.1.$$.tmp |\
psfilter.sh PLAIN 360 STD ON MONO NONE
terminate
fi
#
# NOT SUPPORTED
#
(echo $fileattr; echo ""; echo "NOT SUPPORTED"; echo "^L") >/tmp/prfilter.2.$$.tmp
PROVDIR=/usr/local/prov; export PROVDIR
${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.2.$$.tmp |\
psfilter.sh PLAIN 360 STD ON MONO NONE
terminate
/usr/libexec/filters/psfilter.sh
#! /bin/sh
PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH
#
#LANG=ja_JP.eucJP
#export LANG
#
mt=$1 # PLAIN SFINE PMPHOTO
re=$2 # 360 720
ql=$3 # STD FINE PHOTO
hs=$4 # ON OFF
in=$5 # COLOR MONO
cc=$6 # PHOTO GRAPH NONE
#
# width =210-3-3 =204mm = 204x(360/25.4)=2891dot = 8inch
# height=297-3-14=280mm = 280x(360/25.4)=3968dot =11inch
#
gs -r${re} \
-sPAPERSIZE=a4 \
-q \
-dNOPROMPT \
-dNOPAUSE \
-dSAFER \
-sDEVICE=png16m \
-sOutputFile=- \
- \
-c \
quit |\
pips3500 -ui C \
-ms A4 \
-mt ${mt} \
-re ${re} \
-ql ${ql} \
-hs ${hs} \
-ht ED \
-sc 100 \
-in ${in} \
-cc ${cc} \
-br 0 \
-co 0 \
-sa 0 \
-st 0 0 0 \
-mg 3 3 \
-ps AUTO
/usr/libexec/filters/lpraw-filter.sh
#!/bin/sh # # raw filter for any printer # initepsonusb.sh /bin/cat
prov
lp-filter.sh中で使用している、拙作provに関しては、prov-1.1 -- Overlay printing utility for UNIX-like systemsを参照。
_ lpr(LPRng等)とgtk+-2.0系のアプリケーションに関して
firefox等のgtk+-2.0系のアプリケーションで印刷を行う際に、デフォルトでは[LPRに印刷する]の選択肢が出てこない。まぁ大方の人間はCUPSを使っているのだろうから構わないということなのだろう。
[LPRに印刷する]の選択肢を出すためには、/etc/gtk-2.0/gtkrcまたは~/.gtkrc-2.0に以下のような記述を追加する。
gtk-print-backends="file,lpr,cups"