]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/app/usbcan/usb_vend.c
Setting of initial bit timing has been done.
[lincan.git] / embedded / app / usbcan / usb_vend.c
index 8ee992c4efe655f11d5f51024fa9be91f2d93c9c..1f5d41fd31a27f1aaee082d2c386b183156bafac 100644 (file)
@@ -1,19 +1,25 @@
+// #define CAN_DEBUG
+
 #include <stdio.h>
 #include <system_def.h>
-#include <hal_intr.h>
-#include "./can/ul_usb1.h"
+//#include <hal_intr.h>
 #include "./can/can.h"
 #include "./can/can_sysdep.h"
 #include "./can/main.h"
 #include "./can/devcommon.h"
 #include "./usb/usb_vend.h"
-//#include "./can/ul_usb1.h"
+#include "./can/ul_usb1.h"
 #include <endian.h>
 #if __BYTE_ORDER == __BIG_ENDIAN
   #include <byteswap.h>
 #endif
 
+// lpc17xx debug
+#include "./can/lpc17xx_can.h"
+// lpc17xx debug - end
+
 extern struct canuser_t *canuser;
+extern uint8_t vendor_ret;
 
 int set_ext_mask_complete_fnc(struct usb_ep_t *ep, int status){
   int dest_chip;
@@ -95,30 +101,81 @@ nodata:
        return -1;
 }
 
