Window XP驱动开发(十四) 驱动应用程序端代码实现(针对USB2.0 芯片CY7C68013A,基于CyAPI.lib与Bulkloop固件)

2023-10-29

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家提出意见,一起讨论!

需要源码的可以与我联系.

 

在我的一篇文章    Window XP驱动开发(十二) 驱动应用程序端 (原理分析)

中讲到了驱动应用程序端的开发原理。

这里针对CY7C68013A供应商提供的 .sys .inf及提供的.lib文件进行应用程序端的开发。

 先看一下界面效果:

一、环境

http://www.cypress.com/?rID=34870 下载 CY7C68013的组件开发安装程序。

下载后得到

 

安装后得到驱动安装文件与应用程序开发库:

图一:

 

 

 

二、应用程序开发

现在我们就基于CyAPI.lib进行三次开发。

1、首先将 CyAPI.lib 与 CyAPI.lib加入到我们工程的链接中。(相对简单,不介绍了)

2、代码实现:

2、1  创建CCyUSBDevice接口

           USBDevice = new CCyUSBDevice(m_hWnd);   // Create an instance of CCyUSBDevice

2、2  获得设备列表,并找开设备。用:

         UCHAR                 DeviceCount(void);

         bool                  Open(UCHAR dev);

          获得端点列表,用:

         UCHAR                 EndPointCount(void);

         

void CBulkLoopDlg::OnRefreshBtn() 
{
    int i;

    // if we are currently running loopback, stop
    if (XferThread)
    {
        bLooping = false;

        InEndpt->Abort();
        InEndpt->Reset();

        OutEndpt->Abort();
        OutEndpt->Reset();

        m_StartBtn.SetWindowText("Start");
    }

    // clear the combo boxes
    m_DeviceListComBox.ResetContent();
	m_InEndptComBox.ResetContent();  
	m_OutEndptComBox.ResetContent();

    // make sure there is at lesat one device out there
    if (USBDevice->DeviceCount())
    {
        // search for all connected devices, and add them to the device
        // combo box
        for (i = 0; i < USBDevice->DeviceCount(); i++)
        {
            USBDevice->Open(i);

            m_DeviceListComBox.AddString(USBDevice->DeviceName);
        }


        m_DeviceListComBox.SetCurSel(0);
        OnSelchangeDeviceListCombox();		// This will set the device index and load the ep lists

    }	
}


 

void CBulkLoopDlg::OnSelchangeDeviceListCombox() 
{
    int i;
    char s[12];

    DeviceIndex = m_DeviceListComBox.GetCurSel();

    USBDevice->Open(DeviceIndex);

	// 获得端点数目
    int epts = USBDevice->EndPointCount();
    CCyUSBEndPoint *endpt;

	// Load the endpoint combo boxes
    // 跳过端点0,因为我们知道它是控制端点
	for (i=1; i<epts; i++)
    {    
        endpt = USBDevice->EndPoints[i];

        if (endpt->Attributes == 2)		// Bulk
        {
            sprintf(s, "0x%02X", endpt->Address);

			
            if (endpt->Address & 0x80)	// In 端点
            {
                m_InEndptComBox.AddString(s);
                m_InEndptComBox.SetItemData(m_InEndptComBox.GetCount()-1,i);
            }
            else						// Out端点
            {
                m_OutEndptComBox.AddString(s);
                m_OutEndptComBox.SetItemData(m_OutEndptComBox.GetCount()-1,i);
            }
        }
    }

    m_InEndptComBox.SetCurSel(0);
	m_OutEndptComBox.SetCurSel(0);

    OnSelchangeInCombox();		// Set the InEndpt member
	OnSelchangeOutCombox();		// Set the OutEndpt member

}


2、3  根据选定的In端点与Out 端点进行数据传输.

          Loop线程函数是 XferLoop,用到的函数有

        PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov);

        bool    WaitForXfer(OVERLAPPED *ov, ULONG tOut); 

        bool FinishDataXfer(PUCHAR buf, LONG &len, OVERLAPPED *ov, PUCHAR pXmitBuf, CCyIsoPktInfo* pktInfos = NULL);

 

