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