int spw_open(int portnumber) { ER er; UW data; int asize; int dd; if(portnumber==1){ dd = tk_opn_dev((UB*)"spwa", TD_UPDATE); }else if(portnumber==2){ dd = tk_opn_dev((UB*)"spwb", TD_UPDATE); }else if(portnumber==3){ dd = tk_opn_dev((UB*)"spwc", TD_UPDATE); }else{ printf("open error : invalid port number\n"); return -1; } er = tk_srea_dev(dd, DN_SIGN, &data, sizeof(data), &asize); spw_set_read_timeout(dd,1000); spw_set_write_timeout(dd,1000); if (er == E_PAR) printf("E_PAR"); else { printf("fpga ver. = 0x%04x\n", (unsigned short)(0x0000ffff & data)); } return dd; }
int spwr_get_linkstatus(int dd,int portnum,unsigned int* status){ ER er; UW data; int asize; if(portnum<1 || 6<portnum){ return E_PAR; } int address; switch(portnum){ case 1: address=DN_SPW1CSR;break; case 2: address=DN_SPW2CSR;break; case 3: address=DN_SPW3CSR;break; case 4: address=DN_SPW4CSR;break; case 5: address=DN_SPW5CSR;break; case 6: address=DN_SPW6CSR;break; default: return E_PAR;break; } er = tk_srea_dev(dd, address, &data, sizeof(data), &asize); if (asize != 4) { tk_cls_dev(dd, 0); return E_IO; } *status=data; return er; }
int spw_connect(int dd) { ER er; UW data, div; int asize; int n; printf("connecting ...\n"); data = ((UW)txclk_div << 8) & 0x00003f00; data |= 0x00000001; er = tk_swri_dev(dd, DN_LINKC, &data, sizeof(data), &asize); for (n = 0; n < 100; n ++) { slp_tsk(50); er = tk_srea_dev(dd, DN_LINKS, &data, sizeof(data), &asize); if (er == E_PAR) printf("spw_connect : E_PAR"); printf("status = 0x%08x\n", data); if ((data & 0x0000001c) == 0x0000001c) { printf("connected.\n"); return 0; } slp_tsk(100); } return 1; }
/** reset port */ int spwr_reset_link(int dd,int portnum){ ER er; UW data; int asize; if(portnum<1 || 6<portnum){ return E_PAR; } int address; switch(portnum){ case 1: address=DN_SPW1CSR;break; case 2: address=DN_SPW2CSR;break; case 3: address=DN_SPW3CSR;break; case 4: address=DN_SPW4CSR;break; case 5: address=DN_SPW5CSR;break; case 6: address=DN_SPW6CSR;break; default: return E_PAR;break; } er = tk_srea_dev(dd, address, &data, sizeof(data), &asize); if (asize != 4) { return E_IO; } data = data & 0x00ffffff; data = data | SPW_LINKRESET; er = tk_swri_dev(dd, address, &data, sizeof(data), &asize); if (asize != 4) { er = E_IO; } return er; }
int spwr_open(int portnum) { ER er; UW data; int asize; int dd; if(portnum==4){ dd = tk_opn_dev((UB*)"spwa", TD_UPDATE); }else if(portnum==5){ dd = tk_opn_dev((UB*)"spwb", TD_UPDATE); }else if(portnum==6){ dd = tk_opn_dev((UB*)"spwc", TD_UPDATE); }else{ printf("open error : invalid port number\n"); return -1; } if (dd < 0) { printf("open error (er=0x%8x)\n", dd); return dd; } /* Enable Timecode output to Port 1,2,3 */ data=0x0000000e; //enable timecode output to port 1,2,3 er = tk_swri_dev(dd, DN_TCODEEN, &data, sizeof(data), &asize); er = tk_srea_dev(dd, DN_SIGN, &data, sizeof(data), &asize); if (er == E_PAR) printf("E_PAR"); else { printf("fpga ver. = 0x%04x\n", (unsigned short)(0x0000ffff & data)); } return dd; }
int spw_get_timecode(int dd,unsigned char* flag_and_timecode){ ER er; UW data; int asize; er = tk_srea_dev(dd, DN_TIMOUT, &data, 4, &asize); *flag_and_timecode=data | 0x000000ff; return er; }
int spwr_get_timecode(int dd,unsigned char* flag_and_timecode){ ER er; unsigned int data; int asize; int dd; er = tk_srea_dev(dd, DN_TCIN, &data, 4, &asize); *flag_and_timecode=(unsigned char)(data & 0x000000ff); return er; }
UW spwr_table_read(int dd,UW index) { ER er; int asize, data0; data0 = index; er = tk_swri_dev(dd, DN_TBLIDX, &data0, sizeof(data0), &asize); if (er != E_OK) return 0xffffffff; er = tk_srea_dev(dd, DN_TBLDAT, &data0, sizeof(data0), &asize); if (er != E_OK) return 0xffffffff; return data0; }
int spwr_set_link3_txspeed(int dd,spwr_txclk_div txclk_div) { ER er; UW data; int asize; er = tk_srea_dev(dd, DN_SPW3CSR, &data, sizeof(data), &asize); if (asize != 4) { return E_IO; } data = data | (((UW)txclk_div << 24) & 0x3f000000); er = tk_swri_dev(dd, DN_SPW3CSR, &data, sizeof(data), &asize); if (asize != 4) { return E_IO; } return er; }
/* initial setting at driver start up time */ LOCAL ER kpStartUp(void) { W w[L_DEVCONF_VAL]; W dd, n; ER er; RawEvt evt; T_CMBF cmbf; T_CFLG cflg; ID datatsk; void* name; union { FlgInStat stat; UW uw; } u; /* extract ID of the mailbox for event notification to KB/PD driver */ dd = er = tk_opn_dev(devkbpd, TD_READ); if (er >= E_OK) { er = tk_srea_dev(dd, DN_KPINPUT, (VB*)&EvtMbx, sizeof(EvtMbx), &n); tk_cls_dev(dd, 0); } if (er < E_OK) goto EEXIT1; /* KBID is extracted from DEVCONF parameter */ KbdId = (GetDevConf("KBTYPE", w) == 1) ? w[0] : KID_IBM_JP; /* input message buffer creation */ SetOBJNAME(cmbf.exinf, "lkbM"); cmbf.mbfatr = TA_TFIFO; cmbf.bufsz = sizeof(InMsg) * MAX_INMSG; cmbf.maxmsz = sizeof(InMsg); if ((er = tk_cre_mbf(&cmbf)) < E_OK) goto EEXIT1; InpMbf = er; /* creating the event flag for command */ SetOBJNAME(cflg.exinf, "lkbC"); cflg.flgatr = TA_WMUL; cflg.iflgptn = 0; if ((er = tk_cre_flg(&cflg)) < E_OK) goto EEXIT2; CmdFlg = (ID)er; /* create and start data processing task */ SetOBJNAME(name, "lkbD"); er = kpCreTask((W)name, kpDataTask); if (er < E_OK) goto EEXIT3; datatsk = (ID)er; /* create and start command processing task */ SetOBJNAME(name, "lkbC"); er = kpCreTask((W)name, kpCmdTask); if (er < E_OK) goto EEXIT4; CmdTsk = (ID)er; /* registering event flag for commands */ u.uw = 0; evt.f.stat = u.stat; evt.f.stat.cmd = INP_FLG; evt.f.stat.kb = 1; evt.f.stat.kbid = KbdId; evt.f.stat.reg = 1; evt.f.flgid = CmdFlg; if ((er = kpSendMsg(&evt)) < E_OK) goto EEXIT5; /* device initialization processing */ er = hwInit(DC_OPEN); if (er < E_OK) goto EEXIT5; return E_OK; EEXIT5: tk_ter_tsk(CmdTsk); tk_del_tsk(CmdTsk); EEXIT4: tk_ter_tsk(datatsk); tk_del_tsk(datatsk); EEXIT3: tk_del_flg(CmdFlg); EEXIT2: tk_del_mbf(InpMbf); EEXIT1: DP(("kpStartUp: err=%#x\n", er)); return er; }
/* Get from / Set to RTC */ LOCAL void rtc_get_set(SYSTIM *stm, BOOL set) { ID dd; W asz; ER er; DATE_TIM dt; struct tm ctm; struct tzinfo tz; /* open RTC (CLOCK) driver */ dd = tk_opn_dev("CLOCK", (set == TRUE) ? TD_WRITE : TD_READ); if (dd < E_OK) { P("Can't open CLOCK device [%#x]\n", dd); goto exit0; } /* Note: The RTC is set to UTC rather than local time. because UTC is not affected by time zone and daylight saving time. */ if (set == TRUE) { /* set date to RTC */ /* convert system time to UTC date/time */ dt_gmtime_ms(stm, &ctm); /* set local date/time to RTC */ dt.d_year = ctm.tm_year; dt.d_month = ctm.tm_mon + 1; dt.d_day = ctm.tm_mday; dt.d_hour = ctm.tm_hour; dt.d_min = ctm.tm_min; dt.d_sec = ctm.tm_sec; dt.d_wday = ctm.tm_wday; er = tk_swri_dev(dd, DN_CKDATETIME, &dt, sizeof(dt), &asz); if (er < E_OK) { P("Can't set CLOCK [%#x]\n", er); goto exit1; } } else { /* get date from RTC */ /* get timezone of "UTC+0" */ memset(&tz, 0, sizeof(tz)); er = dt_tzset(&tz, "UTC+0"); if (er < E_OK ) { P("dt_tzset(UTC+0) ERR [%#x]\n", er); goto exit1; } /* get UTC date/time from RTC */ er = tk_srea_dev(dd, DN_CKDATETIME, &dt, sizeof(dt), &asz); if (er < E_OK) { P("Can't get CLOCK [%#x]\n", er); goto exit1; } /* convert to system time */ ctm.tm_year = dt.d_year; ctm.tm_mon = dt.d_month - 1; ctm.tm_mday = dt.d_day; ctm.tm_hour = dt.d_hour; ctm.tm_min = dt.d_min; ctm.tm_sec = dt.d_sec; ctm.tm_wday = dt.d_wday; ctm.tm_usec = 0; ctm.tm_wday = -1; ctm.tm_isdst = 0; ctm.tm_yday = 0; dt_mktime_ms(&ctm, &tz, stm); } exit1: tk_cls_dev(dd, 0); exit0: return; }