LEAF(i2cread) addu a0,a0,1 /* set device address */ //li v0, 0xbfd00000 + SMBUS_HOST_ADDRESS li v0, BONITO_PCIIO_BASE_VA + SMBUS_HOST_ADDRESS sb a0, 0(v0); /* store register offset */ //li v0, 0xbfd00000 + SMBUS_HOST_COMMAND li v0, BONITO_PCIIO_BASE_VA + SMBUS_HOST_COMMAND sb a1, 0(v0); /* read byte data protocol */ li v0, 0x08 //li v1, 0xbfd00000 + SMBUS_HOST_CONTROL li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_CONTROL sb v0, 0(v1); /* make sure SMB host ready to start, important!--zfx */ //li v1, 0xbfd00000 + SMBUS_HOST_STATUS li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_STATUS lbu v0, 0(v1) andi v0,v0, 0x1f beqz v0,1f nop sb v0, 0(v1) lbu v0, 0(v1) #flush the write 1: /* start */ //li v1, 0xbfd00000 + SMBUS_HOST_CONTROL li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_CONTROL lbu v0, 0(v1) ori v0, v0, 0x40 sb v0, 0(v1); /* wait */ //li v1, 0xbfd00000 + SMBUS_HOST_STATUS li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_STATUS 1: #if 0 /* delay */ li a0, 0x1000 2: bnez a0,2b addiu a0, -1 #endif lbu v0, 0(v1) andi v0, SMBUS_HOST_STATUS_BUSY bnez v0, 1b #IDEL ? nop //li v1, 0xbfd00000 + SMBUS_HOST_STATUS li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_STATUS lbu v0, 0(v1) andi v0,v0, 0x1f beqz v0,1f nop sb v0, 0(v1) #reset lbu v0, 0(v1) #flush the write 1: //li v1, 0xbfd00000 + SMBUS_HOST_DATA0 li v1, BONITO_PCIIO_BASE_VA + SMBUS_HOST_DATA0 lbu v0, 0(v1) jr ra nop END(i2cread)