]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/include/usbcan.h
Added vendor functions to embedded application, data transferred by usb channel seria...
[lincan.git] / lincan / include / usbcan.h
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2d580fb3424ddde470f5f62edd6ff2df1a6be672 100644 (file)
@@ -0,0 +1,171 @@
+/* usbcan.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Jan Kriz email:johen@post.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jul 2008
+ */
+
+#ifndef USBCAN_H
+#define USBCAN_H
+
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/kref.h>
+#include <asm/uaccess.h>
+#include <linux/usb.h>
+#include <linux/mutex.h>
+
+#include "../include/kthread.h"
+
+/* our private defines. if this grows any larger, use your own .h file */
+#define MAX_TRANSFER           (PAGE_SIZE - 512)
+/* MAX_TRANSFER is chosen so that the VM is not stressed by
+   allocations > PAGE_SIZE and the number of packets in a page
+   is an integer 512 is the largest possible packet on EHCI */
+#define WRITES_IN_FLIGHT       8
+/* arbitrarily chosen */
+
+/* Define these values to match your devices */
+#define USBCAN_VENDOR_ID       0xDEAD
+#define USBCAN_PRODUCT_ID      0x1001
+
+#define RESET_ADDR 0x0
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x100
+
+
+int usbcan_request_io(struct candevice_t *candev);
+int usbcan_release_io(struct candevice_t *candev);
+int usbcan_reset(struct candevice_t *candev);
+int usbcan_init_hw_data(struct candevice_t *candev);
+int usbcan_init_chip_data(struct candevice_t *candev, int chipnr);
+int usbcan_init_obj_data(struct canchip_t *chip, int objnr);
+void usbcan_write_register(unsigned data, unsigned long address);
+unsigned usbcan_read_register(unsigned long address);
+int usbcan_program_irq(struct candevice_t *candev);
+int usbcan_register(struct hwspecops_t *hwspecops);
+
+int usbcan_chip_config(struct canchip_t *chip);
+int usbcan_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask);
+int usbcan_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+               int sampl_pt, int flags);
+int usbcan_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
+int usbcan_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+               struct canmsg_t *msg);
+int usbcan_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
+               struct canmsg_t *msg);
+int usbcan_fill_chipspecops(struct canchip_t *chip);
+int usbcan_irq_handler(int irq, struct canchip_t *chip);
+
+int usbcan_init(void);
+void usbcan_exit(void);
+
+void usbcan_read_kthread(kthread_t *kthread);
+int usbcan_chip_queue_status(struct canchip_t *chip);
+
+#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
+
+static const char *sja1000_ecc_errc_str[]={
+       "bit error",
+       "form error",
+       "stuff error",
+       "other type of error"
+};
+
+static const char *sja1000_ecc_seg_str[]={
+       "?0?",
+       "?1?",
+       "ID.28 to ID.21",
+       "start of frame",
+       "bit SRTR",
+       "bit IDE",
+       "ID.20 to ID.18",
+       "ID.17 to ID.13",
+       "CRC sequence",
+       "reserved bit 0",
+       "data field",
+       "data length code",
+       "bit RTR",
+       "reserved bit 1",
+       "ID.4 to ID.0",
+       "ID.12 to ID.5",
+       "?16?"
+       "active error flag",
+       "intermission",
+       "tolerate dominant bits",
+       "?20?",
+       "?21?",
+       "passive error flag",
+       "error delimiter",
+       "CRC delimiter",
+       "acknowledge slot",
+       "end of frame",
+       "acknowledge delimiter",
+       "overload flag",
+       "?29?",
+       "?30?",
+       "?31?"
+};
+
+#endif /*CONFIG_OC_LINCAN_DETAILED_ERRORS*/
+
+/* CAN message over usb */
+struct usbcan_canmsg_t{
+       __u8 chip_id;
+       __u16 flags;
+       __u8 id[4];
+       __u8 length;
+       __u8 data[8];
+};
+
+/* Structure to hold all of our device specific stuff */
+struct usbcan_usb {
+       struct usb_device       *udev;                  /* the usb device for this device */
+       struct usb_interface    *interface;             /* the interface for this device */
+       struct semaphore        limit_sem;              /* limiting the number of writes in progress */
+       struct usb_anchor       submitted;              /* in case we need to retract our submissions */
+       unsigned char           *bulk_in_buffer;        /* the buffer to receive data */
+       unsigned char           *ctl_in_buffer; /* the buffer to receive data */
+       size_t                  bulk_in_size;           /* the size of the receive buffer */
+       size_t                  ctl_in_size;            /* the size of the receive buffer */
+       __u8                    ctl_in_endpointAddr;    /* the address of the bulk in endpoint */
+       __u8                    ctl_out_endpointAddr;   /* the address of the bulk in endpoint */
+       __u8                    bulk_in_endpointAddr;   /* the address of the bulk in endpoint */
+       __u8                    bulk_out_endpointAddr;  /* the address of the bulk out endpoint */
+       int                     errors;                 /* the last request tanked */
+       int                     open_count;             /* count the number of openers */
+       spinlock_t              err_lock;               /* lock for errors */
+       struct mutex            io_mutex;               /* synchronize I/O with disconnect */
+       struct urb              *rcv;
+/*     uchar8_t        rcv_msg[16];
+       uchar8_t        tx_msg[16];*/
+       __u8    rcv_msg[16];
+       __u8    tx_msg[16];
+       kthread_t  rcvthread;                      /* usb receive kernel thread  */
+
+       struct candevice_t *candev;
+       long flags;
+};
+
+#define USBCAN_DATA_READ               (1)
+#define USBCAN_TERMINATE               (2)
+#define USBCAN_ERROR                           (3)
+#define USBCAN_TX_PENDING              (4)
+
+#define USBCAN_VENDOR_BAUD_RATE_SET    (1)
+#define USBCAN_VENDOR_BAUD_RATE_STATUS (2)
+#define USBCAN_VENDOR_SET_BTREGS       (3)
+#define USBCAN_VENDOR_CHECK_TX_STAT    (4)
+#define USBCAN_VENDOR_START_CHIP       (5)
+#define USBCAN_VENDOR_STOP_CHIP        (6)
+#define USBCAN_VENDOR_EXT_MASK_SET     (7)
+#define USBCAN_VENDOR_EXT_MASK_STATUS  (8)
+
+
+#endif /*USBCAN_H*/