X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/24dde2b186e49d6d597d5a02e2b5f51e2147ca6e..a6d355f1cf48f39eecb2f1bdead51817d1fd5989:/lincan/include/usbcan.h diff --git a/lincan/include/usbcan.h b/lincan/include/usbcan.h index 80566cd..36c3753 100644 --- a/lincan/include/usbcan.h +++ b/lincan/include/usbcan.h @@ -15,6 +15,9 @@ #include #include #include +#include + +#include "../include/kthread.h" /* our private defines. if this grows any larger, use your own .h file */ #define MAX_TRANSFER (PAGE_SIZE - 512) @@ -25,8 +28,8 @@ /* arbitrarily chosen */ /* Define these values to match your devices */ -#define USBCAN_VENDOR_ID 0xDEAD -#define USBCAN_PRODUCT_ID 0x1001 +#define USBCAN_VENDOR_ID 0x1669 +#define USBCAN_PRODUCT_ID 0x1011 #define RESET_ADDR 0x0 @@ -61,106 +64,110 @@ int usbcan_send_msg(struct canchip_t *chip, struct msgobj_t *obj, int usbcan_fill_chipspecops(struct canchip_t *chip); int usbcan_irq_handler(int irq, struct canchip_t *chip); -void usbcan_read_kthread(kthread_t *kthread); -int usbcan_chip_queue_status(struct canchip_t *chip); - int usbcan_init(void); void usbcan_exit(void); -static int usbcan_probe(struct usb_interface *interface, const struct usb_device_id *id); -static void usbcan_disconnect(struct usb_interface *interface); -#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS +int usbcan_kthread(void *data); +int usbcan_chip_queue_status(struct canchip_t *chip); -static const char *sja1000_ecc_errc_str[]={ - "bit error", - "form error", - "stuff error", - "other type of error" -}; +#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS -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?" -}; +// 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]; -}; +struct usbcan_usb; -/* CAN extended mask */ -struct usbcan_mask_t{ - __u32 code; - __u32 mask; +#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 */ - 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 */ + 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 urb *rcv; - struct usbcan_canmsg_t rcv_msg; - struct usbcan_canmsg_t tx_msg; - kthread_t rcvthread; /* usb receive kernel thread */ + struct usbcan_message rx[USBCAN_TOT_RX_URBS]; + struct usbcan_message tx[USBCAN_TOT_TX_URBS]; - struct candevice_t *candev; - long flags; + struct task_struct *comthread; /* usb communication kernel thread */ + wait_queue_head_t queue; + + struct canchip_t *chip; + volatile long flags; }; -#define USBCAN_DATA_READ (1) -#define USBCAN_TERMINATE (2) -#define USBCAN_ERROR (3) -#define USBCAN_TX_PENDING (4) +#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) @@ -168,21 +175,14 @@ struct usbcan_usb { #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) -/* table of devices that work with this driver */ -static struct usb_device_id usbcan_table [] = { - { USB_DEVICE(USBCAN_VENDOR_ID, USBCAN_PRODUCT_ID) }, - { } /* Terminating entry */ -}; -MODULE_DEVICE_TABLE(usb, usbcan_table); - -static struct usb_driver usbcan_driver = { - .name = "usbcan", - .id_table = usbcan_table, - .probe = usbcan_probe, - .disconnect = usbcan_disconnect, +struct usbcan_devs { + struct usbcan_usb **devs; + int count; + struct candevice_t *candev; }; - #endif /*USBCAN_H*/