1 #include "local_config.h"
2 #include <system_def.h>
6 #include <lpciap_kvpb.h>
7 #endif /* CONFIG_KEYVAL */
8 #ifdef CONFIG_STDIO_COM_PORT
11 #ifdef CONFIG_OC_UL_DRV_SYSLESS
12 #include <ul_lib/ulan.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
21 #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
22 #ifdef CONFIG_OC_PBM_DRV
25 #include <pbm_drv_init.h>
26 #endif /* CONFIG_OC_PBM_DRV */
27 #include <hal_machperiph.h>
31 volatile lt_ticks_t sys_timer_ticks;
33 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
34 #define I2C_DRV_NA_MSTIMEOUT 10
36 int i2c_drv_na_timer=0;
37 #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
39 static void sysInit(void)
45 // setup & enable the MAM
47 MAMTIM = MAMTIM_CYCLES;
50 // set the peripheral bus speed
51 // value computed from config.h
52 VPBDIV = VPBDIV_VALUE; // set the peripheral bus clock speed
54 // setup the parallel port pin
55 IO0CLR = P0IO_ZERO_BITS; // clear the ZEROs output
56 IO0SET = P0IO_ONE_BITS; // set the ONEs output
57 IO0DIR = P0IO_OUTPUT_BITS; // set the output bit direction
59 #ifdef P1IO_OUTPUT_BITS
60 IO1CLR = P1IO_ZERO_BITS; // clear the ZEROs output
61 IO1SET = P1IO_ONE_BITS; // set the ONEs output
62 IO1DIR = P1IO_OUTPUT_BITS; // set the output bit direction
65 PINSEL1 = (PINSEL1 & 0x3FFFFFFF);
67 IO0CLR = LED1_BIT; // Indicate functional state on the LED1
76 T0MR0+=PCLK/SYS_TIMER_HZ;
77 T0IR=TIR_MR0I; // Clear match0 interrupt
78 #ifdef CONFIG_OC_UL_DRV_SYSLESS
81 #ifdef CONFIG_OC_PBM_DRV
84 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
85 if (i2c_drv.flags&I2C_DRV_MS_INPR) {
86 if (i2c_drv.flags&I2C_DRV_NA)
88 if (i2c_drv_na_timer>I2C_DRV_NA_MSTIMEOUT) {
89 if (i2c_drv.stroke_fnc)
90 i2c_drv.stroke_fnc(&i2c_drv);
96 i2c_drv.flags|=I2C_DRV_NA;
100 } while (((int32_t)(T0MR0-T0TC))<0);
108 HAL_INTERRUPT_ATTACH(HAL_INTERRUPT_TIMER0,timer0_isr,0);
109 HAL_INTERRUPT_UNMASK(HAL_INTERRUPT_TIMER0);
114 T0MR0=PCLK/SYS_TIMER_HZ; /* ms tics */
117 T0TCR = TCR_ENABLE; //Run timer 0
120 #ifdef CONFIG_STDIO_COM_PORT
122 int uartcon_write(int file, const char * ptr, int len)
126 for(cnt=0;cnt<len;cnt++,ptr++){
135 void init_system_stub(void) {
136 system_stub_ops.write=uartcon_write;
139 #endif /* CONFIG_STDIO_COM_PORT */
141 #ifdef CONFIG_OC_UL_DRV_SYSLESS
143 extern unsigned uld_debug_flg; /* Left application set defaults */
145 #ifndef CONFIG_KEYVAL
146 unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
147 #endif /* CONFIG_KEYVAL */
149 #define UL_MTYPE_START32BIT 0x100
151 static inline int ul_iac_mem_head_rd(uint8_t *buf, int len,
152 uint32_t* pmtype, uint32_t* pstart, uint32_t* plen)
155 if (len<6) return -1;
156 mtype=*(buf++); /* memory type */
158 val=*(buf++); /* start address */
160 if(mtype&UL_MTYPE_START32BIT){
161 if (len<8) return -1;
162 val+=(uint32_t)*(buf++)<<16;
163 val+=(uint32_t)*(buf++)<<24;
166 val=*(buf++); /* length */
168 if(mtype&UL_MTYPE_START32BIT){
170 val+=(uint32_t)*(buf++)<<16;
171 val+=(uint32_t)*(buf++)<<24;
175 mtype&=~UL_MTYPE_START32BIT; /* 32-bit start address */
180 int ul_iac_call_rdm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
182 uint32_t mtype,start,len;
186 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
187 return UL_IAC_RC_PROC;
191 data->buff=(char*)start;
192 return UL_IAC_RC_FREEMSG;
194 return UL_IAC_RC_PROC;
197 int ul_iac_call_erm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
199 uint32_t mtype,start,len;
203 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
204 return UL_IAC_RC_PROC;
208 lpcisp_erase((void*)start,len);
210 return UL_IAC_RC_FREEMSG;
212 #endif /* CONFIG_KEYVAL */
213 return UL_IAC_RC_PROC;
216 int ul_iac_call_wrm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
218 uint32_t mtype,start,len;
222 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
223 return UL_IAC_RC_PROC;
226 memcpy((void*)start,data->buff,data->len);
227 return UL_IAC_RC_FREEMSG;
231 lpcisp_write((char*)start, data->buff, ISP_RAM2FLASH_BLOCK_SIZE);
232 return UL_IAC_RC_FREEMSG;
234 #endif /* CONFIG_KEYVAL */
235 return UL_IAC_RC_PROC;
239 int ul_iac_call_deb(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
241 uint32_t debcmd,mtype,start;
242 uint8_t *p=(uint8_t*)ibuff;
244 if (msginfo->len<1) return UL_IAC_RC_PROC;
247 case 0x10: /* goto */
249 if (msginfo->len<5) return UL_IAC_RC_PROC;
254 if(mtype&UL_MTYPE_START32BIT){
255 mtype&=~UL_MTYPE_START32BIT;
256 if (msginfo->len<7) return UL_IAC_RC_PROC;
257 start+=(uint32_t)*(p++)<<16;
258 start+=(uint32_t)*(p++)<<24;
261 ((void (*)())start)();
264 return UL_IAC_RC_PROC;
267 int ul_iac_call_res(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
269 uint32_t rescmd,pass;
270 uint8_t *p=(uint8_t*)ibuff;
272 if (msginfo->len<1) return UL_IAC_RC_PROC;
275 case ULRES_CPU: /* CPU */
277 if (msginfo->len<3) return UL_IAC_RC_PROC;
282 lpc_watchdog_init(1,10); /* 10ms */
288 return UL_IAC_RC_PROC;
295 /* set rs485 mode for UART1 */
296 PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000; /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
298 udrv=ul_drv_new(UL_DRV_SYSLESS_PORT, /* port */
299 UL_DRV_SYSLESS_IRQ, /* irq */
300 UL_DRV_SYSLESS_BAUD, /* baud */
301 UL_DRV_SYSLESS_MY_ADR_DEFAULT, /* my adr */
302 #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
303 #if defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG) && defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
304 "16450-dirneg-msrswap", /* chip name */
305 #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
306 "16450-msrswap", /* chip name */
307 #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG)
308 "16450-dirneg", /* chip name */
310 "16450", /* chip name */
312 #else /*CONFIG_OC_UL_DRV_U450_VARPINS*/
313 "16450", /* chip name */
314 #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
315 0); /* baud base - default */
320 ul_drv_add_iac(udrv,UL_CMD_RDM,UL_IAC_OP_SND,ul_iac_call_rdm,NULL,0,0,NULL,0);
321 ul_drv_add_iac(udrv,UL_CMD_ERM,UL_IAC_OP_CALLBACK,ul_iac_call_erm,NULL,0,UL_IAC_BFL_CB_OFFLT,NULL,0);
322 ul_drv_add_iac(udrv,UL_CMD_WRM,UL_IAC_OP_REC,ul_iac_call_wrm,(char*)lpciap_buff,0,UL_IAC_BFL_CB_OFFLT,NULL,0);
323 ul_drv_add_iac(udrv,UL_CMD_DEB,UL_IAC_OP_CALLBACK,ul_iac_call_deb,NULL,0,UL_IAC_BFL_CB_OFFLT,NULL,0);
324 ul_drv_add_iac(udrv,UL_CMD_RES,UL_IAC_OP_CALLBACK,ul_iac_call_res,NULL,0,UL_IAC_BFL_CB_OFFLT,NULL,0);
326 return ul_drv_add_dev(udrv);
328 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
330 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
337 #if (I2C_DRV_SYSLESS_IRQ==9)
338 PINSEL0 = (PINSEL0 & ~0x000000F0) | 0x00000050; /* I2C0 - SCL0, SDA0 */
339 #elif (I2C_DRV_SYSLESS_IRQ==19)
340 PINSEL0 = (PINSEL0 & ~0x30C00000) | 0x30C00000; /* I2C1 - SCL1, SDA1 */
342 #error "wrong I2C pin maping!"
345 if (i2c_drv_init(&i2c_drv,
346 I2C_DRV_SYSLESS_PORT,
348 I2C_DRV_SYSLESS_BITRATE,
349 I2C_DRV_SYSLESS_SLADR)<0) return -1;
354 #endif /*CONFIG_OC_I2C_DRV_SYSLESS*/
356 #ifdef CONFIG_OC_PBM_DRV
362 /* set rs485 mode for UART1 */
363 /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
364 PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000;
366 PBMCHIP_INFO(PBMCHIP_DRV_DESCRIPTION ", "
367 PBMCHIP_DRV_VERSION ", "
368 PBMCHIP_DRV_COPYRIGHT "\n");
370 pbm_dev = pbm_alloc_dev(PBM_UART);
372 PBM_PRINT("unable to allocate device\n");
374 PBM_LOCK_INIT(&pbm_dev->lock);
375 PBM_LOCK_INIT(&pbm_dev->irq_lock);
377 pbm_dev->node_res = &pbm_8250_res;
378 pbm_8250_res.ioport = PBM_8250_PORT;
379 pbm_8250_res.irq = PBM_8250_IRQ;
380 PBMCHIP_INFO("port=0x%04x irq=%d\n",
381 pbm_8250_res.ioport, pbm_8250_res.irq);
383 /* disable all interrupts */
384 pbm_outb(pbm_dev, UART_IER, 0x00);
386 /* get default parameters*/
387 pbm_8250_get_params(pbm_dev, 0);
388 /* chip operations and registering to pbmcore */
389 pbm_dev->chops = chops;
390 rv = pbm_register_chip(pbm_dev);
392 PBM_PRINT("unable to register chip\n");
394 rv = request_irq(pbm_8250_res.irq, pbm_8250_intr, 0, "pbm_8250", pbm_dev);
396 pbm_8250_int_off_all(pbm_dev);
397 pbm_8250_int_on_all(pbm_dev);
399 /* a hack to generate THRE interrupt on LPC2148 */
400 pbm_outb(pbm_dev, UART_TX, 0x00);
403 #endif /* CONFIG_OC_PBM_DRV */
407 // initialize the system
410 #ifdef WATCHDOG_ENABLED
411 lpc_watchdog_init(1,WATCHDOG_TIMEOUT_MS);
413 #endif /* WATCHDOG_ENABLED */
415 // initialize the system timer
418 #ifdef CONFIG_STDIO_COM_PORT
419 uart0Init( B57600 , UART_8N1, UART_FIFO_8);
421 #endif /* CONFIG_STDIO_COM_PORT */
423 #ifdef CONFIG_OC_UL_DRV_SYSLESS
424 // uld_debug_flg=0x3ff;
426 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
428 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
430 #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
432 #ifdef CONFIG_OC_PBM_DRV
434 #endif /* CONFIG_OC_PBM_DRV */