X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/1a9e7b0fc69ea363700b9ff37865caebdec2ce52..ad1d46af5c8562e90a3f8564cf511213ff1f1745:/embedded/app/usbcan/main.c diff --git a/embedded/app/usbcan/main.c b/embedded/app/usbcan/main.c index 86d98ab..4b91631 100644 --- a/embedded/app/usbcan/main.c +++ b/embedded/app/usbcan/main.c @@ -60,12 +60,17 @@ #include "./can/modparms.h" #include "./can/devcommon.h" -#include "./can/ul_usb1.h" +//#include "./can/ul_usb1.h" + //#include "./can/setup.h" #include "./usb/usb_defs.h" #include "./usb/usb_vend.h" +// DEBUG CAN +#include "can/lpc17xx_can.h" +// DEBUG CAN - end + #define MASK_EP1RX 0x01 #define MASK_EP1TX 0x02 @@ -101,6 +106,7 @@ LT_TIMER_IMP(lt_2sec) typedef void (*FNC)(); //function ptr + /*********************************************************************** * global variables ***********************************************************************/ @@ -135,6 +141,7 @@ extern int register_obj_struct(struct msgobj_t *obj, int minorbase); ***********************************************************************/ int sys_err(){ + unsigned char i=0; while(1) { @@ -155,7 +162,7 @@ int sys_err(){ /*********************************************************************** * Microsecond delay routine ***********************************************************************/ - +/* void udelay(long time) { volatile long ticks=(time * CCLK) / 2000000; @@ -163,7 +170,7 @@ void udelay(long time) ticks--; } while(ticks>0); } - +*/ /*********************************************************************** * Routine for visible LED blinking (on USB transmission) @@ -175,6 +182,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; @@ -203,27 +211,42 @@ int main(void) int i,size,m=0; CANMSG("Starting USBCAN module firmware...\n"); + // 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) - ***********************************************************************/ +// !!! DEBUG - first version, only transmitting CAN messages withnout usage of queue system from LinCAN + + // CAN + CAN_init(1000000); + // CAN end + +/* + + //*********************************************************************** + // * CAN device initialization - device side (adapted from LinCAN setup.c) + // *********************************************************************** + + // DEBUG + //can_init(); // only for successful compiling (defined in can_lpcbusemu.c) + + - can_init(); DEBUGMSG("Initiating CAN device initialization\n"); baudrate[0]=1000; @@ -251,17 +274,19 @@ int main(void) } memset(candev->hwspecops, 0, sizeof(struct hwspecops_t)); - ul_usb1_register(candev->hwspecops); + // DEBUG + //ul_usb1_register(candev->hwspecops); // only for successful compiling (defined in ul_usb1.c) + 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(chipnrflags |= CHIP_ATTACHED; // Interrupts from chip are served in main cycle -/* if(can_chip_setup_irq(chip)<0) { +// if(can_chip_setup_irq(chip)<0) { // CANMSG("Error to setup chip IRQ\n"); - sys_err(); - }*/ +// sys_err(); +// } } if (candev->flags & CANDEV_PROGRAMMABLE_IRQ) @@ -307,9 +332,9 @@ 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 +352,7 @@ 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 +367,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,10 +377,11 @@ 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 +415,24 @@ 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 - chip->chipspecops->irq_handler(0,chip); +// DEBUG +// 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 - if (canque_get_inslot(qends, &qedge, &slot, 0)>=0){ //Free slot obtained + + // DEBUG - unused queue system (yet) + //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,15 +459,23 @@ 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); + + // DEBUG - unused queue system (yet) + //slot->msg=canmsg; + //canque_put_inslot(qends, qedge, slot); + CAN_send(&canmsg); } - else - canque_abort_inslot(qends,qedge,slot); + + // DEBUG - unused queue system (yet) + //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; - } + + // DEBUG + //} /* if (size==2){ @@ -454,6 +496,8 @@ int main(void) }*/ } + // DEBUG - only transmitting CAN messages, no reading (yet) + /* 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"); @@ -486,6 +530,7 @@ int main(void) usb_device.ep_events &= ~MASK_EP1TX; } } + */ //if (usb_can_send && )