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);
??????? }
??????? 上述程序非常簡單,本來一天就可以調試成功,誰知,測試失敗!每次都是讀取失敗!
??????? 我的USB MON 輸出:
???????? 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, 我 google: URB EOVERFLOW 很久其中有一條搜索給了我提醒: 設備發送的數據過多! 終于讓我悟到:我在協議配置時,要求讀取 0x200字節,在APP中,卻讀取了0x20字節!當然是設備給的多,我要的少! 其實這個問題以前在windows下調試也遇到過,只是當時印象不深啊,這次恐怕印象深刻了!付出了2天的代價啊!
?? 驗證一下,讀取0x200字節,一切OK!
?
500)this.width=500;">??????????
?? 實際驅動本身任何問題,是APP在調用時,協議沒搞好而已!
? ? ? ? 【作者】張昺華 【出處】http://www.cnblogs.com/sky-heaven/ 【博客園】 http://www.cnblogs.com/sky-heaven/ 【新浪博客】 http://blog.sina.com.cn/u/2049150530 【知乎】 http://www.zhihu.com/people/zhang-bing-hua 【我的作品---旋轉倒立擺】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【我的作品---自平衡自動循跡車】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【新浪微博】 張昺華--sky 【twitter】 @sky2030_ 【facebook】 張昺華 zhangbinghua 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
總結
以上是生活随笔為你收集整理的LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 向linux内核加入系统调用新老内核比較
- 下一篇: weblogic与sitemesh乱码问