mirror of
https://git.yoctoproject.org/poky
synced 2026-05-01 06:32:11 +02:00
Fixes [BUGID #99] The mouse, usb and cursor devices don't work for the qemumips machine. There's no easy way to 'undo' the defaults, or dynamically remove them, so we simply don't use the default UI options for this machine type. Mouse and pointer are provided via ps/2 and not via the usb and wacom tablet driver. Signed-off-by: Richard Griffiths <rgriffit@windriver.com> Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
394 lines
12 KiB
Bash
Executable File
394 lines
12 KiB
Bash
Executable File
#!/bin/bash -x
|
|
|
|
# Handle running Poky images under qemu
|
|
#
|
|
# Copyright (C) 2006-2008 OpenedHand Ltd.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# 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.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
# Call setting:
|
|
# QEMU_MEMORY (optional) - set the amount of memory in the emualted system.
|
|
# SERIAL_LOGFILE (optional) - log the serial port output to a file
|
|
# CROSSPATH - the path to any cross toolchain to use with distcc
|
|
#
|
|
# Image options:
|
|
# MACHINE - the machine to run
|
|
# TYPE - the image type to run
|
|
# ZIMAGE - the kernel image file to use
|
|
# HDIMAGE - the disk image file to use
|
|
#
|
|
|
|
if [ -z "$QEMU_MEMORY" ]; then
|
|
case "$MACHINE" in
|
|
"qemux86")
|
|
QEMU_MEMORY="128M"
|
|
;;
|
|
"qemux86-64")
|
|
QEMU_MEMORY="128M"
|
|
;;
|
|
"qemumips")
|
|
QEMU_MEMORY="128M"
|
|
;;
|
|
"qemuppc")
|
|
QEMU_MEMORY="128M"
|
|
;;
|
|
*)
|
|
QEMU_MEMORY="64M"
|
|
;;
|
|
esac
|
|
|
|
fi
|
|
|
|
QEMUIFUP=`which poky-qemu-ifup`
|
|
QEMUIFDOWN=`which poky-qemu-ifdown`
|
|
|
|
LOCKDIR="/tmp/qemu-tap-locks"
|
|
[ ! -d "$LOCKDIR" ] && mkdir $LOCKDIR
|
|
|
|
POSSIBLE=`ifconfig -a | grep '^tap' | awk '{print $1}'`
|
|
TAP=""
|
|
LOCKFILE=""
|
|
for tap in $POSSIBLE; do
|
|
LOCKFILE="$LOCKDIR/$tap"
|
|
if lockfile -2 -r 1 $LOCKFILE; then
|
|
TAP=$tap
|
|
break;
|
|
fi
|
|
done
|
|
|
|
if [ "$TAP" = "" ]; then
|
|
GROUPID=`id -g`
|
|
echo 'Setting up tap interface under sudo'
|
|
tap=`sudo $QEMUIFUP $GROUPID $POKY_NATIVE_SYSROOT`
|
|
if [ $? -ne 0 ]; then
|
|
# Re-run standalone to see verbose errors
|
|
sudo $QEMUIFUP $GROUPID $POKY_NATIVE_SYSROOT
|
|
return
|
|
fi
|
|
LOCKFILE="$LOCKDIR/$tap"
|
|
if lockfile $LOCKFILE; then
|
|
TAP=$tap
|
|
break;
|
|
fi
|
|
else
|
|
echo "Using preconfigured tap device '$TAP'"
|
|
fi
|
|
|
|
release_lock() {
|
|
if [ "$LOCKFILE" = "" ]; then
|
|
$QEMUIFDOWN $TAP $POKY_NATIVE_SYSROOT
|
|
else
|
|
echo "Releasing lockfile of preconfigured tap device '$TAP'"
|
|
rm -f $LOCKFILE
|
|
fi
|
|
}
|
|
|
|
n1=$[ (`echo $TAP | sed 's/tap//'` * 2) + 1 ]
|
|
n2=$[ (`echo $TAP | sed 's/tap//'` * 2) + 2 ]
|
|
|
|
KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
|
|
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
|
|
QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
|
|
KERNCMDLINE="mem=$QEMU_MEMORY"
|
|
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
|
|
|
|
SERIALOPTS=""
|
|
if [ "x$SERIAL_LOGFILE" != "x" ]; then
|
|
SERIALOPTS="-serial file:$SERIAL_LOGFILE"
|
|
fi
|
|
|
|
case "$MACHINE" in
|
|
"qemuarm") ;;
|
|
"qemumips") ;;
|
|
"qemuppc") ;;
|
|
"qemuarmv6") ;;
|
|
"qemuarmv7") ;;
|
|
"qemux86") ;;
|
|
"qemux86-64") ;;
|
|
"akita") ;;
|
|
"spitz") ;;
|
|
"nokia800") ;;
|
|
"nokia800-maemo") ;;
|
|
*)
|
|
echo "Error: Unsupported machine type $MACHINE"
|
|
return
|
|
;;
|
|
esac
|
|
|
|
if [ "$TYPE" != "nfs" -a ! -f "$HDIMAGE" ]; then
|
|
echo "Error: Image file $HDIMAGE doesn't exist"
|
|
release_lock
|
|
return
|
|
fi
|
|
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
NFS_SERVER="192.168.7.1"
|
|
NFS_DIR=`echo $HDIMAGE | sed 's/^[^:]*:\(.*\)/\1/'`
|
|
UNFS_OPTS="nfsvers=2,mountprog=21111,nfsprog=11111,udp"
|
|
fi
|
|
|
|
if [ "$NFS_SERVER" = "" ]; then
|
|
NFS_SERVER="192.168.7.1"
|
|
NFS_DIR=$HDIMAGE
|
|
fi
|
|
|
|
if [ ! -f "$ZIMAGE" ]; then
|
|
echo "Error: Kernel image file $ZIMAGE doesn't exist"
|
|
release_lock
|
|
return
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemuarm" -o "$MACHINE" = "qemuarmv6" -o "$MACHINE" = "qemuarmv7" ]; then
|
|
if [ -e /proc/sys/vm/mmap_min_addr ]; then
|
|
if [ `cat /proc/sys/vm/mmap_min_addr` != "0" ]; then
|
|
echo "Error, please set /proc/sys/vm/mmap_min_addr to 0 since otherwise it can cause problems with QEMU"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
QEMU=qemu-system-arm
|
|
MACHINE_SUBTYPE=versatilepb
|
|
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS"
|
|
# QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -force-pointer"
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
KERNCMDLINE="root=/dev/sda console=ttyAMA0,115200 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY highres=off"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M versatilepb -hda $HDIMAGE -no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
|
|
echo "Error: NFS mount point $HDIMAGE doesn't exist"
|
|
release_lock
|
|
return
|
|
fi
|
|
KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M versatilepb --no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$MACHINE" = "qemuarmv6" ]; then
|
|
QEMUOPTIONS="$QEMUOPTIONS -cpu arm1136"
|
|
fi
|
|
if [ "$MACHINE" = "qemuarmv7" ]; then
|
|
QEMUOPTIONS="$QEMUOPTIONS -cpu cortex-a8"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemux86" ]; then
|
|
QEMU=qemu
|
|
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware -enable-gl"
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
KERNCMDLINE="vga=0 root=/dev/hda mem=$QEMU_MEMORY $KERNEL_NETWORK_CMD"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -hda $HDIMAGE $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
|
|
echo "Error: NFS mount point $HDIMAGE doesn't exist."
|
|
release_lock
|
|
return
|
|
fi
|
|
KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD $QEMU_UI_OPTIONS"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemux86-64" ]; then
|
|
QEMU=qemu-system-x86_64
|
|
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware -enable-gl"
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
KERNCMDLINE="vga=0 root=/dev/hda mem=$QEMU_MEMORY $KERNEL_NETWORK_CMD"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -hda $HDIMAGE $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
if [ "x$HDIMAGE" = "x" ]; then
|
|
HDIMAGE=/srv/nfs/qemux86-64
|
|
fi
|
|
if [ ! -d "$HDIMAGE" ]; then
|
|
echo "Error: NFS mount point $HDIMAGE doesn't exist."
|
|
release_lock
|
|
return
|
|
fi
|
|
KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD $QEMU_UI_OPTIONS"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "spitz" ]; then
|
|
QEMU=qemu-system-arm
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
echo $HDIMAGE
|
|
HDIMAGE=`readlink -f $HDIMAGE`
|
|
echo $HDIMAGE
|
|
if [ ! -e "$HDIMAGE.qemudisk" ]; then
|
|
echo "Adding a partition table to the ext3 image for use by QEMU, please wait..."
|
|
poky-addptable2image $HDIMAGE $HDIMAGE.qemudisk
|
|
fi
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M spitz -hda $HDIMAGE.qemudisk -portrait"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemumips" ]; then
|
|
QEMU=qemu-system-mips
|
|
MACHINE_SUBTYPE=malta
|
|
QEMU_UI_OPTIONS="-vga cirrus"
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
#KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -hda $HDIMAGE -no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
|
|
echo "Error: NFS mount point $HDIMAGE doesn't exist"
|
|
release_lock
|
|
return
|
|
fi
|
|
KERNCMDLINE="root=/dev/nfs console=ttyS0 console=tty nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemuppc" ]; then
|
|
QEMU=qemu-system-ppc
|
|
MACHINE_SUBTYPE=prep
|
|
CPU_SUBTYPE=603e
|
|
BIOS=powerpc_rom.bin
|
|
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -nographic"
|
|
if [ "$TYPE" = "ext3" ]; then
|
|
KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -bios $BIOS -hda $HDIMAGE -no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
if [ "$TYPE" = "nfs" ]; then
|
|
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
|
|
echo "Error: NFS mount point $HDIMAGE doesn't exist"
|
|
release_lock
|
|
return
|
|
fi
|
|
KERNCMDLINE="root=/dev/nfs console=ttyS0 console=tty0 nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -bios $BIOS -no-reboot $QEMU_UI_OPTIONS"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "akita" ]; then
|
|
QEMU=qemu-system-arm
|
|
if [ "$TYPE" = "jffs2" ]; then
|
|
HDIMAGE=`readlink -f $HDIMAGE`
|
|
if [ ! -e "$HDIMAGE.qemuflash" ]; then
|
|
echo "Converting raw image into flash image format for use by QEMU, please wait..."
|
|
raw2flash.akita < $HDIMAGE > $HDIMAGE.qemuflash
|
|
fi
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M akita -mtdblock $HDIMAGE.qemuflash -portrait"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "nokia800" ]; then
|
|
QEMU=qemu-system-arm
|
|
if [ "$TYPE" = "jffs2" ]; then
|
|
HDIMAGE=`readlink -f $HDIMAGE`
|
|
if [ ! -e "$HDIMAGE.qemuflash" ]; then
|
|
echo "'Flashing' rootfs, please wait..."
|
|
poky-nokia800-flashutil $HDIMAGE $HDIMAGE.qemuflash
|
|
fi
|
|
KERNCMDLINE="root=/dev/mtdblock4 rootfstype=jffs2"
|
|
QEMU_NETWORK_CMD="-net nic,model=usb,vlan=0 $QEMU_TAP_CMD"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M n800 -mtdblock $HDIMAGE.qemuflash -serial vc -m 130 -serial vc -serial vc -serial vc -usb -usbdevice net:0"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MACHINE" = "nokia800-maemo" ]; then
|
|
QEMU=qemu-system-arm
|
|
if [ "$TYPE" = "jffs2" ]; then
|
|
HDIMAGE=`readlink -f $HDIMAGE`
|
|
if [ ! -e "$HDIMAGE.qemuflash" ]; then
|
|
if [ ! -e "$HDIMAGE.initfs" ]; then
|
|
echo "Error, $HDIMAGE.initfs must exist!"
|
|
release_lock
|
|
return
|
|
fi
|
|
if [ ! -e "$HDIMAGE.config" ]; then
|
|
echo "Error, $HDIMAGE.config must exist!"
|
|
echo "To generate it, take an n800 and cat /dev/mtdblock1 > $HDIMAGE.config"
|
|
release_lock
|
|
return
|
|
fi
|
|
echo "'Flashing' config partition, please wait..."
|
|
poky-nokia800-flashutil $HDIMAGE.config $HDIMAGE.qemuflash config
|
|
echo "'Flashing' initfs, please wait..."
|
|
poky-nokia800-flashutil $HDIMAGE.initfs $HDIMAGE.qemuflash initfs
|
|
echo "'Flashing' rootfs, please wait..."
|
|
poky-nokia800-flashutil $HDIMAGE $HDIMAGE.qemuflash
|
|
fi
|
|
KERNCMDLINE=""
|
|
QEMU_NETWORK_CMD="-net nic,model=usb,vlan=0 $QEMU_TAP_CMD"
|
|
QEMUOPTIONS="$QEMU_NETWORK_CMD -M n800 -mtdblock $HDIMAGE.qemuflash -serial vc -m 130 -serial vc -serial vc -serial vc -usb -usbdevice net:0 -show-cursor"
|
|
fi
|
|
fi
|
|
|
|
if [ "x$QEMUOPTIONS" = "x" ]; then
|
|
echo "Error: Unable to support this combination of options"
|
|
release_lock
|
|
return
|
|
fi
|
|
|
|
SDKDIR="/opt/poky/sysroots"
|
|
if [ "$MACHINE" = "qemuarm" -o "$MACHINE" = "spitz" -o "$MACHINE" = "borzoi" -o "$MACHINE" = "akita" -o "$MACHINE" = "nokia800" ]; then
|
|
SDKPATH="$SDKDIR/arm-poky-linux-gnueabi/bin"
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemux86" ]; then
|
|
SDKPATH="$SDKDIR/i586-poky-linux/bin"
|
|
fi
|
|
|
|
if [ "$MACHINE" = "qemux86-64" ]; then
|
|
SDKPATH="$SDKDIR/x86_64-poky-linux/bin"
|
|
fi
|
|
|
|
PATH=$CROSSPATH:$SDKPATH:$PATH
|
|
|
|
QEMUBIN=`which $QEMU`
|
|
|
|
if [ ! -x "$QEMUBIN" ]; then
|
|
echo "Error: No QEMU binary '$QEMU' could be found."
|
|
release_lock
|
|
return
|
|
fi
|
|
|
|
function _quit() {
|
|
if [ -n "$PIDFILE" ]; then
|
|
#echo kill `cat $PIDFILE`
|
|
kill `cat $PIDFILE`
|
|
fi
|
|
release_lock
|
|
return
|
|
}
|
|
|
|
DISTCCD=`which distccd`
|
|
PIDFILE=""
|
|
|
|
trap _quit INT TERM QUIT
|
|
|
|
if [ -x "$DISTCCD" ]; then
|
|
echo "Starting distccd..."
|
|
PIDFILE=`mktemp`
|
|
$DISTCCD --allow 192.168.7.2 --daemon --pid-file $PIDFILE &
|
|
else
|
|
echo "Warning: distccd not present, no distcc support loaded."
|
|
fi
|
|
|
|
echo "Running $QEMU..."
|
|
echo $QEMUBIN -kernel $ZIMAGE $QEMUOPTIONS $SERIALOPTS $* --append '"'$KERNCMDLINE'"'
|
|
$QEMUBIN -kernel $ZIMAGE $QEMUOPTIONS $SERIALOPTS $* --append "$KERNCMDLINE" || /bin/true
|
|
|
|
release_lock
|
|
|
|
trap - INT TERM QUIT
|
|
return
|