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)
44 // setup the parallel port pin
45 IO0CLR = P0IO_ZERO_BITS; // clear the ZEROs output
46 IO0SET = P0IO_ONE_BITS; // set the ONEs output
47 IO0DIR = P0IO_OUTPUT_BITS; // set the output bit direction
49 #ifdef P1IO_OUTPUT_BITS
50 IO1CLR = P1IO_ZERO_BITS; // clear the ZEROs output
51 IO1SET = P1IO_ONE_BITS; // set the ONEs output
52 IO1DIR = P1IO_OUTPUT_BITS; // set the output bit direction
55 PINSEL1 = (PINSEL1 & 0x3FFFFFFF);
57 IO0CLR = LED1_BIT; // Indicate functional state on the LED1
66 T0MR0+=PCLK/SYS_TIMER_HZ;
67 T0IR=TIR_MR0I; // Clear match0 interrupt
68 #ifdef CONFIG_OC_UL_DRV_SYSLESS
71 #ifdef CONFIG_OC_PBM_DRV
74 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
75 if (i2c_drv.flags&I2C_DRV_MS_INPR) {
76 if (i2c_drv.flags&I2C_DRV_NA) {
78 if (i2c_drv_na_timer>I2C_DRV_NA_MSTIMEOUT) {
79 if (i2c_drv.stroke_fnc)
80 i2c_drv.stroke_fnc(&i2c_drv);
86 i2c_drv.flags|=I2C_DRV_NA;
90 } while (((int32_t)(T0MR0-T0TC))<0);
98 HAL_INTERRUPT_ATTACH(HAL_INTERRUPT_TIMER0,timer0_isr,0);
99 HAL_INTERRUPT_UNMASK(HAL_INTERRUPT_TIMER0);
104 T0MR0=PCLK/SYS_TIMER_HZ; /* ms tics */
107 T0TCR = TCR_ENABLE; //Run timer 0
110 #ifdef CONFIG_STDIO_COM_PORT
112 int uartcon_write(int file, const char * ptr, int len)
116 for(cnt=0;cnt<len;cnt++,ptr++){
125 void init_system_stub(void) {
126 system_stub_ops.write=uartcon_write;
129 #endif /* CONFIG_STDIO_COM_PORT */
131 #ifdef CONFIG_OC_UL_DRV_SYSLESS
133 extern unsigned uld_debug_flg; /* Left application set defaults */
135 #ifndef CONFIG_KEYVAL
136 unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
137 #endif /* CONFIG_KEYVAL */
139 #define UL_MTYPE_START32BIT 0x100
141 static inline int ul_iac_mem_head_rd(uint8_t *buf, int len,
142 uint32_t* pmtype, uint32_t* pstart, uint32_t* plen)
145 if (len<6) return -1;
146 mtype=*(buf++); /* memory type */
148 val=*(buf++); /* start address */
150 if(mtype&UL_MTYPE_START32BIT){
151 if (len<8) return -1;
152 val+=(uint32_t)*(buf++)<<16;
153 val+=(uint32_t)*(buf++)<<24;
156 val=*(buf++); /* length */
158 if(mtype&UL_MTYPE_START32BIT){
160 val+=(uint32_t)*(buf++)<<16;
161 val+=(uint32_t)*(buf++)<<24;
165 mtype&=~UL_MTYPE_START32BIT; /* 32-bit start address */
170 int ul_iac_call_rdm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
172 uint32_t mtype,start,len;
176 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
177 return UL_IAC_RC_PROC;
181 data->buff=(char*)start;
182 return UL_IAC_RC_FREEMSG;
184 return UL_IAC_RC_PROC;
187 int ul_iac_call_erm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
189 uint32_t mtype,start,len;
193 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
194 return UL_IAC_RC_PROC;
198 lpcisp_erase((void*)start,len);
200 return UL_IAC_RC_FREEMSG;
202 #endif /* CONFIG_KEYVAL */
203 return UL_IAC_RC_PROC;
206 int ul_iac_call_wrm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
208 uint32_t mtype,start,len;
212 if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
213 return UL_IAC_RC_PROC;
216 memcpy((void*)start,data->buff,data->len);
217 return UL_IAC_RC_FREEMSG;
221 lpcisp_write((char*)start, data->buff, ISP_RAM2FLASH_BLOCK_SIZE);
222 return UL_IAC_RC_FREEMSG;
224 #endif /* CONFIG_KEYVAL */
225 return UL_IAC_RC_PROC;
229 int ul_iac_call_deb(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
231 uint32_t debcmd,mtype,start;
232 uint8_t *p=(uint8_t*)ibuff;
234 if (msginfo->len<1) return UL_IAC_RC_PROC;
237 case 0x10: /* goto */
239 if (msginfo->len<5) return UL_IAC_RC_PROC;
244 if(mtype&UL_MTYPE_START32BIT){
245 mtype&=~UL_MTYPE_START32BIT;
246 if (msginfo->len<7) return UL_IAC_RC_PROC;
247 start+=(uint32_t)*(p++)<<16;
248 start+=(uint32_t)*(p++)<<24;
251 ((void (*)())start)();
254 return UL_IAC_RC_PROC;
257 int ul_iac_call_res(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
259 uint32_t rescmd,pass;
260 uint8_t *p=(uint8_t*)ibuff;
262 if (msginfo->len<1) return UL_IAC_RC_PROC;
265 case ULRES_CPU: /* CPU */
267 if (msginfo->len<3) return UL_IAC_RC_PROC;
272 lpc_watchdog_init(1,10); /* 10ms */
278 return UL_IAC_RC_PROC;
285 /* set rs485 mode for UART1 */
286 PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000; /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
288 udrv=ul_drv_new(UL_DRV_SYSLESS_PORT, /* port */
289 UL_DRV_SYSLESS_IRQ, /* irq */
290 UL_DRV_SYSLESS_BAUD, /* baud */
291 UL_DRV_SYSLESS_MY_ADR_DEFAULT, /* my adr */
292 #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
293 #if defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG) && defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
294 "16450-dirneg-msrswap", /* chip name */
295 #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP)
296 "16450-msrswap", /* chip name */
297 #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG)
298 "16450-dirneg", /* chip name */
300 "16450", /* chip name */
302 #else /*CONFIG_OC_UL_DRV_U450_VARPINS*/
303 "16450", /* chip name */
304 #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
305 0); /* baud base - default */
310 ul_drv_add_iac(udrv,UL_CMD_RDM,UL_IAC_OP_SND,ul_iac_call_rdm,NULL,0,0,NULL,0);
311 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);
312 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);
313 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);
314 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);
316 return ul_drv_add_dev(udrv);
318 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
320 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
327 #if (I2C_DRV_SYSLESS_IRQ==9)
328 PINSEL0 = (PINSEL0 & ~0x000000F0) | 0x00000050; /* I2C0 - SCL0, SDA0 */
329 #elif (I2C_DRV_SYSLESS_IRQ==19)
330 PINSEL0 = (PINSEL0 & ~0x30C00000) | 0x30C00000; /* I2C1 - SCL1, SDA1 */
332 #error "wrong I2C pin maping!"
335 if (i2c_drv_init(&i2c_drv,
336 I2C_DRV_SYSLESS_PORT,
338 I2C_DRV_SYSLESS_BITRATE,
339 I2C_DRV_SYSLESS_SLADR)<0) return -1;
344 #endif /*CONFIG_OC_I2C_DRV_SYSLESS*/
346 #ifdef CONFIG_OC_PBM_DRV
352 /* set rs485 mode for UART1 */
353 /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
354 PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000;
356 PBMCHIP_INFO(PBMCHIP_DRV_DESCRIPTION ", "
357 PBMCHIP_DRV_VERSION ", "
358 PBMCHIP_DRV_COPYRIGHT "\n");
360 pbm_dev = pbm_alloc_dev(PBM_UART);
362 PBM_PRINT("unable to allocate device\n");
364 PBM_LOCK_INIT(&pbm_dev->lock);
365 PBM_LOCK_INIT(&pbm_dev->irq_lock);
367 pbm_dev->node_res = &pbm_8250_res;
368 pbm_8250_res.ioport = PBM_8250_PORT;
369 pbm_8250_res.irq = PBM_8250_IRQ;
370 PBMCHIP_INFO("port=0x%04x irq=%d\n",
371 pbm_8250_res.ioport, pbm_8250_res.irq);
373 /* disable all interrupts */
374 pbm_outb(pbm_dev, UART_IER, 0x00);
376 /* get default parameters*/
377 pbm_8250_get_params(pbm_dev, 0);
378 /* chip operations and registering to pbmcore */
379 pbm_dev->chops = chops;
380 rv = pbm_register_chip(pbm_dev);
382 PBM_PRINT("unable to register chip\n");
384 rv = request_irq(pbm_8250_res.irq, pbm_8250_intr, 0, "pbm_8250", pbm_dev);
386 pbm_8250_int_off_all(pbm_dev);
387 pbm_8250_int_on_all(pbm_dev);
389 /* a hack to generate THRE interrupt on LPC2148 */
390 pbm_outb(pbm_dev, UART_TX, 0x00);
393 #endif /* CONFIG_OC_PBM_DRV */
397 // initialize the system
400 #ifdef WATCHDOG_ENABLED
401 lpc_watchdog_init(1,WATCHDOG_TIMEOUT_MS);
403 #endif /* WATCHDOG_ENABLED */
405 // initialize the system timer
408 #ifdef CONFIG_STDIO_COM_PORT
409 uart0Init( B57600 , UART_8N1, UART_FIFO_8);
411 #endif /* CONFIG_STDIO_COM_PORT */
413 #ifdef CONFIG_OC_UL_DRV_SYSLESS
414 // uld_debug_flg=0x3ff;
416 #endif /* CONFIG_OC_UL_DRV_SYSLESS */
418 #ifdef CONFIG_OC_I2C_DRV_SYSLESS
420 #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
422 #ifdef CONFIG_OC_PBM_DRV
424 #endif /* CONFIG_OC_PBM_DRV */