static void debug_i2c_sensor() { // Use port 2 for debug //float_inport_2(); #if 1 IicPortEnable(1); #else devcon.Connection[1] = CONN_NXT_IIC; devcon.Mode[1] = 255; Device1Ioctl(NULL, NULL, IIC_SET_CONN, (unsigned long)&devcon); while(((volatile IICPORT*)(IicPort+1))->Initialised == 0); #endif #if 0 syslog(LOG_NOTICE, "IIC_SET_CONN"); devcon.Mode[1] = 1; Device1Ioctl(NULL, NULL, IIC_SET_CONN, (unsigned long)&devcon); #endif // I2C while (0) { int Port = 1; UBYTE TmpBuffer[IIC_DATA_LENGTH]; IicPort[Port].OutBuffer[0] = IicPort[Port].Addr; IicPort[Port].OutBuffer[1] = 0x42; //0x08; IicPort[Port].OutBuffer[2] = 0x00; IicPort[Port].OutBuffer[3] = 0x00; IicPort[Port].OutLength = 2; IicPort[Port].InLength = 8; IicPortSend(Port); tslp_tsk(1000); IicPortReceive(Port, TmpBuffer); syslog(LOG_EMERG, "TmpBuffer %d %d %d %d %d", TmpBuffer[0], TmpBuffer[1], TmpBuffer[2], TmpBuffer[3], TmpBuffer[4]); } #if 0 while (1) { IicPortReceive(Port, TmpBuffer); tslp_tsk(1000); target_fput_log('l'); } #endif T_CCYC ccyc; ccyc.cycatr = TA_STA; ccyc.cychdr = debug_i2c_cyc; ccyc.cycphs = 0; ccyc.cyctim = 200; //ER_ID ercd = acre_cyc(&ccyc); //assert(ercd > 0); }
static enum hrtimer_restart Device1TimerInterrupt1(struct hrtimer *pTimer) { UBYTE Port; UBYTE Tmp; UBYTE TmpBuffer[IIC_DATA_LENGTH]; hrtimer_forward_now(pTimer, Device1Time); for (Port = 0; Port < INPUTS; Port++) { // look at one port at a time switch (IicPort[Port].State) { // Main state machine case IIC_IDLE: { // Port inactive pIic->Status[Port] = 0; } break; case IIC_INIT: { // Initialize port hardware memset((void*)IicStrings[Port].Manufacturer, 0, IIC_NAME_LENGTH + 1); memset((void*)IicStrings[Port].SensorType, 0, IIC_NAME_LENGTH + 1); IicPort[Port].State = IIC_ENABLE; } break; case IIC_RESTART: { IicPortDisable(Port); IicPort[Port].State = IIC_ENABLE; } break; case IIC_ENABLE: { // Initialize port variables IicPortEnable(Port); IicPort[Port] = IicPortDefault; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_NXT_TEMP_START; } break; case IIC_NXT_TEMP_START: { if (++(IicPort[Port].Timer) >= (10 / IIC_TIMER_RESOLUTION)) { IicPort[Port].OutBuffer[0] = 0x4C; IicPort[Port].OutBuffer[1] = 0x01; IicPort[Port].OutBuffer[2] = 0x60; IicPort[Port].OutBuffer[3] = 0x00; IicPort[Port].OutLength = 3; IicPort[Port].InLength = 1; IicPort[Port].Repeat = 1; IicPort[Port].Time = 0; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_NXT_TEMP_WRITE; } } break; case IIC_NXT_TEMP_WRITE: { IicPortSend(Port); IicPort[Port].Timer = 0; IicPort[Port].State = IIC_NXT_TEMP_READ; } break; case IIC_NXT_TEMP_READ: { if (IicPortReceive(Port, TmpBuffer) != BUSY) { if (TmpBuffer[0] == 0x60) { memcpy(IicStrings[Port].Manufacturer, "LEGO", IIC_NAME_LENGTH); IicStrings[Port].Manufacturer[IIC_NAME_LENGTH] = 0; memcpy(IicStrings[Port].SensorType, "Temp.", IIC_NAME_LENGTH); IicStrings[Port].SensorType[IIC_NAME_LENGTH] = 0; pIic->Changed[Port] = 1; IicPort[Port].Initialised = 1; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_SETUP_WAIT; } else { IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_START; } } if (++(IicPort[Port].Timer) >= (500 / IIC_TIMER_RESOLUTION)) { IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_START; } } break; case IIC_MANUFACTURER_START: { if (++(IicPort[Port].Timer) >= (10 / IIC_TIMER_RESOLUTION)) { IicPort[Port].OutBuffer[0] = IicPort[Port].Addr; IicPort[Port].OutBuffer[1] = 0x08; IicPort[Port].OutBuffer[2] = 0x00; IicPort[Port].OutBuffer[3] = 0x00; IicPort[Port].OutLength = 2; IicPort[Port].InLength = 8; IicPort[Port].Repeat = 1; IicPort[Port].Time = 0; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_WRITE; } } break; case IIC_MANUFACTURER_WRITE: { IicPortSend(Port); IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_READ; } break; case IIC_MANUFACTURER_READ: { if (IicPortReceive(Port, TmpBuffer) != BUSY) { memcpy(IicStrings[Port].Manufacturer, TmpBuffer, IIC_NAME_LENGTH); IicStrings[Port].Manufacturer[IIC_NAME_LENGTH] = 0; if (TmpBuffer[0] == 0x08) { if (IicPort[Port].Addr < 0x50) { IicPort[Port].Addr++; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_START; } else { if (--IicPort[Port].Retries > 0) { IicPort[Port].Addr = 0x01; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_MANUFACTURER_START; } else { IicPort[Port].Initialised = 1; IicPort[Port].State = IIC_SETUP_START; } } } else { if (TmpBuffer[0] == 0) { memcpy(IicStrings[Port].Manufacturer, "LEGO", IIC_NAME_LENGTH); IicStrings[Port].Manufacturer[IIC_NAME_LENGTH] = 0; } IicPort[Port].Initialised = 1; IicPort[Port].State = IIC_TYPE_START; } } if (++(IicPort[Port].Timer) >= (500 / IIC_TIMER_RESOLUTION)) { IicPort[Port].Addr = 0x01; pIic->Status[Port] &= ~IIC_WRITE_REQUEST; pIic->Status[Port] &= ~IIC_DATA_READY; IicPort[Port].State = IIC_WAITING; } } break; case IIC_TYPE_START: { IicPort[Port].OutBuffer[0] = IicPort[Port].Addr; IicPort[Port].OutBuffer[1] = 0x10; IicPort[Port].OutBuffer[2] = 0x00; IicPort[Port].OutBuffer[3] = 0x00; IicPort[Port].OutLength = 2; IicPort[Port].InLength = 8; IicPort[Port].Repeat = 1; IicPort[Port].Time = 0; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_TYPE_WRITE; } break; case IIC_TYPE_WRITE: { IicPortSend(Port); IicPort[Port].Timer = 0; IicPort[Port].State = IIC_TYPE_READ; } break; case IIC_TYPE_READ: { if (IicPortReceive(Port, TmpBuffer) != BUSY) { memcpy((void*)IicStrings[Port].SensorType, (void*)TmpBuffer, IIC_NAME_LENGTH); IicStrings[Port].SensorType[IIC_NAME_LENGTH] = 0; if (TmpBuffer[0] == 0) { memcpy((void*)IicStrings[Port].SensorType, (void*)"Store", IIC_NAME_LENGTH); IicStrings[Port].Manufacturer[IIC_NAME_LENGTH] = 0; } pIic->Changed[Port] = 1; IicPort[Port].Initialised = 1; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_SETUP_WAIT; } if (++(IicPort[Port].Timer) >= (500 / IIC_TIMER_RESOLUTION)) { pIic->Status[Port] &= ~IIC_WRITE_REQUEST; pIic->Status[Port] &= ~IIC_DATA_READY; IicPort[Port].State = IIC_WAITING; } } break; case IIC_SETUP_WAIT: { if (++(IicPort[Port].Timer) >= (10000 / IIC_TIMER_RESOLUTION)) { IicPort[Port] = IicPortDefault; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_NXT_TEMP_START; } } break; case IIC_SETUP_START: { #ifndef DISABLE_FAST_DATALOG_BUFFER pIic->Actual[Port] = 0; pIic->LogIn[Port] = 0; #endif if (IicStrings[Port].SetupLng) { IicPort[Port].OutBuffer[0] = (UBYTE)((IicStrings[Port].SetupString >> 24) & 0xFF); IicPort[Port].OutBuffer[1] = (UBYTE)((IicStrings[Port].SetupString >> 16) & 0xFF); IicPort[Port].OutBuffer[2] = (UBYTE)((IicStrings[Port].SetupString >> 8) & 0xFF); IicPort[Port].OutBuffer[3] = (UBYTE)((IicStrings[Port].SetupString) & 0xFF); IicPort[Port].OutLength = IicStrings[Port].SetupLng; IicPort[Port].InLength = 0; IicPort[Port].Repeat = 1; IicPort[Port].Time = 0; IicPort[Port].State = IIC_SETUP_WRITE; } else { IicPort[Port].State = IIC_SETUP_READ; } IicPort[Port].Timer = 0; } break; case IIC_SETUP_WRITE: { IicPortSend(Port); IicPort[Port].Timer = 0; IicPort[Port].State = IIC_SETUP_READ; } break; case IIC_SETUP_READ: { if (IicPortReceive(Port, TmpBuffer) != BUSY) { IicPort[Port].State = IIC_WAITING; if (IicStrings[Port].PollLng) { IicPort[Port].OutBuffer[0] = (UBYTE)((IicStrings[Port].PollString >> 24) & 0xFF); IicPort[Port].OutBuffer[1] = (UBYTE)((IicStrings[Port].PollString >> 16) & 0xFF); IicPort[Port].OutBuffer[2] = (UBYTE)((IicStrings[Port].PollString >> 8) & 0xFF); IicPort[Port].OutBuffer[3] = (UBYTE)((IicStrings[Port].PollString) & 0xFF); IicPort[Port].OutLength = IicStrings[Port].PollLng; if (IicStrings[Port].ReadLng < 0) { IicPort[Port].InLength = 0 - IicStrings[Port].ReadLng; IicPort[Port].Reverse = 1; } else { IicPort[Port].InLength = IicStrings[Port].ReadLng; IicPort[Port].Reverse = 0; } IicPort[Port].Repeat = 0; IicPort[Port].Time = IicStrings[Port].Time; IicPort[Port].Timer = 0; IicPort[Port].State = IIC_WRITING; pIic->Status[Port] = 0; } IicPort[Port].Initialised = 1; }