📄 tgt_machdep.c
字号:
/* Pending */#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)static void init_it8172_rtc(void){ int year, month, date, hour, min, sec; CMOS_WRITE(0x20, RTC_REG_A);/* Normal operation */ CMOS_WRITE(RTCSB_24HR | RTC_DM_BINARY | RTC_SET, RTC_REG_B); CMOS_WRITE(0, RTC_REG_C); CMOS_WRITE(0, RTC_REG_D); year = CMOS_READ(RTC_YEAR); month = CMOS_READ(RTC_MONTH); date = CMOS_READ(RTC_DAY_OF_MONTH); hour = CMOS_READ(RTC_HOURS); min = CMOS_READ(RTC_MINUTES); sec = CMOS_READ(RTC_SECONDS); if( (year > 99) || (month < 1 || month > 12) || (date < 1 || date > 31) || (hour > 23) || (min > 59) || (sec > 59) ){ /* printf("RTC time invalid, reset to epoch.\n");*/ CMOS_WRITE(3, RTC_YEAR); CMOS_WRITE(1, RTC_MONTH); CMOS_WRITE(1, RTC_DAY_OF_MONTH); CMOS_WRITE(0, RTC_HOURS); CMOS_WRITE(0, RTC_MINUTES); CMOS_WRITE(0, RTC_SECONDS); } CMOS_WRITE(RTCSB_24HR | RTC_DM_BINARY, RTC_REG_B);}/* Pending */static unsigned int cal_r4koff(void){ unsigned long count; CMOS_WRITE(0x20, RTC_REG_A);/* Normal operation */ /* Start counter exactly on falling edge of update flag */ while (CMOS_READ(RTC_REG_A) & RTC_UIP); while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); /* Start r4k counter. */ CPU_SetCOUNT(0); /* Read counter exactly on falling edge of update flag */ while (CMOS_READ(RTC_REG_A) & RTC_UIP); while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); count = CPU_GetCOUNT(); return (count / 100);}/* Pending */static void_probe_frequencies(){ unsigned long r4k_offset; unsigned long est_freq; clk_invalid = 1; init_it8172_rtc(); r4k_offset = cal_r4koff(); est_freq = 2*r4k_offset*100; est_freq += 5000; /* round */ est_freq -= est_freq%10000; md_pipefreq = est_freq*3/2; md_cpufreq = est_freq; printf("CPU frequency %d.%02d MHz\n", est_freq/1000000, (est_freq%1000000)*100/1000000);}/* * Returns the CPU pipelie clock frequency */inttgt_pipefreq(){ if(md_pipefreq == 0) { _probe_frequencies(); } return(md_pipefreq);}/* * Returns the external clock frequency, usually the bus clock */inttgt_cpufreq(){ if(md_cpufreq == 0) { _probe_frequencies(); } return(md_cpufreq);}static inline time_t_mktime (unsigned int year, unsigned int mon, unsigned int day, unsigned int hour, unsigned int min, unsigned int sec){ if (0 >= (int) (mon -= 2)) { /* 1..12 -> 11,12,1..10 */ mon += 12; /* Puts Feb last since it has leap day */ year -= 1; } return ((((unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) + year*365 - 719499)*24 + hour /* now have hours */ )*60 + min /* now have minutes */ )*60 + sec; /* finally seconds */}time_ttgt_gettime(){ unsigned int year, mon, day, hour, min, sec; unsigned char save_control; CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL); save_control = CMOS_READ(RTC_CONTROL); /* Freeze it. */ CMOS_WRITE(save_control | RTC_SET, RTC_CONTROL); /* Read regs. */ sec = CMOS_READ(RTC_SECONDS); min = CMOS_READ(RTC_MINUTES); hour = CMOS_READ(RTC_HOURS); if (!(save_control & RTC_24H)) { if ((hour & 0xf) == 0xc) hour &= 0x80; if (hour & 0x80) hour = (hour & 0xf) + 12; } day = CMOS_READ(RTC_DAY_OF_MONTH); mon = CMOS_READ(RTC_MONTH); year = CMOS_READ(RTC_YEAR); /* Unfreeze clock. */ CMOS_WRITE(save_control, RTC_CONTROL); if ((year += 1900) < 1970) year += 100; return _mktime(year, mon, day, hour, min, sec); }/* * Set the current time if a TOD clock is present */voidtgt_settime(time_t t){#if 0 struct tm *tm; int ctrlbsave; if(!clk_invalid) { tm = gmtime(&t); /* Enable register writing */ ctrlbsave = inb(RTC_BASE + DS_REG_CTLB); outb(RTC_BASE + DS_REG_CTLB, ctrlbsave & ~DS_CTLB_TE); outb(RTC_BASE + DS_REG_CENT, TOBCD(tm->tm_year / 100 + 19)); outb(RTC_BASE + DS_REG_YEAR, TOBCD(tm->tm_year % 100)); outb(RTC_BASE + DS_REG_MONTH,TOBCD(tm->tm_mon + 1)); outb(RTC_BASE + DS_REG_DATE, TOBCD(tm->tm_mday)); outb(RTC_BASE + DS_REG_WDAY, TOBCD(tm->tm_wday)); outb(RTC_BASE + DS_REG_HOUR, TOBCD(tm->tm_hour)); outb(RTC_BASE + DS_REG_MIN, TOBCD(tm->tm_min)); outb(RTC_BASE + DS_REG_SEC, TOBCD(tm->tm_sec)); /* Transfer new time to counters */ outb(RTC_BASE + DS_REG_CTLB, ctrlbsave | DS_CTLB_TE); }#endif}/* * Print out any target specific memory information */voidtgt_memprint(){ printf("Primary Instruction cache size %dkb (%d line, %d way)\n", CpuPrimaryInstCacheSize / 1024, CpuPrimaryInstCacheLSize, CpuNWayCache); printf("Primary Data cache size %dkb (%d line, %d way)\n", CpuPrimaryDataCacheSize / 1024, CpuPrimaryDataCacheLSize, CpuNWayCache); if(CpuSecondaryCacheSize != 0) { printf("Secondary cache size %dkb\n", CpuSecondaryCacheSize / 1024); } if(CpuTertiaryCacheSize != 0) { printf("Tertiary cache size %dkb\n", CpuTertiaryCacheSize / 1024); }}voidtgt_machprint(){ printf("Copyright 2004-2005, Opsycon AB, Sweden.\n"); printf("Copyright 2005, Liangjin Peng, ICT CAS.\n"); printf("CPU %s @", md_cpuname());} /* * Return a suitable address for the client stack. * Usually top of RAM memory. */register_ttgt_clienttos(){ return((register_t)(int)PHYS_TO_UNCACHED(memorysize & ~7) - 64);}#ifdef HAVE_FLASH/* * Flash programming support code. *//* * Table of flash devices on target. See pflash_tgt.h. */struct fl_map tgt_fl_map_boot8[] = { TARGET_FLASH_DEVICES_8}; struct fl_map tgt_fl_map_boot32[] = { TARGET_FLASH_DEVICES_32};struct fl_map *tgt_flashmap(){ return tgt_fl_map_boot8;} voidtgt_flashwrite_disable(){}inttgt_flashwrite_enable(){#if 0 if(in8(PLD_BSTAT) & 0x40) { return(1); } else { return(1); /* can't enable. jumper selected! */ }#endif return 1;}voidtgt_flashinfo(void *p, size_t *t){ struct fl_map *map; map = fl_find_map(p); if(map) { *t = map->fl_map_size; } else { *t = 0; }}voidtgt_flashprogram(void *p, int size, void *s, int endian){ printf("Programming flash %x:%x into %x\n", s, size, p); if(fl_erase_device(p, size, TRUE)) { printf("Erase failed!\n"); return; } if(fl_program_device(p, s, size, TRUE)) { printf("Programming failed!\n"); } fl_verify_device(p, s, size, TRUE);}#endif /* PFLASH *//* * Network stuff. */voidtgt_netinit(){}inttgt_ethaddr(char *p){ bcopy((void *)&hwethadr, p, 6); return(0);}voidtgt_netreset(){}/*************************************************************************//* * Target dependent Non volatile memory support code * ================================================= * * * On this target a part of the boot flash memory is used to store * environment. See EV64260.h for mapping details. (offset and size). *//* * Read in environment from NV-ram and set. */voidtgt_mapenv(int (*func) __P((char *, char *))){ char *ep; char env[512]; char *nvram; int i; /* * Check integrity of the NVRAM env area. If not in order * initialize it to empty. */#ifdef NVRAM_IN_FLASH nvram = (char *)(tgt_flashmap())->fl_map_base; if(fl_devident(nvram, NULL) == 0 || cksum(nvram + NVRAM_OFFS, NVRAM_SIZE, 0) != 0) {#else nvram = (char *)malloc(NVRAM_SIZE); nvram_get(nvram); if(cksum(nvram, NVRAM_SIZE, 0) != 0) {#endif printf("NVRAM is invalid!\n"); nvram_invalid = 1; } else { nvram += NVRAM_OFFS; ep = nvram+2;; while(*ep != 0) { char *val = 0, *p = env; i = 0; while((*p++ = *ep++) && (ep <= nvram + NVRAM_SIZE - 1) && i++ < 255) { if((*(p - 1) == '=') && (val == NULL)) { *(p - 1) = '\0'; val = p; } } if(ep <= nvram + NVRAM_SIZE - 1 && i < 255) { (*func)(env, val); } else { nvram_invalid = 2; break; } } }// printf("NVRAM@%x\n",(u_int32_t)nvram); /* * Ethernet address for Galileo ethernet is stored in the last * six bytes of nvram storage. Set environment to it. */ bcopy(&nvram[ETHER_OFFS], hwethadr, 6); sprintf(env, "%02x:%02x:%02x:%02x:%02x:%02x", hwethadr[0], hwethadr[1], hwethadr[2], hwethadr[3], hwethadr[4], hwethadr[5]); tgt_printf("ethaddr=%s\n", env); (*func)("ethaddr", env);#ifndef NVRAM_IN_FLASH free(nvram);#endif#ifdef no_thank_you (*func)("vxWorks", env);#endif sprintf(env, "%d", memorysize / (1024 * 1024)); (*func)("memsize", env); sprintf(env, "%d", md_pipefreq); (*func)("cpuclock", env); sprintf(env, "%d", md_cpufreq); (*func)("busclock", env); (*func)("systype", SYSTYPE); sprintf(env, "%d", CpuTertiaryCacheSize / (1024*1024)); (*func)("l3cache", env); sprintf(env, "%x", IT8172_BASE); (*func)("gtbase", env); }inttgt_unsetenv(char *name){ char *ep, *np, *sp; char *nvram; char *nvrambuf; char *nvramsecbuf; int status; if(nvram_invalid) { return(0); } /* Use first defined flash device (we probably have only one) */#ifdef NVRAM_IN_FLASH nvram = (char *)(tgt_flashmap())->fl_map_base; /* Map. Deal with an entire sector even if we only use part of it */ nvram += NVRAM_OFFS & ~(NVRAM_SECSIZE - 1); nvramsecbuf = (char *)malloc(NVRAM_SECSIZE); if(nvramsecbuf == 0) { printf("Warning! Unable to malloc nvrambuffer!\n"); return(-1); } memcpy(nvramsecbuf, nvram, NVRAM_SECSIZE); nvrambuf = nvramsecbuf + (NVRAM_OFFS & (NVRAM_SECSIZE - 1));#else nvramsecbuf = nvrambuf = nvram = (char *)malloc(512); nvram_get(nvram);#endif ep = nvrambuf + 2; status = 0; while((*ep != '\0') && (ep <= nvrambuf + NVRAM_SIZE)) { np = name; sp = ep; while((*ep == *np) && (*ep != '=') && (*np != '\0')) { ep++; np++; } if((*np == '\0') && ((*ep == '\0') || (*ep == '='))) { while(*ep++); while(ep <= nvrambuf + NVRAM_SIZE) { *sp++ = *ep++; } if(nvrambuf[2] == '\0') { nvrambuf[3] = '\0'; } cksum(nvrambuf, NVRAM_SIZE, 1);#ifdef NVRAM_IN_FLASH if(fl_erase_device(nvram, NVRAM_SECSIZE, FALSE)) { status = -1; break; } if(fl_program_device(nvram, nvramsecbuf, NVRAM_SECSIZE, FALSE)) { status = -1; break; }#else nvram_put(nvram);#endif status = 1; break; } else if(*ep != '\0') { while(*ep++ != '\0'); } } free(nvramsecbuf); return(status);}inttgt_setenv(char *name, char *value){ char *ep; int envlen; char *nvrambuf; char *nvramsecbuf;#ifdef NVRAM_IN_FLASH char *nvram;#endif /* Non permanent vars. */ if(strcmp(EXPERT, name) == 0) { return(1); } /* Calculate total env mem size requiered */ envlen = strlen(name); if(envlen == 0) { return(0); } if(value != NULL) { envlen += strlen(value); } envlen += 2; /* '=' + null byte */ if(envlen > 255) { return(0); /* Are you crazy!? */ } /* Use first defined flash device (we probably have only one) */#ifdef NVRAM_IN_FLASH nvram = (char *)(tgt_flashmap())->fl_map_base; /* Deal with an entire sector even if we only use part of it */ nvram += NVRAM_OFFS & ~(NVRAM_SECSIZE - 1);#endif /* If NVRAM is found to be uninitialized, reinit it. */ if(nvram_invalid) { nvramsecbuf = (char *)malloc(NVRAM_SECSIZE); if(nvramsecbuf == 0) { printf("Warning! Unable to malloc nvrambuffer!\n"); return(-1); }#ifdef NVRAM_IN_FLASH memcpy(nvramsecbuf, nvram, NVRAM_SECSIZE);#endif nvrambuf = nvramsecbuf + (NVRAM_OFFS & (NVRAM_SECSIZE - 1)); memset(nvrambuf, -1, NVRAM_SIZE); nvrambuf[2] = '\0'; nvrambuf[3] = '\0'; cksum((void *)nvrambuf, NVRAM_SIZE, 1); printf("Warning! NVRAM checksum fail. Reset!\n");#ifdef NVRAM_IN_FLASH if(fl_erase_device(nvram, NVRAM_SECSIZE, FALSE)) { printf("Error! Nvram erase failed!\n"); free(nvramsecbuf); return(-1); } if(fl_program_device(nvram, nvramsecbuf, NVRAM_SECSIZE, FALSE)) { printf("Error! Nvram init failed!\n"); free(nvramsecbuf); return(-1); }#else nvram_put(nvramsecbuf);#endif nvram_invalid = 0; free(nvramsecbuf); } /* Remove any current setting */ tgt_unsetenv(name); /* Find end of evironment strings */ nvramsecbuf = (char *)malloc(NVRAM_SECSIZE); if(nvramsecbuf == 0) { printf("Warning! Unable to malloc nvrambuffer!\n"); return(-1); }#ifndef NVRAM_IN_FLASH nvram_get(nvramsecbuf);#else memcpy(nvramsecbuf, nvram, NVRAM_SECSIZE);#endif nvrambuf = nvramsecbuf + (NVRAM_OFFS & (NVRAM_SECSIZE - 1)); /* Etheraddr is special case to save space */ if (strcmp("ethaddr", name) == 0) { char *s = value; int i; int32_t v; for(i = 0; i < 6; i++) { gethex(&v, s, 2); hwethadr[i] = v; s += 3; /* Don't get to fancy here :-) */ } } else { ep = nvrambuf+2; if(*ep != '\0') { do { while(*ep++ != '\0'); } while(*ep++ != '\0'); ep--; } if(((int)ep + NVRAM_SIZE - (int)ep) < (envlen + 1)) { free(nvramsecbuf); return(0); /* Bummer! */ } /* * Special case heaptop must always be first since it * can change how memory allocation works. */ if(strcmp("heaptop", name) == 0) { bcopy(nvrambuf+2, nvrambuf+2 + envlen, ep - nvrambuf+1); ep = nvrambuf+2; while(*name != '\0') { *ep++ = *name++; } if(value != NULL) { *ep++ = '='; while((*ep++ = *value++) != '\0'); } else { *ep++ = '\0'; } } else { while(*name != '\0') { *ep++ = *name++; } if(value != NULL) { *ep++ = '='; while((*ep++ = *value++) != '\0'); } else { *ep++ = '\0'; } *ep++ = '\0'; /* End of env strings */ } } cksum(nvrambuf, NVRAM_SIZE, 1); bcopy(hwethadr, &nvramsecbuf[ETHER_OFFS], 6);#ifdef NVRAM_IN_FLASH if(fl_erase_device(nvram, NVRAM_SECSIZE, FALSE)) { printf("Error! Nvram erase failed!\n"); free(nvramsecbuf); return(0); } if(fl_program_device(nvram, nvramsecbuf, NVRAM_SECSIZE, FALSE)) { printf("Error! Nvram program failed!\n"); free(nvramsecbuf); return(0); }#else nvram_put(nvramsecbuf);#endif free(nvramsecbuf); return(1);}/* * Calculate checksum. If 'set' checksum is calculated and set. */static intcksum(void *p, size_t s, int set){ u_int16_t sum = 0; u_int8_t *sp = p; int sz = s / 2; if(set) { *sp = 0; /* Clear checksum */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -