⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_isr.c

📁 WinCE5.0BSP for Renesas SH7770
💻 C
字号:
//
//  Copyright(C) Renesas Technology Corp. 2002-2003. All rights reserved.
//
//  NK Kernel for ITS-DS7 Ver.1.0.0
//
//  FILE      : i2c_isr.c
//  CREATED   : 2002.04.25
//  MODIFIED  : 2003.06.20
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS ITS-DS7
//  HISTORY   : 
//              2003.06.20
//              - Created release code.
//                (based on RENESAS ITS-DS4 Source Kit Ver.1.2.0 for WCE4.2)


#include <windows.h>
#include <platform.h>
#include <sh7770.h>
#include <oalintr.h>
#include <drv_glob.h>

#pragma optimize("", off)

typedef struct _I2C_TABLE {
	unsigned long volatile	dwType;
	unsigned long volatile	dwCount;
	unsigned long volatile	dwPoint;
	unsigned char volatile	bData[0x800-12];
} *PI2C_TABLE;


#define SCR		0x00
#define MCR		0x04
#define SSR		0x08
#define MSR		0x0C
#define SIER	0x10
#define MIER	0x14
#define TXD		0x24
#define RXD		0x24

#define Read(reg)		(*(volatile unsigned long * const)(reg))
#define Write(reg, val)	(*(volatile unsigned long * const)(reg)) = (val)

#define CLRBIT(reg, val) Write((reg), (Read(reg) & (~val)))
#define SETBIT(reg, val) Write((reg), (Read(reg) | val))

int	I2C_ISR(void);

// I2C ISR
int	I2C_ISR(
	void
	)
{
volatile DWORD	dwStatus;
volatile PI2C_TABLE	pi2c;

	pi2c = (PI2C_TABLE)(I2C_BUFFER_BASE);				// The share table address between ISR and i2c driver
	if ( pi2c -> dwType & 0x00000010 ){					// Master transmit mode
		dwStatus = Read(I2C_REGBASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT((I2C_REGBASE+MCR), 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C_REGBASE+MCR, 0x00000002);
			}
			CLRBIT(I2C_REGBASE+MSR, 0x0000000d);
			dwStatus = Read(I2C_REGBASE+MSR);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C_REGBASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}
			else{
				SETBIT(I2C_REGBASE+MCR, 0x00000002);
			}
			CLRBIT(I2C_REGBASE+MSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			pi2c -> dwType |= 0x00000001;
			Write(I2C_REGBASE+MIER, 0);
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000020 ){				// Master receive mode
		dwStatus = Read(I2C_REGBASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C_REGBASE+MCR, 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C_REGBASE+MCR, 0x00000002);
			}
			CLRBIT(I2C_REGBASE+MSR, 0x0000000f);
			dwStatus = Read(I2C_REGBASE+MSR);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C_REGBASE+RXD);
				if ( (pi2c -> dwPoint+1) == pi2c -> dwCount ){
					SETBIT(I2C_REGBASE+MCR, 0x00000002);
				}
			}
			CLRBIT(I2C_REGBASE+MSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			pi2c -> dwType |= 0x00000001;
			Write(I2C_REGBASE+MIER, 0);
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000040 ){				// Slave transmit mode
		dwStatus = Read(I2C_REGBASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C_REGBASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C_REGBASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}
			CLRBIT(I2C_REGBASE+SSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C_REGBASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000080 ){				// Slave receive mode
		dwStatus = Read(I2C_REGBASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C_REGBASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C_REGBASE+RXD);
			}else{
				SETBIT(I2C_REGBASE+SCR, 0x00000001);
				Read(I2C_REGBASE+RXD);
			}
			CLRBIT(I2C_REGBASE+SSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C_REGBASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}
	return SYSINTR_NOP;
}

#pragma optimize("", on)


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -