2 #include <system_def.h>
4 #include "./can/ul_usb1.h"
6 #include "./can/can_sysdep.h"
7 #include "./can/main.h"
8 #include "./can/devcommon.h"
9 #include "./usb/usb_vend.h"
10 //#include "./can/ul_usb1.h"
12 #if __BYTE_ORDER == __BIG_ENDIAN
16 extern struct canuser_t *canuser;
18 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
24 struct ul_usb1_chip_data *chip_data=NULL;
26 usb_device_t *udev=ep->udev;
27 unsigned char *data=ep->ptr - ep->actual;
29 if (udev->request.bRequest==USBCAN_VENDOR_EXT_MASK_SET){
30 dest_chip=(udev->request.wIndex);
31 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
33 if (!chips_p[dest_chip])
35 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
38 mask=*(uint32_t *)(data);
39 code=*(uint32_t *)(data+4);
40 #if __BYTE_ORDER == __BIG_ENDIAN
41 mask = bswap_32( mask);
42 code = bswap_32( code);
46 if (chips_p[dest_chip]->chipspecops->extended_mask(chips_p[dest_chip], code, mask)<0)
48 chip_data->flags |= UL_USB1_CHIP_MASK_SET;
52 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
57 int set_baud_rate_complete_fnc(struct usb_ep_t *ep, int status){
60 int32_t rate,sjw,sampl_pt,flags;
62 struct ul_usb1_chip_data *chip_data=NULL;
64 usb_device_t *udev=ep->udev;
65 unsigned char *data=ep->ptr - ep->actual;
67 if (udev->request.bRequest==USBCAN_VENDOR_BAUD_RATE_SET){
68 dest_chip=(udev->request.wIndex);
69 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
71 if (!chips_p[dest_chip])
73 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
76 rate=*(int32_t *)(data);
77 sjw=*(int32_t *)(data+4);
78 sampl_pt=*(int32_t *)(data+8);
79 flags=*(int32_t *)(data+12);
80 #if __BYTE_ORDER == __BIG_ENDIAN
81 rate = bswap_32( rate);
83 sampl_pt = bswap_32( sampl_pt);
84 flags = bswap_32( flags);
87 if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
89 chip_data->flags |= UL_USB1_CHIP_BAUD_SET;
93 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
98 int usbcan_vendor(usb_device_t *udev)
100 // wIndex, wValue, bRequest, wLength
102 struct ul_usb1_chip_data *chip_data;
105 dest_chip=(udev->request.wIndex);
106 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
107 return 0; // Should look like ok (0) or stall (-1)?
108 if (!chips_p[dest_chip])
109 return 0; // Should look like ok (0) or stall (-1)?
111 switch ( udev->request.bRequest) {
112 case USBCAN_VENDOR_EXT_MASK_SET:
113 udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
115 case USBCAN_VENDOR_EXT_MASK_STATUS:
117 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
118 usb_send_control_data(udev,&ret,1);
120 ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
121 usb_send_control_data(udev,&ret,1);
123 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
126 case USBCAN_VENDOR_BAUD_RATE_SET:
127 udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
129 case USBCAN_VENDOR_BAUD_RATE_STATUS:
131 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
132 usb_send_control_data(udev,&ret,1);
134 ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
135 usb_send_control_data(udev,&ret,1);
137 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
140 case USBCAN_VENDOR_SET_BTREGS:
142 uint16_t value=udev->request.wValue;
144 if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
146 usb_send_control_data(udev,&ret,1);
151 case USBCAN_VENDOR_CHECK_TX_STAT:
153 struct canque_edge_t *qedge;
154 struct canque_slot_t *slot;
156 if (canque_get_inslot(canuser->qends, &qedge, &slot, 0)>=0){
157 canque_abort_inslot(canuser->qends, qedge, slot);
160 usb_send_control_data(udev,&ret,1);
164 case USBCAN_VENDOR_START_CHIP:
166 if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
168 usb_send_control_data(udev,&ret,1);
170 case USBCAN_VENDOR_STOP_CHIP:
172 if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
174 usb_send_control_data(udev,&ret,1);