Mer/Documentation/N810 GPS: Difference between revisions

From Maemo Wiki
Jump to navigationJump to search
No edit summary
imported>amigadave
{{Mer}}
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
These directions are confirmed to work on Mer 0.12.
{{Mer}}


All commands should be run as root.
== Notes ==
*These directions are confirmed to work on Mer 0.12.


All instances of "YOURUSERNAME" should be changed to whatever your user is named. Commands involving "YOURUSERNAME" [i]probably[/i] don't have to be run if your user is named "user", though this is unconfirmed.
*All commands should be run as root.


The time to first fix (TTFF) is quite long (~30 min), and GPSD quits after the last client disconnects. Keep this in mind.
*All instances of "YOURUSERNAME" should be changed to whatever your user is named. Commands involving "YOURUSERNAME" [i]probably[/i] don't have to be run if your user is named "user", though this is unconfirmed.


The formatting is completely messed up, so if you care to look at directions in any usable way, click the edit link.
*The time to first fix (TTFF) is quite long (~30 min), and GPSD quits after the last client disconnects. Keep this in mind.


1. Install the following packages from the Maemo Updates repository (you can install them on Maemo, then copy the packages from the apt cache):
== Directions ==
libsupld1
=== Step 1: Install the necessary files ===
osso-gpsd
Install the following packages from the Maemo Updates repository (you can install them on Maemo, then copy the packages from the apt cache):
libgpsmgr
libsupld1
libgpsbt (?)
osso-gpsd
gpsdriver
libgpsmgr
libgpsbt (?)
gpsdriver


2. Edit /etc/init.d/libgpsbt and change all instances of "user:users" to "YOURUSERNAME:users" There should be 2 instances you need to change.
=== Step 2: Tweak /etc/init.d/libgpsbt ===
Edit /etc/init.d/libgpsbt and change all instances of "user:users" to "YOURUSERNAME:users" There should be 2 instances you need to change.


3. Run: chown -R YOURUSERNAME:users /var/lib/gps
=== Step 3: Change ownership ===
Run:
chown -R YOURUSERNAME:users /var/lib/gps


4. Make the following files:
=== Step 4: Make the necessary files ===
Make the following files:


/etc/default/gps5300driver.conf
/etc/default/gps5300driver.conf:
=================CUT====================
# /etc/default/gps5300driver.conf
# The user who can control the driver
GPS5300_USER=root
# Whether the driver will self-initialize, may or may not work (more on the may not side)
GPS5300_SELFINIT=true


# /etc/default/gps5300driver.conf


# The user who can control the driver
/etc/init.d/gps5300driver:
GPS5300_USER=root
#!/bin/bash
GPS5300_DRIVER='/usr/sbin/gps5300driver'
GPS5300_PIDFILE='/var/run/gps5300driver.pid'
GPS5300_PRELOAD='/usr/lib/libgps5300faker.so'
CONF=/etc/default/gps5300driver.conf
if [ -f $CONF ]; then
          . $CONF
fi
case $1 in
start)
echo "Starting GPS5300 driver"
if ! [ -e /sys/devices/platform/gpio-switch/gps_reset/state ]; then
echo "gps_reset state gpio switch missing"
# return 1
fi
[ -z "${GPS5300_SELFINIT}" ] && GPS5300_SELFINIT=true
${GPS5300_SELFINIT} || unset GPS5300_SELFINIT
export GPS5300_SELFINIT
[ -z "${GPS5300_USER}" ] && GPS5300_USER=root
export GPS5300_USER
export LD_PRELOAD=${GPS5300_PRELOAD}
start-stop-daemon --start \
--quiet \
--background \
--pidfile "${GPS5300_PIDFILE}" \
--make-pidfile \
--exec "${GPS5300_DRIVER}"
# --env "LD_PRELOAD=${GPS5300_PRELOAD}" \
# --exec "${GPS5300_DRIVER}"
# return 0
;;
stop)
echo "Stopping GPS5300 driver"
start-stop-daemon --stop \
--quiet \
--pidfile "${GPS5300_PIDFILE}"
rm ${GPS5300_PIDFILE}
# return 0
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
echo "Usage: $0: {start|stop|restart|force-reload}"
exit 1
;;
esac


# Whether the driver will self-initialize, may or may not work (more on the may not side)
=== Step 5: Copy gpsdriver ===
GPS5300_SELFINIT=true
Make a copy of gpsdriver to prevent confusion
cp /usr/sbin/gpsdriver /usr/sbin/gps5300driver


=================CUT====================
=== Step 6: Install libgps5300faker.so ===
First of all, install the necessary packages (they may be removed later, this may be an excessive list or an incomplete list. Basically keep installing stuff until it stops complaining):
apt-get install build-essential m4 automake autoconf


/etc/init.d/gps5300driver
Make the following files somewhere (they may be removed later):
=================CUT====================


