]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - sw/app/rocon/appl_main.c
RoCoN: new file for application specific commands and sqrtll tests added.
[fpga/lx-cpu1/lx-rocon.git] / sw / app / rocon / appl_main.c
1 #include <system_def.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <hal_machperiph.h>
5
6 #include "appl_defs.h"
7 #include "appl_version.h"
8 #include "appl_fpga.h"
9
10 #ifdef CONFIG_KEYVAL
11 #include <lpciap.h>
12 #include <keyval_id.h>
13 #include <keyval_loc.h>
14 #include <lpciap_kvpb.h>
15 #include <bbconf_info.h>
16
17 #endif /*CONFIG_KEYVAL*/
18
19 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
20 #include <i2c_drv.h>
21 extern i2c_drv_t i2c_drv;
22 #endif
23
24 #ifdef CONFIG_OC_SPI_DRV_SYSLESS
25 #include <spi_drv.h>
26 #endif
27
28 #include <ul_log.h>
29 #include <ul_logreg.h>
30
31 #if defined(APPL_WITH_SUITK) && defined(OMK_FOR_TARGET)
32 #define UL_LOG_TO_STDOUT
33 extern FILE *ul_log_default_file;
34 #endif
35
36 /***********************************/
37 // global variables
38 #ifdef CONFIG_KEYVAL
39 kvpb_block_t kvpb_block_global;
40 kvpb_block_t *kvpb_block = &kvpb_block_global;
41 #endif /*CONFIG_KEYVAL*/
42
43 #ifdef APPL_WITH_ULAN
44 uloi_con_ulan_t uloi_con_ulan_global;
45 uloi_coninfo_t *coninfo = &uloi_con_ulan_global.con;
46
47 #ifdef CONFIG_ULAN_DY
48 UL_DYAC_VAR_LOC ul_dyac_t ul_dyac_global;
49 ul_dyac_t *ul_dyac = &ul_dyac_global;
50 char ul_dyac_gst_reply[4 + 2];
51 #endif /*CONFIG_ULAN_DY*/
52
53 /* ulan variables */
54 ul_fd_t ul_fd, ul_fd1;
55 ul_msginfo umsginfo;
56 uint8_t uaddr = 3;
57
58 #ifdef APPL_WITH_UL_FD4TIMEPROG
59 ul_fd_t ul_fd4timeprog;
60 #endif
61 #endif /*APPL_WITH_ULAN*/
62
63 uint32_t usn; /* uLAN/USB device serial number */
64
65 int usb_enable_flag = 1;
66
67 LT_TIMER_IMP(lt_10msec)
68
69 /***********************************/
70 /* alternative memory reservation for framebuffer and uLan*/
71 #ifndef APPL_WITH_SIM_POSIX
72 void *(* const gr_driver_reserve_ram)(size_t size) =
73   lpc_reserve_usb_ram;
74
75 void *(* const ul_drv_reserve_ram)(size_t size) =
76   lpc_reserve_usb_ram;
77
78 void *(* const timeprog_reserve_ram)(size_t size) =
79   lpc_reserve_usb_ram;
80
81 void *(* const appl_distore_reserve_ram)(size_t size) =
82   lpc_reserve_usb_ram;
83 #endif /*APPL_WITH_SIM_POSIX*/
84
85 /***********************************/
86 int sys_err()
87 {
88   printf("System error at %p\n", __builtin_return_address(0));
89
90   while (1);
91 }
92
93 /***********************************/
94 char ul_save_sn(uint32_t usn)
95 {
96 #ifdef CONFIG_KEYVAL
97   kvpb_set_key(kvpb_block, KVPB_KEYID_ULAN_SN, 4, &usn);
98 #endif /*CONFIG_KEYVAL*/
99   return 0;
100 }
101
102 /***********************************/
103 char ul_save_adr(uint8_t uaddr)
104 {
105 #ifdef CONFIG_KEYVAL
106   kvpb_set_key(kvpb_block, KVPB_KEYID_ULAN_ADDR, 1, &uaddr);
107 #endif /*CONFIG_KEYVAL*/
108   return 0;
109 }
110
111 void save_cfg()
112 {
113   // kvpb_set_key(kvpb_block,KVPB_KEYID_APPL_PARAM,sizeof(appl_param_t),&appl_param);
114 }
115
116 /***********************************/
117 #ifdef CONFIG_OC_SPI_DRV_SYSLESS
118 // received data bits 28..31 KBD variant (1)
119 //               bits  1..25 keys
120 //               bit       0 sticky 1
121 // send data     bits 12..15 LED indicators
122 //               bits  0.. 7 LED indicators
123 //               bit      10 backlight full
124 //               bit      11 backlight medium
125 //               bit       8 beep on (0)
126 //               bit       9 tone freq select
127 // LEDs RUN 0, HOLD 1, PURGE 2, ERROR 3, A 5, B 6, C 7
128 //      D 12, MOTOR 14
129 // Keys '1'-'9' 1-9, '.' 10, '0' 11, ENTER 12, STOP 13, START 14,
130 //      down 15, right 16, up 17, lesft 18, ESC 19, P/M 20,
131 //      D 21, C 22, B 23, A 24, MENU 25
132 int check_spi_kbd_presence()
133 {
134   int res;
135   uint8_t tx_buff[4] = {0x00, 0x00, 0x09, 0x55};
136   uint8_t rx_buff[4];
137   spi_drv_t *spi_drv = spi_find_drv(NULL, 0);
138
139   if (spi_drv == NULL)
140     return -1;
141
142   res = spi_transfer(spi_drv, 4, 4, tx_buff, rx_buff);
143
144   if (res < 0)
145     return -1;
146
147   printf("kbd_presence %02x %02x %02x %02x\n",
148          rx_buff[0], rx_buff[1], rx_buff[2], rx_buff[3]);
149
150   return 0;
151 }
152 #endif /*CONFIG_OC_SPI_DRV_SYSLESS*/
153
154 /***********************************/
155
156 #ifndef APPL_WITH_SIM_POSIX
157 #include <hal_gpio.h>
158 int appl_adc_init()
159 {
160   hal_pin_conf(ADC0_PIN);
161   hal_pin_conf(ADC1_PIN);
162   hal_pin_conf(ADC2_PIN);
163   hal_pin_conf(ADC3_PIN);
164   hal_pin_conf(ADC7_PIN);
165
166   LPC_SC->PCONP |= (1 << 12); /*PCADC*/
167
168   LPC_ADC->CR = (1 << 21); /*PDN*/
169
170   LPC_ADC->CR |= 0x8F; /*SEL selsect channels 0 to 3 and 7*/
171   LPC_ADC->CR |= (9 << 8); /*CLKDIV*/
172   LPC_ADC->CR |= (1 << 16); /*BURST start burst mode*/
173
174   return 0;
175 }
176 #endif /*APPL_WITH_SIM_POSIX*/
177
178 /***********************************/
179
180 #if !defined(APPL_WITH_SIM_POSIX) && \
181     defined(APPL_RUN_AT_FAST_SFI)
182 extern void (*timer0_isr_appl_call)(void);
183
184 #ifdef APPL_RUN_AT_SLOW_SFI
185 long appl_run_fast_sfi_usec = 1000000 / SYS_TIMER_HZ;
186 long appl_run_slow_sfi_usec = APPL_SLOW_SFI_USEC;
187 long appl_run_fast2slow_sfi_accum;
188 #endif /*APPL_RUN_AT_SLOW_SFI*/
189
190 void appl_run_at_fast_sfi(void)
191 {
192   APPL_RUN_AT_FAST_SFI;
193 #if defined(SLOW_SFI_INVOKE_IRQn) && defined(APPL_RUN_AT_SLOW_SFI)
194   {
195     appl_run_fast2slow_sfi_accum += appl_run_fast_sfi_usec;
196
197     if (appl_run_fast2slow_sfi_accum >= appl_run_slow_sfi_usec)
198     {
199       appl_run_fast2slow_sfi_accum -= appl_run_slow_sfi_usec;
200       NVIC->STIR = SLOW_SFI_INVOKE_IRQn;
201     }
202   }
203 #endif /*SLOW_SFI_INVOKE_IRQn*/
204 }
205
206 int appl_run_at_fast_sfi_setup(void)
207 {
208   timer0_isr_appl_call = appl_run_at_fast_sfi;
209   return 0;
210 }
211
212 #else /*APPL_WITH_SIM_POSIX APPL_RUN_AT_FAST_SFI */
213 int appl_run_at_fast_sfi_setup(void)
214 {
215   return 0;
216 }
217 #endif /*APPL_WITH_SIM_POSIX APPL_RUN_AT_FAST_SFI */
218
219 /***********************************/
220
221 #if !defined(APPL_WITH_SIM_POSIX) && \
222     defined(APPL_RUN_AT_SLOW_SFI)
223
224 IRQ_HANDLER_FNC(appl_run_at_slow_sfi_isr)
225 {
226   APPL_RUN_AT_SLOW_SFI;
227 }
228
229 int appl_run_at_slow_sfi_setup(void)
230 {
231   if (request_irq(SLOW_SFI_INVOKE_IRQn, appl_run_at_slow_sfi_isr,
232                   0, "slow_sfi", NULL) < 0)
233     return -1;
234
235   return 0;
236 }
237 #else /* APPL_WITH_SIM_POSIX APPL_RUN_AT_SLOW_SFI */
238
239 int appl_run_at_slow_sfi_setup(void)
240 {
241   return 0;
242 }
243
244 #endif /* APPL_WITH_SIM_POSIX APPL_RUN_AT_SLOW_SFI */
245
246 /***********************************/
247
248 /*
249 UL_LOG_CUST(ulogd_main)
250 */
251
252 #define UL_LOGL_DEF UL_LOGL_MSG
253
254 #include "log_domains.inc"
255
256 static void register_logdomains(void)
257 {
258   ul_logreg_domains_static(ul_log_domains_array, sizeof(ul_log_domains_array) / sizeof(ul_log_domains_array[0]));
259 }
260
261
262 /***********************************/
263 int main()
264 {
265   int i;
266
267 #ifndef APPL_WITH_SIM_POSIX
268
269   /* Setup default interrupt priority into middle of the range */
270   for (i = 0; i < sizeof(NVIC->IP); i++)
271     NVIC->IP[i] = 0x80;
272
273 #ifdef SLOW_SFI_INVOKE_IRQn
274   /* The lowes priority to IRQ invoking slow activities */
275   NVIC->IP[SLOW_SFI_INVOKE_IRQn] = 0xc0;
276 #endif
277
278   /* Higher priority for SPI to gradient valves */
279   NVIC->IP[SSP1_IRQn] = 0x40;
280
281   /* Start of the cam period */
282   NVIC->IP[MCPWM_IRQn] = 0x20;
283
284   /* The most critical - position compare events */
285   NVIC->IP[QEI_IRQn] = 0x00;
286 #endif /*APPL_WITH_SIM_POSIX*/
287
288   /*
289   unsigned long bb_val;
290   bbconf_get_param(BBCONF_PTTAG_BBVER, &bb_val);
291   */
292 #ifdef UL_LOG_TO_STDOUT
293   ul_log_default_file = stdout;
294 #endif
295   register_logdomains();
296
297   printf(APP_VER_ID " initializing\n");
298
299 #ifdef SDRAM_BASE
300
301   if (((void *)main >= (void *)SDRAM_BASE) &&
302       ((void *)main <= (void *)(SDRAM_BASE + SDRAM_SIZE)))
303     printf("running from SDRAM\n");
304
305 #endif /*SDRAM_BASE*/
306
307 #ifdef CONFIG_KEYVAL
308   /***********************************/
309   // kvpb init
310   kvpb_block->base = (uint8_t *)KEYVAL_START;
311   kvpb_block->size = KEYVAL_PAGE_LEN;
312   kvpb_block->flags = KVPB_DESC_DOUBLE | KVPB_DESC_CHUNKWO;
313   kvpb_block->chunk_size = KVPB_CHUNK_SIZE;
314   kvpb_block->erase = lpcisp_kvpb_erase;
315   kvpb_block->copy = lpcisp_kvpb_copy;
316   kvpb_block->flush = lpcisp_kvpb_flush;
317
318   if (kvpb_check(kvpb_block, 1) < 0) sys_err();
319
320   if (kvpb_check(kvpb_block, 1) < 0) sys_err();
321
322   printf("Keyval ready\n");
323
324   /***********************************/
325   // set configuration for device
326 #ifdef APPL_WITH_ULAN
327   kvpb_get_key(kvpb_block, KVPB_KEYID_ULAN_ADDR, 1, &uaddr);
328   kvpb_get_key(kvpb_block, KVPB_KEYID_ULAN_SN, 4, &usn);
329 #endif /*APPL_WITH_ULAN*/
330
331 //  kvpb_get_key(kvpb_block,KVPB_KEYID_APPL_PARAM,sizeof(appl_param_t),&appl_param);
332
333   printf("Keyval variables read\n");
334 #endif /*CONFIG_KEYVAL*/
335
336   /***********************************/
337   // timers
338   lt_10msec_init();
339
340 #ifdef APPL_WITH_ULAN
341   /***********************************/
342   // ulan init
343   // uld_printk_flush();
344   ul_fd = ul_open(NULL, NULL);
345
346   if (ul_fd == UL_FD_INVALID) sys_err();
347
348   ul_fd1 = ul_open(NULL, NULL);
349
350   if (ul_fd1 == UL_FD_INVALID) sys_err();
351
352   ul_setidstr(ul_fd, ul_idstr);
353 #ifdef APPL_WITH_UL_FD4TIMEPROG
354   ul_fd4timeprog = ul_open(NULL, NULL);
355
356   if (ul_fd4timeprog == UL_FD_INVALID) sys_err();
357
358 #endif /*APPL_WITH_UL_FD4TIMEPROG*/
359
360   printf("uLAN open\n");
361
362   ul_setmyadr(ul_fd, uaddr);
363   printf("Setting address %d\n", uaddr);
364
365   //umsginfo.sadr=0;
366   //umsginfo.dadr=0;
367   //umsginfo.cmd=0;
368   //ul_addfilt(ul_fd,&umsginfo);
369
370 #ifndef APPL_WITH_SIM_POSIX
371   ul_stroke(ul_fd);
372 #endif /*APPL_WITH_SIM_POSIX*/
373
374   umsginfo.dadr = 2;
375   umsginfo.cmd = 5;
376   umsginfo.flg = UL_BFL_SND;
377   //ul_newmsg(ul_fd,&umsginfo);
378   //ul_freemsg(ul_fd);
379
380   /***********************************/
381 #ifdef CONFIG_ULAN_DY
382   // uLan dyac init
383   uldy_init(ul_dyac, ul_fd, ul_save_sn, ul_save_adr, (char *)ul_idstr, usn);
384
385   memset(&umsginfo, 0, sizeof(umsginfo));
386   umsginfo.cmd = UL_CMD_NCS;
387   ul_addfilt(ul_fd, &umsginfo);
388
389   ul_opdata_add_iac(ul_fd, UL_CMD_GST, UL_IAC_OP_SND, ul_iac_call_gst, ul_dyac_gst_reply, sizeof(ul_dyac_gst_reply), 0, ul_dyac);
390
391   printf("uLAN dynamic adressing initialized\n");
392 #endif /*CONFIG_ULAN_DY*/
393
394   /***********************************/
395   // uLan object interface init
396   uloi_con_ulan_set_cmd_fd(coninfo, UL_CMD_OISV, ul_fd, ul_fd1);
397
398   memset(&umsginfo, 0, sizeof(umsginfo));
399   umsginfo.cmd = UL_CMD_OISV;
400   ul_addfilt(uloi_con_ulan_rdfd(coninfo), &umsginfo);
401 #endif /*APPL_WITH_ULAN*/
402   /***********************************/
403   // DINFO and other persistent data
404 #ifdef APPL_WITH_DISTORE_EEPROM_USER
405   appl_distore_init();
406 #endif /* APPL_WITH_DISTORE_EEPROM_USER */
407
408   /***********************************/
409   // Micro Windows GUI
410
411 #ifdef CONFIG_OC_MWENGINE
412 #ifdef CONFIG_OC_SPI_DRV_SYSLESS
413   check_spi_kbd_presence();
414 #endif /*CONFIG_OC_SPI_DRV_SYSLESS*/
415   i = gui_init();
416   printf("gui_init ret %d\n", i);
417 #endif /*CONFIG_OC_MWENGINE*/
418
419   /***********************************/
420   // USB initialization
421
422 #ifdef APPL_WITH_USB
423   usb_app_fill_serial_number(usn);
424
425   if (usb_enable_flag)
426   {
427     usb_app_init();
428     printf("usb_app_init\n");
429   }
430
431 #endif /*APPL_WITH_USB*/
432
433   /***********************************/
434   // LCP engine initialization
435
436 #ifndef APPL_WITH_SIM_POSIX
437   appl_adc_init();
438 #ifdef APPL_WITH_AUX_IO
439   aux_io_init();
440 #endif /*APPL_WITH_AUX_IO*/
441 #endif /*APPL_WITH_SIM_POSIX*/
442
443 #ifdef APPL_WITH_DISTORE_KEYVAL_SERVICE
444   setup_distore_restore();
445 #endif /*APPL_WITH_DISTORE_KEYVAL_SERVICE*/
446
447 #ifdef APPL_WITH_DISTORE_EEPROM_USER
448   appl_distore_user_restore();
449 #endif /* APPL_WITH_DISTORE_EEPROM_USER */
450
451 #ifdef APPL_WITH_TIMEPROG_EEPROM_STORE
452   appl_timeprog_eeprom_restore();
453 #endif /*APPL_WITH_TIMEPROG_EEPROM_STORE*/
454
455   /* Init FPGA */
456   fpga_init();
457
458 #ifdef CONFIG_PXMC
459   fpga_reconfiguaration_initiated = pxmc_done;
460   fpga_reconfiguaration_finished = pxmc_initialize;
461   printf("setup pxmc_initialize hook for FPGA\n");
462 #endif /*CONFIG_PXMC*/
463
464   appl_run_at_slow_sfi_setup();
465   appl_run_at_fast_sfi_setup();
466
467 #ifdef APPL_WITH_AUX_IO
468   aux_out_set_init_val();
469 #endif /*APPL_WITH_AUX_IO*/
470
471   /***********************************/
472   // Main application loop
473   mloop();
474
475   /***********************************/
476   // Greace finalization of application to check memory leakage
477 #ifdef APPL_WITH_FINALIZATION_CHECK
478
479 #ifdef CONFIG_OC_MWENGINE
480   gui_done();
481 #endif /*CONFIG_OC_MWENGINE*/
482
483 #endif /*APPL_WITH_FINALIZATION_CHECK*/
484
485   return 0;
486 }
487