]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/app/usbcan/usb_vend.c
3f0afc9e8f278df17afdb45fbf75fbd5dca3e41d
[lincan.git] / embedded / app / usbcan / usb_vend.c
1 // #define CAN_DEBUG
2
3 #include <stdio.h>
4 #include <system_def.h>
5 //#include <hal_intr.h>
6 #include "./can/can.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"
12 #include <endian.h>
13 #if __BYTE_ORDER == __BIG_ENDIAN
14   #include <byteswap.h>
15 #endif
16
17 // lpc17xx debug
18 #include "./can/lpc17xx_can.h"
19 // lpc17xx debug - end
20
21 extern struct canuser_t *canuser;
22 extern uint8_t vendor_ret;
23
24 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
25   int dest_chip;
26
27         unsigned long code;
28         unsigned long mask;
29
30         struct ul_usb1_chip_data *chip_data=NULL;
31
32         usb_device_t *udev=ep->udev;
33         unsigned char *data=ep->ptr - ep->actual;
34
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))
38                         goto error;
39                 if (!chips_p[dest_chip])
40                         goto error;
41                 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
42                         goto nodata;
43
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);
49                 #endif
50
51
52                 if (chips_p[dest_chip]->chipspecops->extended_mask(chips_p[dest_chip], code, mask)<0)
53                         goto error;
54                 chip_data->flags |= UL_USB1_CHIP_MASK_SET;
55         }
56         return 0;
57 error:
58         chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
59 nodata:
60         return -1;
61 }
62
63 int set_baud_rate_complete_fnc(struct usb_ep_t *ep, int status){
64   int dest_chip;
65
66         int32_t rate,sjw,sampl_pt,flags;
67
68         struct ul_usb1_chip_data *chip_data=NULL;
69
70         usb_device_t *udev=ep->udev;
71         unsigned char *data=ep->ptr - ep->actual;
72
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))
76                         goto error;
77                 if (!chips_p[dest_chip])
78                         goto error;
79                 if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
80                         goto nodata;
81
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);
88                 sjw  = bswap_32( sjw);
89                 sampl_pt  = bswap_32( sampl_pt);
90                 flags  = bswap_32( flags);
91                 #endif
92
93                 if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
94                         goto error;
95                 chip_data->flags |= UL_USB1_CHIP_BAUD_SET;
96         }
97         return 0;
98 error:
99         chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
100 nodata:
101         return -1;
102 }
103
104 int set_canbtr_complete_fnc(struct usb_ep_t *ep, int status){
105   int dest_chip;
106
107 //      int32_t rate,sjw,sampl_pt,flags;
108         uint32_t brp, sjw, tseg1, tseg2;
109
110         struct can_lmc1_chip_data *chip_data=NULL;
111
112         usb_device_t *udev=ep->udev;
113         unsigned char *data=ep->ptr - ep->actual;
114
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))
118                         goto error;
119                 if (!chips_p[dest_chip])
120                         goto error;
121                 if ((chip_data=((struct can_lmc1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
122                         goto nodata;
123
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
129                 brp  = bswap_32(brp);
130                 sjw  = bswap_32(sjw);
131                 tseg1  = bswap_32(tseg1);
132                 tseg2  = bswap_32(tseg2);
133                 #endif
134
135                                 
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);  
138
139 //              if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
140 //                      goto error;
141                 chip_data->flags |= CAN_LMC1_CHIP_CANBTR_SET;
142         }
143         return 0;
144 error:
145         chip_data->flags &= ~CAN_LMC1_CHIP_CANBTR_SET;
146 nodata:
147         return -1;
148 }
149
150 int usbcan_vendor(usb_device_t *udev)
151 {
152   // wIndex, wValue, bRequest, wLength
153   int dest_chip;
154   struct ul_usb1_chip_data *chip_data;
155
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)?
161
162   switch ( udev->request.bRequest) {
163                 
164                 //lpc17xx debug 
165                 case USBCAN_VENDOR_SET_CANBTR:
166                         udev->ep0.complete_fnc=set_canbtr_complete_fnc;
167                         return 1;
168                 //lpc17xx debug - end
169
170                 case USBCAN_VENDOR_EXT_MASK_SET:
171                         udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
172                         return 1;
173                 case USBCAN_VENDOR_EXT_MASK_STATUS:
174                         vendor_ret=-1;
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);
177                         else{
178                                 vendor_ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
179                                 usb_send_control_data(udev,&vendor_ret,1);
180                         }
181                         chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
182                         return 1;
183
184                 case USBCAN_VENDOR_BAUD_RATE_SET:
185                         udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
186                         return 1;
187                 case USBCAN_VENDOR_BAUD_RATE_STATUS:
188                         vendor_ret=-1;
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);
191                         else{
192                                 vendor_ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
193                                 usb_send_control_data(udev,&vendor_ret,1);
194                         }
195                         chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
196                         return 1;
197
198                 case USBCAN_VENDOR_SET_BTREGS:
199                         {
200                                 uint16_t value=udev->request.wValue;
201                                 vendor_ret=1;
202                                 if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
203                                         vendor_ret=0;
204                                 usb_send_control_data(udev,&vendor_ret,1);
205                         }
206                         return 1;
207
208                 case USBCAN_VENDOR_CHECK_TX_STAT:
209                         {
210                                 struct canque_edge_t *qedge;
211                                 struct canque_slot_t *slot;
212                                 vendor_ret=0;
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");
216                                         vendor_ret=1;
217                                 }
218                                 DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Sending %d\r\n",vendor_ret);
219                                 usb_send_control_data(udev,&vendor_ret,1);
220                                 return 1;
221                         }
222
223                 case USBCAN_VENDOR_START_CHIP:
224                         vendor_ret=1;
225                         if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
226                                 vendor_ret=0;
227                         usb_send_control_data(udev,&vendor_ret,1);
228                         return 1;
229                 case USBCAN_VENDOR_STOP_CHIP:
230                         vendor_ret=1;
231                         if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
232                                 vendor_ret=0;
233                         usb_send_control_data(udev,&vendor_ret,1);
234                         return 1;
235   }
236
237   return 0;
238 }