]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/app/usbcan/main.c
Merge branch 'master' into can-usb1
[lincan.git] / embedded / app / usbcan / main.c
index b9271e3407ffad0ccac4dc106d27596283ac2ef9..657b9e38e7b5315f270826d0cff2426f90cb4f14 100644 (file)
 #include "./can/sja1000p.h"
 #include "./can/main.h"
 
-#include "./can/can_sysdep.h"
+// #include "./can/can_sysdep.h"
 #include "./can/modparms.h"
 #include "./can/devcommon.h"
 
 #include "./can/ul_usb1.h"
 //#include "./can/setup.h"
 
+#include "./usb/usb_defs.h"
 #include "./usb/usb_vend.h"
 
 #define MASK_EP1RX  0x01
 #define MASK_EP1TX  0x02
 
-#ifdef USB_MAX_PACKET
-       #undef USB_MAX_PACKET
-       #define USB_MAX_PACKET 16
-#endif
-
 #define CAN_OP_MASK 0x80
 #define CAN_OP_READ 0x80
 #define CAN_OP_WRITE 0x00
 
+#ifdef USB_MAX_PACKET
+       #undef USB_MAX_PACKET
+       #define USB_MAX_PACKET 16
+#endif
 /***********************************************************************
  * Note:
  * Comparing to LinCAN, there is no need to sleep for processes
@@ -57,7 +57,7 @@
 /***********************************************************************
  * Note:
  * Code is wittingly complex in order to ease future changes in hardware
- * configuration and to make it as much similar as the code of LinCAN
+ * configuration and to make it as much similar as the code of LinCAN
  ***********************************************************************/
 
 LT_TIMER_DEC(lt_10msec)
@@ -70,18 +70,20 @@ LT_TIMER_IMP(lt_2sec)
 typedef void (*FNC)(); //function ptr
 
 /***********************************************************************
      * global variables
      ***********************************************************************/
+ * global variables
+ ***********************************************************************/
 
 
 usb_device_t usb_device;
 
-usb_ep_t eps[2];
+usb_ep_t eps[NUM_ENDPOINTS];
 unsigned char ep1_rx_buff[USB_MAX_PACKET];
 unsigned char ep1_tx_buff[USB_MAX_PACKET];
 uint8_t timer_str,timer_rx_off,timer_tx_off,timer_configured;
 volatile uint8_t bootloader_run;
 
+uint8_t vendor_ret;
+
 int processlocal;
 
 int baudrate[MAX_TOT_CHIPS];
@@ -92,9 +94,12 @@ struct msgobj_t *objects_p[MAX_TOT_MSGOBJS];
 
 struct canuser_t *canuser;
 
