]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/include/usbcan.h
changed usb vendor and product id.
[lincan.git] / lincan / include / usbcan.h
index 94fa0fc42c58e9cb5ee59a70aa408819a6337eea..36c3753cbbe470e61713b84f9e931dc275161038 100644 (file)
 #include <linux/kref.h>
 #include <asm/uaccess.h>
 #include <linux/usb.h>
+#include <linux/mutex.h>
+#include <linux/wait.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       0x1669
+#define USBCAN_PRODUCT_ID      0x1011
+
+#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);
@@ -24,6 +50,7 @@ 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);
@@ -40,4 +67,122 @@ int usbcan_irq_handler(int irq, struct canchip_t *chip);
 int usbcan_init(void);
 void usbcan_exit(void);
 
-#endif /*USBCAN_H*/
\ No newline at end of file
+int usbcan_kthread(void *data);
+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*/
+
+struct usbcan_usb;
+
+#define USBCAN_TOT_RX_URBS 8
+#define USBCAN_TOT_TX_URBS 8
+
+#define USBCAN_TRANSFER_SIZE 16
+
+struct usbcan_message {
+       struct urb      *u;
+       struct usbcan_usb *dev;
+       u8      msg[USBCAN_TRANSFER_SIZE];
+       spinlock_t              acc;            /* access lock */
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       volatile long   flags;
+};
+
+#define USBCAN_MESSAGE_FREE                                    (1)
+#define USBCAN_MESSAGE_URB_PENDING             (2)
+#define USBCAN_MESSAGE_TERMINATE                       (3)
+#define USBCAN_MESSAGE_ERROR                                   (4)
+#define USBCAN_MESSAGE_DATA_OK                         (5)
+#define USBCAN_MESSAGE_TYPE_RX                         (6)
+#define USBCAN_MESSAGE_TYPE_TX                         (7)
+
+/* 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 */
+       unsigned char           *bulk_in_buffer;        /* the buffer to receive data */
+       size_t                  bulk_in_size;           /* the size of the receive buffer */
+       u8                      bulk_in_endpointAddr;   /* the address of the bulk in endpoint */
+       u8                      bulk_out_endpointAddr;  /* the address of the bulk out endpoint */
+       struct mutex            io_mutex;               /* synchronize I/O with disconnect */
+       struct usbcan_message   rx[USBCAN_TOT_RX_URBS];
+       struct usbcan_message   tx[USBCAN_TOT_TX_URBS];
+
+       struct task_struct *comthread;                      /* usb communication kernel thread  */
+       wait_queue_head_t queue;
+
+       struct canchip_t *chip;
+       volatile long flags;
+};
+
+#define USBCAN_DATA_OK                         (1)
+#define USBCAN_DATA_RX                         (2)
+#define USBCAN_DATA_TX                         (3)
+#define USBCAN_TERMINATE                       (4)
+#define USBCAN_ERROR                                   (5)
+#define USBCAN_TX_PENDING                      (6)
+#define USBCAN_THREAD_RUNNING  (7)
+#define USBCAN_FREE_TX_URB             (8)
+
+#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)
+
+struct usbcan_devs {
+       struct usbcan_usb **devs;
+       int     count;
+       struct candevice_t *candev;
+};
+
+
+#endif /*USBCAN_H*/