#!/bin/bash
preload_init.c
/*
  * Copyright 2009 Luke Dashjr <luke_n8x0_gps5300driver@dashjr.org>
  * Licensed for redistribution as-is;
  * contact me if you want something more permissive
  */
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
static struct sockaddr_un ctrl_sau = {
AF_UNIX,
"/var/lib/gps/gps_driver_ctrl\0",
};
#define CTRL_SCK_PATH ctrl_sau.sun_path
static int ctrl_sck = -1;
typedef int (*bind_t)(int, const struct sockaddr*, socklen_t);
int
bind(int sockfd, const struct sockaddr*addr, socklen_t addrlen) {
static bind_t real = NULL;
if (!real)
real = dlsym(RTLD_NEXT, "bind");
int rv = real(sockfd, addr, addrlen);
if (
    addr &&
    addr->sa_family == AF_FILE &&
    !strcmp(CTRL_SCK_PATH,
            ((struct sockaddr_un*)addr)->sun_path
          ) &&
    getenv("GPS5300_SELFINIT") &&
    1
)
ctrl_sck = sockfd;
return rv;
}
typedef int (*listen_t)(int, int);
int
listen(int sockfd, int backlog) {
static listen_t real = NULL;
if (!real)
real = dlsym(RTLD_NEXT, "listen");
int rv = real(sockfd, backlog);
if (sockfd == ctrl_sck && !fork())
{
// Child process :)
int sck;
char initcmd[] = "P 3\n";
sck = socket(PF_FILE, SOCK_STREAM, 0);
if (sck < 0)
exit(1);
if (connect(sck, &ctrl_sau, sizeof ctrl_sau))
exit(1);
write(sck, initcmd, sizeof initcmd);
close(sck);
exit(0);
}
return rv;
}


GPS5300_DRIVER='/usr/sbin/gps5300driver'
preload.c:
GPS5300_PIDFILE='/var/run/gps5300driver.pid'
  /*
GPS5300_PRELOAD='/usr/lib/libgps5300faker.so'
  * Copyright 2009 Luke Dashjr <luke_n8x0_gps5300driver@dashjr.org>
CONF=/etc/default/gps5300driver.conf
  * Licensed for redistribution as-is;
  * contact me if you want something more permissive
  */
#define _GNU_SOURCE
#include <dlfcn.h>
#include <pwd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
typedef struct passwd* (*getpwnam_t)(const char*);
struct passwd *
getpwnam(const char *name) {
static getpwnam_t real = NULL;
if (!real)
real = dlsym(RTLD_NEXT, "getpwnam");
if (!strcmp(name, "user"))
{
const char*username = getenv("GPS5300_USER");
if (username)
name = username;
}
return real(name);
}


if [ -f $CONF ]; then
Compile them:
        . $CONF
cd /path/to/source/files/
fi
gcc -shared -fPIC -ldl preload.c preload_init.c -o libgps5300faker.so


case $1 in
Put libgps5300faker.so in /usr/lib (assuming you're still in the same directory):
start)
cp libgps5300faker.so /usr/lib
echo "Starting GPS5300 driver"
if ! [ -e /sys/devices/platform/gpio-switch/gps_reset/state ]; then
echo "gps_reset state gpio switch missing"
# return 1
fi
[ -z "${GPS5300_SELFINIT}" ] && GPS5300_SELFINIT=true
${GPS5300_SELFINIT} || unset GPS5300_SELFINIT
export GPS5300_SELFINIT
[ -z "${GPS5300_USER}" ] && GPS5300_USER=root
export GPS5300_USER
export LD_PRELOAD=${GPS5300_PRELOAD}
start-stop-daemon --start \
--quiet \
--background \
--pidfile "${GPS5300_PIDFILE}" \
--make-pidfile \
--exec "${GPS5300_DRIVER}"
# --env "LD_PRELOAD=${GPS5300_PRELOAD}" \
# --exec "${GPS5300_DRIVER}"
# return 0
;;


stop)
=== Step 7: Reboot ===
echo "Stopping GPS5300 driver"
Reboot:
start-stop-daemon --stop \
reboot
--quiet \
--pidfile "${GPS5300_PIDFILE}"
rm ${GPS5300_PIDFILE}
# return 0
;;


restart|force-reload)
=== Step 8: Prepare to use the GPS ===
$0 stop
Get ready to use the GPS:
$0 start
/etc/init.d/libgpsbt restart
;;
/etc/init.d/gpsdriver restart
/etc/init.d/gps5300driver restart


*)
=== Step 9: Start GPSD ===
echo "Usage: $0: {start|stop|restart|force-reload}"
Start GPSD:
exit 1
gpsd -n -N -D2 /dev/pgps
;;
esac


=================CUT====================
When you start getting messages like:
 
