WINCE 下的IO操作

小小白桦树 2011-08-21 08:54:57
最近在做CE下的GPIO驱动,以前在2440上做过,以为差不多操作寄存器应该很简单,可是X86下的原来不太一样。本来想做成流驱动,在网上找了些资料,试了下没成功,后来又查到X86下的,X86的CPU,由于它的外设I/O端口和存储器空间分开编址,可以直接嵌入汇编或者使用宏read_port_xxx,write_port_xxx来读写设备寄存器的物理地址。
本人的CPU是LX800 GPIO是通过83627出来的。

想在我想问的是X86下访问物理IO是否可以直接操作端口,不分配内存可不可以?

该GPIO操作可不可以不做成驱动,直接在应用程序中嵌入汇编来操作端口?
...全文
136 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
northcan 2011-08-22
  • 打赏
  • 举报
回复
在ARM架构下可以不做成流驱动
X86没搞过,帮顶。
MEIDANZON 2011-08-22
  • 打赏
  • 举报
回复
WINCE6上都是分开的,虚拟的地址,做流驱动不难,给你个ARM11+WINCE的例子

#include "bsp.h"
//#include <s3c6410.h>
#include <DrvLib.h>
#include <winuser.h>

#include "GPI.h"
// GPIO virtual address
static volatile S3C6410_GPIO_REG *g_pGPIOReg ;
//----------------------------------------------------------------------------//
// DLL entry //
//----------------------------------------------------------------------------//
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
OutputDebugString(L"\nGPI - DLL_PROCESS_ATTACH\n");
RETAILMSG(1,(TEXT("GPI - DLL_PROCESS_ATTACH\n")));
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}

return 1;
}

void InitializeGPIOPort(void)
{
g_pGPIOReg->GPPCON = (g_pGPIOReg->GPPCON &~(0x3<<2))|(0x1<<2);
g_pGPIOReg->GPPPUD=(g_pGPIOReg->GPPPUD&~(0x3<<2))|(0x0<<2);

g_pGPIOReg->GPPCON = (g_pGPIOReg->GPPCON &~(0x3<<16))|(0x1<<16);
g_pGPIOReg->GPPPUD=(g_pGPIOReg->GPPPUD&~(0x3<<16))|(0x0<<16);

g_pGPIOReg->GPPCON = (g_pGPIOReg->GPPCON &~(0x3<<18))|(0x1<<18);
g_pGPIOReg->GPPPUD=(g_pGPIOReg->GPPPUD&~(0x3<<18))|(0x0<<18);


g_pGPIOReg->GPPCON = (g_pGPIOReg->GPPCON &~(0x3<<24))|(0x1<<24);
g_pGPIOReg->GPPPUD=(g_pGPIOReg->GPPPUD&~(0x3<<24))|(0x0<<24);



}

DWORD GPI_Init(LPCTSTR pContext, LPCVOID lpvBusContext) {

g_pGPIOReg = (S3C6410_GPIO_REG *)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG), FALSE);
InitializeGPIOPort();
return 1;
}

//----------------------------------------------------------------------------//
// BUZZER deinit //
//----------------------------------------------------------------------------//
BOOL GPI_Deinit(DWORD hDeviceContext) {
VirtualFree((PVOID)g_pGPIOReg, 0, MEM_RELEASE);
g_pGPIOReg=NULL;
return TRUE;
}

//----------------------------------------------------------------------------//
// BUZZER open //
//----------------------------------------------------------------------------//
DWORD GPI_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) {
//RETAILMSG(1,(TEXT("771\n")));
return 1;
}

//----------------------------------------------------------------------------//
// BUZZER close //
//----------------------------------------------------------------------------//
BOOL GPI_Close(DWORD hOpenContext) {

return 1;
}

//----------------------------------------------------------------------------//
// BUZZER read //
//----------------------------------------------------------------------------//
DWORD GPI_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) {
//RETAILMSG(1,(TEXT("772\n")));
return 1;
}

//----------------------------------------------------------------------------//
// BUZZER write //
//----------------------------------------------------------------------------//
DWORD GPI_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) {
DWORD IO;
IO=*(DWORD*)(pBuffer);
if((IO&0x1)==0x1)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<1))|(0x1<<1);
}
if((IO&0x1)==0x0)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<1))|(0x0<<1);
}
if((IO&0x2)==0x2)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<8))|(0x1<<8);
}
if((IO&0x2)==0x0)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<8))|(0x0<<8);
}
if((IO&0x4)==0x4)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<9))|(0x1<<9);
}
if((IO&0x4)==0x0)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<9))|(0x0<<9);
}
if((IO&0x8)==0x8)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<12))|(0x1<<12);
}
if((IO&0x8)==0x0)
{
g_pGPIOReg->GPPDAT=(g_pGPIOReg->GPPDAT&~(0x1<<12))|(0x0<<12);
}



return 2;
}

//----------------------------------------------------------------------------//
// BUZZER power up //
//----------------------------------------------------------------------------//
VOID GPI_PowerUp(DWORD hDeviceContext) {

}

//----------------------------------------------------------------------------//
// BUZZER down //
//----------------------------------------------------------------------------//
VOID GPI_PowerDown(DWORD hDeviceContext) {

}

//----------------------------------------------------------------------------//
// BUZZER seek //
//----------------------------------------------------------------------------//
DWORD GPI_Seek(DWORD hOpenContext, long Amount, DWORD Type) {
return 1;
}



//----------------------------------------------------------------------------//
// BUZZER IO control //
//----------------------------------------------------------------------------//
BOOL GPI_IOControl(DWORD Handle,
DWORD dwIoControlCode,
PDWORD pInBuf,
DWORD nInBufSize,
PDWORD pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned) {


return 1;
}



EmbeddedLong 2011-08-22
  • 打赏
  • 举报
回复
X86 没实现过 绑定
shenzhentom 2011-08-21
  • 打赏
  • 举报
回复
BSP中对IO口操作有封装的范例. 驱动中直接操作就行.
小小白桦树 2011-08-21
  • 打赏
  • 举报
回复
googleman 在你日志里看到一篇关于IO操作的文章,求指导

19,521

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