Re: Canon Printers and CUPS: ARM drivers availabile?
First you need to have binfmt-support and qemu-i386 installed to run x86 drivers, binaries, etc:
Code: Select all
sudo apt-get install binfmt-support qemu-user
Enable the kernel to automatically hand x86 programs to qemu:
Code: Select all
sudo echo ':i386:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/usr/bin/qemu-i386-static:' > /proc/sys/fs/binfmt_misc/register
Then you’re going to create the default directory for the qemu i386 library files and link it to the other default directory for qemu i386 libraries:
Code: Select all
mkdir -p /etc/qemu-binfmt/i386
ln -s /etc/qemu-binfmt/i386 /usr/gnemul/qemu-i386
Next, you’ll install the 32-bit driver common and ufr2 deb files manually:
Code: Select all
ar x cndrvcups-common_3.70-1_i386.deb data.tar.xz && mkdir common-data && mv data.tar.xz common-data/data.tar.xz
ar x cndrvcups-common_3.70-1_i386.deb control.tar.xz && tar xvf control.tar.xz ./postinst && mv postinst common-data/postinst.sh && chmod 777 postinst.sh
ar x cndrvcups-ufr2-us_3.30-1_i386.deb data.tar.xz && mkdir ufr2-data && mv data.tar.xz ufr2-data/data.tar.xz
ar x cndrvcups-ufr2-us_3.30-1_i386.deb control.tar.xz && tar xvf control.tar.xz ./postinst && mv postinst ufr2-data/postinst.sh && chmod 777 postinst.sh
sudo su
pushd common-data
tar xvC /etc/qemu-binfmt/i386 -f data.tar.xz ./lib ./usr/lib
tar xvC / -f data.tar.xz ./usr/bin ./usr/include ./usr/share ./usr/lib/cups ./etc
popd
pushd ufr2-data
tar xvC /etc/qemu-binfmt/i386 -f data.tar.xz ./lib ./usr/lib
tar xvC / -f data.tar.xz ./usr/bin ./usr/include ./usr/share ./usr/lib/cups ./etc
popd
./common-data/postinst.sh
./ufr2-data/postinst.sh
Now, the fun part – manually downloading and installing all the dependency libraries. Here’s how to extract one library manually to our default library folder:
Code: Select all
pushd /tmp && mkdir libraryname && cd libraryname
wget http://url-to-tar.gz-file
ar x tar.gz-file data.tar.xz --OR-- ar x tar.gz-file data.tar.gz
tar xvC /etc/qemu-binfmt/i386 -f data.tar.xz ./etc ./lib ./usr/lib --OR -- tar xvC /etc/qemu-binfmt/i386 -f data.tar.gz ./etc ./lib ./usr/lib
popd
Finally, since the proprietary cups filter pstoufr2cpca calls ghostscript with an x86 driver/shared library, we also need to download and install the x86 version of ghostscript and all of it’s library dependencies as well following the convention above. You may be wondering, “I have two different copies of the ghostscript program now. How do I tell pstoufr2cpca to use the x86 one instead of the arm one?” Not so lucky for us, pstoufr2cpca calls the ghostscript program by full path “/usr/bin/gs”. We’ll need to create a bash script that replaces “/usr/bin/gs” and allow the bash script to call the correct ghostscript program. Here’s the contents of the bash script that I made. I renamed the ghostscript programs to “gs-i386” and “gs-arm” and put them in /usr/bin. This script must also be given execute permission by using chmod.
Code: Select all
#!/bin/bash
PARENT_COMMAND=$(ps --no-headers -o command $PPID)
if [[ $PARENT_COMMAND == *"pstoufr2"* ]]; then
/usr/bin/gs-i386 "$@"
else
/usr/bin/gs-arm "$@"
fi
You can test the process that cups uses to print a test page by issuing the commands manually. The last command is the important command. If this runs successfully and pstoout.out contains binary code, your printer will print this document.
Code: Select all
export PPD=/usr/share/cups/model/CNCUPSMF4500ZS.ppd
/usr/lib/cups/filter/bannertopdf 1 me '' 1 '' < /usr/share/cups/data/testprint > bannertopdf.pdf
/usr/lib/cups/filter/pdftopdf 1 me '' 1 '' < bannertopdf.pdf > pdftopdf.pdf
/usr/lib/cups/filter/pdftops 1 me '' 1 '' < pdftopdf.pdf > pdftops.ps
/usr/lib/cups/filter/pstoufr2cpca 1 me '' 1 '' < pdftops.ps > pstoout.out
If this produces errors, you’ll need to check if qemu is running the cups filter, is the correct ghostscript program running, and do you have all the dependency x86 libraries installed, etc.