4 #include <system_def.h>
5 //#include <hal_intr.h>
7 #include "./can/can_sysdep.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 #include "./can/lpc17xx_can.h"
19 extern struct canuser_t *canuser;
20 extern uint8_t vendor_ret;
22 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
28 struct ul_usb1_chip_data *chip_data=NULL;
30 usb_device_t *udev=ep->udev;
31 unsigned char *data=ep->ptr - ep->actual;
33 if (udev->request.bRequest==USBCAN_VENDOR_EXT_MASK_SET){
34 dest_chip=(udev->request.wIndex);
35 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
37 if (!chips_p[dest_chip])
39 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
42 mask=*(uint32_t *)(data);
43 code=*(uint32_t *)(data+4);
44 #if __BYTE_ORDER == __BIG_ENDIAN
45 mask = bswap_32( mask);
46 code = bswap_32( code);
50 if (chips_p[dest_chip]->chipspecops->extended_mask(chips_p[dest_chip], code, mask)<0)
52 chip_data->flags |= UL_USB1_CHIP_MASK_SET;
56 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
61 int set_baud_rate_complete_fnc(struct usb_ep_t *ep, int status){
64 int32_t rate,sjw,sampl_pt,flags;
66 struct ul_usb1_chip_data *chip_data=NULL;
68 usb_device_t *udev=ep->udev;
69 unsigned char *data=ep->ptr - ep->actual;
71 if (udev->request.bRequest==USBCAN_VENDOR_BAUD_RATE_SET){
72 dest_chip=(udev->request.wIndex);
73 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
75 if (!chips_p[dest_chip])
77 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
80 rate=*(int32_t *)(data);
81 sjw=*(int32_t *)(data+4);
82 sampl_pt=*(int32_t *)(data+8);
83 flags=*(int32_t *)(data+12);
84 #if __BYTE_ORDER == __BIG_ENDIAN
85 rate = bswap_32( rate);
87 sampl_pt = bswap_32( sampl_pt);
88 flags = bswap_32( flags);
91 if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
93 chip_data->flags |= UL_USB1_CHIP_BAUD_SET;
97 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
104 int set_bittiming_complete_fnc(struct usb_ep_t *ep, int status){
107 int32_t brp, sjw, tseg1, tseg2;
109 usb_device_t *udev=ep->udev;
110 unsigned char *data=ep->ptr - ep->actual;
112 if(ep->actual != USBCAN_BITTIMING_SIZE)
115 if (udev->request.bRequest==USBCAN_VENDOR_SET_BITTIMING){
116 dest_chip=(udev->request.wIndex);
117 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
119 if (!chips_p[dest_chip])
122 brp=*(int32_t *)(data);
123 sjw=*(int32_t *)(data+4);
124 tseg1=*(int32_t *)(data+8);
125 tseg2=*(int32_t *)(data+12);
126 #if __BYTE_ORDER == __BIG_ENDIAN
129 tseg1 = bswap_32(tseg1);
130 tseg2 = bswap_32(tseg2);
134 if (chips_p[dest_chip]->chipspecops->set_bittiming(chips_p[dest_chip], brp, sjw, tseg1, tseg2)<0)
143 int get_bittiming_const_complete_fnc(usb_device_t *udev){
147 struct can_lmc1_chip_data *chip_data=NULL;
148 struct can_bittiming_const *btc;
150 uint8_t buffer[USBCAN_BITTIMING_CONST_SIZE];
153 if (udev->request.bRequest==USBCAN_VENDOR_GET_BITTIMING_CONST){
155 dest_chip=(udev->request.wIndex);
156 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
158 if (!chips_p[dest_chip])
160 if ((chip_data=((struct can_lmc1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL){
164 btc = &chip_data->btc;
166 ptr = (uint32_t*) buffer;
168 #if __BYTE_ORDER == __BIG_ENDIAN
169 *(ptr++) = bswap_32(chips_p[dest_chip]->clock);
170 *(ptr++) = bswap_32(btc->tseg1_min);
171 *(ptr++) = bswap_32(btc->tseg1_max);
172 *(ptr++) = bswap_32(btc->tseg2_min);
173 *(ptr++) = bswap_32(btc->tseg2_max);
174 *(ptr++) = bswap_32(btc->sjw_max);
175 *(ptr++) = bswap_32(btc->brp_min);
176 *(ptr++) = bswap_32(btc->brp_max);
177 *(ptr) = bswap_32(btc->brp_inc);
179 *(ptr++) = chips_p[dest_chip]->clock;
180 *(ptr++) = btc->tseg1_min;
181 *(ptr++) = btc->tseg1_max;
182 *(ptr++) = btc->tseg2_min;
183 *(ptr++) = btc->tseg2_max;
184 *(ptr++) = btc->sjw_max;
185 *(ptr++) = btc->brp_min;
186 *(ptr++) = btc->brp_max;
187 *(ptr) = btc->brp_inc;
190 usb_send_control_data(udev, buffer, USBCAN_BITTIMING_CONST_SIZE);
200 int usbcan_vendor(usb_device_t *udev)
202 // wIndex, wValue, bRequest, wLength
204 struct ul_usb1_chip_data *chip_data;
206 dest_chip=(udev->request.wIndex);
207 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
208 return -1; // Should look like ok (0) or stall (-1)?
209 if (!chips_p[dest_chip])
210 return -1; // Should look like ok (0) or stall (-1)?
212 switch ( udev->request.bRequest) {
215 case USBCAN_VENDOR_SET_BITTIMING:
216 udev->ep0.complete_fnc=set_bittiming_complete_fnc;
219 case USBCAN_VENDOR_GET_BITTIMING_CONST:
220 get_bittiming_const_complete_fnc(udev);
224 case USBCAN_VENDOR_EXT_MASK_SET:
225 udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
227 case USBCAN_VENDOR_EXT_MASK_STATUS:
229 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
230 usb_send_control_data(udev,&vendor_ret,1);
232 vendor_ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
233 usb_send_control_data(udev,&vendor_ret,1);
235 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
238 case USBCAN_VENDOR_BAUD_RATE_SET:
239 udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
241 case USBCAN_VENDOR_BAUD_RATE_STATUS:
243 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
244 usb_send_control_data(udev,&vendor_ret,1);
246 vendor_ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
247 usb_send_control_data(udev,&vendor_ret,1);
249 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
252 case USBCAN_VENDOR_SET_BTREGS:
254 uint16_t value=udev->request.wValue;
256 if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
258 usb_send_control_data(udev,&vendor_ret,1);
262 case USBCAN_VENDOR_CHECK_TX_STAT:
264 struct canque_edge_t *qedge;
265 struct canque_slot_t *slot;
267 if (canque_get_inslot(canuser->qends, &qedge, &slot, 0)>=0){
268 canque_abort_inslot(canuser->qends, qedge, slot);
269 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Free slot found\r\n");
272 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Sending %d\r\n",vendor_ret);
273 usb_send_control_data(udev,&vendor_ret,1);
277 case USBCAN_VENDOR_START_CHIP:
279 if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
281 usb_send_control_data(udev,&vendor_ret,1);
283 case USBCAN_VENDOR_STOP_CHIP:
285 if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
287 usb_send_control_data(udev,&vendor_ret,1);