void CBulkLoopDlg::OnStartBtn() 
{
	if (XferThread) {
		bLooping = false;

//		InEndpt->Abort();
//		InEndpt->Reset();

//		OutEndpt->Abort();
//		OutEndpt->Reset();

		m_StartBtn.SetWindowText("Start");
	} else {

		char s[12];
		ZeroMemory(s,12);
		m_XferSize.GetLine(0,s,8);
		LONG xfer = atol(s);
		if (xfer > 2048) {
			xfer = 2048;
			m_XferSize.SetWindowText("2048");
		}

        USBDevice->Open(DeviceIndex);
        OutEndpt = USBDevice->EndPoints[m_OutEndptComBox.GetItemData(m_OutEndptComBox.GetCurSel())];
        InEndpt = USBDevice->EndPoints[m_InEndptComBox.GetItemData(m_InEndptComBox.GetCurSel())];

		// Launch the looping thread  (Calls XferLoop() function, above.)
		if (xfer && USBDevice->IsOpen()) {
			bLooping = true;
			XferThread = AfxBeginThread(XferLoop, this);
		}

		m_StartBtn.SetWindowText("Stop");
	}
	
}


 

UINT XferLoop( LPVOID params ) {

    OVERLAPPED outOvLap, inOvLap; 

    CBulkLoopDlg *dlg = (CBulkLoopDlg *) params;
	char s[24];						ZeroMemory(s, 24);
	
	dlg->m_XferSize.GetLine(0,s,8);
	LONG xfer = atol(s);
	PUCHAR data = new UCHAR[xfer];	ZeroMemory(data,xfer);
	PUCHAR inData = new UCHAR[xfer];	ZeroMemory(inData,xfer);

    outOvLap.hEvent  = CreateEvent(NULL, false, false, "CYUSB_OUT"); 
    inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN"); 

	dlg->m_SeedValue.GetLine(0,s,8);
	LONG seed = atol(s);

	int stopOnError = dlg->m_StopOnErrorChkBox.GetCheck();

	stuffBuff(data,xfer,seed,dlg->m_FillPatternComBox.GetCurSel());

	dlg->m_StatusLabel.SetWindowText(" STATUS: Transferring data . . .");
	dlg->m_SuccessCount.SetWindowText("0");
	dlg->m_FailureCount.SetWindowText("0");

	bool success;
	LONG nSuccess = 0;
	LONG nFailure = 0;

    if (dlg->m_DisableTimeoutChkBox.GetCheck())
    {
        dlg->OutEndpt->TimeOut = 0;
	    dlg->InEndpt->TimeOut = 0;
    }
    else
    {
        dlg->OutEndpt->TimeOut = 2000;
	    dlg->InEndpt->TimeOut = 2000;
    }

	for (;dlg->bLooping;) {
        LONG outlen,inlen,len;

        outlen = inlen = len = xfer;     // Use temp var because XferData can change the value of len

		// 发送数据给USB设备
	    UCHAR  *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap);
		// 从USB设备中读到数据
	    UCHAR  *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);

		// 等待
        dlg->OutEndpt->WaitForXfer(&outOvLap,2000); 
        dlg->InEndpt->WaitForXfer(&inOvLap,2000); 

		// 完成数据传输
        success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext); 
        success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext); 


		if (success) {
			bool pass = (memcmp(data,inData,len) == 0);
			if (pass)
				nSuccess++;
			else
				nFailure++;
		} else 
			nFailure++;

		sprintf(s,"%d",nSuccess);
		dlg->m_SuccessCount.SetWindowText(s);
		sprintf(s,"%d",nFailure);
		dlg->m_FailureCount.SetWindowText(s);

		if ((!success) && stopOnError) dlg->bLooping = false;
	} 

    CloseHandle(outOvLap.hEvent); 
    CloseHandle(inOvLap.hEvent); 

	delete [] data;
	delete [] inData;

	dlg->m_StatusLabel.SetWindowText(" STATUS: Stopped");

	dlg->XferThread = NULL;

    dlg->USBDevice->Close();

	return true;
}


 

三、测试方法

1、加载此应用程序对应的CY7C68013固件

固件源码在CYPRESS提供的安装包下:

设计方法请看我的另一篇文章:<<>>

这里我们得把得到的bulkloop.hex单片机文件写入的CY7C里。

我们采用的工具是CYPRESS提供的工具: CyConsole.exe

(1)在运行界面下打开EZ-USB Interface选项界面

 

(2)选择Download按钮,将选择bulkloop.hex

 

(3)写入bulkloop.hex文件后,我们在设备管理器中发现此设备变化无法识别了。

这是因为我们之前的驱动是建立的VID:04B4      PID:8613 基础上的。

而现在我们的VID与PID变了,所以找不到驱动:

