6908|19

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CE6.0流接口访问物理地址 [复制链接]

我要做一个操作寄存器读写的工具,之前查了资料是用virtualalloc,和virtualcopy两个函数就能搞定,但是又发现CE6.0上不能用virtualcopy了,要用流接口驱动来实现。流接口的每个函数应该怎么定义,我要实现几个函数啊?

最新回复

UUG
虽然不是很清楚,但是有一点概念了,谢谢你  详情 回复 发表于 2010-1-1 20:16
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这是流接口的所有函数,
XXX_Init()
XXX_Denit()
XXX_Open()
XXX_Close()
XXX_Read()
XXX_Write()
XXX_IOControl()
XXX_Seek()
XXX_PowerDown()
XXX_PowerUp()

很多不用实现,只要返回一个值就可以。XXX_Init(),XXX_Open(),XXX_IOControl(),实现着三个函数就能实现了
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
XXX_Open(),这个函数也不用实现,其实看看其它流驱动怎么写的就可以了。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
关键就是实现XXX_IOControl()了; 然后APP调用CreateFile, 然后调用DeviceIoControl就可以了
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
我的blog里有一篇完整实现,希望对你有用
 
 
 

回复

126

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 guopeixin 的回复:
我的blog里有一篇完整实现,希望对你有用

给个链接来吧,找不到
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 jiereliyi 的回复:
XXX_Open(),这个函数也不用实现,其实看看其它流驱动怎么写的就可以了。

就是不会实现,之前没写过驱动。有没有已实现的代码可以参考下呢
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 jjyyhema 的回复:
引用 2 楼 jiereliyi 的回复:
XXX_Open(),这个函数也不用实现,其实看看其它流驱动怎么写的就可以了。

就是不会实现,之前没写过驱动。有没有已实现的代码可以参考下呢


如果你就BSP就看看已有的driver,大部分已经实现这个功能了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
直接使用MmMapIoSpace函数映射吧。
v_pIOP_BAK_regs = (volatile S3C6410_GPIO_REG *)MmMapIoSpace(IOPhyAdr, (ULONG)dwIOSize, FALSE);
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

10
 
mini2440的led驱动。可以参考,比较简单。
[code]#include
//#include
#include
#include
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"


#define IO_CTL_LED_1_ON 0x01
#define IO_CTL_LED_2_ON 0x02
#define IO_CTL_LED_3_ON 0x03
#define IO_CTL_LED_4_ON 0x04
#define IO_CTL_LED_ALL_ON 0x05
#define IO_CTL_LED_1_OFF 0x06
#define IO_CTL_LED_2_OFF 0x07
#define IO_CTL_LED_3_OFF 0x08
#define IO_CTL_LED_4_OFF 0x09
#define IO_CTL_LED_ALL_OFF 0x0a


volatile IOPreg         *s2440IOP = (IOPreg *)IOP_BASE;
volatile INTreg         *s2440INT = (INTreg *)INT_BASE;



BOOL mInitialized;
void Virtual_Alloc();                                                // Virtual allocation



void Virtual_Alloc()
{

    // GPIO Virtual alloc
        s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
        if(s2440IOP == NULL) {
                RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc faiLED!\r\n")));
        }
        else {
                if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
                        RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!\r\n")));
                }
        }

       
}


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;
        case DLL_THREAD_DETACH:
                break;
        case DLL_PROCESS_DETACH:
                break;
#ifdef UNDER_CE
        case DLL_PROCESS_EXITING:
                break;
        case DLL_SYSTEM_STARTED:
                break;
#endif
        }

        return TRUE;
}


BOOL LED_Deinit(DWORD hDeviceContext)
{
        BOOL bRet = TRUE;
       
        RETAILMSG(1,(TEXT("USERLED: LED_Deinit\r\n")));

        return TRUE;
}




BOOL LEDGpioInit()
{
        RETAILMSG(1,(TEXT("LED_Gpio_Setting----\r\n")));
        s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 10)) | (1<< 10);        // GPB5 == OUTPUT.
        s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 12)) | (1<< 12);        // GPB6 == OUTPUT.
        s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 14)) | (1<< 14);        // GPB7 == OUTPUT.
        s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 16)) | (1<< 16);        // GPB8 == OUTPUT.
        return TRUE;
}




