paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [5287] x


From: antoine drouin
Subject: [paparazzi-commits] [5287] x
Date: Mon, 09 Aug 2010 22:30:19 +0000

Revision: 5287
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5287
Author:   poine
Date:     2010-08-09 22:30:18 +0000 (Mon, 09 Aug 2010)
Log Message:
-----------
x

Added Paths:
-----------
    paparazzi3/trunk/sw/airborne/fms/fms_crc.c
    paparazzi3/trunk/sw/airborne/fms/fms_crc.h
    paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.c
    paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.h

Added: paparazzi3/trunk/sw/airborne/fms/fms_crc.c
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_crc.c                          (rev 0)
+++ paparazzi3/trunk/sw/airborne/fms/fms_crc.c  2010-08-09 22:30:18 UTC (rev 
5287)
@@ -0,0 +1,74 @@
+
+#include "fms/fms_crc.h"
+
+crc_t crc__table[256];
+
+void crc__init(uint32_t polynomial) {
+  crc_t crc_remainder;
+  uint32_t crc_dividend;
+  crc_t top_bit = (1 << (CRC__WIDTH - 1));
+  uint8_t bit;
+  for(crc_dividend = 0; crc_dividend < 256; crc_dividend++) {
+    crc_remainder = crc_dividend << (CRC__WIDTH - 8);
+    for(bit = 8; bit > 0; bit--) {
+      if(crc_remainder & top_bit) {
+       crc_remainder = (crc_remainder << 1) ^ polynomial;
+      }
+      else {
+       crc_remainder = (crc_remainder << 1);
+      }
+    }
+    crc__table[crc_dividend] = crc_remainder;
+  }
+
+#if 0
+  int i=0;
+  while (i<256) {
+    printf("%03d ",crc__table[i]);
+    if ((i%8)==7) printf("\n");
+    i++;
+  }
+#endif
+
+}
+
+#define POLYNOMIAL 0x31
+#define WIDTH  (8 * sizeof(uint8_t))
+#define TOPBIT (1 << (WIDTH - 1))
+uint8_t crc__calc_block_crc8(const uint8_t buf[], uint32_t len) {
+  crc_t  _remainder = 0;       
+  for (int byte = 0; byte < len; ++byte)  {
+    _remainder ^= (buf[byte] << (WIDTH - 8));
+    for (uint8_t bit = 8; bit > 0; --bit)  {
+      if (_remainder & TOPBIT)
+       _remainder = (_remainder << 1) ^ POLYNOMIAL;
+      else
+       _remainder = (_remainder << 1);
+    }
+  }
+  return (_remainder);
+} 
+
+#if 0
+uint8_t crc__calc_block_crc8(const uint8_t buffer[], uint32_t buffer_length) {
+  int counter;
+  uint16_t crc = 0;
+  for(counter = 0; counter < buffer_length; counter++) {
+    crc = crc ^ crc__table[ ( crc ^ *(char *)(buffer)++ ) & 0x00FF ];
+  }
+  return crc;
+}
+#endif
+
+
+uint16_t crc__calc_block_crc16(const void * buffer, uint32_t buffer_length) {
+  int counter;
+  crc_t crc = 0;
+  for(counter = 0; counter < buffer_length; counter++) {
+    crc = (crc << 8) ^ crc__table[ ( (crc >> 8) ^ *(char *)(buffer)++ ) & 
0x00FF ];
+  }
+  return crc;
+}
+
+
+

Added: paparazzi3/trunk/sw/airborne/fms/fms_crc.h
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_crc.h                          (rev 0)
+++ paparazzi3/trunk/sw/airborne/fms/fms_crc.h  2010-08-09 22:30:18 UTC (rev 
5287)
@@ -0,0 +1,21 @@
+#ifndef __CRC_H__
+#define __CRC_H__
+
+#include "std.h"
+
+typedef uint8_t crc_t;
+
+#define CRC__WIDTH (8 * sizeof(crc_t))
+
+void crc__init(uint32_t polynomial);
+
+extern uint8_t crc__calc_block_crc8(const uint8_t buffer[], uint32_t 
buffer_length);
+uint16_t crc__calc_block_crc16(const void * buffer,
+                               uint32_t buffer_length);
+
+#define crc8__check(buffer, length, crc) \
+       (crc == crc__calc_block_crc8((buffer), (length)));
+#define crc16__check(buffer, length, crc) \
+       (crc == crc__calc_block_crc16((buffer), (length)));
+
+#endif /* __CRC_H__ */

Added: paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.c
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.c                         
(rev 0)
+++ paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.c 2010-08-09 22:30:18 UTC 
(rev 5287)
@@ -0,0 +1,59 @@
+#include "fms_spi_link.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+int spi_link_init(void) {
+
+  spi_link.device = "/dev/spidev1.1";
+  //  spi_link.mode  = 0;
+  //  spi_link.mode  = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST;
+  spi_link.mode  = SPI_CPHA;
+  //  spi_link.mode  = SPI_LSB_FIRST;
+  spi_link.bits  = 8;
+  spi_link.speed = 3000000;
+  //  spi_link.speed = 18000000;
+  spi_link.delay = 1;
+
+  spi_link.fd = open(spi_link.device, O_RDWR);
+  if (spi_link.fd < 0)
+    return -1;
+
+  int ret = 0;
+  ret = ioctl(spi_link.fd, SPI_IOC_WR_MODE, &spi_link.mode);
+  if (ret == -1)
+    return -2;
+
+  ret = ioctl(spi_link.fd, SPI_IOC_WR_BITS_PER_WORD, &spi_link.bits);
+  if (ret == -1)
+    return -3;
+
+  ret = ioctl(spi_link.fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_link.speed);
+  if (ret == -1)
+    return -4;
+
+  return 0;
+}
+
+int spi_link_send(const void *buf_out, size_t count, void *buf_in) {
+
+ int ret; 
+
+ struct spi_ioc_transfer tr = {
+   .tx_buf        = (unsigned long)buf_out,
+   .rx_buf        = (unsigned long)buf_in,
+   .len           = count,
+   .delay_usecs   = spi_link.delay,
+   .speed_hz      = spi_link.speed,
+   .bits_per_word = spi_link.bits,
+ };
+ ret = ioctl(spi_link.fd, SPI_IOC_MESSAGE(1), &tr);
+
+ return ret;
+
+}

Added: paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.h
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.h                         
(rev 0)
+++ paparazzi3/trunk/sw/airborne/fms/fms_spi_link_crc.h 2010-08-09 22:30:18 UTC 
(rev 5287)
@@ -0,0 +1,21 @@
+#ifndef FMS_SPI_LINK_H
+#define FMS_SPI_LINK_H
+
+#include <inttypes.h>
+#include <unistd.h>
+
+struct SpiLink {
+  int      fd;
+  char*    device;
+  uint8_t  mode;
+  uint8_t  bits;
+  uint32_t speed;
+  uint16_t delay;
+};
+
+struct SpiLink spi_link;
+
+extern int spi_link_init(void);
+extern int spi_link_send(const void *buf_out, size_t count, void* buf_in);
+
+#endif /* FMS_SPI_LINK_H */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]