为什么PID发生了变化?这是因为bulkloop.hex改变了PID。请看我的文章:

<<http://blog.csdn.net/chenyujing1234/article/details/7722669>>

 

接下来我们修改CyUsb.inf文件。

 

2、修改CyUsb.Inf(请将以下的8613改为我们实际的PID,eg: 1004)

中的CyUSB.chm里有讲到怎么对CyUSB.INF进行修改,使之在具体的应该中使用.

1、1  增加设备的标识符到驱动中

把 图一中的CyUSB.inf中的

;%VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USB\VID_XXXX&PID_XXXX

改为:

%VID_04B4&PID_8613.DeviceDesc%=CyUsb, USB\VID_04B4&PID_8613

 

1、2 替换Cypress 串,使之与自己的公司描述更确切。

CYUSB_Provider    = "Cypress"
CYUSB_Company     = "Cypress Semiconductor Corporation"
CYUSB_Description = "Cypress Generic USB Driver"
CYUSB_DisplayName = "Cypress USB Generic"

1、3  执行一个通用的GUID

   应用程序软件通过驱动的的GUID访问驱动,每一个Window系统的驱动都应该有一个唯一的GUID

因为可能会有不同的硬件供应商,这样就会有很多CYUSB.SYS的实例。我们可以通过GUIDGEN.exe来产生我们

自己的GUID。并把此GUI写在CyUSB.inf中

CYUSB.GUID="{AE18AA60-7F6A-11d4-97DD-00010229B959}"

 

1、4  在启动时执行一个脚本

  CYUSB.sys驱动在启动时能被配置到默认的控制端点(端点0)。

为了配置设备使之能表现控制传输,我们用CyConsole.exe来创建一个脚本文件。

我们保存此脚本文件为MyDevice.SPT,把此文件放到.INF文件下。

目的是让此脚夫本文件把固件镜像下载到设备中。

1、4、1  在CyUSB.inf中的 [CYUSB.AddReg.Guid]下添加

HKR,,DriverEXECSCRIPT,,%CYUSB.EXECSCRIPT%

1、4、2  在[Strings]下添加

 CYUSB.EXECSCRIPT="\systemroot\system32\MyDevice\MyDevice.spt"

 

2、强制系统用CYUSB.sys驱动

