📄 i2c_isr.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 + -