+int set_canbtr_complete_fnc(struct usb_ep_t *ep, int status){
+  int dest_chip;
+
+       uint32_t brp, sjw, tseg1, tseg2;
+
+       struct can_lmc1_chip_data *chip_data=NULL;
+
+       usb_device_t *udev=ep->udev;
+       unsigned char *data=ep->ptr - ep->actual;
+
+       if (udev->request.bRequest==USBCAN_VENDOR_SET_CANBTR){
+               dest_chip=(udev->request.wIndex);
+               if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
+                       goto error;
+               if (!chips_p[dest_chip])
+                       goto error;
+               if ((chip_data=((struct can_lmc1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
+                       goto nodata;
+
+               brp=*(uint32_t *)(data);
+               sjw=*(uint32_t *)(data+4);
+               tseg1=*(uint32_t *)(data+8);
+               tseg2=*(uint32_t *)(data+12);
+               #if __BYTE_ORDER == __BIG_ENDIAN
+               brp  = bswap_32(brp);
+               sjw  = bswap_32(sjw);
+               tseg1  = bswap_32(tseg1);
+               tseg2  = bswap_32(tseg2);
+               #endif
+
+                               
+               printf("BRP: %d, SJW: %d, TSEG1: %d, TSEG2: %d \n", brp, sjw, tseg1, tseg2);
+               CAN_set_bittiming(chips_p[dest_chip], brp--, sjw--, tseg1--, tseg2--);  
+
+//             if (chips_p[dest_chip]->chipspecops->baud_rate(chips_p[dest_chip], rate, chips_p[dest_chip]->clock, sjw, sampl_pt, flags)<0)
+//                     goto error;
+               chip_data->flags |= CAN_LMC1_CHIP_CANBTR_SET;
+       }
+       return 0;
+error:
+       chip_data->flags &= ~CAN_LMC1_CHIP_CANBTR_SET;
+nodata:
+       return -1;
+}
+
 int usbcan_vendor(usb_device_t *udev)
 {
   // wIndex, wValue, bRequest, wLength
   int dest_chip;
   struct ul_usb1_chip_data *chip_data;
-  uint8_t ret;
 
   dest_chip=(udev->request.wIndex);
   if ((dest_chip>=MAX_TOT_CHIPS)||(dest_chip<0))
-       return 0; // Should look like ok (0) or stall (-1)?
+       return -1; // Should look like ok (0) or stall (-1)?
   if (!chips_p[dest_chip])
-       return 0; // Should look like ok (0) or stall (-1)?
+       return -1; // Should look like ok (0) or stall (-1)?
 
   switch ( udev->request.bRequest) {
+               
+               //lpc17xx debug 
+               case USBCAN_VENDOR_SET_CANBTR:
+                       udev->ep0.complete_fnc=set_canbtr_complete_fnc;
+                       return 1;
+               //lpc17xx debug - end
+
                case USBCAN_VENDOR_EXT_MASK_SET:
                        udev->ep0.complete_fnc=set_ext_mask_complete_fnc;
                        return 1;
                case USBCAN_VENDOR_EXT_MASK_STATUS:
-                       ret=-1;
+                       vendor_ret=-1;
                        if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
-                               usb_send_control_data(udev,&ret,1);
+                               usb_send_control_data(udev,&vendor_ret,1);
                        else{
-                               ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
-                               usb_send_control_data(udev,&ret,1);
+                               vendor_ret=(chip_data->flags & UL_USB1_CHIP_MASK_SET)?1:0;
+                               usb_send_control_data(udev,&vendor_ret,1);
                        }
                        chip_data->flags &= ~UL_USB1_CHIP_MASK_SET;
                        return 1;
@@ -127,12 +184,12 @@ int usbcan_vendor(usb_device_t *udev)
                        udev->ep0.complete_fnc=set_baud_rate_complete_fnc;
                        return 1;
                case USBCAN_VENDOR_BAUD_RATE_STATUS:
-                       ret=-1;
+                       vendor_ret=-1;
                        if ((chip_data=((struct ul_usb1_chip_data*)(chips_p[dest_chip]->chip_data)))==NULL)
-                               usb_send_control_data(udev,&ret,1);
+                               usb_send_control_data(udev,&vendor_ret,1);
                        else{
-                               ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
-                               usb_send_control_data(udev,&ret,1);
+                               vendor_ret=(chip_data->flags & UL_USB1_CHIP_BAUD_SET)?1:0;
+                               usb_send_control_data(udev,&vendor_ret,1);
                        }
                        chip_data->flags &= ~UL_USB1_CHIP_BAUD_SET;
                        return 1;
@@ -140,11 +197,10 @@ int usbcan_vendor(usb_device_t *udev)
                case USBCAN_VENDOR_SET_BTREGS:
                        {
                                uint16_t value=udev->request.wValue;
-                               ret=1;
+                               vendor_ret=1;
                                if (chips_p[dest_chip]->chipspecops->set_btregs(chips_p[dest_chip],value&0xFF,(value>>8)&0xFF)<0)
-                                       ret=0;
-                               usb_send_control_data(udev,&ret,1);
-                               return 1;
+                                       vendor_ret=0;
+                               usb_send_control_data(udev,&vendor_ret,1);
                        }
                        return 1;
 
@@ -152,26 +208,28 @@ int usbcan_vendor(usb_device_t *udev)
                        {
                                struct canque_edge_t *qedge;
                                struct canque_slot_t *slot;
-                               ret=0;
+                               vendor_ret=0;
                                if (canque_get_inslot(canuser->qends, &qedge, &slot, 0)>=0){
                                        canque_abort_inslot(canuser->qends, qedge, slot);
-                                       ret=1;
+                                       DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Free slot found\r\n");
+                                       vendor_ret=1;
                                }
-                               usb_send_control_data(udev,&ret,1);
+                               DEBUGMSG("USBCAN_VENDOR_CHECK_TX_STAT - Sending %d\r\n",vendor_ret);
+                               usb_send_control_data(udev,&vendor_ret,1);
                                return 1;
                        }
 
                case USBCAN_VENDOR_START_CHIP:
-                       ret=1;
+                       vendor_ret=1;
                        if (chips_p[dest_chip]->chipspecops->start_chip(chips_p[dest_chip])<0)
-                               ret=0;
-                       usb_send_control_data(udev,&ret,1);
+                               vendor_ret=0;
+                       usb_send_control_data(udev,&vendor_ret,1);
                        return 1;
                case USBCAN_VENDOR_STOP_CHIP:
-                       ret=1;
+                       vendor_ret=1;
                        if (chips_p[dest_chip]->chipspecops->stop_chip(chips_p[dest_chip])<0)
-                               ret=0;
-                       usb_send_control_data(udev,&ret,1);
+                               vendor_ret=0;
+                       usb_send_control_data(udev,&vendor_ret,1);
                        return 1;
   }