I own a Brother HL-L5000D printer. This printer has no LAN port, thus I used an external print server. Many years I used a cheap Wifi access point with OpenWRT that had an extra USB port to run simultaneously as print server using the wonderful package p910nd. This server basically forwards data from port 9100 to the USB device. On the cheapo accesspoint, this was the only viable solution, as the device had only a tiny amount of RAM and flash...
Some day, the access point broke, so I swapped it for a Raspberry Pi 4B. It can easily handle cups but there is an issue: The Brother drivers are only published on their website for i686 and amd64... A week ago I noticed, that on the German website also a driver for Raspian is offered. The weird thing is, that is only shown there but not on the international page... Installing the package is easy, just enable armhf, install a libc and you are good to go:
dpkg --add-architecture armhf apt update apt install libc6:armhf
However, that package would not work for me. It would add the printer just fine, but I could not print the testpage. So lets look at the package content more closely:
# dpkg -L brgenprintml2pdrv:armhf /. /usr /usr/share /usr/share/doc /var /var/spool /var/spool/lpd /var/spool/lpd/BrGenPrintML2 /etc /etc/opt /etc/opt/brother /etc/opt/brother/Printers /etc/opt/brother/Printers/BrGenPrintML2 /etc/opt/brother/Printers/BrGenPrintML2/inf /opt /opt/brother /opt/brother/Printers /opt/brother/Printers/BrGenPrintML2 /opt/brother/Printers/BrGenPrintML2/LICENSE_JPN.txt /opt/brother/Printers/BrGenPrintML2/cupswrapper /opt/brother/Printers/BrGenPrintML2/cupswrapper/brother-BrGenPrintML2-cups-en.ppd /opt/brother/Printers/BrGenPrintML2/cupswrapper/paperconfigml2 /opt/brother/Printers/BrGenPrintML2/cupswrapper/Copying /opt/brother/Printers/BrGenPrintML2/cupswrapper/lpdwrapper /opt/brother/Printers/BrGenPrintML2/lpd /opt/brother/Printers/BrGenPrintML2/lpd/armv7l /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/i686 /opt/brother/Printers/BrGenPrintML2/lpd/i686/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/i686/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/lpdfilter /opt/brother/Printers/BrGenPrintML2/lpd/x86_64 /opt/brother/Printers/BrGenPrintML2/lpd/x86_64/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/x86_64/rawtobr3 /opt/brother/Printers/BrGenPrintML2/inf /opt/brother/Printers/BrGenPrintML2/inf/setupPrintcap /opt/brother/Printers/BrGenPrintML2/inf/brBrGenPrintML2rc /opt/brother/Printers/BrGenPrintML2/inf/brBrGenPrintML2func /opt/brother/Printers/BrGenPrintML2/LICENSE_ENG.txt
Uhhhm okay, there are x86_64 and i686 files as well... And now for the crucial part:
# ls -al /opt/brother/Printers/BrGenPrintML2/lpd insgesamt 32 drwxr-xr-x 5 root root 4096 10. Dez 17:30 . drwxr-xr-x 5 root root 4096 10. Dez 16:56 .. drwxr-xr-x 2 root root 4096 10. Dez 16:56 armv7l lrwxrwxrwx 1 root root 60 10. Dez 16:57 brprintconflsr3 -> /opt/brother/Printers/BrGenPrintML2/lpd/i686/brprintconflsr3 drwxr-xr-x 2 root root 4096 10. Dez 16:56 i686 -rwxr-xr-x 1 root root 6698 19. Apr 2017 lpdfilter lrwxrwxrwx 1 root root 53 10. Dez 16:57 rawtobr3 -> /opt/brother/Printers/BrGenPrintML2/lpd/i686/rawtobr3 drwxr-xr-x 2 root root 4096 10. Dez 16:56 x86_64
Okay... thats the issue! The install scripts just assumes that it should install i686. Extracting the Debian package shows exactly that:
# mkdir -p brgen/DEBIAN # dpkg -e brgenprintml2pdrv-4.0.0-1.armhf.deb brgen/DEBIAN/ # head -n 11 brgen/DEBIAN/postinst #!/bin/sh if [ "$(echo $(uname -m) | grep -i 'arm')" != '' ]; then ln -s /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/rawtobr3 ln -s /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/brprintconflsr3 elif [ "$(echo $(uname -m) | grep -i -e 'x86_64' -e 'amd64')" != '' ]; then ln -s /opt/brother/Printers/BrGenPrintML2/lpd/x86_64/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/rawtobr3 ln -s /opt/brother/Printers/BrGenPrintML2/lpd/x86_64/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/brprintconflsr3 else ln -s /opt/brother/Printers/BrGenPrintML2/lpd/i686/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/rawtobr3 ln -s /opt/brother/Printers/BrGenPrintML2/lpd/i686/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/brprintconflsr3 fi
The reason is, that
arm64 is actually called
Okay, so pretty easy to fix:
ln -s -f /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/rawtobr3 /opt/brother/Printers/BrGenPrintML2/lpd/ ln -s -f /opt/brother/Printers/BrGenPrintML2/lpd/armv7l/brprintconflsr3 /opt/brother/Printers/BrGenPrintML2/lpd/
But then I noticed something else: The original driver actually ships the same files - including armhf, i686 and x86_64 - but a different PPD. The Raspbian uses a generic printer, but the other has a proper HL-L5000D.ppd. (Okay, to be fair: they are not the same files but the same folder structure and filenames)
So what you can do to get the original HL-L5000D printer driver:
mkdir -p hll5000dcupswrapper/DEBIAN mkdir -p hll5000dlpr/DEBIAN dpkg -x hll5000dcupswrapper-3.5.1-1.i386.deb hll5000dcupswrapper dpkg -e hll5000dcupswrapper-3.5.1-1.i386.deb hll5000dcupswrapper/DEBIAN dpkg -x hll5000dlpr-3.5.1-1.i386.deb hll5000dlpr dpkg -e hll5000dlpr-3.5.1-1.i386.deb hll5000dlpr/DEBIAN sed -i '/^Architecture/s/i386/all/' hll5000dcupswrapper/DEBIAN/control sed "s/-i 'arm'/-i -e 'arm' -e 'aarch64'/" hll5000dlpr/DEBIAN/postinst sed -i '/^Architecture/s/i386/all/' hll5000dlpr/DEBIAN/control dpkg-deb -Z xz -b hll5000dcupswrapper dpkg-deb -Z xz -b hll5000dlpr
This repackages the package to be installed on all architectures (okay, that is not correct but we do not care...) and also patches the line in the postinstall script to symlink the correct binaries. It would be neat to add the dependencies, like cups, because the postinst script actually requires some commands, but that is a job for another day...
I'm not sure if this works the same for other Brother printers, but I would assume it does.