CUPS on mini2440

Artem
Dear ALL,

I'm going to use CUPS on the board. I tried to build different versions of
CUPS (1.3.11 1.4.6 and 1.5.x). All of them were built successfully, however
the only 1.3.11 could be started successfully on the board. The other
version crash with Segmentation fault or Illegal instruction message. 

After couple of hours digging the sources I got rid of Segmentation fault
by using static linking of CUPS (--enable-static --disable-shared
--disable-default-shared). Currently I experience problems with Illegal
instruction (v1.4.6 and v1.5), inspecting the core dump provides:

Core was generated by `/usr/local/sbin/cupsd -f'.
Program terminated with signal 4, Illegal instruction.
#0  0x2a0b8908 in __aeabi_dadd ()
(gdb) quit

I imagine this is related to some CPU related options during compilation...

On CUPS forum I saw the message saying that CUPS is not designed for
cross-compiling ...

v1.3.11 seems to be working but so far I couldn't print a page using it.
Anyway I would like to use newer version and my preference is 1.4.6.

compiler: arm-none-linux-gnueabi
flags used: -march=armv4t -msoft-float -mtune=arm920t -mcpu=arm920t

If someone has experience of porting CUPS to ARM board please share your
knowledge.

Abuda
Try the command "echo 2 > /proc/cpu/alignment". 

This should solve the segmentation fault problem.

bao
Hi Artem,

You can use buildroot to build CUPS. It is the way I made CUPS work with my
micro 2440 board.

I have no experience about cross compiling cups directly. 

Regards

Artem
Hi bao,

Could you please tell me the version of CUPS you used. I will try this.

Also please tell whether you could configure the CUPS and it can detect
printers connected to the board?

Currently I have compiled CUPS 1.3.11 and I could run it. However there is
a problem right now with printer detection. I was digging the log files and
found some mysteries :-)) I imagine that something is wrong with the build
process ...

bao
Attachment: us-ascii.txt (3.01 KB)
Hi Artem,

I am using CUPS 1.3.9. In order to get CUPS detect your printer, you must
have the printer driver (usblp) in your kernel. Make sure that you can see
your printer in /dev/usb/lp0 

I don't know about CUPS 1.3.11, but if you use CUPS 1.4.5 or 1.4.6, you
have to remove the usblp driver, because CUPS 1.4.x use libusb to detect
the printer.
In my case, after installing CUPS to the target file system, I have to copy
the file us-ascii.txt to /usr/share/cups/charmap (attached). Otherwise,
CUPS print out nothing.

You can use the usb backend to detect your printer without this charmap
file.
 /usr/lib/cups/backend/usb

or you can use cups server:

/etc/init.d.cups restart
lpinfo -l -v


Hope that help
Regards

PS: Can you share the mystery :D

BAO

bao
Sorry, mistyping

/etc/init.d/cups restart

Artem
Many thanks for the information. Actually I'm using
/usr/lib/cups/backend/usb but have some problems.. During detection
procedure in the log files CUPS says that it has no permission to access
some files however I'm running it under root and I'm sure I have no problem
with file permissions. Anyway I will keep digging the problem.

bao
It looks strange.
Try change the cupsd.conf from "info" to "debug". It can provide you more
information.
Are you using the pre-installed linux with Qtopia? Do you have /dev/usb/lp0
when you plug in your printer? 

Did you use any patch before cross-compile? As far as I know, CUPS can not
cross-compile out of the box.

Abhinit
@Artem and Bao:

Even I cross compilled and made Cups 1.3.11 for my mini2440, Now how do I
transfer it to the mini2440 system? T make it run.

Abhinit
K, I got CUPS on my mini2440, but whenever I start /etc/init.d/cups start i
get:


ps: invalid option -- 'a'
BusyBox v1.13.3 (2010-07-24 19:11:35 CST) multi-call binary

Usage: ps 

Report process status

Options:
        w       Wide output

cups: unable to start scheduler.

can anyone please suggest something?

Juergen Beisert
Busybox's 'ps' command is not the same than the regular 'ps' command. Just
modify the '/etc/init.d/cups' script not using the 'a' param. Or install
the regular 'ps' command on your target instead.

Abhinit
Thanx Juergen, I'll just try tht right now and get back...

Abhinit
I'm sorry I'm kinda new to this :( I'm posting my /etc/init.d/cups here,
can you point out the change? 

#!/bin/sh
#
# "$Id: cups.sh.in 6649 2007-07-11 21:46:42Z mike $"
#
#   Startup/shutdown script for the Common UNIX Printing System (CUPS).
#
#   Copyright 2007 by Apple Inc.
#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
#
#   These coded instructions, statements, and computer programs are the
#   property of Apple Inc. and are protected by Federal copyright
#   law.  Distribution and use rights are outlined in the file
"LICENSE.txt"
#   which should have been included with this file.  If this file is
#   file is missing or damaged, see the license at "http://www.cups.org/";.
#

#### OS-Dependent Information

#
#   Linux chkconfig stuff:
#
#   chkconfig: 235 99 00
#   description: Startup/shutdown script for the Common UNIX \
#                Printing System (CUPS).
#

#
#   NetBSD 1.5+ rcorder script lines.  The format of the following two
#   lines is very strict -- please don't add additional spaces!
#
# PROVIDE: cups
# REQUIRE: DAEMON
#


#### OS-Dependent Configuration

case "`uname`" in
  IRIX*)
    IS_ON=/sbin/chkconfig

    if $IS_ON verbose; then
      ECHO=echo
    else
      ECHO=:
    fi
    ECHO_OK=:
    ECHO_ERROR=:
    ;;

  *BSD*)
          IS_ON=:
    ECHO=echo
    ECHO_OK=:
    ECHO_ERROR=:
    ;;

  Darwin*)
    . /etc/rc.common

    if test "${CUPS:=-YES-}" = "-NO-"; then
      exit 0
    fi

          IS_ON=:
    ECHO=ConsoleMessage
    ECHO_OK=:
    ECHO_ERROR=:
    ;;

  Linux*)
    IS_ON=/bin/true
    if test -f /etc/init.d/functions; then
      . /etc/init.d/functions
      ECHO=echo
      ECHO_OK="echo_success"
      ECHO_ERROR="echo_failure"
    else
      ECHO=echo
      ECHO_OK=:
      ECHO_ERROR=:
    fi
    ;;

  *)
    IS_ON=/bin/true
    ECHO=echo
    ECHO_OK=:
    ECHO_ERROR=:
    ;;
esac

#### OS-Independent Stuff

#
# Set the timezone, if possible...  This allows the scheduler and
# all child processes to know the local timezone when reporting
# dates and times to the user.  If no timezone information is
# found, then Greenwich Mean Time (GMT) will probably be used.
#

for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do
  if test -f $file; then
          . $file
  fi
done

if test "x$ZONE" != x; then
  TZ="$ZONE"
fi

if test "x$TIMEZONE" != x; then
  TZ="$TIMEZONE"
fi

if test "x$TZ" != x; then
  export TZ
fi

#
# Don't use TMPDIR environment variable from init script, as that can
# cause cupsd to set TempDir to a user's temporary directory instead
# of the default...
#

unset TMPDIR


#
# Make sure we have the standard program directories in the path
# since some operating systems (this means YOU HP-UX!) don't
# provide a standard path on boot-up...
#

if test "x$PATH" = x; then
  PATH="/bin:/usr/bin:/sbin:/usr/sbin"
else
  PATH="/bin:/usr/bin:/sbin:/usr/sbin:$PATH"
fi

export PATH

#
# See if the CUPS server (cupsd) is running...
#

case "`uname`" in
  HP-UX* | AIX* | SINIX*)
    pid=`ps -e | awk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print
