]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/app/usbcan/main.c
embedded: reintroduce missing emulated bus initialization for UL_USB1 board.
[lincan.git] / embedded / app / usbcan / main.c
index 86d98ab703afa743a0bd39699cdd648c93233950..14fbe288e98c5eb5bf7b1b3c841e744a49dcb951 100644 (file)
 #include "./can/modparms.h"
 #include "./can/devcommon.h"
 
-#include "./can/ul_usb1.h"
-//#include "./can/setup.h"
+//#include "./can/ul_usb1.h"
+
+#include "./can/setup.h"
 
 #include "./usb/usb_defs.h"
 #include "./usb/usb_vend.h"
 
+extern int can_lmc1_register(struct hwspecops_t *hwspecops);
+extern int ul_usb1_register(struct hwspecops_t *hwspecops);
+
 #define MASK_EP1RX  0x01
 #define MASK_EP1TX  0x02
 
@@ -105,7 +109,6 @@ typedef void (*FNC)(); //function ptr
  * global variables
  ***********************************************************************/
 
-
 usb_device_t usb_device;
 
 usb_ep_t eps[NUM_ENDPOINTS];
@@ -135,6 +138,7 @@ extern int register_obj_struct(struct msgobj_t *obj, int minorbase);
  ***********************************************************************/
 
 int sys_err(){
+  
   unsigned char i=0;
 
   while(1) {
@@ -152,19 +156,6 @@ int sys_err(){
   }
 }
 
-/***********************************************************************
- * Microsecond delay routine
- ***********************************************************************/
-
-void udelay(long time)
-{
-  volatile long ticks=(time * CCLK) / 2000000;
-  do{
-    ticks--;
-  } while(ticks>0);
-}
-
-
 /***********************************************************************
  * Routine for visible LED blinking (on USB transmission)
  ***********************************************************************/
@@ -175,6 +166,7 @@ void timer_10ms(void)
   else SET_OUT_PIN(LED_PORT,LED1_BIT);
   if (timer_rx_off!=0) timer_rx_off--;
   else SET_OUT_PIN(LED_PORT,LED2_BIT);
+
 /*  if (timer_configured!=0) timer_configured--;
   else {
     timer_configured=20;
@@ -207,23 +199,24 @@ int main(void)
 //     volatile int i=0;
        bootloader_run=0;
        /***********************************/
+
        lt_10msec_init();
        lt_100msec_init();
        lt_2sec_init();
 
-       SET_OUT_PIN(LED_PORT,LED_ERR);
-       CLR_OUT_PIN(LED_PORT,LED_GP);
+       // DEBUG
+       //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();
+       // ***********************************************************************
+       // * CAN device initialization - device side (adapted from LinCAN setup.c)
+       // ***********************************************************************
 
        DEBUGMSG("Initiating CAN device initialization\n");
        baudrate[0]=1000;
@@ -251,22 +244,33 @@ int main(void)
        }
        memset(candev->hwspecops, 0, sizeof(struct hwspecops_t));
 
+       
+
+#ifdef CONFIG_OC_LINCAN_CARD_ul_usb1
        ul_usb1_register(candev->hwspecops);
+#endif
+#ifdef CONFIG_OC_LINCAN_CARD_can_lmc1
+       can_lmc1_register(candev->hwspecops);
+#endif
 
        bd=baudrate[0];
        if (candev->hwspecops->init_hw_data(candev)){
                CANMSG("HW data could not be initialized\n");
                sys_err();
        }
-       /* Alocate and initialize the chip structures */
+
+       // 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(chipnr<irqnum)
+//                     irqsig=irq[*irq_param_idx_p+chipnr];
                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;
@@ -278,11 +282,21 @@ int main(void)
                        if(m>=0) m++;
                }
        }
-       if (candev->hwspecops->request_io(candev))
+
+
+       if (candev->hwspecops->request_io(candev)) {
+               CANMSG("Error to request IO\n");
                sys_err();
+       }
        candev->flags|=CANDEV_IO_RESERVED;
