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

📄 aaci.cpp

📁 AACILib,是在上海杰德的平台上
💻 CPP
字号:
#include "stdafx.h"
#include "AACI.h"
#include "wm9712.h"
#include "CEDDK.h"

#define LOOP_TIME	10000
#define ENTERMUTEX //WaitForSingleObject(hMutex, INFINITE)
#define RELEASEMUTEX //ReleaseMutex(hMutex)
#define udelay(time) Sleep(time)

void CAACI::MapAACIReg()
{
	PHYSICAL_ADDRESS PhysicalAddress;
	PhysicalAddress.HighPart = 0;
    PhysicalAddress.LowPart = AACI_BASE;
    m_addrAACIBase = (UCHAR *)MmMapIoSpace(PhysicalAddress, AACI_HWREGS_SIZE, FALSE);
    
	if( !m_addrAACIBase )
    {
        RETAILMSG(1, (TEXT("MapAACIReg: Map AACI hardware registers failed")));
    }
}

void CAACI::UnMapAACIReg()
{
	if(m_addrAACIBase)
	{
		MmUnmapIoSpace(m_addrAACIBase, AACI_HWREGS_SIZE);
	  	m_addrAACIBase = NULL;
	}
}

int CAACI::apAACI_WriteRegister(volatile int reg, int value)
{
	int timer;

	if(!m_addrAACIBase)return FALSE;

    //AACI_SLFR ---#define AACI_SL1TXBUSY  0x0002---Slot 1 transceive busy????
    // Wait for TX1/2 not to be busy
    timer = LOOP_TIME;
    ENTERMUTEX;	
    while ((*((DWORD*)(m_addrAACIBase+AACI_SLFR)) & AACI_SL1TXBUSY) && timer) {//等待slot1 的传送寄存器空闲
        udelay(10);
        timer--;
    }
    
    // Note: the data value must be setup before the address
    *((DWORD*)(m_addrAACIBase+AACI_SL2TX)) = value << 4;//数据寄存器
    *((DWORD*)(m_addrAACIBase+AACI_SL1TX)) = reg   << 12;//地址寄存器
    RELEASEMUTEX;

    if (timer)
        return TRUE;
    else
        return FALSE;
}

int CAACI::apAACI_ReadRegister(volatile int reg)
{
	int timer;
    unsigned int data;//, stat;

	if(!m_addrAACIBase)return FALSE;

	ENTERMUTEX;	
	timer = AACI_TIMEOUT;
    //先放数据,再放地址
    while ((*((DWORD*)(m_addrAACIBase + AACI_SLFR)) & AACI_SL1TXBUSY) && timer) {//等待slot1 的传送寄存器空闲
        udelay(10);
        timer--;
    }
	
    //先放数据,再放地址
    *((DWORD*)(m_addrAACIBase + AACI_SL2TX)) = 0;
    //地址为8BIT,所以应该放在20位中的高8位,所以要向右移12位
    *((DWORD*)(m_addrAACIBase + AACI_SL1TX)) = (reg << 12) | 0x80000;

    timer = LOOP_TIME;
    while(((*((DWORD*)(m_addrAACIBase+AACI_SLFR)) & 0x100) == 0) && timer){//当退出这个循环的时候表示数据已经接收到了 
        udelay(10);
        timer--;
    }
  	data = (*((DWORD*)(m_addrAACIBase+AACI_SL2RX)) >> 4);
	RELEASEMUTEX;

	return data;
}

CAACI::CAACI()
{
	m_addrAACIBase = NULL;

	MapAACIReg();
}

CAACI::~CAACI()
{
	UnMapAACIReg();
}

⌨️ 快捷键说明

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