* 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);
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_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*/