X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/a10d3f9f35082efb022dcbd400b8298b28aad81c..f9522530e37184c3dcfb818a35f55ec3f177406f:/lincan/include/usbcan.h diff --git a/lincan/include/usbcan.h b/lincan/include/usbcan.h index 35ee4f1..2d580fb 100644 --- a/lincan/include/usbcan.h +++ b/lincan/include/usbcan.h @@ -5,6 +5,41 @@ * Version lincan-0.3 17 Jul 2008 */ +#ifndef USBCAN_H +#define USBCAN_H + +#include +#include +#include +#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) +/* 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); @@ -14,6 +49,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); @@ -27,4 +63,109 @@ 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); +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*/