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

📄 bus.cpp

📁 arm控制外部总线驱动
💻 CPP
字号:
#include <windows.h>
#include <nkintr.h>
#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "s2440.h"
#include "ceddk.h"
#include "pkfuncs.h"

//BANK1 映射虚拟地址 对应的物理地址
#define BUS0_BASE    0xA2000000      //映射表中DCD 0x82000000,      0x08000000,  32,nCS1

volatile UINT16     *s2440BUS0 = (UINT16 *)BUS0_BASE; 
volatile IOPreg     *s2440IOP = (IOPreg *)IOP_BASE;

void Virtual_Alloc()
{
    s2440BUS0 = (volatile UINT16 *) VirtualAlloc(0,sizeof(UINT16),MEM_RESERVE, PAGE_NOACCESS);
    s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
   
    if((s2440BUS0 == NULL)||(s2440IOP == NULL))//||(s2440MEMC == NULL))
    {
        RETAILMSG(1,(TEXT("For s2440: VirtualAlloc faiBUS!\r\n")));
        return;
    }
    else
    {
            if(!VirtualCopy((PVOID)s2440BUS0,(PVOID)(BUS0_BASE),sizeof(UINT16),PAGE_READWRITE | PAGE_NOCACHE))
            {
                RETAILMSG(1,(TEXT("For s2440BUS0: VirtualCopy faiBUS!\r\n")));    return;
            }
            if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE ))
            {
                RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!\r\n")));    return;
            }
    }
}

BOOL WINAPI  DllEntry(HANDLE    hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        DEBUGREGISTER((HINSTANCE)hinstDLL);
        return TRUE;
    case DLL_THREAD_ATTACH:
        break;
    }

    return TRUE;
}

BOOL ConfigInit()
{
    RETAILMSG(1,(TEXT("Config Setting----\r\n")));
	s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 10)) | (1<< 10);	// GPB5 == OUTPUT.
	s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 12)) | (1<< 12);	// GPB6 == OUTPUT.
    return TRUE;
}


BOOL BUS_Deinit(DWORD hDeviceContext)
{
    RETAILMSG(1,(TEXT("USERBUS: BUS_Deinit\r\n")));
    return TRUE;
}



DWORD BUS_Init(DWORD dwContext)
{
    RETAILMSG(1,(TEXT("BUS_Init----\r\n")));
    Virtual_Alloc();
	ConfigInit();
    return TRUE;
}


//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD BUS_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    RETAILMSG(1,(TEXT("USERBUS: BUS_Open\r\n")));
    return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL BUS_Close(DWORD hOpenContext)
{
	s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&(0xF<<5);
    RETAILMSG(1, (TEXT("::: SPL_Close.\r\n")));      /* 提示驱动关闭 */
    return TRUE;
}



//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD BUS_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    UINT16 * ReadBuffer;
    RETAILMSG(1,(TEXT("USERBUS: BUS_Read\r\n")));
    if((pBuffer==NULL)||(Count<=0))
    {
        return 0;
    }
	 // 映射地址空间

/*驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess?因为设备管理器负责加载驱动程序DLL,这意味着当应用程序调
  用驱动程序接口函数的时候,WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程
  序代码,应用程序和设备管理器处于两个进程空间,这就造成设备管理器无法访问应用程序传递的指针(虚拟地址),所以当我
  们在应用程序中传递指针给流驱动程序接口函数时,WINCE内核从中作了一个地址映射,例如ReadFile、WriteFile、DeviceIoControl
  函数的参数凡是指针都经过了映射才传递给驱动程序,所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个
  指向一个结构体的指针,而结构体里包括一个或多个指针,那么WINCE内核并不负责映射,所以就需要开发者在驱动程序接口函数中调用API
  函数MapPtrToProcess来映射地址。例如:pPointer_retval = MapPtrToProcess(pPointer, GetCallerProcess());   */
    ReadBuffer=(UINT16*)MapPtrToProcess(pBuffer,GetCallerProcess());

        *ReadBuffer=*(s2440BUS0+12);


		s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<5);
		Sleep(10);
		s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<5);

    return 1;
}
/*-----------------------------------------------------------------------------
函数名称: BUS_Write

描    述: 向本驱动写入数据

输入参数: DWORD hOpenContext: 驱动程序引用事例句柄

          LPVOID pBuffer    : 发送缓冲区

          DWORD Count         : 要写入的字节数

输出参数: 无

返    回: 实际写入的字节数

-----------------------------------------------------------------------------*/
DWORD BUS_Write(DWORD hOpenContext, LPVOID pSourceBytes, DWORD NumberOfBytes)
{
    UINT16 * WriteBuffer;
    RETAILMSG(1,(TEXT("USERBUS: BUS_Write\r\n")));

    if((pSourceBytes==NULL)||(NumberOfBytes<=0))
    {
        return 0;
    }
    WriteBuffer=(UINT16*)MapPtrToProcess(pSourceBytes,GetCallerProcess());

        *(s2440BUS0+5)=*WriteBuffer;
		s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<6);
		Sleep(10);
		s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<6);
    return 1;
} 
/**************************************************************************************

函数名称: BUS_Seek

描    述: 对设备的数据指针进行操作,本驱动不支持该函数

输入参数: 

输出参数:

返    回:

*************************************************************************************/

DWORD BUS_Seek(DWORD hOpenContext, long Amount, DWORD Type)

{

       RETAILMSG(1, (TEXT("::: BUS_Seek.\r\n")));                      /* 提示执行本函数 */

 

       return 0;

}
/**************************************************************************************

函数名称: BUS_PowerUp

描    述: 电源上电驱动处理函数

输入参数: 

输出参数:

返    回: 无

*************************************************************************************/

void BUS_PowerUp(void)

{

       RETAILMSG(1, (TEXT("::: BUS_PowerUp.\r\n")));                  /* 提示执行本函数 */

}

 

 

/**************************************************************************************

函数名称: BUS_PowerDown

描    述: 电源下电驱动处理函数

输入参数: 

输出参数:

返    回: 无

**************************************************************************************/

void BUS_PowerDown(void)

{

       RETAILMSG(1, (TEXT("::: BUS_PowerDown.\r\n")));                     /* 提示执行本函数 */

}

 

 

⌨️ 快捷键说明

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