5. Run "cp /usr/sbin/gpsdriver /usr/sbin/gps5300driver"
 
6. Put libgps5300faker.so in /usr/lib (Not posted anywhere yet)


7. Reboot
gpsd: <= GPS: $GPGGA,183757.000,4504.94573,N,09300.43367,W,1,04,2.7,288.8,M,-31.3,M,,*60
 
gpsd: <= GPS: $GPGLL,4504.94573,N,09300.43367,W,183757.000,A,A*42
8. Run:
gpsd: can't use GGA/GGL time until after ZDA or RMC has supplied a year.
/etc/init.d/libgpsbt restart
gpsd: <= GPS: $GPGSA,A,3,31,11,30,32,,,,,,,,,5.9,2.7,5.3*3D
/etc/init.d/gpsdriver restart
gpsd: <= GPS: $GPGST,183757.000,14.3,13.2,37.3,19.1,16.0,32.4,73.2*54
/etc/init.d/gps5300driver restart
 
9. Run: "gpsd -n -N -D2 /dev/pgps"
 
When you start getting messages like:


gpsd: <= GPS: $GPGGA,183757.000,4504.94573,N,09300.43367,W,1,04,2.7,288.8,M,-31.3,M,,*60
You have a lock and are ready to use your GPS (I've also gotten other messages indicating the GPS is ready. Basically anything new/other than what it routinely spits out should be a good indicator).
gpsd: <= GPS: $GPGLL,4504.94573,N,09300.43367,W,183757.000,A,A*42
gpsd: can't use GGA/GGL time until after ZDA or RMC has supplied a year.
gpsd: <= GPS: $GPGSA,A,3,31,11,30,32,,,,,,,,,5.9,2.7,5.3*3D
gpsd: <= GPS: $GPGST,183757.000,14.3,13.2,37.3,19.1,16.0,32.4,73.2*54


You've got a lock and are ready to use your GPS.
[[Category:N8x0]]
[[Category:GPS]]

Latest revision as of 09:38, 22 September 2010

Mer is back : Please visit http://www.merproject.org to learn more about this news.


Notes

  • These directions are confirmed to work on Mer 0.12.
  • All commands should be run as root.
  • All instances of "YOURUSERNAME" should be changed to whatever your user is named. Commands involving "YOURUSERNAME" [i]probably[/i] don't have to be run if your user is named "user", though this is unconfirmed.
  • The time to first fix (TTFF) is quite long (~30 min), and GPSD quits after the last client disconnects. Keep this in mind.

Directions

Step 1: Install the necessary files

Install the following packages from the Maemo Updates repository (you can install them on Maemo, then copy the packages from the apt cache):

libsupld1
osso-gpsd
libgpsmgr
libgpsbt (?)
gpsdriver

Step 2: Tweak /etc/init.d/libgpsbt

Edit /etc/init.d/libgpsbt and change all instances of "user:users" to "YOURUSERNAME:users" There should be 2 instances you need to change.

Step 3: Change ownership

Run:

chown -R YOURUSERNAME:users /var/lib/gps

Step 4: Make the necessary files

Make the following files:

/etc/default/gps5300driver.conf:

# /etc/default/gps5300driver.conf

# The user who can control the driver
GPS5300_USER=root

# Whether the driver will self-initialize, may or may not work (more on the may not side)
GPS5300_SELFINIT=true


/etc/init.d/gps5300driver:

#!/bin/bash

GPS5300_DRIVER='/usr/sbin/gps5300driver'
GPS5300_PIDFILE='/var/run/gps5300driver.pid'
GPS5300_PRELOAD='/usr/lib/libgps5300faker.so'
CONF=/etc/default/gps5300driver.conf

if [ -f $CONF ]; then
         . $CONF
fi

case $1 in
	start)
		echo "Starting GPS5300 driver"
		if ! [ -e /sys/devices/platform/gpio-switch/gps_reset/state ]; then
			echo "gps_reset state gpio switch missing"
#			return 1
		fi
			
		[ -z "${GPS5300_SELFINIT}" ] && GPS5300_SELFINIT=true
		${GPS5300_SELFINIT} || unset GPS5300_SELFINIT
		export GPS5300_SELFINIT
		
		[ -z "${GPS5300_USER}" ] && GPS5300_USER=root
		export GPS5300_USER
		
		export LD_PRELOAD=${GPS5300_PRELOAD}		
	
		start-stop-daemon --start \
			--quiet \
			--background \
			--pidfile "${GPS5300_PIDFILE}" \
			--make-pidfile \
			--exec "${GPS5300_DRIVER}"
#			--env "LD_PRELOAD=${GPS5300_PRELOAD}" \
#			--exec "${GPS5300_DRIVER}"
#		return 0
	;;

	stop)
		echo "Stopping GPS5300 driver"
		start-stop-daemon --stop \
			--quiet \
			--pidfile "${GPS5300_PIDFILE}"
		rm ${GPS5300_PIDFILE}
