]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/board/arm/ul_usb1/libs/bspbase/bsp0hwinit.c
468e1720372f0b531294c4a3cb6e7e787094f77a
[lincan.git] / embedded / board / arm / ul_usb1 / libs / bspbase / bsp0hwinit.c
1 #include "local_config.h"
2 #include <system_def.h>
3 #ifdef CONFIG_KEYVAL
4   #include <keyvalpb.h>
5   #include <lpciap.h>
6   #include <lpciap_kvpb.h>
7 #endif /* CONFIG_KEYVAL */
8 #ifdef CONFIG_STDIO_COM_PORT
9   #include <uart.h>
10 #endif
11 #ifdef CONFIG_OC_UL_DRV_SYSLESS
12   #include <ul_lib/ulan.h>
13   #include <string.h>
14   #include <ul_drv_init.h>
15   #include <ul_drv_iac.h>
16   #include <ul_lib/ul_drvdef.h>
17   extern long int uld_jiffies;
18 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
19 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
20   #include <i2c_drv.h>
21 #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
22 #include <hal_machperiph.h>
23 #include <hal_intr.h>
24
25 /* timers */
26 volatile lt_ticks_t sys_timer_ticks;
27
28 static void sysInit(void) 
29 {
30
31   lpc_pll_off();
32   lpc_pll_on();
33
34   // setup & enable the MAM
35   MAMCR = 0;
36   MAMTIM = MAMTIM_CYCLES;
37   MAMCR = MAMCR_FULL;
38
39   // set the peripheral bus speed
40   // value computed from config.h
41   VPBDIV = VPBDIV_VALUE;                // set the peripheral bus clock speed
42
43   // setup the parallel port pin
44   IO0CLR = P0IO_ZERO_BITS;                // clear the ZEROs output
45   IO0SET = P0IO_ONE_BITS;                 // set the ONEs output
46   IO0DIR = P0IO_OUTPUT_BITS;              // set the output bit direction
47
48  #ifdef P1IO_OUTPUT_BITS
49   IO1CLR = P1IO_ZERO_BITS;                // clear the ZEROs output
50   IO1SET = P1IO_ONE_BITS;                 // set the ONEs output
51   IO1DIR = P1IO_OUTPUT_BITS;              // set the output bit direction
52  #endif
53
54   IO0CLR = LED1_BIT;                      // Indicate functional state on the LED1
55 }
56
57 void timer0_isr(void)
58 {   
59   unsigned int ir;
60   ir=T0IR;
61   if (ir&TIR_MR0I) {
62     do {
63       T0MR0+=PCLK/SYS_TIMER_HZ;
64       T0IR=TIR_MR0I;               // Clear match0 interrupt
65      #ifdef CONFIG_OC_UL_DRV_SYSLESS
66       uld_jiffies++;
67      #endif
68       sys_timer_ticks++;
69     } while (((int32_t)(T0MR0-T0TC))<0);
70   }
71 }
72
73 void timerInit(void)
74 {
75   sys_timer_ticks=0;
76
77   HAL_INTERRUPT_ATTACH(HAL_INTERRUPT_TIMER0,timer0_isr,0);
78   HAL_INTERRUPT_UNMASK(HAL_INTERRUPT_TIMER0);
79     
80   T0TC=0;
81   T0MCR=0;
82
83   T0MR0=PCLK/SYS_TIMER_HZ;                            /* ms tics */
84   T0MCR|=TMCR_MR0_I;
85
86   T0TCR = TCR_ENABLE; //Run timer 0
87 }
88
89 #ifdef CONFIG_STDIO_COM_PORT
90
91 int uartcon_write(int file, const char * ptr, int len)
92 {
93   int cnt;
94   unsigned char ch;
95   for(cnt=0;cnt<len;cnt++,ptr++){
96     ch=*ptr;
97     if(ch==0xa)
98       uart0Putch(0xd);
99     uart0Putch(ch);
100   }
101   return cnt;
102 }
103
104 void init_system_stub(void) {
105   system_stub_ops.write=uartcon_write;
106 }
107
108 #endif /* CONFIG_STDIO_COM_PORT */
109
110 #ifdef CONFIG_OC_UL_DRV_SYSLESS
111
112 extern unsigned uld_debug_flg; /* Left application  set defaults */
113
114 #ifndef CONFIG_KEYVAL
115 unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
116 #endif /* CONFIG_KEYVAL */
117
118 #define UL_MTYPE_START32BIT 0x100
119
120 static inline int ul_iac_mem_head_rd(uint8_t *buf, int len,
121                       uint32_t* pmtype, uint32_t* pstart, uint32_t* plen)
122 {
123   uint32_t val, mtype;
124   if (len<6) return -1;
125   mtype=*(buf++);       /* memory type */
126   mtype+=*(buf++)<<8;
127   val=*(buf++);           /* start address */
128   val+=*(buf++)<<8;
129   if(mtype&UL_MTYPE_START32BIT){
130     if (len<8) return -1;
131     val+=(uint32_t)*(buf++)<<16;
132     val+=(uint32_t)*(buf++)<<24;
133   }
134   *pstart=val;
135   val=*(buf++);           /* length */
136   val+=*(buf++)<<8;
137   if(mtype&UL_MTYPE_START32BIT){
138     if (len==10) {
139       val+=(uint32_t)*(buf++)<<16;
140       val+=(uint32_t)*(buf++)<<24;
141     }
142   }
143   *plen=val;
144   mtype&=~UL_MTYPE_START32BIT;       /* 32-bit start address */
145   *pmtype=mtype;
146   return 0;
147 }
148
149 int ul_iac_call_rdm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
150 {
151   uint32_t mtype,start,len;
152
153   data->len=0;
154
155   if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
156     return UL_IAC_RC_PROC;
157
158   if (mtype==0x00) {
159     data->len=len;
160     data->buff=(unsigned char*)start;
161     return UL_IAC_RC_FREEMSG;
162   }
163   return UL_IAC_RC_PROC;
164 }
165
166 int ul_iac_call_erm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
167 {
168   uint32_t mtype,start,len;
169
170   data->len=0;
171
172   if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
173     return UL_IAC_RC_PROC;
174
175  #ifdef CONFIG_KEYVAL
176   if (mtype==0x01) {
177     lpcisp_erase((void*)start,len);
178     data->len=0;
179     return UL_IAC_RC_FREEMSG;
180   }
181  #endif /* CONFIG_KEYVAL */
182   return UL_IAC_RC_PROC;
183 }
184
185 int ul_iac_call_wrm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
186 {
187   uint32_t mtype,start,len;
188
189   data->len=0;
190
191   if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
192     return UL_IAC_RC_PROC;
193
194   if (mtype==0x00) {
195     memcpy((void*)start,data->buff,data->len);
196     return UL_IAC_RC_FREEMSG;
197   }
198  #ifdef CONFIG_KEYVAL
199   if (mtype==0x01) {
200     lpcisp_write((char*)start, data->buff, ISP_RAM2FLASH_BLOCK_SIZE);
201     return UL_IAC_RC_FREEMSG;
202   }
203  #endif /* CONFIG_KEYVAL */
204   return UL_IAC_RC_PROC;
205 }
206
207
208 int ul_iac_call_deb(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
209 {
210   uint32_t debcmd,mtype,start;
211   uint8_t *p=(uint8_t*)ibuff;
212
213   if (msginfo->len<1) return UL_IAC_RC_PROC;
214   debcmd=*(p++);
215   switch (debcmd) {
216     case 0x10: /* goto */
217       data->len=0;
218       if (msginfo->len<5) return UL_IAC_RC_PROC;
219       mtype=*(p++);
220       mtype+=*(p++)<<8;
221       start=*(p++);
222       start+=*(p++)<<8;
223       if(mtype&UL_MTYPE_START32BIT){
224         mtype&=~UL_MTYPE_START32BIT;
225         if (msginfo->len<7) return UL_IAC_RC_PROC;
226         start+=(uint32_t)*(p++)<<16;
227         start+=(uint32_t)*(p++)<<24;
228       }
229       if (mtype==0x00)
230         ((void (*)())start)();
231     default:break;
232   }
233   return UL_IAC_RC_PROC;
234 }
235
236 int ul_iac_call_res(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
237 {
238   uint32_t rescmd,pass;
239   uint8_t *p=(uint8_t*)ibuff;
240
241   if (msginfo->len<1) return UL_IAC_RC_PROC;
242   rescmd=*(p++);
243   switch (rescmd) {
244     case ULRES_CPU: /* CPU */
245       data->len=0;
246       if (msginfo->len<3) return UL_IAC_RC_PROC;
247       pass=*(p++);
248       pass+=*(p++)<<8;
249       if (pass==0xaa55) {
250         MEMMAP=MEMMAP_FLASH;
251         lpc_watchdog_init(1,10); /* 10ms */
252         lpc_watchdog_feed();
253         while(1);
254       }
255     default:break;
256   }
257   return UL_IAC_RC_PROC;
258 }
259
260 int uLanInit()
261 {
262   struct ul_drv *udrv;
263
264   /* set rs485 mode for UART1 */
265   PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000; /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
266
267   udrv=ul_drv_new(UL_DRV_SYSLESS_PORT,      /* port */
268              UL_DRV_SYSLESS_IRQ,            /* irq */
269              UL_DRV_SYSLESS_BAUD,           /* baud */
270              UL_DRV_SYSLESS_MY_ADR_DEFAULT, /* my adr */
271         #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
272           #if defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG) && defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
273              "16450-dirneg-msrswap",        /* chip name */
274           #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
275              "16450-msrswap",               /* chip name */
276           #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG)
277              "16450-dirneg",                /* chip name */
278           #else
279              "16450",                       /* chip name */
280           #endif
281         #else /*CONFIG_OC_UL_DRV_U450_VARPINS*/
282              "16450",                       /* chip name */
283         #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
284              0);                            /* baud base - default */
285
286   if (udrv==NULL)
287     return -1;
288
289   ul_drv_add_iac(udrv,UL_CMD_RDM,UL_IAC_OP_SND,ul_iac_call_rdm,NULL,0,0,NULL);
290   ul_drv_add_iac(udrv,UL_CMD_ERM,UL_IAC_OP_CALLBACK,ul_iac_call_erm,NULL,0,0,NULL);
291   ul_drv_add_iac(udrv,UL_CMD_WRM,UL_IAC_OP_REC,ul_iac_call_wrm,(char*)lpciap_buff,0,0,NULL);
292   ul_drv_add_iac(udrv,UL_CMD_DEB,UL_IAC_OP_CALLBACK,ul_iac_call_deb,NULL,0,0,NULL); 
293   ul_drv_add_iac(udrv,UL_CMD_RES,UL_IAC_OP_CALLBACK,ul_iac_call_res,NULL,0,0,NULL); 
294
295   return ul_drv_add_dev(udrv);
296 }
297 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
298
299 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
300
301 i2c_drv_t i2c_drv;
302
303 int
304 i2cInit(void)
305 {
306
307   /* set io pins */
308   PINSEL0 = (PINSEL0 & ~0x000000F0) | 0x00000050; /* I2C - SCL, SDA */
309
310   if (i2c_drv_init(&i2c_drv, 
311                I2C_DRV_SYSLESS_PORT,
312                I2C_DRV_SYSLESS_IRQ,
313                I2C_DRV_SYSLESS_BITRATE,
314                I2C_DRV_SYSLESS_SLADR)<0) return -1;
315
316   return 1;
317 }
318
319 #endif /*CONFIG_OC_I2C_DRV_SYSLESS*/
320
321 void _setup_board()
322 {
323   // initialize the system
324   sysInit();                                
325
326   #ifdef WATCHDOG_ENABLED
327     lpc_watchdog_init(1,WATCHDOG_TIMEOUT_MS);
328     lpc_watchdog_feed();
329   #endif /* WATCHDOG_ENABLED */
330
331   // initialize the system timer
332   timerInit();
333
334   #ifdef CONFIG_STDIO_COM_PORT
335     uart0Init( B57600 , UART_8N1, UART_FIFO_8); 
336     init_system_stub();
337   #endif /* CONFIG_STDIO_COM_PORT */
338
339   #ifdef CONFIG_OC_UL_DRV_SYSLESS
340 //    uld_debug_flg=0x3ff;
341     uLanInit();
342   #endif /* CONFIG_OC_UL_DRV_SYSLESS */
343   
344   #ifdef CONFIG_OC_I2C_DRV_SYSLESS
345     i2cInit();
346   #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
347 }