Difference between revisions of "Brother HL-3150CDW"

From ArchWiki
Jump to: navigation, search
m (Adapt the drivers to systemd)
(fix double redirect)
 
(13 intermediate revisions by 5 users not shown)
Line 1: Line 1:
[[Category:Printers]]
+
#REDIRECT [[CUPS/Printer-specific problems#Brother]]
This guide explains how to install a [http://welcome.solutions.brother.com/BSC/public/eu/eu_ot/en/model_top/colorlaserpri/hl3150cdw_eu.html?reg=eu&c=eu_ot&lang=en&prod=hl3150cdw_eu Brother HL-3150CDW] color laser printer using CUPS.
 
 
 
==Prerequisites==
 
 
 
This tutorial assumes you have already configured the [[CUPS]] printer server.  There is plenty of existing information to get this working. By the other hand, I assume you have pure [[systemd]] archlinux system.
 
 
 
== Installation ==
 
 
 
=== Download and extract drivers ===
 
 
 
* Download the [http://welcome.solutions.brother.com/bsc/public_s/id/linux/en/download_prn.html#HL-3150CDW drivers]: [http://www.brother.com/cgi-bin/agreement/agreement.cgi?dlfile=http://www.brother.com/pub/bsc/linux/dlf/hl3150cdwlpr-1.1.2-1.i386.rpm&lang=English_lpr LPRDriver] and [http://www.brother.com/cgi-bin/agreement/agreement.cgi?dlfile=http://www.brother.com/pub/bsc/linux/dlf/hl3150cdwcupswrapper-1.1.2-1.i386.rpm&lang=English_gpl cupswrapperdriver]
 
* Install rpmextract: {{ic|pacman -S rpmextract}}
 
* make a directory, for example {{ic|mkdir ~/brother}}
 
* extract the contents of rpm in that directory: {{ic|cd ~/brother}}, {{ic|rpmextract.sh *.rpm}}
 
* it makes two subdirectories: {{ic|usr}} and {{ic|opt}}
 
 
 
=== Adapt the drivers to systemd ===
 
 
 
The cupswrapper is for init.d systems, but archlinux now uses systemd. So we have to adapt cupswrapper. Do that:
 
 
 
* In {{ic|./opt/brother/Printers/hl3150cdw/cupswrapper/cupswrapperhl3150cdw}}, change all the ocurrences of
 
{{bc|if [  -e /etc/init.d/cups ]; then
 
  /etc/init.d/cups restart
 
}}
 
for
 
{{bc|systemctl restart cups.service
 
}}
 
 
 
* You have to do the same with stop and start cups service.
 
* At final, you should have the {{ic|./opt/brother/Printers/hl3150cdw/cupswrapper/cupswrapperhl3150cdw}} with the following contents:
 
{{hc|contents of cupswrapperhl3150cdw|
 
<nowiki>
 
#! /bin/sh
 
#
 
# Brother Print filter
 
# Copyright (C) 2005-2012 Brother. Industries, Ltd.
 
 
 
# This program is free software; you can redistribute it and/or modify it
 
# under the terms of the GNU General Public License as published by the Free
 
# Software Foundation; either version 2 of the License, or (at your option)
 
# any later version.
 
#
 
# This program is distributed in the hope that it will be useful, but WITHOUT
 
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 
# more details.
 
#
 
# You should have received a copy of the GNU General Public License along with
 
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 
# Place, Suite 330, Boston, MA  02111-1307  USA
 
#
 
 
 
printer_model=""hl3150cdw""
 
printer_name=`echo $printer_model | tr '[a-z]' '[A-Z]'`
 
device_name=`echo $printer_name | eval sed -e 's/MFC/MFC-/' -e 's/DCP/DCP-/' -e 's/HL/HL-/' -e 's/FAX/FAX-/'`
 
pcfilename=`echo $printer_name | tr -d '[A-Z]'`
 
device_model="Printers"
 
tmp_filter=/var/tmp/brother_lpdwrapper_${printer_model}
 
 
 
if [ -d "/usr/share/cups/model" ]; then
 
  mkdir -p /usr/share/cups/model/Brother
 
else
 
  mkdir -p /usr/share/ppd/Brother
 
fi
 
 
 
if [ -d "/usr/share/ppd" ]; then
 
  mkdir -p /usr/share/ppd/Brother     
 
else
 
  mkdir -p /usr/share/cups/model/Brother
 
fi
 
 
 
 
 
 
 
if [ "$1" = '-e' ]; then
 
  lpadmin -x ${printer_name}
 
  rm -f /usr/share/cups/model/Brother/brother_${printer_model}_printer_en.ppd
 
  rm -f /usr/share/ppd/Brother/brother_${printer_model}_printer_en.ppd
 
  rm -f /usr/lib/cups/filter/brother_lpdwrapper_${printer_model}
 
  rm -f /usr/lib64/cups/filter/brother_lpdwrapper_${printer_model}
 
  rm -f /opt/brother/${device_model}/${printer_model}/cupswrapper/brcupsconfpt1
 
#  rm -f /usr/local/Brother/${device_model}/${printer_model}/cupswrapper/brcupsconfpt1
 
  systemctl restart cups.service
 
  exit 0
 
fi
 
 
 
if [ "$1" = "-r" ]; then
 
  lpadmin -x ${printer_name}
 
  systemctl restart cups.service
 
  exit 0
 
fi
 
if [ "$1" = "help" ] || [ "$1" = "-h" ]; then
 
  echo  'option -h : help'
 
  echo  '      -i : install'
 
  echo  '      -e : uninstall'
 
  echo  '      -r : remove printer'
 
  exit 0
 
fi
 
#mkdir -p /usr/local/Brother/${device_model}/${printer_model}/filter
 
#mkdir -p /usr/lib/cups/filter
 
 
 
if [ -e "/opt/brother/${device_model}/${printer_model}/lpd/filter${printer_model}" ]; then
 
  :
 
else
 
  echo "ERROR : Brother LPD filter is not installed."
 
fi
 
rm -f /usr/share/cups/model/Brother/brother_${printer_model}_printer_en.ppd
 
if [ -d "/usr/share/cups/model" ]; then
 
  ppd_file_name=/usr/share/cups/model/Brother/brother_${printer_model}_printer_en.ppd
 
else
 
  ppd_file_name=/usr/share/ppd/Brother/brother_${printer_model}_printer_en.ppd
 
fi
 
 
 
if [ -e "/opt/brother/${device_model}/${printer_model}/cupswrapper/brother_${printer_model}_printer_en.ppd" ]; then
 
cp "/opt/brother/${device_model}/${printer_model}/cupswrapper/brother_${printer_model}_printer_en.ppd" $ppd_file_name
 
fi
 
 
 
chmod 644 $ppd_file_name
 
 
 
if [ -d /usr/share/ppd ]
 
then
 
if [ -d /usr/share/cups/model ]
 
then
 
cp $ppd_file_name /usr/share/ppd/Brother/brother_${printer_model}_printer_en.ppd
 
chmod 644 /usr/share/ppd/Brother/brother_${printer_model}_printer_en.ppd
 
fi
 
fi
 
 
 
#
 
# create temporary CUPS Filter
 
#
 
 
 
cat <<!ENDOFWFILTER! >$tmp_filter
 
#! /bin/sh
 
#
 
# Copyright (C) 2005-2012 Brother. Industries, Ltd.
 
#                                   Ver1.10
 
 
 
# This program is free software; you can redistribute it and/or modify it
 
# under the terms of the GNU General Public License as published by the Free
 
# Software Foundation; either version 2 of the License, or (at your option)
 
# any later version.
 
#
 
# This program is distributed in the hope that it will be useful, but WITHOUT
 
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 
# more details.
 
#
 
# You should have received a copy of the GNU General Public License along with
 
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 
# Place, Suite 330, Boston, MA  02111-1307  USA
 
#
 
 
 
LOGFILE="/dev/null"
 
LOGLEVEL="1"
 
LOGCLEVEL="7"
 
DEBUG=0
 
NUPENABLE=1
 
LOG_LATESTONLY=1
 
 
 
 
 
touch /tmp/${printer_model}_latest_print_info
 
chmod 600 -R /tmp/${printer_model}_latest_print_info
 
 
 
errorcode=0
 
 
 
if [ \$DEBUG != 0 ]; then
 
    LOGFILE=/tmp/br_cupsfilter_debug_log
 
fi
 
 
 
PPDC=\`printenv | grep "PPD="\`
 
PPDC=\`echo \$PPDC | sed -e 's/PPD=//'\`
 
 
 
if [ "\$PPDC" = "" ]; then
 
    PPDC="/usr/share/cups/model/Brother/brother_${printer_model}_printer_en.ppd"
 
fi
 
 
 
 
 
if [ \$LOGFILE != "/dev/null" ]; then
 
  if [ \$LOG_LATESTONLY == "1" ]; then
 
    rm -f \$LOGFILE
 
    date                                                          >\$LOGFILE
 
  else
 
    if [ -e \$LOGFILE ]; then
 
    date                                                        >>\$LOGFILE
 
    else
 
    date                                                        >\$LOGFILE
 
    fi
 
  fi
 
    echo "arg0 = \$0"                                          >>\$LOGFILE
 
    echo "arg1 = \$1"                                          >>\$LOGFILE
 
    echo "arg2 = \$2"                                          >>\$LOGFILE
 
    echo "arg3 = \$3"                                          >>\$LOGFILE
 
    echo "arg4 = \$4"                                          >>\$LOGFILE
 
    echo "arg5 = \$5"                                          >>\$LOGFILE
 
    echo "arg6 = \$6"                                          >>\$LOGFILE
 
    echo "PPD  = \$PPD"                                        >>\$LOGFILE
 
fi
 
 
 
cp  /opt/brother/Printers/${printer_model}/inf/br${printer_model}rc  /tmp/br${printer_model}rc_\$$
 
chmod 777 -R /tmp/br${printer_model}rc_\$$
 
export BRPRINTERRCFILE=/tmp/br${printer_model}rc_\$$
 
 
 
INPUT_TEMP_PS=\`mktemp /tmp/br_input_ps.XXXXXX\`
 
 
 
nup="cat"
 
if [ "\`echo \$5 | grep 'Nup='\`" != '' ] && [ \$NUPENABLE != 0 ]; then
 
 
 
if  [ "\`echo \$5 | grep 'Nup=64'\`" != '' ]; then
 
nup="psnup -64"
 
elif [ "\`echo \$5 | grep 'Nup=32'\`" != '' ]; then
 
nup="psnup -32"
 
elif [ "\`echo \$5 | grep 'Nup=25'\`" != '' ]; then
 
nup="psnup -25"
 
elif [ "\`echo \$5 | grep 'Nup=16'\`" != '' ]; then
 
nup="psnup -16"
 
elif [ "\`echo \$5 | grep 'Nup=8'\`" != '' ]; then
 
nup="psnup -8"
 
elif [ "\`echo \$5 | grep 'Nup=6'\`" != '' ]; then
 
nup="psnup -6"
 
elif [ "\`echo \$5 | grep 'Nup=4'\`" != '' ]; then
 
nup="psnup -4"
 
elif [ "\`echo \$5 | grep 'Nup=2'\`" != '' ]; then
 
nup="psnup -2"
 
elif [ "\`echo \$5 | grep 'Nup=1'\`" != '' ]; then
 
nup="cat"
 
fi
 
echo  "NUP=\$nup"                                      >>\$LOGFILE
 
  if [ -e /usr/bin/psnup ]; then
 
      if [ \$# -ge 7 ]; then
 
      cat \$6  | \$nup > \$INPUT_TEMP_PS
 
      else
 
      cat      | \$nup > \$INPUT_TEMP_PS
 
      fi
 
  else
 
      if [ \$# -ge 7 ]; then
 
      cp \$6  \$INPUT_TEMP_PS
 
      else
 
      cat    > \$INPUT_TEMP_PS
 
      fi
 
  fi
 
else
 
  if [ \$# -ge 7 ]; then
 
      cp \$6  \$INPUT_TEMP_PS
 
  else
 
      cat    > \$INPUT_TEMP_PS
 
  fi
 
fi
 
if [ -e "/opt/brother/${device_model}/${printer_model}/lpd/filter${printer_model}" ]; then
 
      :
 
else
 
    echo "ERROR: /opt/brother/${device_model}/${printer_model}/lpd/filter${printer_model} does not exist"  >>\$LOGFILE
 
    echo "ERROR: /opt/brother/${device_model}/${printer_model}/lpd/filter${printer_model} does not exist"  >>/tmp/${printer_model}_latest_print_info
 
    errorcode=30
 
    exit
 
fi
 
 
 
CUPSOPTION=\`echo "\$5 Copies=\$4" | sed -e 's/BrMirror=OFF/MirrorPrint=OFF/' -e 's/BrMirror=ON/MirrorPrint=ON/' -e 's/BrChain/Chain/' -e 's/BrBrightness/Brightness/' -e 's/BrContrast/Contrast/' -e 's/BrHalfCut/HalfCut/' -e 's/BrAutoTapeCut/AutoCut/' -e 's/BrHalftonePattern/Halftone/' -e 's/Binary/Binary/' -e 's/Dither/Dither/' -e 's/ErrorDiffusion/ErrorDiffusion/' -e 's/BrSheets/Sheets/' -e 's/multiple-document-handling/Collate/' -e 's/separate-documents-collated-copies/ON/' -e 's/separate-documents-uncollated-copies/OFF/'\`
 
if [ -e "/opt/brother/${device_model}/${printer_model}/cupswrapper/brcupsconfpt1" ]; then
 
 
  if [ \$DEBUG = 0 ]; then
 
    /opt/brother/${device_model}/${printer_model}/cupswrapper/brcupsconfpt1  ${printer_name}  \$PPDC 0 "\$CUPSOPTION" "${printer_model}" \$BRPRINTERRCFILE>> /dev/null
 
  else
 
    /opt/brother/${device_model}/${printer_model}/cupswrapper/brcupsconfpt1  ${printer_name}  \$PPDC \$LOGCLEVEL "\$CUPSOPTION" "${printer_model}" \$BRPRINTERRCFILE>>\$LOGFILE
 
  fi
 
fi
 
 
 
if [ \$DEBUG -lt 10 ]; then
 
    cat    \$INPUT_TEMP_PS | /opt/brother/${device_model}/${printer_model}/lpd/filter${printer_model}
 
    echo br${printer_model}rc_\$$  > /tmp/${printer_model}_latest_print_info
 
    cat  /tmp/br${printer_model}rc_\$$  >> /tmp/${printer_model}_latest_print_info
 
    rm -f /tmp/br${printer_model}rc_\$$
 
 
 
    if [ \$LOGLEVEL -gt 2 ];  then
 
  if [ \$LOGFILE != "/dev/null" ]; then
 
    echo ""                                                >>\$LOGFILE
 
    echo "    ------PostScript Data-------"                >>\$LOGFILE
 
    cat    \$INPUT_TEMP_PS                                  >>\$LOGFILE
 
  fi
 
    fi
 
fi
 
rm -f  \$INPUT_TEMP_PS
 
 
 
exit $errorcode
 
 
 
!ENDOFWFILTER!
 
 
 
chmod 755 $tmp_filter
 
 
 
#
 
# check /usr/lib/cups/filter
 
#
 
if [ -d /usr/lib/cups/filter ]; then
 
brotherlpdwrapper=/usr/lib/cups/filter/brother_lpdwrapper_${printer_model}
 
rm -f  $brotherlpdwrapper
 
cp $tmp_filter $brotherlpdwrapper
 
fi
 
 
 
#
 
# check /usr/lib64/cups/filter
 
#
 
if [ -e /usr/lib64/cups/filter ]; then
 
brotherlpdwrapper64=/usr/lib64/cups/filter/brother_lpdwrapper_${printer_model}
 
rm -f  $brotherlpdwrapper64
 
cp $tmp_filter $brotherlpdwrapper64
 
fi
 
 
 
#
 
# remove temporary script file
 
#
 
rm -f  $tmp_filter
 
 
 
#chmod a+w /opt/brother/${device_model}/${printer_model}/inf/br${printer_model}rc
 
#chmod a+w /opt/brother/${device_model}/${printer_model}/inf
 
systemctl stop cups.service
 
systemctl restart cups.service
 
 
 
sleep 2s
 
 
 
uris=$(lpinfo -v)
 
 
 
for uri in $uris
 
do
 
URI=$(echo $uri | grep ${device_name} | grep usb)
 
if [ "$URI" != '' ];then
 
break;
 
fi
 
done
 
 
 
if [ "$URI" = '' ];then
 
for uri in $uris
 
do
 
URI=$(echo $uri | grep ${device_name} )
 
if [ "$URI" != '' ];then
 
break;
 
fi
 
done
 
fi
 
 
 
if [ "$URI" = '' ];then
 
for uri in $uris
 
do
 
URI=$(echo $uri | grep -i Brother | grep usb )
 
if [ "$URI" != '' ];then
 
break;
 
fi
 
done
 
fi
 
 
 
if [ "$URI" = '' ];then
 
for uri in $uris
 
do
 
URI=$(echo $uri | grep usb )
 
if [ "$URI" != '' ];then
 
break;
 
fi
 
done
 
fi
 
 
 
 
 
if [ "$URI" = '' ];then
 
URI="usb:/dev/usb/lp0"
 
fi
 
 
 
echo lpadmin -p ${printer_name} -E -v $URI -P $ppd_file_name
 
lpadmin -p ${printer_name} -E -v $URI -P $ppd_file_name
 
 
exit 0
 
</nowiki>}}
 
* The diff is here:
 
{{hc|# diff cupswrapperhl3150cdw-old cupswrapperhl3150cdw|
 
<nowiki>
 
50,55c50
 
< if [  -e /etc/init.d/cups ]; then
 
<    /etc/init.d/cups restart
 
< elif [  -e /etc/init.d/cupsys ]; then
 
<    /etc/init.d/cupsys restart
 
< fi
 
< #  /etc/init.d/cups restart
 
---
 
>  systemctl restart cups.service
 
57a53
 
>
 
60,65c56
 
< if [  -e /etc/init.d/cups ]; then
 
<    /etc/init.d/cups restart
 
< elif [  -e /etc/init.d/cupsys ]; then
 
<    /etc/init.d/cupsys restart
 
< fi
 
< #  /etc/init.d/cups restart
 
---
 
>  systemctl restart cups.service
 
291,303c282,283
 
< if [ -e /etc/init.d/lpd ]; then
 
<    /etc/init.d/lpd stop
 
< fi
 
< if [  -e /etc/init.d/lprng ]; then
 
<    /etc/init.d/lprng stop
 
< fi
 
<
 
<
 
< if [  -e /etc/init.d/cups ]; then
 
<    /etc/init.d/cups restart
 
< elif [  -e /etc/init.d/cupsys ]; then
 
<    /etc/init.d/cupsys restart
 
< fi
 
---
 
> systemctl stop cups.service
 
> systemctl restart cups.service</nowiki>}}
 
 
 
=== Install in your system ===
 
 
 
* As root, copy the contents of {{ic|~/brother/opt}} to {{ic|/opt}} and {{ic|~/brother/usr/bin/brprintconf_hl3150cdw}} to {{ic|/usr/bin/}}
 
* As root:
 
{{bc|# cd /opt/brother/Printers/hl3150cdw/cupswrapper/
 
# ./cupswrapperhl3150cdw
 
}}
 
* It automatically add a printer in cups, with usb interface. In my case, I can't print any page with USB, but if you change USB by {{ic|lpd://<your IP printer>/BINARY_P1}}, everything is OK (remember than HL-3150CDW has wifi connection)
 
 
 
== References ==
 
 
 
* [https://bbs.archlinux.org/viewtopic.php?id=165594 bbs thread]
 

Latest revision as of 03:42, 17 September 2015