-       if (candev->hwspecops->reset(candev))
+
+
+       if (candev->hwspecops->reset(candev)) {
+               CANMSG("Error to reset chip\n");
                sys_err();
+       }
+
+
        for(chipnr=0; chipnr<candev->nr_all_chips; chipnr++) {
                if((chip=candev->chip[chipnr])==NULL)
                        continue;
@@ -294,11 +308,12 @@ int main(void)
 
                chip->flags |= CHIP_ATTACHED;
 
-// Interrupts from chip are served in main cycle
-/*             if(can_chip_setup_irq(chip)<0) {
-//                     CANMSG("Error to setup chip IRQ\n");
+               // used with lpc17xx:
+               if(can_chip_setup_irq(chip)<0) {
+                       CANMSG("Error to setup chip IRQ\n");
                        sys_err();
-               }*/
+               }
+
        }
 
        if (candev->flags & CANDEV_PROGRAMMABLE_IRQ)
@@ -307,9 +322,10 @@ int main(void)
                        sys_err();
                }
 
-       /***********************************************************************
-        * CAN device initialization - client side (adapted from LinCAN open.c)
-        ***********************************************************************/
+       //***********************************************************************
+       // * CAN device initialization - client side (adapted from LinCAN open.c)
+       // ***********************************************************************
+
 
        chip=candev->chip[0];
        obj=chip->msgobj[0];
@@ -327,7 +343,8 @@ int main(void)
                if (chip->chipspecops->pre_read_config(chip,obj)<0)
                        CANMSG("Error initializing chip for receiving\n");
 
-       } /* End of chip configuration */
+       } // End of chip configuration
+
 
        canuser = (struct canuser_t *)malloc(sizeof(struct canuser_t));
        if(canuser == NULL) sys_err();
@@ -342,7 +359,7 @@ int main(void)
        canqueue_ends_init_kern(qends);
        canuser->qends = qends;
 
-       /*required to synchronize with RT-Linux context*/
+       //required to synchronize with RT-Linux context
        can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
        list_add(&canuser->peers, &obj->obj_users);
        can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
@@ -352,11 +369,12 @@ int main(void)
 
        if(canqueue_connect_edge(canuser->rx_edge0=canque_new_edge_kern(MAX_BUF_LENGTH),
                obj->qends, canuser->qends)<0) sys_err();
-       /*FIXME: more generic model should be used there*/
+       //FIXME: more generic model should be used there
        canque_edge_decref(canuser->rx_edge0);
        canque_edge_decref(edge);
 
 
+
        /***********************************************************************
         * USB Init
         ***********************************************************************/
@@ -389,16 +407,25 @@ int main(void)
         ***********************************************************************/
 
        timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
+
+
+       printf("Main loop\n");
+
        while (1) {
 
                usb_check_events(&usb_device);
                usb_control_response(&usb_device);
 
-               if (!(IO0PIN&P0_SJA1000_INT_PIN)) //INT PIN is inverted
+#ifdef CONFIG_OC_LINCAN_CARD_ul_usb1
+               /* polled IRQ mode for ul_usb1 board*/
+               if (!(IO0PIN&P0_SJA1000_INT_PIN)) /* INT PIN is inverted */
                        chip->chipspecops->irq_handler(0,chip);
+#endif
 
                if (usb_device.ep_events & MASK_EP1RX) {  //EP1RX - data waiting to receive
+                       
                        if (canque_get_inslot(qends, &qedge, &slot, 0)>=0){ //Free slot obtained
+
                                size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,16);
                                if (size==16){
                                        uint16_t msgflags;
@@ -425,16 +452,22 @@ int main(void)
                                        /* Automatic selection of extended format if ID>2047 */
                                        if (canmsg.id & ~0x7ffl & MSG_ID_MASK ) canmsg.flags |= MSG_EXT;
                                        /* has been dependent on "extended" option */
+                       
                                        slot->msg=canmsg;
                                        canque_put_inslot(qends, qedge, slot);
+
                                }
                                else
                                        canque_abort_inslot(qends,qedge,slot);
+                                       
+
                                timer_rx_off=50;        //rosviceni diody pri prijmu
                                CLR_OUT_PIN(LED_PORT,LED2_BIT);
                                usb_device.ep_events &= ~MASK_EP1RX;
+                       
+                                       
                        }
-
+                       
 
 /*                     if (size==2){
                                uint8_t val;
@@ -454,6 +487,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");
@@ -484,8 +518,12 @@ int main(void)
                                timer_tx_off=50;                //rozsviceni diod pri vysilani
                                CLR_OUT_PIN(LED_PORT,LED1_BIT);
                                usb_device.ep_events &= ~MASK_EP1TX;
+
                        }
+                       
+
                }
+               
 
                //if (usb_can_send && )