X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/3c6d0376edd06bad63e861415974556259f593cd..a6d355f1cf48f39eecb2f1bdead51817d1fd5989:/lincan/include/usbcan.h diff --git a/lincan/include/usbcan.h b/lincan/include/usbcan.h index 0f1e39c..36c3753 100644 --- a/lincan/include/usbcan.h +++ b/lincan/include/usbcan.h @@ -15,6 +15,7 @@ #include #include #include +#include #include "../include/kthread.h" @@ -27,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 @@ -66,7 +67,7 @@ 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_kthread(void *data); int usbcan_chip_queue_status(struct canchip_t *chip); #ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS @@ -115,37 +116,58 @@ int usbcan_chip_queue_status(struct canchip_t *chip); #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 */ - 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; - u8 rcv_msg[16]; - u8 tx_msg[16]; - 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) @@ -156,5 +178,11 @@ struct usbcan_usb { #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*/