DMPAPI(bool) i2c_Reset(int dev) { unsigned long nowtime; io_outpb(I2C_EXCTRL_REG(dev), io_inpb(I2C_EXCTRL_REG(dev)) | 0x80); nowtime = timer_NowTime(); while (((io_inpb(I2C_EXCTRL_REG(dev)) & 0x80) != 0) && ((timer_NowTime() - nowtime) < I2C_TIMEOUT)); if ((io_inpb(I2C_EXCTRL_REG(dev)) & 0x80) != 0) { err_print("fail to reset I2C module %d", dev); return false; } //Remarks: due to Vortex86DX's poor I2C design, RESET bit may become 0 when dummy clocks are still being output timer_Delay(20L); //lazy trick to tackle the above issue return true; }
void delay(unsigned long ms) { timer_Delay(ms); }