unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) { unsigned long long int _timeout, now_time, width = 0L; if(pin >= PINS || PIN86[pin].gpN == NOUSED) return 0x00; _timeout = ((unsigned long long int)timeout)*vx86_CpuCLK() + timer_GetClocks64(); while(digitalRead(pin) == state) if(timer_GetClocks64() >= _timeout) return 0; while(digitalRead(pin) != state) if(timer_GetClocks64() >= _timeout) return 0; now_time = timer_GetClocks64(); while(digitalRead(pin) == state) if(timer_GetClocks64() >= _timeout) return 0; width = timer_GetClocks64() - now_time; width = (unsigned long long int)(width * (1.0/vx86_CpuCLK())); return ((unsigned long)width); // unit is micro second }
bool init() { int i, crossbarBase, gpioBase; if(io_Init() == false) return false; timer_NowTime(); // initialize timer CLOCKS_PER_MICROSEC = vx86_CpuCLK(); VORTEX86EX_CLOCKS_PER_MS = CLOCKS_PER_MICROSEC*1000UL; // Set IRQ4 as level-trigger io_outpb(0x4D0, io_inpb(0x4D0) | 0x10); //set corssbar Base Address crossbarBase = sb_Read16(SB_CROSSBASE) & 0xfffe; if(crossbarBase == 0 || crossbarBase == 0xfffe) sb_Write16(SB_CROSSBASE, CROSSBARBASE | 0x01); // Force set HIGH speed ISA on SB sb_Write(SB_FCREG, sb_Read(SB_FCREG) | 0x8000C000L); //set SB GPIO Base Address gpioBase = sb_Read16(SB_GPIOBASE) & 0xfffe; if(gpioBase == 0 || gpioBase == 0xfffe) { sb_Write16(SB_GPIOBASE, GPIOCTRLBASE | 0x01); gpioBase = GPIOCTRLBASE; } // Enable GPIO 0 ~ 7 io_outpdw(gpioBase, 0x00ff); // set GPIO Port 0~7 dircetion & data Address for(i=0;i<8;i++) io_outpdw(gpioBase + (i+1)*4,((GPIODIRBASE + i*4)<<16) + GPIODATABASE + i*4); // set ADC Base Address sb_Write(0xbc, sb_Read(0xbc) & (~(1L<<28))); // active adc sb1_Write16(0xde, sb1_Read16(0xde) | 0x02); // not Available for 8051A Access ADC sb1_Write(0xe0, 0x0050fe00L); // baseaddr = 0xfe00, disable irq // set MCM Base Address set_MMIO(); mc_setbaseaddr(); for(i=0; i<4; i++) mc_SetMode(i, MCMODE_PWM_SIFB); if(Global_irq_Init == false) { // set MCM IRQ if(irq_Init() == false) { printf("MCM IRQ init fail\n"); return false; } if(irq_Setting(GetMCIRQ(), IRQ_LEVEL_TRIGGER + IRQ_DISABLE_INTR) == false) { printf("MCM IRQ Setting fail\n"); return false; } Set_MCIRQ(GetMCIRQ()); Global_irq_Init = true; } //CDC USBDEV = CreateUSBDevice(); if(USBDEV == NULL) { printf("init error\n"); return false; } usb_SetUSBPins(USBDEV, 7, 0, 7, 1); usb_SetTimeOut(USBDEV, 0L, 500L); // USB RX timerout is 0ms and TX timeout is 500ms if(usb_Init(USBDEV) == false) { printf("init2 error\n"); return false; } //io_Close(); return true; }
int main() { char bios_version[16]; unsigned long mem_size; printf("86INFO v1.1, author: PING-HUI WEI, E-mail: [email protected], 2016/03/18\n"); printf("CPU:\t\t\t "); switch(vx86_CpuID()) { case CPU_VORTEX86SX: printf("Vortex86SX\n"); break; case CPU_VORTEX86DX_UNKNOWN: printf("Vortex86DX_unknown\n"); break; case CPU_VORTEX86DX_A: printf("Vortex86DX_A\n"); break; case CPU_VORTEX86DX_C: printf("Vortex86DX_C\n"); break; case CPU_VORTEX86DX_D: printf("Vortex86DX_D\n"); break; case CPU_VORTEX86MX: printf("Vortex86MX\n"); break; case CPU_VORTEX86MX_PLUS: printf("Vortex86MX_plus\n"); break; case CPU_VORTEX86DX2: printf("Vortex86DX2\n"); break; case CPU_VORTEX86DX3: printf("Vortex86DX3\n"); break; case CPU_VORTEX86EX: printf("Vortex86EX\n"); break; case CPU_UNSUPPORTED: default: printf("unsupported\n"); } printf("CPU Frequency:\t\t %ldMHz\n", vx86_CpuCLK()); printf("CPU Temperature:\t %f °C\n", cpuTemperature()); printf("Memory Size:\t\t"); if(get_mem_size(&mem_size) == false) printf("get memory size error!\n"); else printf(" %luMB\n", mem_size); printf("Memory Frequency:\t %luMHz\n", vx86_DramCLK()); printf("BIOS Version:\t\t"); if(get_BIOS_version(bios_version) == false) printf("get bios version error!\n"); else printf(" %s\n", bios_version); return EXIT_SUCCESS; }