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
18 #include "./can/lpc17xx_can.h"
19 // lpc17xx debug - end
21 extern struct canuser_t *canuser;
22 extern uint8_t vendor_ret;
24 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
30 struct ul_usb1_chip_data *chip_data=NULL;
32 usb_device_t *udev=ep->udev;
33 unsigned char *data=ep->ptr - ep->actual;
35 if (udev->request.bRequest==USBCAN_VENDOR_EXT_MASK_SET){
36 dest_chip=(udev->request.wIndex);
37 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
39 if (!chips_p[dest_chip])
41 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
44 mask=*(uint32_t *)(data);
45 code=*(uint32_t *)(data+4);
46 #if __BYTE_ORDER == __BIG_ENDIAN
47 mask = bswap_32( mask);
48 code = bswap_32( code);
52 if (chips_p[dest_chip]->chipspecops->extended_mask(chips_p[dest_chip], code, mask)<0)
54 chip_data->flags |= UL_USB1_CHIP_MASK_SET;
58 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
63 int set_baud_rate_complete_fnc(struct usb_ep_t *ep, int status){
66 int32_t rate,sjw,sampl_pt,flags;
68 struct ul_usb1_chip_data *chip_data=NULL;
70 usb_device_t *udev=ep->udev;
71 unsigned char *data=ep->ptr - ep->actual;
73 if (udev->request.bRequest==USBCAN_VENDOR_BAUD_RATE_SET){
74 dest_chip=(udev->request.wIndex);
75 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
77 if (!chips_p[dest_chip])
79 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
82 rate=*(int32_t *)(data);
83 sjw=*(int32_t *)(data+4);
84 sampl_pt=*(int32_t *)(data+8);
85 flags=*(int32_t *)(data+12);
86 #if __BYTE_ORDER == __BIG_ENDIAN
87 rate = bswap_32( rate);
89 sampl_pt = bswap_32( sampl_pt);
90 flags = bswap_32( flags);
93 if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
95 chip_data->flags |= UL_USB1_CHIP_BAUD_SET;
99 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
104 int set_canbtr_complete_fnc(struct usb_ep_t *ep, int status){
107 // int32_t rate,sjw,sampl_pt,flags;
108 uint32_t brp, sjw, tseg1, tseg2;
110 struct can_lmc1_chip_data *chip_data=NULL;
112 usb_device_t *udev=ep->udev;
113 unsigned char *data=ep->ptr - ep->actual;
115 if (udev->request.bRequest==USBCAN_VENDOR_SET_CANBTR){
116 dest_chip=(udev->request.wIndex);
117 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
119 if (!chips_p[dest_chip])
121 if ((chip_data=((struct can_lmc1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
124 brp=*(uint32_t *)(data);
125 sjw=*(uint32_t *)(data+4);
126 tseg1=*(uint32_t *)(data+8);
127 tseg2=*(uint32_t *)(data+12);
128 #if __BYTE_ORDER == __BIG_ENDIAN
131 tseg1 = bswap_32(tseg1);
132 tseg2 = bswap_32(tseg2);
136 printf("BRP: %d, SJW: %d, TSEG1: %d, TSEG2: %d \n", brp, sjw, tseg1, tseg2);
137 CAN_set_bittiming(chips_p[dest_chip], brp, sjw, tseg1, tseg2);
139 // if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
141 chip_data->flags |= CAN_LMC1_CHIP_CANBTR_SET;
145 chip_data->flags &= ~CAN_LMC1_CHIP_CANBTR_SET;
150 int usbcan_vendor(usb_device_t *udev)
152 // wIndex, wValue, bRequest, wLength
154 struct ul_usb1_chip_data *chip_data;
156 dest_chip=(udev->request.wIndex);
157 if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
158 return -1; // Should look like ok (0) or stall (-1)?
159 if (!chips_p[dest_chip])
160 return -1; // Should look like ok (0) or stall (-1)?
162 switch ( udev->request.bRequest) {
165 case USBCAN_VENDOR_SET_CANBTR:
166 udev->ep0.complete_fnc=set_canbtr_complete_fnc;
168 //lpc17xx debug - end
170 case USBCAN_VENDOR_EXT_MASK_SET:
171 udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
173 case USBCAN_VENDOR_EXT_MASK_STATUS:
175 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
176 usb_send_control_data(udev,&vendor_ret,1);
178 vendor_ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
179 usb_send_control_data(udev,&vendor_ret,1);
181 chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
184 case USBCAN_VENDOR_BAUD_RATE_SET:
185 udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
187 case USBCAN_VENDOR_BAUD_RATE_STATUS:
189 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
190 usb_send_control_data(udev,&vendor_ret,1);
192 vendor_ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
193 usb_send_control_data(udev,&vendor_ret,1);
195 chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
198 case USBCAN_VENDOR_SET_BTREGS:
200 uint16_t value=udev->request.wValue;
202 if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
204 usb_send_control_data(udev,&vendor_ret,1);
208 case USBCAN_VENDOR_CHECK_TX_STAT:
210 struct canque_edge_t *qedge;
211 struct canque_slot_t *slot;
213 if (canque_get_inslot(canuser->qends, &qedge, &slot, 0)>=0){
214 canque_abort_inslot(canuser->qends, qedge, slot);
215 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Free slot found\r\n");
218 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Sending %d\r\n",vendor_ret);
219 usb_send_control_data(udev,&vendor_ret,1);
223 case USBCAN_VENDOR_START_CHIP:
225 if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
227 usb_send_control_data(udev,&vendor_ret,1);
229 case USBCAN_VENDOR_STOP_CHIP:
231 if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
233 usb_send_control_data(udev,&vendor_ret,1);