DWORD LED_Init(DWORD dwContext)
{
       
        RETAILMSG(1,(TEXT("LED_Init----\r\n")));

        // 1. Virtual Alloc
        Virtual_Alloc();
       
        LEDGpioInit();
       
       
        mInitialized = TRUE;
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL LED_IOControl(DWORD hOpenContext,
                                   DWORD dwCode,
                                   PBYTE pBufIn,
                                   DWORD dwLenIn,
                                   PBYTE pBufOut,
                                   DWORD dwLenOut,
                                   PDWORD pdwActualOut)
{
        LEDGpioInit();
        switch(dwCode)
        {
        case IO_CTL_LED_1_ON:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<5);
                break;
        case IO_CTL_LED_2_ON:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<6);
                break;
        case IO_CTL_LED_3_ON:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<7);
                break;
        case IO_CTL_LED_4_ON:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<8);
                break;
        case IO_CTL_LED_ALL_ON:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0xF<<5);
                break;
        case IO_CTL_LED_1_OFF:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<5);
                break;
        case IO_CTL_LED_2_OFF:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<6);
                break;
        case IO_CTL_LED_3_OFF:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<7);
                break;
        case IO_CTL_LED_4_OFF:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<8);
                break;
        case IO_CTL_LED_ALL_OFF:
                s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0xF<<5);
                break;
        default:
                break;               
        }
   
        RETAILMSG(1,(TEXT("LED:Ioctl code = 0x%x\r\n"), dwCode));
        return TRUE;
}

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

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL LED_Close(DWORD hOpenContext)
{
        s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&(0xF<<5);
        RETAILMSG(1,(TEXT("USERLED: LED_Close\r\n")));
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void LED_PowerDown(DWORD hDeviceContext)
{
        RETAILMSG(1,(TEXT("USERLED: LED_PowerDown\r\n")));
       
        //RETAILMSG(1,(TEXT("CAMERA: LED_PowerDown, m_Dx = D%u, init %d \r\n"), m_Dx, mInitialized));
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void LED_PowerUp(DWORD hDeviceContext)
{
        RETAILMSG(1,(TEXT("USERLED: LED_PowerUp\r\n")));

}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
        RETAILMSG(1,(TEXT("USERLED: LED_Read\r\n")));
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
        RETAILMSG(1,(TEXT("USERLED: LED_Seek\r\n")));
        return 0;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
        RETAILMSG(1,(TEXT("USERLED: LED_Write\r\n")));
        return 0;
}


 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

11
 
代码怎么加,功能不会用啊
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
void WriteToDriver( )
{
        DWORD dwWritten;
        TCHAR *tcString=L"Demo String...";
        HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if (INVALID_HANDLE_VALUE == hDrv) {
                OutputDebugString(L"Failed to open Driver...\n");
        } else {
                WriteFile(hDrv,(LPVOID)tcString,lstrlen(tcString)*sizeof(TCHAR),&dwWritten,NULL);
        }
        CloseHandle(hDrv);
}

void ReadFromDriver( )
{
        DWORD dwRead;
        TCHAR tcTemp[30];
        HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if (INVALID_HANDLE_VALUE == hDrv) {
                OutputDebugString(L"Failed to open Driver...\n");
        } else {
                memset(tcTemp,0x00,30*sizeof(TCHAR));
                ReadFile(hDrv,tcTemp,30,&dwRead,NULL);
                MessageBox(NULL,tcTemp,L"Demo Data",MB_OK);
        }
        CloseHandle(hDrv);
}

void HandleIOCTL( )
{
        HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        TCHAR tcBuffer[10];
        DWORD dwBytesReturned;
       
        lstrcpy(tcBuffer,L"Hello");
       
        BOOL bRet=DeviceIoControl(
                hDrv,
                IOCTL_DRIVER_DEMO,
                tcBuffer,
                lstrlen(tcBuffer)*sizeof(TCHAR),
                tcBuffer,
                lstrlen(tcBuffer)*sizeof(TCHAR),
                &dwBytesReturned,
                NULL);
       
        MessageBox(NULL,tcBuffer,L"IOCTL Test",MB_OK);
        CloseHandle(hDrv);
       
}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

13
 
如上DEM1就是你要使用来读写寄存器的的驱动名。。。一般而言,应用程序直接访问寄存器不推荐
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
流接口函数的这几个句柄搞得好晕,有这几个问题:

1,XXX_init和XXX_Open返回的句柄是不是同一个?
2,上面的两个句柄是怎么得到的?
3,当调用createfile时,他返回的句柄是不是XXX_Open返回的那一个?
4,Readfile和writefile所用的句柄,跟XXX_Read和XXX_Write里的参数hOpenContext是什么关系?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
1.不是
2.XXX_init 创建一个设备句柄,XXX_Open 第一个参数是XXX_init 返回的设备句柄,它会来创建一个文件句柄,供XXX_read,XXX_write之类使用
3.是的
4.这个是同一样东西,即文件内核对象句柄。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 aaa_tnt 的回复:
1.不是
2.XXX_init 创建一个设备句柄,XXX_Open 第一个参数是XXX_init 返回的设备句柄,它会来创建一个文件句柄,供XXX_read,XXX_write之类使用
3.是的
4.这个是同一样东西,即文件内核对象句柄。

但是为什么我见到一些驱动程序,XXX_Open只返回一个整数,比如0,1之类的,而跟踪CreateFile得到的句柄确是一个很大的整数。
而且很多驱动程序没有传递句柄的操作,比如9楼那个程序。XXX_Open传回的是TRUE应该怎么解释呢?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
XXX_Init 返回非0,表示设备管理加载驱动成功,
XXX_Open 返回非0,便是APP打开驱动成功。
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 16 楼 aaa_tnt 的回复:
XXX_Init 返回非0,表示设备管理加载驱动成功,
XXX_Open 返回非0,便是APP打开驱动成功。

你还没有回答我的问题啊,他返回是TRUE的话,那CreateFile得到的句柄也应该是1了吧,可以做为句柄吗?我理解的句柄应该是内存的一个地址
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 16 楼 aaa_tnt 的回复:
XXX_Init 返回非0,表示设备管理加载驱动成功,
XXX_Open 返回非0,便是APP打开驱动成功。

前面这里有一些误解,XXX_Init和XXX_Open 的返回值在9楼这里,实质没有什么意义,和CreateFile的返回值也没有直接联系。规范点的流驱动,例如串口驱动,XXX_Init会返回一个设备句柄,而XXX_Open 会返回一个文件句柄。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 aaa_tnt 的回复:
引用 16 楼 aaa_tnt 的回复:
XXX_Init 返回非0,表示设备管理加载驱动成功,
XXX_Open 返回非0,便是APP打开驱动成功。

前面这里有一些误解,XXX_Init和XXX_Open 的返回值在9楼这里,实质没有什么意义,和CreateFile的返回值也没有直接联系。规范点的流驱动,例如串口驱动,XXX_Init会返回一个设备句柄,而XXX_Open 会返回一个文件句柄。

虽然不是很清楚,但是有一点概念了,谢谢你
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表