【嵌入式】[原创]基于WINCE设备驱动程序的设计
0赞嵌入式系统的设计中经常需要用到驱动程序的设计,以前很多人写的都是基于Linux系统的,我就写写基于WINce系统的设备驱动程序的设计,希望大家能够投票。
嵌入式系统的单片驱动程序和分层的驱动程序模型:
其中要注意以下几点:
1、流接口驱动程序是以动态链接库形式存在的,由设备管理器统一加载、管理和卸载。
2、为了与外围设备进行交互,流接口驱动程序通常使用本机设备驱动程序所提供的DDSI函数来使用本机设备驱动程序。
3、流接口驱动程序的主要任务就是把外设的使用传递给应用程序,这是通过把设备表示为文件系统的一个特殊文件实现的。对于串口1在用户级别的程序里面通常被描述为COM1。
设备文件名:
1、在WINCE中应用程序通过文件系统里的特殊入口访问外围设备。WINCE中的文件系统代码包括那些识别特殊文件名并重定向IO操作到适当的流接口驱动程序的代码。
2、WINCE的设备文件名是由三个大写字母、一个数字和冒号组成的,例如“COM1:”。WINCE使用前面三个字母来识别与特殊流接口驱动程序相对应的特殊设备。文件名前缀存储在称作“Prefix”的注册表键值中,一般来说如果用户想生成自己的流接口驱动程序,就要指定这三个字母的前缀。它可以是任意三个字母。
3、WINCE设备文件名中的数字是用来区分由同一个流接口驱动程序管理的所有设备。设备管理器对索引的编号默认是从1到9,1用于第一个设备文件名,如果需要10个文件名可以把0也用上。
流接口驱动程序入口函数 :
1、每个流接口驱动程序必须实现一组标准的函数,用来完成标准的文件IO函数和电源管理函数,这些函数提供给WINCE内核使用。这些函数通常叫做流接口驱动程序的DLL接口。
7、XXX_IOControl
我主要写一个流接口驱动程序开发 过程:
1、在EVC中新建一个工程
3、编译工程
4、打开PB,并点击“Open Workspace”,选择第1章中的SMDK2410工程。目录为E:\WINCE420\PUBLIC\SMDK2410。
7、编译
void CTestDRVDlg::OnBtnOpen() {
// Open the device file
hStr=CreateFile(TEXT("TST1"), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(INVALID_HANDLE_VALUE==hStr)
{
::MessageBox(NULL, _T("Cannot open TST1:"),_T("TestDRV"), MB_OK);
}else
{
::MessageBox(NULL, _T("Open TEST1: Succed"),_T("TestDRV"), MB_OK);
}
}
void CTestDRVDlg::OnBtnClose()
{
if(hStr!=NULL)
{
CloseHandle(hStr);
hStr=NULL;
}
}
void CTestDRVDlg::OnBtnRead()
{
WCHAR wch[256];
DWORD dwBytesRead=256;
memset(&wch, '\0', 256*sizeof(WCHAR));
::ReadFile(hStr, wch, sizeof(wch), &dwBytesRead, NULL);
::MessageBox(NULL, wch, TEXT("TestDRV"), MB_OK);
}
void CTestDRVDlg::OnBtnWrite()
{
DWORD dwWritten=0;
WCHAR* pString = TEXT("This is a test of WINCE device driver. This is only a test");
::WriteFile(hStr, pString, (_tcslen(pString) + 1), &dwWritten, NULL);
}
void CTestDRVDlg::OnBTNIOControl()
{
::DeviceIoControl(hStr, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
有问题大家可以找我啊,最近正在搞WINCE,谢谢大家。