由于cyusb.inf文件中没有提供DefaultInstall 默认安装节点,但我们可以通过EzDriverInstaller安装(请参见:http://blog.csdn.net/chenyujing1234/article/details/7676812

安装完后,我们的应用程序才有意义,接下来开始测试应用程序了。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Window XP驱动开发(十四) 驱动应用程序端代码实现(针对USB2.0 芯片CY7C68013A,基于CyAPI.lib与Bulkloop固件) 的相关文章

随机推荐

  • Redis系列 - Redis缓存更新:先更新数据库还是先更新缓存?

    Redis系列 Redis缓存更新 先更新数据库还是先更新缓存 在更新缓存时 对于更新完数据库 是更新缓存呢 还是删除缓存 又或者是先删除缓存 再更新数据库 其实都会存在一定的问题 Cache Aside Pattern 旁路缓存模式 这是
  • TCP协议(全面)

    TCP协议 TCP的全称是Transmission Control Protocol 即传输控制协议 TCP工作在传输层上 其职责是 实现主机间进程到进程的通信 其次还需要保证可靠性 不是安全性 换言之不能保证安全性 什么是可靠性 重点在前
  • VSCode配置python开发环境无法找到自己设置的python编译器

    VSCode配置python开发环境无法找到自己设置的python编译器 前言 一 分别安装VScode和python 二 vscode配置python环境 1 在vscode里安装官方python插件 2 修改配置文件 前言 听说开发py
  • LCT维护子树信息(子树信息LCT) LCT维护边权(边权LCT) 知识点讲解

    扯淡 前言 众所周知LCT可以支持关于点权的链修改 换根 LINK CUT和查询链信息操作 但是总有那么些神犇 毒瘤 出题人会让你在支持链修改 换根 LINK和CUT操作的情况下去支持子树查询 或者维护关于边权的链修改 换根 LINK CU
  • Hadoop安装完全分布式搭建

    1 安装Hadoop 上传Hadoop的指定路径 root softwares 解压安装 cd root softwares tar zxvf hadoop 2 7 3 tar gz C usr local 配置环境变量 vim etc p
  • SHELL编程Nginx源码多版本脚本

    转载来源 京峰教育 因为Nginx是基于C语言开发的源代码程序 默认不能被Linux操作系统直接 识别和使用 需要经过C编译器将源代码文件编译生成二进制文件方可 要执行 源码软件部署三个步骤 预编译 configure prefix usr
  • 第一章 Elastic Stack入门

    一 预备知识Restful 1 起源 在没有前后端分离概念之前 一个网站的完成总是 all in one 在这个阶段 页面 数据 渲染全部在服务端完成 这样做的最大的弊端是后期维护 扩展极其痛苦 开发人员必须同时具备前后端知识 于是后来慢慢
  • 【平衡二叉搜索树(AVL)-- 旋转】

    目录 前言 1 二叉搜索树的插入 2 AVL树的旋转 1 右单旋 LL 2 左单旋 RR 3 右左双旋 LR 4 左右双旋 RL 完整插入代码以及打印验证 3 为什么需要AVL树 总结 前言 打怪升级 第60天 AVLTree 也就是我们所
  • kube-proxy Failed to retrieve node info: Unauthorized

    kube proxy Failed to retrieve node info Unauthorized 简介 解决方案 简介 最近遇到k8s master被误操作删除的问题 最后经过各方努力把集群恢复了 恢复的过程中遇到calico no
  • LASSO和LARS

    1 LASSO简介 LASSO是一种经典的松弛算法 其全称是The Least Absolute Shrinkage and Selectionator operator 于1996年由Tibshirani提出来 lasso的一个根本思想就
  • 分数阶微积分_从数学发现到物理难题——分数微积分的推导与应用

    一个神奇的发现 迭代积分公式 计算加法时 为了简化同一个数与自己多次相加我们定义了乘法 同样的 为了简化一个数与自己多次相乘 我们定义了乘方 因为这些新的标记方式和新的需要 我们把乘法和乘方运算里的n扩展到了有理数 其中它的特点是 现在我们
  • ais信号接收设备_AIS基站收发机是如何工作的

    船舶自动识别系统 Automatic Identification System 简称AIS系统 由岸基 基站 设施和船载设备共同组成 是一种新型的集网络技术 现代通讯技术 计算机技术 电子信息显示技术为一体的数字助航系统和设备 船舶自动识
  • C/C++从源码到可执行程序的过程

    C C 源码生成平台下的可执行文件 需要经过3个步骤 预处理 编译 链接 1 预处理 将宏 条件编译指令 头文件包含等指令进行展开 也就是说 这是一个代码替换的工作 C C 源码经预处理后 不再存在各种宏指令 但展开后依然是代码的形式 是人
  • 虚拟机windows7安装启动MYSQL5.7

    一 环境 环境 虚拟机VMVare 系统 windows7旗舰版 MYSQL版本 mysql5 7 25 二 具体步骤 1 首先下载安装mysql5 7 25 这里用的是安装版的mysql 网上大多数都是推荐去官网下载 这里推荐的是清华大学
  • RK356x 修改uboot和kernel,让固件支持多个设备树DTB选择

    步骤如下 1 开发环境 1 1 实验环境 1 2 目标 2 Uboot修改 2 1 uboot默认配置文件 config 2 2 uboot从resource img获取DTB和kernel顺序过程 2 3 修改boot mode模式 2
  • Linux —— 1.5万字详解LVM逻辑卷管理

    文章目录 一 逻辑卷管理 1 LVM介绍 2 LVM基本概念 二 逻辑卷LVM应用 1 逻辑卷创建 1 准备物理设备 2 创建物理卷 pvcreate 3 创建卷组并将物理卷加入其中 vgcreate 4 创建逻辑卷 lvcreate 5
  • 前端Vue uni-app App/小程序/H5 通用tree树形结构图

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • [YOLO专题-21]:YOLO V5 - ultralytics代码解析-网络配置文件与总体结构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122369147 目录 第1章 YOL
  • VS2010 如何添加H文件目录和LIB目录

    第一次使用VS2010 也是初学者开始编写VC 程序首先学习编写DLL文件 编译完自己的DLL文件后 要在其它项目中使用 开始遇到很多错 但是在网上搜索了好久后 终于解决了问题 H文件目录 依次点击 项目 XX 属性 C C 常规 在 附加
  • Window XP驱动开发(十四) 驱动应用程序端代码实现(针对USB2.0 芯片CY7C68013A,基于CyAPI.lib与Bulkloop固件)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的可以与我联系 在我的一篇文章 Window XP驱动开发 十二 驱动应用程序端 原理分析 中讲到了驱动应用程序端的