$1}'`
    ;;
  IRIX* | SunOS*)
    pid=`ps -e | nawk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print
$1}'`
    ;;
  UnixWare*)
    pid=`ps -e | awk '{if (match($6, ".*/cupsd$") || $6 == "cupsd") print
$1}'`
    . /etc/TIMEZONE
    ;;
  OSF1*)
    pid=`ps -e | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print
$1}'`
    ;;
  Linux* | *BSD* | Darwin*)
    pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print
$1}'`
    ;;
  *)
    pid=""
    ;;
esac

#
# Start or stop the CUPS server based upon the first argument to the
script.
#

case $1 in
  start | restart | reload)
    if $IS_ON cups; then
      if test "$pid" != ""; then
        kill -HUP $pid
      else
        if test $? != 0; then
          $ECHO_FAIL
          $ECHO "cups: unable to $1 scheduler."
          exit 1
        fi
      fi
      $ECHO_OK
      $ECHO "cups: ${1}ed scheduler."
    fi
    ;;

  stop)
    if test "$pid" != ""; then
      kill $pid
      $ECHO_OK
      $ECHO "cups: stopped scheduler."
    fi
    ;;

  status)
    if test "$pid" != ""; then
      echo "cups: scheduler is running."
    else
      echo "cups: scheduler is not running."
    fi
    ;;

  start_msg)
    # HP-UX non-standard...
    echo "Starting CUPS Server"
    ;;

  stop_msg)
    # HP-UX non-standard...
    echo "Starting CUPS Server"
    ;;

  *)
    echo "Usage: cups {reload|restart|start|status|stop}"
    exit 1
    ;;
esac

#
# Exit with no errors.
#

exit 0


#
# End of "$Id: cups.sh.in 6649 2007-07-11 21:46:42Z mike $".
#

Abhinit
k tht was stupid.... I'm not providing any "a" param though...

Abhinit
I removed the "a" param, but its now giving trouble with the x param :P I
guess I'll go ahead and install ps on my system :)

Abhinit
I removed all params from the ps command, still m getting "unable to start
scheduler" error.

Martin
Hi,

I would like to know if you finally suceeded in compiling CUPS and printing
from your ARM.

I am trying to cross compile CUPS for an ARM Cortex A9, running Debian
And since a lot of people seem to have trouble doing this i'd like to know
if we are not trying something we can't achieve.

We are trying to do this because we want to install and configure a printer
on our board, we only have the .PPD file, everything is working fine with
CUPS on our x86 architecture under ubuntu, but the final project will be on
ARM, do you think that cross compiling CUPS for our ARM is possible or do
you see an other easier solution, giving that we are 2 students, from
engineering school involved in the project. The final aim in only to print
a given image and not to use all the functionality of the printer.

Best regards.