Пример #1
0
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);
}
Пример #2
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;
				}