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