X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/1a9e7b0fc69ea363700b9ff37865caebdec2ce52..7c28d4d63c2ccd9945d1b0bb11dd3caff4c382b3:/embedded/app/usbcan/main.c diff --git a/embedded/app/usbcan/main.c b/embedded/app/usbcan/main.c index 86d98ab..14fbe28 100644 --- a/embedded/app/usbcan/main.c +++ b/embedded/app/usbcan/main.c @@ -60,12 +60,16 @@ #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(chipnrnr_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; chipnrnr_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 && )