]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/embedded/app/ulboot/ulboot.c
Initializing repo
[can-usb1.git] / ulan / embedded / app / ulboot / ulboot.c
1 #include <system_def.h>
2 #include <keyval_id.h>
3 #include <ul_lib/ulan.h>
4 #include <uldy_base.h>
5 #include <lt_timer.h>
6 #include <local_config.h>
7 #ifndef SDCC
8   #include <mem_loc.h>
9   #include <hal_machperiph.h>
10   #include <keyval_loc.h>
11   #include <lpciap_kvpb.h>
12   #include <ul_idstr.h>
13 #else
14   #include <vect.h>
15   void timer(void);
16 #endif /* SDCC */
17
18 LT_TIMER_DEC(lt_100msec)
19 LT_TIMER_IMP(lt_100msec)
20 LT_TIMER_DEC(lt_2sec)
21 LT_TIMER_IMP(lt_2sec)
22
23 /***********************************/
24 // global variables
25 KVPB_BLOCK_LOC kvpb_block_t kvpb_block_global;
26 UL_DYAC_VAR_LOC ul_dyac_t ul_dyac_global;
27
28 #ifndef UL_WITHOUT_HANDLE
29 kvpb_block_t *kvpb_block=&kvpb_block_global;
30 ul_dyac_t *ul_dyac=&ul_dyac_global;
31 ul_fd_t ul_fd;
32 ul_msginfo msginfo;
33 #endif /* UL_WITHOUT_HANDLE */
34
35 /* ulan variables */
36 unsigned int XDATA uaddr;
37 unsigned long XDATA usn;
38 //uint16_t ustatus;
39
40 typedef void (*FNC)(); //function ptr
41
42 /***********************************/
43 int sys_err() 
44 {
45   unsigned char i=0;
46
47   while(1) {
48    #ifdef SDCC
49     /* serve interrupt rutine for timer */
50     timer();      
51    #endif
52
53     if (lt_100msec_expired(100)) {
54       i++;
55       if (i&1) {
56         SET_OUT_PIN(LED_PORT,LED_ERR);
57       } else {
58         CLR_OUT_PIN(LED_PORT,LED_ERR);
59       }
60      #ifdef WATCHDOG_ENABLED
61       watchdog_feed();
62      #endif /* WATCHDOG_ENABLED */
63     }
64   }
65 }
66
67 /***********************************/
68 char ul_save_sn(uint32_t usn)
69 {
70   kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
71   return 0;
72 }
73
74 /***********************************/
75 char ul_save_adr(uint8_t uaddr_new)
76 {
77   uaddr=uaddr_new;
78   kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
79   return 0;
80 }
81
82 /***********************************/
83 int main(void) 
84 {
85
86   /***********************************/
87   // timers 
88   lt_100msec_init();
89   lt_2sec_init();
90
91 //  ustatus=0;
92   CLR_OUT_PIN(LED_PORT,LED_GP);
93
94   /***********************************/
95   // kvpb init
96   kvpb_block->base=(CODE uint8_t *)KEYVAL_START;
97   kvpb_block->size=KEYVAL_PAGE_LEN;
98   kvpb_block->flags=KVPB_DEFAULT_FLAGS;
99  #ifndef KVPB_MINIMALIZED
100   kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
101   kvpb_block->erase=kvpb_erase;
102   kvpb_block->copy=kvpb_copy;
103   kvpb_block->flush=kvpb_flush;
104  #endif
105   if (kvpb_check(kvpb_block,1)<0) sys_err();
106
107   /***********************************/
108   // set configuration for device
109   uaddr=62;
110   usn=0;
111   kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
112   kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
113
114   /***********************************/
115   // ulan init
116  #ifdef UL_WITHOUT_HANDLE
117   ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
118   ul_drv_init();
119  #endif
120   ul_fd=ul_open(NULL,NULL);
121   if (ul_fd==UL_FD_INVALID) sys_err();    
122   ul_setidstr(ul_fd,ul_idstr);
123   ul_setmyadr(ul_fd,uaddr);
124   msginfo.sadr=0;
125   msginfo.dadr=0;
126   msginfo.cmd=0;
127   ul_addfilt(ul_fd,&msginfo);
128   ul_stroke(ul_fd);
129   
130   /***********************************/
131   // uLan dyac init
132   uldy_init(ULDY_ARG_ul_dyac ULDY_ARG_ul_fd ul_save_sn,ul_save_adr,(char*)ul_idstr,usn);
133
134   /********************/
135   // start
136   while (1) {
137     if(!(ul_dyac->boot_activated)) {
138       if(*(int CODE*)MEM_APP_START != (int) ~0)
139         if(lt_2sec_expired(2000))
140           break;
141     }
142
143    #ifdef SDCC
144     /* serve interrupt rutine for uLan */
145     ul_int();
146
147     /* serve interrupt rutine for timer */
148     timer();      
149    #endif
150
151     /* test for ulan message */
152     if(ul_inepoll(ul_fd)>0){
153       uldy_process_msg(ULDY_ARG_ul_dyac NULL);
154     }
155
156     /* test request for address */
157     if (uldy_rqa(ULDY_ARG1_ul_dyac)) 
158       uldy_addr_rq(ULDY_ARG1_ul_dyac);
159
160     
161    #ifdef WATCHDOG_ENABLED
162     watchdog_feed();
163    #endif /* WATCHDOG_ENABLED */
164
165     /* serve 100ms timer */
166     if (lt_100msec_expired(100)) {
167     
168       /* ulan stroke */
169       ul_stroke(ul_fd);
170     }
171   }
172   SET_OUT_PIN(LED_PORT,LED_GP);
173   ((FNC)MEM_APP_START)();
174   /* unreachable code */
175  #ifdef SDCC
176   vec_jmp(0x0);  /* need to call a function from misc to correct linking */
177  #endif
178   return 0;
179 }