打印

S3C6410开发板wince6.0下的GPIO流驱动

[复制链接]
2778|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ptlsmile|  楼主 | 2011-2-28 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
S3C6410GPIO流驱动(WINCE600)
Topic:S3C6410GPIO流驱动(作者:Sturtle)

//----------------------------------------------------------------------------------------------------------------------------

// 作者:Sturtle
// 平台:友坚UT-S3C6410开发板+WINCE6.0 OS

// 注意事项:未经作者同意,商业网站不能转载,更不得在转载的时候擅自修改、删除**的任何部分

//------------------------------------------------------------------------------------------------------------------------------

写前:控制GPIO通常是用PHYSICAL_ADDRESSMmMapIoSpace,通俗的说就是通过VirtualAllocVirtualCopy进行虚拟地址映射,然后操作相应GPIO寄存器做自己要的动作;据说CE5可以直接内存映射,CE6必须写GPIO驱动,鄙人更赞成写成流驱动的形式,后续维护移植都方便;闲话少说,言归正卷

1VirtualAlloc()/VirtualCopy()



view plaincopy to clipboardprint?

PVOID TSP_RegAlloc(PVOID addr, INT sz)

{


PVOID reg;

  

reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);


if (reg)


{


if (!VirtualCopy(reg, (PVOID)((UINT32)addr >> 8), sz, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE ))


{


//VirtualFree(reg, sz, MEM_RELEASE);


VirtualFree(reg, 0, MEM_RELEASE);


reg = NULL;


}


}

  

return reg;

}

PVOID TSP_RegAlloc(PVOID addr, INT sz)
{

PVOID reg;



reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);


if (reg)


{


if (!VirtualCopy(reg, (PVOID)((UINT32)addr >> 8), sz, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE ))


{


//VirtualFree(reg, sz, MEM_RELEASE);


VirtualFree(reg, 0, MEM_RELEASE);


reg = NULL;


}


}



return reg;

}



2
、初始化      



view plaincopy to clipboardprint?

DWORD GIO_Init(LPCTSTR pContext,LPVOID lpvBusContext)


{


UINT32 i;

  

RETAILMSG(sturtle_gpio, (TEXT("GIO_Init... \r\n") ) );

  

g_pIOPregs = (volatile S3C6410_GPIO_REG*)TSP_RegAlloc((PVOID)S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG));


if (g_pIOPregs == NULL)


{


RETAILMSG(1,(TEXT("GIO_Init -> g_pIOPregs: VirtualAlloc failed!\r\n")));

  

}


...

}

DWORD GIO_Init(LPCTSTR pContext,LPVOID lpvBusContext)

{


UINT32 i;



RETAILMSG(sturtle_gpio, (TEXT("GIO_Init... \r\n") ) );



g_pIOPregs = (volatile S3C6410_GPIO_REG*)TSP_RegAlloc((PVOID)S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG));


if (g_pIOPregs == NULL)


{


RETAILMSG(1,(TEXT("GIO_Init -> g_pIOPregs: VirtualAlloc failed!\r\n")));



}


...

}

//如有错误,请留言指正;同时希望有更好的方法与大家交流和分享,让我们大家一起进步!


本文由友坚科技整理:http://www.urbetter.com

相关帖子

沙发
llf021421| | 2011-3-5 09:13 | 只看该作者
谢谢,正在学习中

使用特权

评论回复
板凳
ptlsmile|  楼主 | 2011-3-30 16:53 | 只看该作者
UT-S3C6410开发板是性能稳定、功能强大、高性价比的ARM11处理器开发板;专为消费类电子、工业控制、车载导航、人机界面、多媒体终端、POS机、行业PDA等电子产品的开发而设计,主要供广大企业用户进行产品前期软硬件性能评估验证、设计参考用。其丰富的设备接口、全面的功能模块和详细的软硬件资料也使其成为高校、培训机构、嵌入式爱好者学习研究的最佳工具。
    UT-S3C6410开发板完美实现了三星S3C6410处理器在视频媒体编解码、2D/3D图形加速、显示处理和缩放等方面的性能,并提供了LCD接口、VGA接口、TVout接口、Camera输入接口、4路串口、SD卡接口、SPI、100M网口、USB2.0-OTG接口,USB Host接口、音频输入输出接口、按键接口、I2C接口等硬件资源,具有更高的主频和更丰富外设,能适用于对性能和处理能力有更高要求的嵌入式系统应用场合。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

120

帖子

1

粉丝