📄 i2c_isr.c
字号:
//
// Copyright (c) Renesas Technology Corp. 2002-2003 All Rights Reserved.
//
// OEM Adaptation Layer
//
//----------------------------------------------------------------------------
//
// File : I2C_ISR.C
// Created : 2002.01.31
// MODIFIED : 2003.08.06
// AUTHOR : Renesas Technology Corp.
// HARDWARE : RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
// TARGET OS : Microsoft(R) Windows(R) CE .NET 4.2
// Notes :
// History :
// 2002.9.27
// - Released for HS7751RSTC01H (S1-E, ITS-DS5)
#include <windows.h>
#include <s1e.h>
#include <hd64404.h>
#include <oalintr.h>
#include <drv_glob.h>
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_CH0_ISR(void);
int I2C_CH1_ISR(void);
int I2C_MasterTransmit(PVBYTE, PI2C_TABLE);
int I2C_MasterReceive(PVBYTE, PI2C_TABLE);
int I2C_SlaveTransmit(PVBYTE, PI2C_TABLE);
int I2C_SlaveReceive(PVBYTE, PI2C_TABLE);
// I2C channel0 ISR
int I2C_CH0_ISR(
void
)
{
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(I2C0_BASE+MSR);
if ( dwStatus & 0x00000001 ){
CLRBIT((I2C0_BASE+MCR), 0x00000001);
if ( pi2c -> dwCount == pi2c -> dwPoint ){
SETBIT(I2C0_BASE+MCR, 0x00000002);
}
CLRBIT(I2C0_BASE+MSR, 0x00000001);
}
if ( dwStatus & 0x00000008 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
Write(I2C0_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
}else{
SETBIT(I2C0_BASE+MCR, 0x00000002);
}
CLRBIT(I2C0_BASE+MSR, 0x00000008);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000070 ){
CLRBIT(I2C0_BASE+MSR, 0x00000070);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000020 ){ // Master receive mode
dwStatus = Read(I2C0_BASE+MSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C0_BASE+MCR, 0x00000001);
if ( pi2c -> dwCount == pi2c -> dwPoint ){
SETBIT(I2C0_BASE+MCR, 0x00000002);
}
CLRBIT(I2C0_BASE+MSR, 0x00000001);
}
if ( dwStatus & 0x00000002 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C0_BASE+RXD);
if ( pi2c -> dwPoint == pi2c -> dwCount ){
SETBIT(I2C0_BASE+MCR, 0x00000002);
}
}else{
SETBIT(I2C0_BASE+MCR, 0x00000002);
}
CLRBIT(I2C0_BASE+MSR, 0x00000002);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000070 ){
CLRBIT(I2C0_BASE+MSR, 0x00000070);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000040 ){ // Slave transmit mode
dwStatus = Read(I2C0_BASE+SSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C0_BASE+SSR, 0x00000001);
}
if ( dwStatus & 0x00000008 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
Write(I2C0_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
}
CLRBIT(I2C0_BASE+SSR, 0x00000008);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000010 ){
CLRBIT(I2C0_BASE+SSR, 0x00000010);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000080 ){ // Slave receive mode
dwStatus = Read(I2C0_BASE+SSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C0_BASE+SSR, 0x00000001);
}
if ( dwStatus & 0x00000002 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C0_BASE+RXD);
}else{
SETBIT(I2C0_BASE+SCR, 0x00000001);
Read(I2C0_BASE+RXD);
}
CLRBIT(I2C0_BASE+SSR, 0x00000002);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000010 ){
CLRBIT(I2C0_BASE+SSR, 0x00000010);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}
return SYSINTR_NOP;
}
// I2C channel1 ISR
int I2C_CH1_ISR(
void
)
{
DWORD dwStatus;
volatile PI2C_TABLE pi2c;
pi2c = (PI2C_TABLE)(I2C_BUFFER_BASE+I2C_CH2BUF_OFFSET); // The share table address between ISR and i2c driver
if ( pi2c -> dwType & 0x00000010 ){ // Master transmit mode
dwStatus = Read(I2C1_BASE+MSR);
if ( dwStatus & 0x00000001 ){
CLRBIT((I2C1_BASE+MCR), 0x00000001);
if ( pi2c -> dwCount == pi2c -> dwPoint ){
SETBIT(I2C1_BASE+MCR, 0x00000002);
}
CLRBIT(I2C1_BASE+MSR, 0x00000001);
}
if ( dwStatus & 0x00000008 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
Write(I2C1_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
}else{
SETBIT(I2C1_BASE+MCR, 0x00000002);
}
CLRBIT(I2C1_BASE+MSR, 0x00000008);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000070 ){
CLRBIT(I2C1_BASE+MSR, 0x00000070);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000020 ){ // Master receive mode
dwStatus = Read(I2C1_BASE+MSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C1_BASE+MCR, 0x00000001);
if ( pi2c -> dwCount == pi2c -> dwPoint ){
SETBIT(I2C1_BASE+MCR, 0x00000002);
}
CLRBIT(I2C1_BASE+MSR, 0x00000001);
}
if ( dwStatus & 0x00000002 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C1_BASE+RXD);
if ( pi2c -> dwPoint == pi2c -> dwCount ){
SETBIT(I2C1_BASE+MCR, 0x00000002);
}
}else{
SETBIT(I2C1_BASE+MCR, 0x00000002);
}
CLRBIT(I2C1_BASE+MSR, 0x00000002);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000070 ){
CLRBIT(I2C1_BASE+MSR, 0x00000070);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000040 ){ // Slave transmit mode
dwStatus = Read(I2C1_BASE+SSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C1_BASE+SSR, 0x00000001);
}
if ( dwStatus & 0x00000008 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
Write(I2C1_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
}
CLRBIT(I2C1_BASE+SSR, 0x00000008);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000010 ){
CLRBIT(I2C1_BASE+SSR, 0x00000010);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}else if ( pi2c -> dwType & 0x00000080 ){ // Slave receive mode
dwStatus = Read(I2C1_BASE+SSR);
if ( dwStatus & 0x00000001 ){
CLRBIT(I2C1_BASE+SSR, 0x00000001);
}
if ( dwStatus & 0x00000002 ){
if ( pi2c -> dwPoint < pi2c -> dwCount ){
pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C1_BASE+RXD);
}else{
SETBIT(I2C1_BASE+SCR, 0x00000001);
Read(I2C1_BASE+RXD);
}
CLRBIT(I2C1_BASE+SSR, 0x00000002);
return SYSINTR_NOP;
}
if ( dwStatus & 0x00000010 ){
CLRBIT(I2C1_BASE+SSR, 0x00000010);
pi2c -> dwType |= 0x00000001;
return SYSINTR_I2C;
}
}
return SYSINTR_NOP;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -