summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/freesmartphone/frameworkd/om-gta02/frameworkd.conf5
-rw-r--r--packages/freesmartphone/frameworkd_git.bb2
-rw-r--r--packages/gypsy/gypsy_svn.bb2
-rw-r--r--packages/images/fso-image.bb2
-rw-r--r--packages/linux/gumstix-kernel-2.6.21/smc91x-fail-if-no-chip.patch2
-rw-r--r--packages/linux/gumstix-kernel-2.6.21/tsc2003.c260
-rw-r--r--packages/linux/gumstix-kernel_2.6.21.bb2
-rw-r--r--packages/linux/gumstix-linux.inc31
-rw-r--r--packages/tangogps/files/.mtn2git_empty0
-rw-r--r--packages/tangogps/files/0002-Get-GPS-data-via-the-gypsy-interface.patch182
-rw-r--r--packages/tangogps/files/0003-Try-to-request-the-GPS-resource-from-ousaged.patch73
-rw-r--r--packages/tangogps/tangogps-fso_0.9.2.bb13
12 files changed, 416 insertions, 158 deletions
diff --git a/packages/freesmartphone/frameworkd/om-gta02/frameworkd.conf b/packages/freesmartphone/frameworkd/om-gta02/frameworkd.conf
index 28a6416729..cbeedf3da7 100644
--- a/packages/freesmartphone/frameworkd/om-gta02/frameworkd.conf
+++ b/packages/freesmartphone/frameworkd/om-gta02/frameworkd.conf
@@ -5,6 +5,7 @@ ignoreinput=2,3
[input]
# don't read from accellerometers for GTA02
ignoreinput=2,3
+
# specify accellerometer type
accelerometer_type = gta02
# keys
@@ -13,6 +14,10 @@ report2 = POWER,key,116,1
report3 = CHARGER,key,356,0
report4 = HEADSET,switch,2,0
+# disable accelerometer since it uses LOADS of CPU resources
+[accelerometer]
+disable = 1
+
[ogsmd]
# GTA02 has TI Calypso
modemtype = ti_calypso
diff --git a/packages/freesmartphone/frameworkd_git.bb b/packages/freesmartphone/frameworkd_git.bb
index 76e8b78691..08c43f907a 100644
--- a/packages/freesmartphone/frameworkd_git.bb
+++ b/packages/freesmartphone/frameworkd_git.bb
@@ -5,7 +5,7 @@ SECTION = "console/network"
DEPENDS = "python-cython-native python-pyrex-native"
LICENSE = "GPL"
PV = "0.8.1+gitr${SRCREV}"
-PR = "r11"
+PR = "r12"
inherit distutils update-rc.d
diff --git a/packages/gypsy/gypsy_svn.bb b/packages/gypsy/gypsy_svn.bb
index bb1038d86a..ed5d45537b 100644
--- a/packages/gypsy/gypsy_svn.bb
+++ b/packages/gypsy/gypsy_svn.bb
@@ -6,6 +6,8 @@ SRC_URI = "svn://svn.o-hand.com/repos/${PN}/trunk;module=${PN};proto=http \
file://fixups.patch;patch=1;maxrev=107 \
file://docs-reference-am.patch;patch=1;minrev=134"
+PR = "1"
PV = "0.0+svnr${SRCREV}"
S = "${WORKDIR}/${PN}"
+DEPENDS = "libxslt-native"
diff --git a/packages/images/fso-image.bb b/packages/images/fso-image.bb
index f1b9104b87..299e9790a1 100644
--- a/packages/images/fso-image.bb
+++ b/packages/images/fso-image.bb
@@ -68,7 +68,7 @@ GTK_INSTALL = "\
openmoko-calculator2 \
openmoko-terminal2 \
gpe-scap \
- tangogps \
+ tangogps-fso \
"
# FIXME these should rather be part of alsa-state,
diff --git a/packages/linux/gumstix-kernel-2.6.21/smc91x-fail-if-no-chip.patch b/packages/linux/gumstix-kernel-2.6.21/smc91x-fail-if-no-chip.patch
index 0d4425412c..17ead87f12 100644
--- a/packages/linux/gumstix-kernel-2.6.21/smc91x-fail-if-no-chip.patch
+++ b/packages/linux/gumstix-kernel-2.6.21/smc91x-fail-if-no-chip.patch
@@ -52,7 +52,7 @@
-proceed:
+proceed1:
-+ printk(KERN_ERR "%s: found %d smc91x chip(s)\n", __FUNCTION__);
++ printk(KERN_ERR "%s: found %d smc91x chip(s)\n", __FUNCTION__,num_devices);
pxa_gpio_mode(GPIO15_nCS_1_MD);
if(smc91x_devices[1]) pxa_gpio_mode(GPIO_GUMSTIX_ETH1_RST_MD);
diff --git a/packages/linux/gumstix-kernel-2.6.21/tsc2003.c b/packages/linux/gumstix-kernel-2.6.21/tsc2003.c
index a4a68b756d..8836537b77 100644
--- a/packages/linux/gumstix-kernel-2.6.21/tsc2003.c
+++ b/packages/linux/gumstix-kernel-2.6.21/tsc2003.c
@@ -3,7 +3,8 @@
*
* Copyright (C) 2005 Bill Gatliff <bgat at billgatliff.com>
* Changes for 2.6.20 kernel by Nicholas Chen <nchen at cs.umd.edu>
- * Changes for 2.6.21 kernel by Chris Dollar <chris.dollar at gmail.com>
+ * Changes to poll for events rather than use penirq by
+ * Chris Dollar <chris.dollar at gmail.com>
*
* 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
@@ -12,7 +13,6 @@
* Driver for TI's TSC2003 I2C Touch Screen Controller
*/
-//#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
@@ -21,10 +21,8 @@
#include <linux/bcd.h>
#include <linux/list.h>
#include <linux/device.h>
-#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/delay.h>
-#include <asm-arm/arch-pxa/irqs.h>
#define DRIVER_NAME "tsc2003"
#define TSC2003_CMD(cn,pdn,m) (((cn) << 4) | ((pdn) << 2) | ((m) << 1))
@@ -37,10 +35,10 @@ static unsigned short normal_i2c[] = { 0x48, I2C_CLIENT_END };
I2C_CLIENT_INSMOD_1(tsc2003);
enum tsc2003_pd {
- PD_POWERDOWN = 0, /* penirq */
- PD_IREFOFF_ADCON = 1, /* no penirq */
- PD_IREFON_ADCOFF = 2, /* penirq */
- PD_IREFON_ADCON = 3, /* no penirq */
+ PD_POWERDOWN = 0,
+ PD_IREFOFF_ADCON = 1,
+ PD_IREFON_ADCOFF = 2,
+ PD_IREFON_ADCON = 3,
PD_PENIRQ_ARM = PD_IREFON_ADCOFF,
PD_PENIRQ_DISARM = PD_IREFON_ADCON,
};
@@ -70,14 +68,10 @@ struct tsc2003_data {
struct i2c_client client;
struct device_driver driver;
struct input_dev *idev;
- struct semaphore sem;
struct task_struct *tstask;
struct completion tstask_completion;
- struct completion penirq_completion;
enum tsc2003_pd pd;
enum tsc2003_m m;
- int penirq;
-
int vbat1;
int vbat2;
int temp0;
@@ -86,11 +80,12 @@ struct tsc2003_data {
int in2;
};
-static int
- tsc2003_i2c_detect(struct i2c_adapter *adapter, int address, int kind);
+static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address,
+ int kind);
static int tsc2003_read(struct tsc2003_data *data, enum tsc2003_cmd cmd,
- enum tsc2003_pd pd, int *val) {
+ enum tsc2003_pd pd, int *val)
+{
char c;
char d[2];
int ret;
@@ -101,7 +96,8 @@ static int tsc2003_read(struct tsc2003_data *data, enum tsc2003_cmd cmd,
goto err;
udelay(20);
- ret = i2c_master_recv(&data->client, d, data->m == M_12BIT ? 2 : 1);
+ ret =
+ i2c_master_recv(&data->client, d, data->m == M_12BIT ? 2 : 1);
if (ret <= 0)
goto err;
@@ -111,70 +107,80 @@ static int tsc2003_read(struct tsc2003_data *data, enum tsc2003_cmd cmd,
if (data->m == M_12BIT)
*val += (d[1] >> 4);
}
-
#if defined(CONFIG_I2C_DEBUG_CHIP)
printk(KERN_ERR "%s: val[%x] = %d\n",
- __FUNCTION__, cmd, (((int)d[0]) << 8) + d[1]);
+ __FUNCTION__, cmd, (((int) d[0]) << 8) + d[1]);
#endif
return 0;
- err: if (!ret)
+ err:if (!ret)
ret = -ENODEV;
return ret;
}
static inline int tsc2003_read_temp0(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_TEMP0, pd, t);
}
static inline int tsc2003_read_temp1(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_TEMP1, pd, t);
}
static inline int tsc2003_read_xpos(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *x) {
+ tsc2003_pd pd, int *x)
+{
return tsc2003_read(d, MEAS_XPOS, pd, x);
}
static inline int tsc2003_read_ypos(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *y) {
+ tsc2003_pd pd, int *y)
+{
return tsc2003_read(d, MEAS_YPOS, pd, y);
}
static inline int tsc2003_read_pressure(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *p) {
+ tsc2003_pd pd, int *p)
+{
return tsc2003_read(d, MEAS_Z1POS, pd, p);
}
static inline int tsc2003_read_in1(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_IN1, pd, t);
}
static inline int tsc2003_read_in2(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_IN2, pd, t);
}
static inline int tsc2003_read_vbat1(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_VBAT1, pd, t);
}
static inline int tsc2003_read_vbat2(struct tsc2003_data *d, enum
-tsc2003_pd pd, int *t) {
+ tsc2003_pd pd, int *t)
+{
return tsc2003_read(d, MEAS_VBAT2, pd, t);
}
-static inline int tsc2003_powerdown(struct tsc2003_data *d) {
+static inline int tsc2003_powerdown(struct tsc2003_data *d)
+{
/* we don't have a distinct powerdown command,
- so do a benign read with the PD bits cleared */
+ so do a benign read with the PD bits cleared */
return tsc2003_read(d, MEAS_IN1, PD_POWERDOWN, 0);
}
-void tsc2003_init_client(struct i2c_client *client) {
+void tsc2003_init_client(struct i2c_client *client)
+{
struct tsc2003_data *data = i2c_get_clientdata(client);
data->pd = PD_PENIRQ_DISARM;
@@ -182,34 +188,10 @@ void tsc2003_init_client(struct i2c_client *client) {
return;
}
-static irqreturn_t tsc2003_penirq(int irq, void *v) {
- struct tsc2003_data *d = v;
-
- printk(KERN_INFO "penirq: %Ld\n", jiffies);
-
- // disable the penirq while we take the sample
- disable_irq_nosync(d->penirq);
-
- complete(&d->penirq_completion);
- return IRQ_HANDLED;
-}
-
-static void tsc2003_pen_up(unsigned long v) {
- printk(KERN_INFO "tsc2003_pen_up - re-enable irq now\n");
- struct tsc2003_data *d = (struct tsc2003_data *)v;
-
- enable_irq(d->penirq);
-
- input_report_abs(d->idev, ABS_PRESSURE, 0);
- input_sync(d->idev);
- return;
-}
-
-static int tsc2003ts_thread(void *v) {
+static int tsc2003ts_thread(void *v)
+{
struct tsc2003_data *d = v;
struct task_struct *tsk = current;
- int ret;
- int err = 0;
d->tstask = tsk;
@@ -220,56 +202,47 @@ static int tsc2003ts_thread(void *v) {
#if defined(CONFIG_I2C_DEBUG_CHIP)
printk(KERN_INFO "%s: address 0x%x\n",
- __FUNCTION__, d->client.addr);
-#endif
-
- do {
- unsigned int x, y, p, fp;
- int pen_is_up = 0;
-
- down(&d->sem);
+ __FUNCTION__, d->client.addr);
+#endif
- // take the sample
- d->pd = PD_PENIRQ_DISARM;
- tsc2003_read_xpos(d, PD_PENIRQ_DISARM, &x);
- tsc2003_read_ypos(d, PD_PENIRQ_DISARM, &y);
- tsc2003_read_pressure(d, PD_PENIRQ_DISARM, &p);
+ do {
+ unsigned int x, y, p;
+ int pen_is_up = 0;
- if (p < 64) {
- p=0;
- }
+ d->pd = PD_PENIRQ_DISARM;
+ tsc2003_read_xpos(d, PD_PENIRQ_DISARM, &x);
+ tsc2003_read_ypos(d, PD_PENIRQ_DISARM, &y);
+ tsc2003_read_pressure(d, PD_PENIRQ_DISARM, &p);
+ if (p < 64) {
+ p = 0;
+ }
#if defined(CONFIG_I2C_DEBUG_CHIP)
- printk(KERN_INFO "TSD X: %d Y: %d P: %d\n", x, y, p);
-#endif
-
- if (!pen_is_up) {
- // report our touch to the input layer
- input_report_abs(d->idev, ABS_X, 4096 - x);
- input_report_abs(d->idev, ABS_Y, 4096 - y);
- input_report_abs(d->idev, ABS_PRESSURE, p);
- input_sync(d->idev);
- }
-
- if(p == 0) {
+ printk(KERN_INFO "TSD X: %d Y: %d P: %d\n", x, y, p);
+#endif
+
+ if (!pen_is_up) {
+ input_report_abs(d->idev, ABS_X, 4096 - x);
+ input_report_abs(d->idev, ABS_Y, 4096 - y);
+ input_report_abs(d->idev, ABS_PRESSURE, p);
+ input_sync(d->idev);
+ }
+
+ if (p == 0) {
#if defined(CONFIG_I2C_DEBUG_CHIP)
- printk(KERN_INFO "No pressure - pen is up!\n");
-#endif
- // set our pen as up
- pen_is_up = 1;
- }
- else {
+ printk(KERN_INFO "No pressure - pen is up!\n");
+#endif
+ pen_is_up = 1;
+ } else {
#if defined(CONFIG_I2C_DEBUG_CHIP)
- printk(KERN_INFO "Pen is still down - sleeping and will re-sample!\n");
-#endif
- // set our pen as down
- pen_is_up = 0;
- }
-
- // sleep for 3 jiffies to give us about 30 updates/sec
- msleep (3);
+ printk(KERN_INFO
+ "Pen is still down - sleeping and will re-sample!\n");
+#endif
+ pen_is_up = 0;
+ }
- up(&d->sem);
+ // sleep for 3 jiffies to give us about 30 updates/sec
+ msleep(3);
} while (!signal_pending(tsk));
@@ -277,13 +250,11 @@ static int tsc2003ts_thread(void *v) {
complete_and_exit(&d->tstask_completion, 0);
}
-static int tsc2003_idev_open(struct input_dev *idev) {
+static int tsc2003_idev_open(struct input_dev *idev)
+{
struct tsc2003_data *d = idev->private;
int ret = 0;
- if (down_interruptible(&d->sem))
- return -EINTR;
-
if (d->tstask)
panic(DRIVER_NAME "tsd already running (!). abort.");
@@ -293,50 +264,26 @@ static int tsc2003_idev_open(struct input_dev *idev) {
ret = 0;
}
- up(&d->sem);
return ret;
}
-static void tsc2003_idev_close(struct input_dev *idev) {
+static void tsc2003_idev_close(struct input_dev *idev)
+{
struct tsc2003_data *d = idev->private;
- down_interruptible(&d->sem);
if (d->tstask) {
send_sig(SIGKILL, d->tstask, 1);
wait_for_completion(&d->tstask_completion);
}
- up(&d->sem);
return;
}
-static int tsc2003_detect_irq(struct tsc2003_data *d) {
- d->penirq = IRQ_GPIO(16); //PWM0 GPIO
- return 0;
-}
-
-static int tsc2003_driver_register(struct tsc2003_data *data) {
+static int tsc2003_driver_register(struct tsc2003_data *data)
+{
struct input_dev *idev;
int ret = 0;
- int error;
-
- init_MUTEX(&data->sem);
- error = tsc2003_detect_irq(data);
- if (error) {
- printk(KERN_ERR "TSC2003: IRQ probe failed\n");
- }
-
- if (data->penirq) {
- ret = request_irq(data->penirq, tsc2003_penirq, SA_INTERRUPT | IRQF_TRIGGER_LOW,
- DRIVER_NAME, data);
- if (!ret) {
- printk(KERN_INFO "%s: irq %d\n", __FUNCTION__, data->penirq);
- init_completion(&data->tstask_completion);
- init_completion(&data->penirq_completion);
- } else {
- printk(KERN_ERR "%s: cannot grab irq %d\n", __FUNCTION__, data->penirq);
- }
- }
+ init_completion(&data->tstask_completion);
idev = input_allocate_device();
data->idev = idev;
@@ -361,19 +308,21 @@ static int tsc2003_driver_register(struct tsc2003_data *data) {
return ret;
}
-static int tsc2003_i2c_attach_adapter(struct i2c_adapter *adapter) {
+static int tsc2003_i2c_attach_adapter(struct i2c_adapter *adapter)
+{
printk(KERN_INFO "tsc2003 i2c touch screen controller\n");
+#if defined(CONFIG_I2C_DEBUG_CHIP)
printk(KERN_INFO "Bill Gatliff <bgat at billgatliff.com\n");
- printk(KERN_INFO "Nicholas Chen <nchen at cs.umd.edu>\n");
-
- return i2c_probe(adapter, &addr_data, tsc2003_i2c_detect);
+ printk(KERN_INFO "Nicholas Chen <nchen at cs.umd.edu>\n");
+#endif
+ return i2c_probe(adapter, &addr_data, tsc2003_i2c_detect);
}
-static int tsc2003_i2c_detach_client(struct i2c_client *client) {
+static int tsc2003_i2c_detach_client(struct i2c_client *client)
+{
int err;
struct tsc2003_data *d = i2c_get_clientdata(client);
- free_irq(d->penirq, d);
input_unregister_device(d->idev);
if ((err = i2c_detach_client(client))) {
@@ -385,16 +334,18 @@ static int tsc2003_i2c_detach_client(struct i2c_client *client) {
return 0;
}
-static struct i2c_driver tsc2003_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = DRIVER_NAME,
- },
- .attach_adapter = tsc2003_i2c_attach_adapter,
- .detach_client = tsc2003_i2c_detach_client,
+static struct i2c_driver tsc2003_driver = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = DRIVER_NAME,
+ },
+ .attach_adapter = tsc2003_i2c_attach_adapter,
+ .detach_client = tsc2003_i2c_detach_client,
};
-static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address, int kind) {
+static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address,
+ int kind)
+{
struct i2c_client *new_client;
struct tsc2003_data *data;
@@ -402,7 +353,8 @@ static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address, int kind
const char *name = "";
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
- | I2C_FUNC_I2C | I2C_FUNC_SMBUS_WORD_DATA))
+ | I2C_FUNC_I2C |
+ I2C_FUNC_SMBUS_WORD_DATA))
goto exit;
data = kcalloc(1, sizeof(*data), GFP_KERNEL);
@@ -419,16 +371,16 @@ static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address, int kind
new_client->flags = 0;
/* TODO: I'm pretty sure I'm not dealing with kind correctly */
- if (kind == 0 /* identification */|| kind < 0 /* detection */)
+ if (kind == 0 /* identification */ || kind < 0 /* detection */ )
kind = tsc2003;
if (kind == tsc2003)
name = DRIVER_NAME;
/* try a command, see if we get an ack;
- if we do, assume it's our device */
+ if we do, assume it's our device */
printk(KERN_INFO "%s: probing address 0x%x\n",
- __FUNCTION__, address);
+ __FUNCTION__, address);
err = tsc2003_powerdown(data);
if (err >= 0) {
strlcpy(new_client->name, name, I2C_NAME_SIZE);
@@ -443,15 +395,15 @@ static int tsc2003_i2c_detect(struct i2c_adapter *adapter, int address, int kind
goto exit_free;
printk(KERN_INFO "%s: device address 0x%x attached.\n",
- __FUNCTION__, address);
+ __FUNCTION__, address);
return 0;
}
/* failure to detect when everything else is ok isn't an error */
else
err = 0;
- exit_free: kfree(new_client);
- exit: return err;
+ exit_free:kfree(new_client);
+ exit:return err;
}
static int __init tsc2003_init(void)
diff --git a/packages/linux/gumstix-kernel_2.6.21.bb b/packages/linux/gumstix-kernel_2.6.21.bb
index d1664e8763..e71c972053 100644
--- a/packages/linux/gumstix-kernel_2.6.21.bb
+++ b/packages/linux/gumstix-kernel_2.6.21.bb
@@ -1,4 +1,4 @@
-require linux.inc
+require gumstix-linux.inc
SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \
file://defconfig \
diff --git a/packages/linux/gumstix-linux.inc b/packages/linux/gumstix-linux.inc
index 76fd15d95a..50111cb545 100644
--- a/packages/linux/gumstix-linux.inc
+++ b/packages/linux/gumstix-linux.inc
@@ -9,7 +9,10 @@ DEPENDS += " \
u-boot-mkimage-openmoko-native \
"
+KERNEL_IMAGE_BASE_NAME = ${KERNEL_IMAGETYPE}-${PV}-${PR}-${MACHINE}
+
S = "${WORKDIR}/linux-${PV}"
+do_deploy[dirs] = "${S}"
do_configure_prepend() {
echo "" > ${S}/.config
@@ -32,6 +35,16 @@ do_configure_prepend() {
yes '' | oe_runmake oldconfig
}
+do_sizecheck() {
+ if [ ! -z "${KERNEL_IMAGE_MAXSIZE}" ]; then
+ size=`ls -l arch/${ARCH}/boot/${KERNEL_IMAGETYPE} | awk '{ print $5}'`
+ if [ $size -ge ${KERNEL_IMAGE_MAXSIZE} ]; then
+ rm arch/${ARCH}/boot/${KERNEL_IMAGETYPE}
+ die "This kernel (size=$size) is too big for your device. Please reduce the size of the kernel by making more of it modular."
+ fi
+ fi
+}
+
do_install_prepend() {
if test -e arch/${ARCH}/boot/Image ; then
ln -f arch/${ARCH}/boot/Image arch/${ARCH}/boot/uImage
@@ -41,3 +54,21 @@ do_install_prepend() {
ln -f arch/${ARCH}/boot/images/uImage arch/${ARCH}/boot/uImage
fi
}
+
+do_deploy() {
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0644 arch/${ARCH}/boot/${KERNEL_IMAGETYPE} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin
+ tar -cvzf ${DEPLOY_DIR_IMAGE}/modules-${KERNEL_RELEASE}-${PR}-${MACHINE}.tgz -C ${D} lib
+
+ if test "x${KERNEL_IMAGETYPE}" = "xuImage" ; then
+ ${OBJCOPY} -O binary -R .note -R .comment -S arch/${ARCH}/boot/compressed/vmlinux linux.bin
+ uboot-mkimage -A ${ARCH} -O linux -T kernel -C none -a ${UBOOT_ENTRYPOINT} -e ${UBOOT_ENTRYPOINT} -n "${DISTRO_NAME}/${PV}/${MACHINE}" -d linux.bin ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin
+ rm -f linux.bin
+
+ fi
+}
+
+addtask sizecheck before do_install after do_compile
+addtask deploy before do_package after do_install
+
+
diff --git a/packages/tangogps/files/.mtn2git_empty b/packages/tangogps/files/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/tangogps/files/.mtn2git_empty
diff --git a/packages/tangogps/files/0002-Get-GPS-data-via-the-gypsy-interface.patch b/packages/tangogps/files/0002-Get-GPS-data-via-the-gypsy-interface.patch
new file mode 100644
index 0000000000..d5b673dfca
--- /dev/null
+++ b/packages/tangogps/files/0002-Get-GPS-data-via-the-gypsy-interface.patch
@@ -0,0 +1,182 @@
+From aab817f5f2d66f1ef1e710eb6b698865d14b7fc2 Mon Sep 17 00:00:00 2001
+From: Daniel Willmann <daniel@totalueberwachung.de>
+Date: Mon, 21 Jul 2008 04:33:59 +0200
+Subject: [PATCH] Get GPS data via the gypsy interface.
+ Except for the time (which ogpsd doesn't send periodically) the interface
+ is implemented.
+
+---
+ configure.in | 2 +-
+ src/gps_functions.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/gps_functions.h | 3 +-
+ src/init.c | 6 ++-
+ 4 files changed, 103 insertions(+), 4 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index 3661a57..cf06033 100644
+--- a/configure.in
++++ b/configure.in
+@@ -23,7 +23,7 @@ AM_GLIB_GNU_GETTEXT
+
+ AM_PROG_LIBTOOL
+
+-PKG_CHECK_MODULES(PACKAGE, [gtk+-2.0 gdk-2.0 gconf-2.0])
++PKG_CHECK_MODULES(PACKAGE, [gtk+-2.0 gdk-2.0 gconf-2.0 gypsy])
+ AC_SUBST(PACKAGE_CFLAGS)
+ AC_SUBST(PACKAGE_LIBS)
+
+diff --git a/src/gps_functions.c b/src/gps_functions.c
+index bafbc18..57646e1 100644
+--- a/src/gps_functions.c
++++ b/src/gps_functions.c
+@@ -4,6 +4,13 @@
+ # include <config.h>
+ #endif
+
++#include <gypsy/gypsy-control.h>
++#include <gypsy/gypsy-device.h>
++#include <gypsy/gypsy-position.h>
++#include <gypsy/gypsy-accuracy.h>
++#include <gypsy/gypsy-course.h>
++#include <gypsy/gypsy-satellite.h>
++
+ #include <glib.h>
+ #include <glib/gprintf.h>
+
+@@ -630,3 +637,92 @@ get_gps()
+
+
+ }
++
++static void on_fix_status_changed(GypsyDevice *device, GypsyDeviceFixStatus status, void *user_data)
++{
++ gpsdata->fix.mode = status;
++ gpsdata->valid = status > 1;
++}
++
++static void on_position_changed(GypsyPosition *position, GypsyPositionFields fields_set,
++ int timestamp, double latitude, double longitude, double altitude, void *user_data)
++{
++ if (gpsdata->valid) {
++ gpsdata->fix.latitude = latitude;
++ gpsdata->fix.longitude = longitude;
++ gpsdata->fix.altitude = altitude;
++ }
++}
++
++static void on_accuracy_changed(GypsyAccuracy *accuracy, int fields, double pdop,
++ double hdop, double vdop, void *user_data)
++{
++ gpsdata->hdop = hdop;
++}
++
++static void on_course_changed(GypsyCourse *course, GypsyCourseFields fields_set,
++ int timestamp, double speed, double direction, double climb, void *user_data)
++{
++ gpsdata->fix.speed = speed/3.6;
++ gpsdata->fix.track = direction;
++}
++
++static void on_satellites_changed(GypsySatellite *sat, GPtrArray *sats, void *user_data)
++{
++ int i;
++
++ gpsdata->satellites_used = 0;
++ gpsdata->satellites_inview = sats->len;
++ for (i = 0; i < sats->len; i++) {
++ GypsySatelliteDetails *details = sats->pdata[i];
++
++ if (details->in_use) {
++ gpsdata->satellites_used++;
++ }
++ }
++}
++
++// typedef struct {
++// double time; /* Time of update, seconds since Unix epoch */
++// int mode; /* Mode of fix */
++// double latitude; /* Latitude in degrees (valid if mode >= 2) */
++// double longitude; /* Longitude in degrees (valid if mode >= 2) */
++// double altitude; /* Altitude in meters (valid if mode == 3) */
++// double track; /* Course made good (relative to true north) */
++// double speed; /* Speed over ground, meters/sec */
++// double bearing; /* in radian */
++// } gps_fix_t;
++//
++// typedef struct {
++// gps_fix_t fix;
++// int satellites_used;
++// int satellites_inview;
++// double hdop;
++// gboolean valid;
++// } gps_data_t;
++
++
++#define GYPSY_OBJ_PATH "/org/freedesktop/Gypsy"
++
++int setup_gypsy() {
++ gpsdata = g_new0(gps_data_t,1);
++
++ GypsyControl *gyctrl = gypsy_control_get_default();
++ GypsyDevice *gydevice = gypsy_device_new(GYPSY_OBJ_PATH);
++ GypsyPosition *gypos = gypsy_position_new(GYPSY_OBJ_PATH);
++ GypsyAccuracy *gyacc = gypsy_accuracy_new(GYPSY_OBJ_PATH);
++ GypsyCourse *gycourse = gypsy_course_new(GYPSY_OBJ_PATH);
++ GypsySatellite *gysat = gypsy_satellite_new(GYPSY_OBJ_PATH);
++
++ g_signal_connect(gydevice, "fix-status-changed", G_CALLBACK(on_fix_status_changed), NULL);
++ g_signal_connect(gypos, "position-changed", G_CALLBACK(on_position_changed), NULL);
++ g_signal_connect(gyacc, "accuracy-changed", G_CALLBACK(on_accuracy_changed), NULL);
++ g_signal_connect(gycourse, "course-changed", G_CALLBACK(on_course_changed), NULL);
++ g_signal_connect(gysat, "satellites-changed", G_CALLBACK(on_satellites_changed), NULL);
++
++ gpsdata->fix.mode = gypsy_device_get_fix_status(gydevice, NULL);
++ gpsdata->valid = gpsdata->fix.mode > 1;
++
++ return 1;
++}
++
+diff --git a/src/gps_functions.h b/src/gps_functions.h
+index 1090565..207b39f 100644
+--- a/src/gps_functions.h
++++ b/src/gps_functions.h
+@@ -1,4 +1,5 @@
+-
++int
++setup_gypsy();
+
+ void
+ get_gps();
+diff --git a/src/init.c b/src/init.c
+index 46ca583..c557ce4 100644
+--- a/src/init.c
++++ b/src/init.c
+@@ -26,7 +26,7 @@
+ #include "wp.h"
+
+ FILE *fp = NULL;
+-
++int have_gypsy = 0;
+
+
+ void
+@@ -197,7 +197,8 @@ cb_gps_timer()
+
+ printf("timer called\n");
+
+- get_gps();
++ if (!have_gypsy)
++ get_gps();
+
+
+ if(gpsdata)
+@@ -868,5 +869,6 @@ init()
+ gtk_label_set_text(GTK_LABEL(widget), "V: " VERSION " (C) Marcus Bauer, GPLv2");
+ #endif
+
++ have_gypsy = setup_gypsy();
+ timer = g_timeout_add (1000,cb_gps_timer,data);
+ }
+--
+1.5.4.5
+
diff --git a/packages/tangogps/files/0003-Try-to-request-the-GPS-resource-from-ousaged.patch b/packages/tangogps/files/0003-Try-to-request-the-GPS-resource-from-ousaged.patch
new file mode 100644
index 0000000000..09b2c2ad8a
--- /dev/null
+++ b/packages/tangogps/files/0003-Try-to-request-the-GPS-resource-from-ousaged.patch
@@ -0,0 +1,73 @@
+From 2562a173716141cd9ea5c227dfa52f04ce4205f8 Mon Sep 17 00:00:00 2001
+From: Daniel Willmann <daniel@totalueberwachung.de>
+Date: Tue, 22 Jul 2008 00:22:58 +0200
+Subject: [PATCH] Try to request the GPS resource from ousaged
+
+---
+ configure.in | 2 +-
+ src/gps_functions.c | 22 ++++++++++++++++++++++
+ 2 files changed, 23 insertions(+), 1 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index cf06033..2bc3cf9 100644
+--- a/configure.in
++++ b/configure.in
+@@ -23,7 +23,7 @@ AM_GLIB_GNU_GETTEXT
+
+ AM_PROG_LIBTOOL
+
+-PKG_CHECK_MODULES(PACKAGE, [gtk+-2.0 gdk-2.0 gconf-2.0 gypsy])
++PKG_CHECK_MODULES(PACKAGE, [gtk+-2.0 gdk-2.0 gconf-2.0 dbus-glib-1 gypsy])
+ AC_SUBST(PACKAGE_CFLAGS)
+ AC_SUBST(PACKAGE_LIBS)
+
+diff --git a/src/gps_functions.c b/src/gps_functions.c
+index 57646e1..0802e67 100644
+--- a/src/gps_functions.c
++++ b/src/gps_functions.c
+@@ -11,6 +11,7 @@
+ #include <gypsy/gypsy-course.h>
+ #include <gypsy/gypsy-satellite.h>
+
++#include <dbus/dbus-glib.h>
+ #include <glib.h>
+ #include <glib/gprintf.h>
+
+@@ -705,6 +706,11 @@ static void on_satellites_changed(GypsySatellite *sat, GPtrArray *sats, void *u
+ #define GYPSY_OBJ_PATH "/org/freedesktop/Gypsy"
+
+ int setup_gypsy() {
++ DBusGConnection *connection;
++ DBusGProxy *proxy;
++ GError *error;
++ int result;
++
+ gpsdata = g_new0(gps_data_t,1);
+
+ GypsyControl *gyctrl = gypsy_control_get_default();
+@@ -723,6 +729,22 @@ int setup_gypsy() {
+ gpsdata->fix.mode = gypsy_device_get_fix_status(gydevice, NULL);
+ gpsdata->valid = gpsdata->fix.mode > 1;
+
++ error = NULL;
++ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ if (connection == NULL) {
++ g_printerr ("Failed to open connection to bus: %s\n",
++ error->message);
++ g_error_free (error);
++ proxy = NULL;
++ }
++
++ proxy = dbus_g_proxy_new_for_name (connection,
++ "org.freesmartphone.ousaged",
++ "/org/freesmartphone/Usage",
++ "org.freesmartphone.Usage");
++
++ dbus_g_proxy_call (proxy, "RequestResource", &error, G_TYPE_STRING, "GPS", G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID);
++
+ return 1;
+ }
+
+--
+1.5.4.5
+
diff --git a/packages/tangogps/tangogps-fso_0.9.2.bb b/packages/tangogps/tangogps-fso_0.9.2.bb
new file mode 100644
index 0000000000..e05b72dc29
--- /dev/null
+++ b/packages/tangogps/tangogps-fso_0.9.2.bb
@@ -0,0 +1,13 @@
+LICENSE = "GPLv2"
+SECTION = "x11/applications"
+PRIORITY = "optional"
+DESCRIPTION = "lightweight and fast mapping application"
+DEPENDS = "curl gtk+ gconf gypsy dbus-glib"
+
+inherit autotools
+
+SRC_URI = "http://www.tangogps.org/downloads/tangogps-${PV}.tar.gz\
+ file://0002-Get-GPS-data-via-the-gypsy-interface.patch;patch=1 \
+ file://0003-Try-to-request-the-GPS-resource-from-ousaged.patch;patch=1"
+
+S=${WORKDIR}/tangogps-${PV}