#		return 0
	;;

	restart|force-reload)
		$0 stop
		$0 start
	;;

	*)
		echo "Usage: $0: {start|stop|restart|force-reload}"
		exit 1
	;;
esac

Step 5: Copy gpsdriver

Make a copy of gpsdriver to prevent confusion

cp /usr/sbin/gpsdriver /usr/sbin/gps5300driver

Step 6: Install libgps5300faker.so

First of all, install the necessary packages (they may be removed later, this may be an excessive list or an incomplete list. Basically keep installing stuff until it stops complaining):

apt-get install build-essential m4 automake autoconf

Make the following files somewhere (they may be removed later):

preload_init.c

/*
 * Copyright 2009 Luke Dashjr <luke_n8x0_gps5300driver@dashjr.org>
 * Licensed for redistribution as-is;
 * contact me if you want something more permissive
 */

#define _GNU_SOURCE

#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

static struct sockaddr_un ctrl_sau = {
	AF_UNIX,
	"/var/lib/gps/gps_driver_ctrl\0",
};
#define CTRL_SCK_PATH ctrl_sau.sun_path

static int ctrl_sck = -1;

typedef int (*bind_t)(int, const struct sockaddr*, socklen_t);

int
bind(int sockfd, const struct sockaddr*addr, socklen_t addrlen) {
	static bind_t real = NULL;
	if (!real)
		real = dlsym(RTLD_NEXT, "bind");
	
	int rv = real(sockfd, addr, addrlen);
	
	if (
	    addr &&
	    addr->sa_family == AF_FILE &&
	    !strcmp(CTRL_SCK_PATH,
	            ((struct sockaddr_un*)addr)->sun_path
	           ) &&
	    getenv("GPS5300_SELFINIT") &&
	    1
	)
		ctrl_sck = sockfd;
	
	return rv;
}

typedef int (*listen_t)(int, int);

int
listen(int sockfd, int backlog) {
	static listen_t real = NULL;
	if (!real)
		real = dlsym(RTLD_NEXT, "listen");
	
	int rv = real(sockfd, backlog);
	
	if (sockfd == ctrl_sck && !fork())
	{
		// Child process :)
		
		int sck;
		char initcmd[] = "P 3\n";
		
		sck = socket(PF_FILE, SOCK_STREAM, 0);
		if (sck < 0)
			exit(1);
		if (connect(sck, &ctrl_sau, sizeof ctrl_sau))
			exit(1);
		write(sck, initcmd, sizeof initcmd);
		close(sck);
		
		exit(0);
	}
	
	return rv;
}

preload.c:

 /*
 * Copyright 2009 Luke Dashjr <luke_n8x0_gps5300driver@dashjr.org>
 * Licensed for redistribution as-is;
 * contact me if you want something more permissive
 */

#define _GNU_SOURCE

#include <dlfcn.h>
#include <pwd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

typedef struct passwd* (*getpwnam_t)(const char*);

struct passwd *
getpwnam(const char *name) {
	static getpwnam_t real = NULL;
	if (!real)
		real = dlsym(RTLD_NEXT, "getpwnam");
	
	if (!strcmp(name, "user"))
	{
		const char*username = getenv("GPS5300_USER");
		if (username)
			name = username;
	}
	
	return real(name);
}

Compile them:

cd /path/to/source/files/
gcc -shared -fPIC -ldl preload.c preload_init.c -o libgps5300faker.so

Put libgps5300faker.so in /usr/lib (assuming you're still in the same directory):

cp libgps5300faker.so /usr/lib

Step 7: Reboot

Reboot:

reboot

Step 8: Prepare to use the GPS

Get ready to use the GPS:

/etc/init.d/libgpsbt restart
/etc/init.d/gpsdriver restart
/etc/init.d/gps5300driver restart

Step 9: Start GPSD

Start GPSD:

gpsd -n -N -D2 /dev/pgps

When you start getting messages like:

gpsd: <= GPS: $GPGGA,183757.000,4504.94573,N,09300.43367,W,1,04,2.7,288.8,M,-31.3,M,,*60
gpsd: <= GPS: $GPGLL,4504.94573,N,09300.43367,W,183757.000,A,A*42
gpsd: can't use GGA/GGL time until after ZDA or RMC has supplied a year.
gpsd: <= GPS: $GPGSA,A,3,31,11,30,32,,,,,,,,,5.9,2.7,5.3*3D
gpsd: <= GPS: $GPGST,183757.000,14.3,13.2,37.3,19.1,16.0,32.4,73.2*54

You have a lock and are ready to use your GPS (I've also gotten other messages indicating the GPS is ready. Basically anything new/other than what it routinely spits out should be a good indicator).