+extern int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate);
+extern int register_chip_struct(struct canchip_t *chip, int minorbase);
+extern int register_obj_struct(struct msgobj_t *obj, int minorbase);
 
 /***********************************************************************
- * SOMETHING BAD HAPPENED
+ * IF SOMETHING BAD HAPPENED
  ***********************************************************************/
 
 int sys_err(){
@@ -150,7 +155,9 @@ int main(void)
        can_spin_irqflags_t iflags;
 
        int chipnr,bd;
-       int i,size;
+       int i,size,m=0;
+
+       CANMSG("Starting USBCAN module firmware...\n");
 
 //     volatile int i=0;
        bootloader_run=0;
@@ -162,11 +169,18 @@ int main(void)
        SET_OUT_PIN(LED_PORT,LED_ERR);
        CLR_OUT_PIN(LED_PORT,LED_GP);
 
+       if (USB_MAX_PACKET<16){
+               CANMSG("Maximum packet size less than 16B (is %dB)\n",USB_MAX_PACKET);
+               sys_err();
+       }
+
        /***********************************************************************
         * CAN device initialization - device side (adapted from LinCAN setup.c)
         ***********************************************************************/
 
+       can_init();
 
+       DEBUGMSG("Initiating CAN device initialization\n");
        baudrate[0]=1000;
 
        canqueue_kern_initialize();
@@ -174,8 +188,11 @@ int main(void)
        hardware_p->nr_boards=1;
 
        candev=(struct candevice_t *)malloc(sizeof(struct candevice_t));
-               if (candev==NULL) sys_err();
-               memset(candev, 0, sizeof(struct candevice_t));
+       if (!candev){
+               CANMSG("No space left in memory\n");
+               sys_err();
+       }
+       memset(candev, 0, sizeof(struct candevice_t));
 
        hardware_p->candevice[0]=candev;
        candev->candev_idx=0;
@@ -183,18 +200,38 @@ int main(void)
        candev->dev_base_addr=0;
 
        candev->hwspecops=(struct hwspecops_t *)malloc(sizeof(struct hwspecops_t));
-               if (candev->hwspecops==NULL) sys_err();
-               memset(candev->hwspecops, 0, sizeof(struct hwspecops_t));
+       if (!candev->hwspecops){
+               CANMSG("No space left in memory\n");
+               sys_err();
+       }
+       memset(candev->hwspecops, 0, sizeof(struct hwspecops_t));
 
        ul_usb1_register(candev->hwspecops);
 
        bd=baudrate[0];
-       if (candev->hwspecops->init_hw_data(candev)) sys_err();
+       if (candev->hwspecops->init_hw_data(candev)){
+               CANMSG("HW data could not be initialized\n");
+               sys_err();
+       }
        /* Alocate and initialize the chip structures */
        for (chipnr=0; chipnr < candev->nr_all_chips; chipnr++) {
 /*             if(chipnr<irqnum)
                        irqsig=irq[*irq_param_idx_p+chipnr];*/
-               if (init_chip_struct(candev, chipnr, 0, bd*1000)) sys_err();
+               if (init_chip_struct(candev, chipnr, 0, bd*1000)){
+                       CANMSG("Chip structure could not be initialized\n");
+                       sys_err();
+               }
+       }
+       for (chipnr=0; chipnr < candev->nr_all_chips; chipnr++) {
+               struct canchip_t *chip=candev->chip[chipnr];
+               int objnr;
+
+               register_chip_struct(chip, m);
+
+               for (objnr=0; objnr<chip->max_objects; objnr++) {
+                       register_obj_struct(chip->msgobj[objnr], m);
+                       if(m>=0) m++;
+               }
        }
        if (candev->hwspecops->request_io(candev))
                sys_err();
@@ -281,9 +318,10 @@ int main(void)
 
        memset( &usb_device, 0, sizeof( usb_device));
        usb_device.id = 1;
+       usb_device.devdes_table = &usb_devdes_table;
        usb_device.init = usb_lpc_init;
        usb_debug_set_level(DEBUG_LEVEL_NONE);
-       usb_device.cntep = 3;
+       usb_device.cntep = NUM_ENDPOINTS;
        usb_device.ep = eps;
 
        eps[0].max_packet_size = USB_MAX_PACKET;
@@ -295,30 +333,29 @@ int main(void)
        eps[0].udev = &usb_device;
        eps[1].udev = &usb_device;
 
-//  usb_device.vendor_fnc=usb_loader;
+       usb_device.vendor_fnc=usbcan_vendor;
 
        usb_init(&usb_device);
        usb_connect(&usb_device);
-
-       can_init();
+       usb_device.ep_events |= MASK_EP1TX;
 
        /***********************************************************************
         * Start
         ***********************************************************************/
 
-  timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
+       timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
        while (1) {
 
                usb_check_events(&usb_device);
                usb_control_response(&usb_device);
 
-               if (!(IO0PIN&P0_SJA1000_INT_PIN))
+               if (!(IO0PIN&P0_SJA1000_INT_PIN)) //INT PIN is inverted
                        chip->chipspecops->irq_handler(0,chip);
 
                if (usb_device.ep_events & MASK_EP1RX) {  //EP1RX - data waiting to receive
                        uint8_t val;
                        if (canque_get_inslot(qends, &qedge, &slot, 0)>=0){ //Free slot obtained
-                               size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,USB_MAX_PACKET);
+                               size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,16);
                                if (size==16){
                                        uint16_t msgflags;
                                        uint32_t msgid;
@@ -374,6 +411,7 @@ int main(void)
 
                if(usb_device.ep_events & MASK_EP1TX){ //EP1TX - data transmitted
                        if(canque_test_outslot(qends, &qedge, &slot)>=0){
+                               DEBUGMSG("CAN message ready to send over usb\n");
                                uint16_t msgflags;
                                uint32_t msgid;
 
@@ -395,7 +433,7 @@ int main(void)
                                for (;i<CAN_MSG_LENGTH;i++){
                                        *(uint8_t *)(ep1_tx_buff+8+i)=0;
                                }
-                               usb_udev_write_endpoint(&eps[1],ep1_tx_buff,USB_MAX_PACKET);
+                               usb_udev_write_endpoint(&eps[1],ep1_tx_buff,16);
 
                                canque_free_outslot(qends, qedge, slot);
                                timer_tx_off=50;                //rozsviceni diod pri vysilani