4 #include <system_def.h>
7 #include "./can/can_sysless.h"
8 #include "./can/main.h"
9 #include "./can/devcommon.h"
10 #include "./usb/usb_vend.h"
11 #include "./can/ul_usb1.h"
13 #if __BYTE_ORDER == __BIG_ENDIAN
17 extern struct canuser_t *canuser;
18 extern uint8_t vendor_ret;
20 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
26 struct ul_usb1_chip_data *chip_data=NULL;
28 usb_device_t *udev=ep->udev;
29 unsigned char *data=ep->ptr - ep->actual;
31 if (udev->request.bRequest==USBCAN_VENDOR_EXT_MASK_SET){
32 dest_chip=(udev->request.wIndex);
33 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
35 if (!chips_p[dest_chip])
37 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
40 mask=*(uint32_t *)(data);
41 code=*(uint32_t *)(data+4);
42 #if __BYTE_ORDER == __BIG_ENDIAN
43 mask = bswap_32( mask);
44 code = bswap_32( code);
48 if (chips_p[dest_chip]->chipspecops->extended_mask(chips_p[dest_chip], code, mask)<0)
50 chip_data->flags |= UL_USB1_CHIP_MASK_SET;
54 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
59 int set_baud_rate_complete_fnc(struct usb_ep_t *ep, int status){
62 int32_t rate,sjw,sampl_pt,flags;
64 struct ul_usb1_chip_data *chip_data=NULL;
66 usb_device_t *udev=ep->udev;
67 unsigned char *data=ep->ptr - ep->actual;
69 if (udev->request.bRequest==USBCAN_VENDOR_BAUD_RATE_SET){
70 dest_chip=(udev->request.wIndex);
71 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
73 if (!chips_p[dest_chip])
75 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
78 rate=*(int32_t *)(data);
79 sjw=*(int32_t *)(data+4);
80 sampl_pt=*(int32_t *)(data+8);
81 flags=*(int32_t *)(data+12);
82 #if __BYTE_ORDER == __BIG_ENDIAN
83 rate = bswap_32( rate);
85 sampl_pt = bswap_32( sampl_pt);
86 flags = bswap_32( flags);
89 if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
91 chip_data->flags |= UL_USB1_CHIP_BAUD_SET;
95 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
100 int usbcan_vendor(usb_device_t *udev)
102 // wIndex, wValue, bRequest, wLength
104 struct ul_usb1_chip_data *chip_data;
106 dest_chip=(udev->request.wIndex);
107 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
108 return -1; // Should look like ok (0) or stall (-1)?
109 if (!chips_p[dest_chip])
110 return -1; // Should look like ok (0) or stall (-1)?
112 switch ( udev->request.bRequest) {
113 case USBCAN_VENDOR_EXT_MASK_SET:
114 udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
116 case USBCAN_VENDOR_EXT_MASK_STATUS:
118 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
119 usb_send_control_data(udev,&vendor_ret,1);
121 vendor_ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
122 usb_send_control_data(udev,&vendor_ret,1);
124 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
127 case USBCAN_VENDOR_BAUD_RATE_SET:
128 udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
130 case USBCAN_VENDOR_BAUD_RATE_STATUS:
132 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
133 usb_send_control_data(udev,&vendor_ret,1);
135 vendor_ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
136 usb_send_control_data(udev,&vendor_ret,1);
138 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
141 case USBCAN_VENDOR_SET_BTREGS:
143 uint16_t value=udev->request.wValue;
145 if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
147 usb_send_control_data(udev,&vendor_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);
158 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Free slot found\r\n");
161 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Sending %d\r\n",vendor_ret);
162 usb_send_control_data(udev,&vendor_ret,1);
166 case USBCAN_VENDOR_START_CHIP:
168 if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
170 usb_send_control_data(udev,&vendor_ret,1);
172 case USBCAN_VENDOR_STOP_CHIP:
174 if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
176 usb_send_control_data(udev,&vendor_ret,1);