summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kocialkowski <contact@paulk.fr>2012-08-12 21:06:21 (GMT)
committerPaul Kocialkowski <contact@paulk.fr>2012-08-12 21:06:21 (GMT)
commitb153cbd84327b97c6d1f7eacad52dab79e0c2d7e (patch)
tree0750b710a83b3bfe810b8d49b091ff6268495af0
parente4f94e901b9b4c5fef5642ad9580863fc2bfe336 (diff)
downloadbcm4751-b153cbd84327b97c6d1f7eacad52dab79e0c2d7e.zip
bcm4751-b153cbd84327b97c6d1f7eacad52dab79e0c2d7e.tar.gz
bcm4751-b153cbd84327b97c6d1f7eacad52dab79e0c2d7e.tar.bz2
Created clean new BCM4751 gpsd code that works and prints the read data
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
-rw-r--r--Android.mk22
-rw-r--r--bcm4751_gpsd.c294
-rw-r--r--meif.h67
-rw-r--r--utils/Makefile (renamed from Makefile)0
-rw-r--r--utils/bcm4751_daemon.c (renamed from bcm4751_daemon.c)0
-rw-r--r--utils/bcm4751_hal.c (renamed from bcm4751_hal.c)0
-rw-r--r--utils/bcm4751_lib.c (renamed from bcm4751_lib.c)0
-rw-r--r--utils/bcm4751_test.c (renamed from bcm4751_test.c)0
8 files changed, 379 insertions, 4 deletions
diff --git a/Android.mk b/Android.mk
index 5a305a3..eecee6d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bcm4751_test.c
+LOCAL_SRC_FILES := utils/bcm4751_test.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES := liblog libcutils
@@ -15,7 +15,7 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bcm4751_hal.c
+LOCAL_SRC_FILES := utils/bcm4751_hal.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_C_INCLUDES += hardware/libhardware/include/
@@ -30,7 +30,7 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bcm4751_daemon.c
+LOCAL_SRC_FILES := utils/bcm4751_daemon.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
@@ -44,7 +44,7 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bcm4751_lib.c
+LOCAL_SRC_FILES := utils/bcm4751_lib.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
@@ -55,3 +55,17 @@ LOCAL_MODULE := bcm4751_lib
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := bcm4751_gpsd.c
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)
+
+LOCAL_SHARED_LIBRARIES := liblog libcutils
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_MODULE := bcm4751_gpsd
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_EXECUTABLE)
diff --git a/bcm4751_gpsd.c b/bcm4751_gpsd.c
new file mode 100644
index 0000000..5072751
--- /dev/null
+++ b/bcm4751_gpsd.c
@@ -0,0 +1,294 @@
+/**
+ * This file is part of BCM4751 gpsd
+ *
+ * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr>
+ *
+ * BCM4751 gpsd is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * BCM4751 gpsd 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 BCM4751 gpsd. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <termios.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "meif.h"
+
+/*
+ * Utils
+ */
+
+void hex_dump(void *data, int size)
+{
+ /* dumps size bytes of *data to stdout. Looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20
+ * 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ * (in a single line of course)
+ */
+
+ unsigned char *p = data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[ 16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4x",
+ ((unsigned int)p-(unsigned int)data) );
+ }
+
+ c = *p;
+ if (isalnum(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ } else if(n%8 == 0) {
+ /* half line: add whitespaces */
+ strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1);
+ strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1);
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+
+/*
+ * SEC
+ */
+
+int sec_gps_power(int power)
+{
+ char gpio_power_path[] = "/sys/class/sec/gps/GPS_PWR_EN/value";
+ char gpio_on_value[] = "1\n";
+ char gpio_off_value[] = "0\n";
+ int fd = -1;
+ int rc;
+
+ fd = open(gpio_power_path, O_RDWR);
+ if(fd < 0)
+ return -1;
+
+ if(power) {
+ rc = write(fd, gpio_on_value, strlen(gpio_on_value));
+ } else {
+ rc = write(fd, gpio_off_value, strlen(gpio_off_value));
+ }
+
+ if(rc <= 0) {
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+
+ usleep(250000);
+
+ return 0;
+}
+
+int sec_gps_reset(int value)
+{
+ char gpio_reset_path[] = "/sys/class/sec/gps/GPS_nRST/value";
+ char gpio_on_value[] = "1\n";
+ char gpio_off_value[] = "0\n";
+ int fd = -1;
+ int rc;
+
+ fd = open(gpio_reset_path, O_RDWR);
+ if(fd < 0)
+ return -1;
+
+ if(value) {
+ rc = write(fd, gpio_on_value, strlen(gpio_on_value));
+ } else {
+ rc = write(fd, gpio_off_value, strlen(gpio_off_value));
+ }
+
+ if(rc <= 0) {
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+
+ usleep(250000);
+
+ return 0;
+}
+
+/*
+ * BCM4751
+ */
+
+int bcm4751_serial_open(void)
+{
+ struct termios termios;
+ int fd = -1;
+
+ // TODO: add more checks
+
+ fd = open("/dev/s3c2410_serial1", O_RDWR|O_NOCTTY|O_NONBLOCK);
+ if(fd < 0)
+ return -1;
+
+ tcgetattr(fd, &termios);
+
+ // Flush
+ ioctl(fd, TCFLSH, 0x2);
+
+ cfmakeraw(&termios);
+ cfsetispeed(&termios, B115200);
+ cfsetospeed(&termios, B115200);
+
+ // This is the magic to contact the chip
+ termios.c_cflag = 0x800018b2;
+
+ tcsetattr(fd, TCSANOW, &termios);
+
+ // Flush
+ ioctl(fd, TCFLSH, 0x2);
+
+ return fd;
+}
+
+int bcm4751_serial_read(int fd, void *data, int length, struct timeval *timeout)
+{
+ fd_set fds;
+ int rc = -1;
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+
+ rc = select(fd + 1, &fds, NULL, NULL, timeout);
+ if(rc > 0 && length > 0) {
+ rc = read(fd, data, length);
+ }
+
+ return rc;
+}
+
+int bcm4751_serial_write(int fd, void *data, int length, struct timeval *timeout)
+{
+ fd_set fds;
+ int rc = -1;
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+
+ rc = select(fd + 1, NULL, &fds, NULL, timeout);
+ if(rc > 0) {
+ rc = write(fd, data, length);
+ }
+
+ return rc;
+}
+
+int bcm4751_autobaud(int fd)
+{
+ struct timeval timeout;
+ uint8_t autobaud[20] = { 0x80 };
+ int ready = 0;
+ int rc = -1;
+
+ // TODO: limit the number of attempts
+
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+
+ while(!ready) {
+ bcm4751_serial_write(fd, autobaud, sizeof(autobaud), NULL);
+
+ rc = bcm4751_serial_read(fd, NULL, 0, &timeout);
+ if(rc > 0)
+ ready = 1;
+ }
+
+ return 0;
+}
+
+void bcm4751_read_dump(int fd)
+{
+ void *data = NULL;
+ int length = 0x100;
+ int rc = -1;
+
+ data = malloc(length);
+
+ while(1) {
+ rc = bcm4751_serial_read(fd, data, length, NULL);
+ if(rc > 0) {
+ printf("Read %d bytes:\n", rc);
+ hex_dump(data, rc);
+ } else {
+ free(data);
+ return;
+ }
+ }
+}
+
+int main(void)
+{
+ int fd = -1;
+ int rc = -1;
+
+ printf("Turning the GPS on...\n");
+ rc = sec_gps_power(1);
+ if(rc < 0) {
+ printf("Failed to turn the GPS on!\n");
+ return 1;
+ }
+
+ printf("Opening the GPS serial...\n");
+ fd = bcm4751_serial_open();
+ if(fd < 0) {
+ printf("Failed to open the GPS serial!\n");
+ return 1;
+ }
+
+ printf("Sending autobaud...\n");
+ rc = bcm4751_autobaud(fd);
+ if(fd < 0) {
+ printf("Failed to send autobaud!\n");
+ return 1;
+ }
+
+ bcm4751_read_dump(fd);
+
+ return 0;
+}
diff --git a/meif.h b/meif.h
new file mode 100644
index 0000000..f79b9b8
--- /dev/null
+++ b/meif.h
@@ -0,0 +1,67 @@
+/**
+ * This file is part of BCM4751 gpsd
+ *
+ * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr>
+ *
+ * BCM4751 gpsd is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * BCM4751 gpsd 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 BCM4751 gpsd. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#ifndef _MEIF_H_
+#define _MEIF_H_
+
+#define MEIF_START 0xA593
+#define MEIF_END 0xA568
+
+/*
+ * Commands
+ */
+
+#define MEIF_ACK_MSG 0x0000
+#define MEIF_NACK_MSG 0x0001
+//#define MEIF_ERROR_MSG 0x0002 or 0x0003
+#define MEIF_STATE_REPORT_MSG 0x0004
+#define MEIF_CONFIG_VALUES_MSG 0x0008
+
+/*
+ * Data
+ */
+
+/*
+ * Structures
+ */
+
+struct meif_message {
+ uint16_t command;
+ uint16_t length;
+ void *data;
+} __attribute__((__packed__));
+
+struct meif_config_values_report {
+ uint8_t unknown1[36];
+ char vendor[16];
+ char product[16];
+ uint8_t unknown2[2];
+} __attribute__((__packed__));
+
+/*
+ * Functions
+ */
+
+void meif_read_loop(int fd);
+
+#endif
diff --git a/Makefile b/utils/Makefile
index eb48aed..eb48aed 100644
--- a/Makefile
+++ b/utils/Makefile
diff --git a/bcm4751_daemon.c b/utils/bcm4751_daemon.c
index 3cc3190..3cc3190 100644
--- a/bcm4751_daemon.c
+++ b/utils/bcm4751_daemon.c
diff --git a/bcm4751_hal.c b/utils/bcm4751_hal.c
index d60bb9e..d60bb9e 100644
--- a/bcm4751_hal.c
+++ b/utils/bcm4751_hal.c
diff --git a/bcm4751_lib.c b/utils/bcm4751_lib.c
index 3dd9e6d..3dd9e6d 100644
--- a/bcm4751_lib.c
+++ b/utils/bcm4751_lib.c
diff --git a/bcm4751_test.c b/utils/bcm4751_test.c
index bf4159b..bf4159b 100644
--- a/bcm4751_test.c
+++ b/utils/bcm4751_test.c