Brother HL-3150CDW - ArchWiki

# Brother HL-3150CDW

This guide explains how to install a 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

The factual accuracy of this article or section is disputed.

Reason: There is brother-hl3150cdw in the AUR, so manual installation should not be needed. (Discuss)

### Download and extract drivers

- Download the drivers: LPRDriver and cupswrapperdriver
- Install rpmextract: `pacman -S rpmextract`
- create a directory, for example `mkdir ~/brother`
- extract the contents of rpm in that directory: `cd ~/brother`, `rpmextract.sh *.rpm`
- it makes two subdirectories: `usr` and `opt`

### Adapt the drivers to systemd

This article or section is being considered for deletion.

Reason: This should be patched in the AUR package, wiki is not suitable for such dumps. (Discuss)

The cupswrapper is for init.d systems, but archlinux now uses systemd. So we have to adapt cupswrapper. Do that:

- In `./opt/brother/Printers/hl3150cdw/cupswrapper/cupswrapperhl3150cdw`, change all the ocurrences of

    if [  -e /etc/init.d/cups ]; then
       /etc/init.d/cups restart

for

    systemctl restart org.cups.cupsd.service

- You have to do the same with stop and start cups service.
- Finally, you should have the `./opt/brother/Printers/hl3150cdw/cupswrapper/cupswrapperhl3150cdw` with the following contents:

    contents of cupswrapperhl3150cdw

    #! /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

- The diff is here:

    # diff cupswrapperhl3150cdw-old cupswrapperhl3150cdw

    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

### Install in your system

- As root, copy the contents of `~/brother/opt` to `/opt` and `~/brother/usr/bin/brprintconf_hl3150cdw` to `/usr/bin/`
- As root:

    # cd /opt/brother/Printers/hl3150cdw/cupswrapper/
    # ./cupswrapperhl3150cdw

- It automatically adds a printer in cups, with usb interface. In my case, I can't print any page with USB because I can reach my printer (it's in another room), but if you change USB by `lpd://<your IP printer>/BINARY_P1`, then you could print via wifi (remember than HL-3150CDW has wifi connection)

## References

- Linux Solutions at Brother official page
- bbs thread

Category:

- Printers