4 #include <system_def.h>
6 #include <local_config.h>
7 #include <usb/usbdebug.h>
10 #include <usb/usb_srq.h>
12 #include <keyval_id.h>
13 #include <hal_machperiph.h>
14 #include <keyval_loc.h>
16 #include <lpciap_kvpb.h>
19 #include "can/sja1000p.h"
21 #define MASK_EP1RX 0x01
22 #define MASK_EP1TX 0x02
26 #define USB_MAX_PACKET 8
29 #define CAN_OP_MASK 0x80
30 #define CAN_OP_READ 0x80
31 #define CAN_OP_WRITE 0x00
34 LT_TIMER_DEC(lt_10msec)
35 LT_TIMER_IMP(lt_10msec)
36 LT_TIMER_DEC(lt_100msec)
37 LT_TIMER_IMP(lt_100msec)
41 typedef void (*FNC)(); //function ptr
43 /***********************************/
46 usb_device_t usb_device;
49 unsigned char ep1_rx_buff[USB_MAX_PACKET];
50 unsigned char ep1_tx_buff[USB_MAX_PACKET];
51 uint8_t timer_str,timer_rx_off,timer_tx_off,timer_configured,usb_can_send;
52 volatile uint8_t bootloader_run;
57 SOMETHING BAD HAPPENED
63 if (lt_100msec_expired(100)) {
66 SET_OUT_PIN(LED_PORT,LED_ERR);
68 CLR_OUT_PIN(LED_PORT,LED_ERR);
70 #ifdef WATCHDOG_ENABLED
72 #endif /* WATCHDOG_ENABLED */
78 Routine for visible LED blinking
82 if (timer_tx_off!=0) timer_tx_off--;
83 else SET_OUT_PIN(LED_PORT,LED1_BIT);
84 if (timer_rx_off!=0) timer_rx_off--;
85 else SET_OUT_PIN(LED_PORT,LED2_BIT);
87 /* if (timer_configured!=0) timer_configured--;
90 CLR_OUT_PIN(LED_PORT,LED1_BIT);
91 CLR_OUT_PIN(LED_PORT,LED2_BIT);
92 timer_rx_off=timer_tx_off=5;
96 /***********************************/
101 /***********************************/
106 SET_OUT_PIN(LED_PORT,LED_ERR);
107 CLR_OUT_PIN(LED_PORT,LED_GP);
109 //********************
111 memset( &usb_device, 0, sizeof( usb_device));
113 usb_device.init = usb_lpc_init;
114 usb_debug_set_level(DEBUG_LEVEL_NONE);
115 usb_device.cntep = 3;
118 eps[0].max_packet_size = USB_MAX_PACKET;
119 eps[1].max_packet_size = USB_MAX_PACKET;
122 eps[0].event_mask = 0x04;
123 eps[1].event_mask = 0x08;
124 eps[0].udev = &usb_device;
125 eps[1].udev = &usb_device;
127 // usb_device.vendor_fnc=usb_loader;
129 usb_init(&usb_device);
130 usb_connect(&usb_device);
135 /********************/
137 timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
140 usb_check_events(&usb_device);
141 usb_control_response(&usb_device);
143 if ((usb_device.ep_events & MASK_EP1RX)&&(usb_can_send)) { //EP1RX
147 size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,USB_MAX_PACKET);
148 data=(uint8_t *)ep1_rx_buff;
150 if (((*data)&CAN_OP_MASK)==CAN_OP_READ){ // Get data from CAN device and return to caller
151 can_read((*data) & 0x7F,&val);
153 usb_udev_write_endpoint(&eps[1],(unsigned char *)data,size);
154 timer_rx_off=50; //rosviceni diody pri prijmu
155 CLR_OUT_PIN(LED_PORT,LED2_BIT);
158 if (((*data)&CAN_OP_MASK)==CAN_OP_WRITE){ // Save data to CAN device
159 can_write((*data)&(~CAN_OP_MASK),data+1);
160 timer_tx_off=50; //rozsviceni diod pri vysilani
161 CLR_OUT_PIN(LED_PORT,LED1_BIT);
164 usb_device.ep_events &= ~MASK_EP1RX;
167 if(usb_device.ep_events & MASK_EP1TX){
169 usb_device.ep_events &= ~MASK_EP1TX;
172 #ifdef WATCHDOG_ENABLED
174 #endif /* WATCHDOG_ENABLED */
177 if (lt_10msec_expired(10))
181 SET_OUT_PIN(LED_PORT,LED_GP);
182 SET_OUT_PIN(LED_PORT,LED_ERR);
184 /* unreachable code */
186 vec_jmp(0x0); /* need to call a function from misc to correct linking */