LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】
转自:http://biancheng.dnbcw.info/linux/257411.html
【1】 如何编译X86下的 uBuntu APP---非常简单:
gcc -o testusb testusb.c
编译完成后即可生成 testusb ,这就是可执行文件。
【2】下面制作一个APP,目的是读取4740的内存。只要能实现这个目标,测试基本就算完成。
#include <stdio.h>
#include <string.h>
#include <ftw.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int usb_boot_fd;
#define USBTEST_REQUEST _IOWR('U', 100, struct usbtest_param)
int read_from_4740()
{
unsigned char Buffer0[256];
unsigned char Buffer1[512];
int res,i;
if ((usb_boot_fd = open ("/dev/usb_boot", O_RDWR)) < 0) {
perror ("can't open dev file r/w");
return -1;
}
Buffer0[0]=0x40;
Buffer0[1]=0x01; //Reqest 01===>SET DATA ADDRESS
Buffer0[2]=0xC0; //Byte2
Buffer0[3]=0xBF; //Byte3
Buffer0[4]=0x00; //Byte0
Buffer0[5]=0x00; //Byte1
Buffer0[6]=0x00;
Buffer0[7]=0x00;
res=ioctl (usb_boot_fd, USBDEVFS_IOCTL, Buffer0);
//==========
Buffer1[0]=0x40;
Buffer1[1]=0x02; //Reqest 02===>SET DATA LENGTH
Buffer1[2]=0x00; //Byte2
Buffer1[3]=0x00; //Byte3
Buffer1[4]=0x00; //Byte0
Buffer1[5]=0x02; //Byte1
Buffer1[6]=0x00;
Buffer1[7]=0x00;
res=ioctl (usb_boot_fd, USBDEVFS_IOCTL, Buffer1);
memset(Buffer1,0x00,0x200);
res=read(usb_boot_fd,Buffer1,0x20);
printf("\nRead Buffer 0xBFC00000: res=%d\n",res);
for(i=0;i<0x20;i++)
{
if (0==(i%16)) printf("\n");
printf(" %2.2X",Buffer1[i]);
}
printf("\n===========\n");
close (usb_boot_fd);
}
上述程序非常简单,本来一天就可以调试成功,谁知,测试失败!每次都是读取失败!
f440df80 3225088196 S Co:019:00 s 40 01 80c0 0000 0000 0
f440df80 3225374404 C Co:019:00 0 0
f440df80 3225374785 S Co:019:00 s 40 02 0000 0200 0000 0
f440df80 3225499216 C Co:019:00 0 0
f440df80 3225499692 S Bi:019:01 -115 32 <
f440df80 3225515295 C Bi:019:01 -75 32 = 00000000 ....00000000 00000000
U盘,正确的输出:
f446e580 2935176097 S Bo:018:01 -115 31 = 55534243 04000000 ....00000
f446e580 2935188508 C Bo:018:01 0 31 >
f446e580 2935188925 S Bi:018:01 -115 13 <
f446e580 2935203774 C Bi:018:01 0 13 = 55534253 04000000 00000000 00
错误码:kernel\include\asm-generic\errno.h 其中:
#define EINPROGRESS 115 /* Operation now in progress */
#define EOVERFLOW 75 /* Value too large for defined data type */
总是出现错误码: -75,也就是说,EOVERFLOW,
验证一下,读取0x200字节,一切OK!

500)this.width=500;">
LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】的更多相关文章
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试
相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控 用python + hadoop streami ...
- 编写和调试Android下JNI程序流程
1,切换到Android目录下bin/classes,使用javah命令生成jni所需的头文件,命令类似于:javah com.xxx.ooo,其中,com.xxx为package名称,ooo为包含n ...
- Java初学者作业——编写Java程序,实现用户登录验证。
返回本章节 返回作业目录 需求说明: 编写Java程序,实现用户登录验证. 若用户名与密码输入正确,则提示"登录成功,欢迎回来!",若用户名与密码不匹配,则提示"用户名和 ...
- 转 : 用Delphi编写安装程序
http://www.okbase.net/doc/details/931 还没有亲自验证过,仅收藏 当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步 ...
- 如何让VS2012编写的程序在XP下运行
Win32主程序需要以下设置 第一步:在工程属性General设置 第二步:在C/C++ Code Generation 设置 第三步:SubSystem 和 Minimum Required Ve ...
- (七)JavaScript之[调试]与[前端表单验证]
12].调试为什么要去调试?1.在编写JavaScript时,如果没有调试工具将是一件很痛苦的事情.2.没有调试工具是很难去编写JavaScript程序的.3.编写的代码可能包含语法错误.逻辑错误,如 ...
- 如何使用c#编写单片机程序
因为个人喜爱想研究单片机,但是不太会c,然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序,本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经 ...
- 如何让VS2013编写的程序
总体分c++程序和c#程序 1.c++程序 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以. 额外说明:(1)程序必须为Dotnet 4.0及以下版本.(XP只支持 ...
随机推荐
- js仿QQ拖拽删除
原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...
- Shell脚本创建Nginx的upstream及location配置文件
#!/bin/sh ##################################################### # Name: create_nginx_conf.sh # Versi ...
- P4291 [HAOI2008]排名系统
题目描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务器负担,在返回 ...
- The Bells are Ringing UVALive - 4060(枚举求解)
输出整数N,使得 t1 <= N 统计有多少组t1,t2,t3,满足:1<t1<t2<t3<=1000000,t3-t1<=25,且t1,t2,t3的最小公倍数 ...
- uoj50【UR#3】链式反应
题解: 令$a(x)$为破坏死光的$EFG$,$f(x)$为方案的$EGF$:$f(x) = x + \int \ \frac{1}{2} f^2(x) a(x) \ dt$; 注意到$f(0)= ...
- c++ 宏多态 动态多态和静态多态(转载)
转载出处:通道 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形.在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关 ...
- servlet解析
什么是Servlet2,Servlet有什么作用3,Servlet的生命周期4,Servlet怎么处理一个请求5,Servlet与JSP有什么区别6,Servlet里的cookie技术7,Servle ...
- 从新浪JS服务器获得股票和股指深度行情(.NET)
当我们需要通过网络来自动获取股指或股票的深度行情时,一般有以下两种方法可以获得.目前除了使用Python进行爬虫获取(需要解析html获得)外还可以通过新浪提供的JS行情服务器获得,本文采用的是后者( ...
- 线程属性API
数据类型:pthread_attr_t 操作API: // 初始化线程属性 int pthread_attr_init(pthread_attr_t *attr);// 初始化为系统支持的所有属性的默 ...
- 「Vue」实用组件
一.时间格式 1.安装Moment模块 npm i moment -S2.main.js中设置全局过滤器 import moment from 'moment' Vue.filter('ctime', ...