sense
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2518回复:4

HID设备的访问问题

楼主#
更多 发布于:2001-09-18 14:04
我在用Cypress的CY7C63001做一个HID外设,有两个问题请教:
1、驱动的开发我是门外汉,但是有要通过USB总线对外设的
eeprom读写,如果定义两条Vendor-Specific的读写Request,
需要自己写相应的驱动,我想直接用系统提供的HID类的驱动,
所以决定用Set_Report的方式向外设发送一个数据段,其中
包括eeprom读写指令、eeprom地址和待写数据,firmware
parse这个数据段,作出相应的读写操作,这样做可不可以?
eeprom的读写操作都在endpoint0中断中完成,执行时间会不会
引起冲突?
2、这个外设安装时也遇到了问题,我直接用系统的Hiddev.inf
文件安装时,win98下正常,win2000下装到最后一步说:安装
失败,没有为设备指定一个功能驱动程序?而且,98下用HIDVIEW
的Full Test,通过了测试,但在使用API访问外设时,总是找不到
外设,调用DiEnumDeviceInterfaces()后,总说没有Interface的
信息?
请指点。艾,急死了。
SimonCai
驱动牛犊
驱动牛犊
  • 注册日期2001-09-12
  • 最后登录2010-04-27
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-19 23:22
HID设备的访问问题

用set_report发送可以。CY7C63001没有集成EEPROM interface所以你自己必须按照相关protocol进行读或写,花的时间将是ms级,如果这个功能放在endpoint0中断中完成,我想不行。

DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-20 10:02
[QUOTE]原本由 sense 发表
[B]我在用Cypress的CY7C63001做一个HID外设,有两个问题请教:
1、驱动的开发我是门外汉,但是有要通过USB总线对外设的
eeprom读写,如果定义两条Vendor-Specific的读写Request,
需要自己写相应的驱动,我想直接用系统提供的HID类的驱动,
所以决定用Set_Report的方式向外设发送一个数据段,其中
包括eeprom读写指令、eeprom地址和待写数据,firmware
parse这个数据段,作出相应的读写操作,这样做可不可以?
eeprom的读写操作都在endpoint0中断中完成,执行时间会不会
引起冲突?
2、这个外设安装时也遇到了问题,我直接用系统的Hiddev.inf
文件安装时,win98下正常,win2000下装到最后一步说:安装
失败,没有为设备指定一个功能驱动程序?而且,98下用HIDVIEW
的Full Test,通过了测试,但在使用API访问外设时,总是找不到
外设,调用DiEnumDeviceInterfaces()后,总说没有Interface的
信息?
请指点。艾,急死了。 [/B][/QUOTE]
完全可以!你的方案是对的,接着做就可以了!
喜欢清静?享受人生
sense
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-20 10:35
首先,谢谢DKBOY和CBB的指点。
对于第一个问题我试试看吧。
第二个问题能给点提示吗?现在我在98下装好后,用HidView和
USBCheck测试,通过了所有测试,但是我的应用程序就是找不到
这个外设,我检查了一下,VID和PID设置正确,但是当我的应用
程序成功执行完HidD_GetHidGuid(),SetupDiGetClassDevs()后,
在执行SetupDiEnumDeviceInterfaces()时返回:没有发现任何可用信息。怎么会找不到呢?奇怪!
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-09-20 13:00
[QUOTE]原本由 sense 发表
[B]首先,谢谢DKBOY和CBB的指点。
对于第一个问题我试试看吧。
第二个问题能给点提示吗?现在我在98下装好后,用HidView和
USBCheck测试,通过了所有测试,但是我的应用程序就是找不到
这个外设,我检查了一下,VID和PID设置正确,但是当我的应用
程序成功执行完HidD_GetHidGuid(),SetupDiGetClassDevs()后,
在执行SetupDiEnumDeviceInterfaces()时返回:没有发现任何可用信息。怎么会找不到呢?奇怪!
 [/B][/QUOTE]
看一面一段代码:
GUID hidGuid;
HidD_GetHidGuid(&hidGuid);
HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
                                            NULL, // no enumerator
                                            NULL, // no parent
                                            (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));
if(!hDevInfo)
{
       m_st.SetWindowText("Couldn't get handle for HID devices");
        return;
    }

    SP_INTERFACE_DEVICE_DATA devInfoData;
    devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
    int deviceNo = 0;

    SetLastError(NO_ERROR);

    while(GetLastError() != ERROR_NO_MORE_ITEMS)
    {
        if(SetupDiEnumInterfaceDevice (hDevInfo,
                                       0,
                                       &hidGuid,
                                       deviceNo,
                                       &devInfoData))
        {
            ULONG  requiredLength = 0;
            SetupDiGetInterfaceDeviceDetail(hDevInfo,
                                            &devInfoData,
                                            NULL,
                                            0,
                                            &requiredLength,
                                            NULL);

            PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
            devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

            if(! SetupDiGetInterfaceDeviceDetail(hDevInfo,
                                                 &devInfoData,
                                                 devDetail,
                                                 requiredLength,
                                                 NULL,
                                                 NULL))
            {
                AfxMessageBox("Couldn't get HID details");
                free(devDetail);
                return;
            }

            // open a file to this device
            HANDLE hidHandle = CreateFile(devDetail->DevicePath,
                                          GENERIC_READ | GENERIC_WRITE,
                                          FILE_SHARE_READ | FILE_SHARE_WRITE,
                                          NULL,
                                          OPEN_EXISTING,
                                          FILE_FLAG_OVERLAPPED,
                                          NULL);
            free(devDetail);

            if(INVALID_HANDLE_VALUE == hidHandle)
            {
                AfxMessageBox("Couldn't get HID handle");
                return;
            }
喜欢清静?享受人生
游客

返回顶部