为了搞懂u***协议原理,我看了很多天的书,感觉很多东西不太确定。然后发现一个好东西,就是u***isp(u***asp),开源的avr下载线,看代码可以把u***原理彻底搞懂,甚至连底层的信号传输都是用软件实现的。并且这个东西功能很简单。但是没有说明书,读代码很累,读了很多很多天,90%多的东西都搞懂了。于是就可以改一些源代码,做做试验什么的。
首先atmega48的源代码不变,刷进去,没有成功。并且单片机发热。找各种原因,每个引脚的接线都看了一遍,没发现问题,陷入困惑中。u***接头用的是一个坏的u***延长线,因为万用表的表笔插入u***接口比较费劲,我只是草率的测过一遍,线的颜色红白绿黑顺序是对的。现在找不到头绪,于是我就又找了一根坏的u***延长线,我把这根线的母头剪下来,然后插到那根待测试的u***接头,我又四根线全部用万用表量了一下,依然没有发现问题,这根母头的线每个颜色都能对上那根待测试的线的颜色。……发愁,找不到原因。然后我想了一下,虽然线的颜色顺序对,但也有可能顺序是整个相反的。于是测了一下,又喜又气。所有正规的u***线都是红色接正,黑色接负,但是我找的这两根线都是顺序相反的……。这两根线是截然不同的,一根很结实的样子,还有磁环,另一根虽然没有磁环,但是线也很粗,做工都不是很差,就是有些坑爹。正负极相反,单片机发热,猜是烧了,然后证实了,为了找毛病用了两个atmega48,全部阵亡。
后来想改一下源代码,让下载线变成hid设备。源代码只改3处,u***config.h里边class改成3,USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 改成 43 。 u***drv.c里边再设备描述符前加入
PROGMEM char u***DescriptorHidReport[] = {
0x06, 0x00, 0xFF, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xA1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8 bits)
// 14 bytes Feature report#1 ( 8 bytes sent to/from host)
0x85, 0x01, // Global Report ID (cannot be 0) Command Report 8 bytes + ID
0x95, 0x08, // Global Report Count 8 (number of Report Size fields)
0x09, 0x00, // Usage Undefined
0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage)
0x26, 0xFF, 0x00, // Local Usage Maximum
0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf)
// 28 bytes Feature report#2 ( 16 bytes sent to/from host)
0x85, 0x02, // Global Report ID (cannot be 0) Data Report 16bytes + ID
0x95, 0x10, // Global Report Count 16 (number of Report Size fields)
0x09, 0x00, // Usage Undefined
0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage)
0x26, 0xFF, 0x00, // Local Usage Maximum
0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf)
// 42 buytes
0xC0 // END_COLLECTION
};
这个hid报表描述符,我从网上看了很多教程,然后又找的现成的描述符,试了好几个,都是插入电脑只有接入声音没有拔出声音。我用的wireshark3.2.0,来分析u***数据。每次发送完设备描述符,配置描述符,字符串描述符,然后请求报表描述符,请求3次,设备没有回应,然后复位u***设备,然后反复循环如此。于是各种改源代码找原因。看不见摸不着的东西找问题很费劲,于是又接上一个指示灯。每次都要执行到一个switch里边,把灯亮语句放在switch的开头就亮 ,放到结尾就不亮。怀疑是到哪个case出了问题,于是10来个case各种删除然后编译,有时删了这个case正常有时删那个正常,最后总结case只要删的多就正常,最后明白了------》atmega48容量太小,程序超过了4k,刷机时不提示任何错误。最后把不重要的功能删除,刷入,正常。
开始我用的libu***开源库做的实验,改成hid设备之后发现libu***用不了了,又学了一下hidapi开源库。
为了搞懂u***协议原理,我看了很多天的书,感觉很多东西不太确定。然后发现一个好东西,就是u***isp(u***asp),开源的avr下载线,看代码可以把u***原理彻底搞懂,甚至连底层的信号传输都是用软件实现的。并且这个东西功能很简单。但是没有说明书,读代码很累,读了很多很多天,90%多的东西都搞懂了。于是就可以改一些源代码,做做试验什么的。
首先atmega48的源代码不变,刷进去,没有成功。并且单片机发热。找各种原因,每个引脚的接线都看了一遍,没发现问题,陷入困惑中。u***接头用的是一个坏的u***延长线,因为万用表的表笔插入u***接口比较费劲,我只是草率的测过一遍,线的颜色红白绿黑顺序是对的。现在找不到头绪,于是我就又找了一根坏的u***延长线,我把这根线的母头剪下来,然后插到那根待测试的u***接头,我又四根线全部用万用表量了一下,依然没有发现问题,这根母头的线每个颜色都能对上那根待测试的线的颜色。……发愁,找不到原因。然后我想了一下,虽然线的颜色顺序对,但也有可能顺序是整个相反的。于是测了一下,又喜又气。所有正规的u***线都是红色接正,黑色接负,但是我找的这两根线都是顺序相反的……。这两根线是截然不同的,一根很结实的样子,还有磁环,另一根虽然没有磁环,但是线也很粗,做工都不是很差,就是有些坑爹。正负极相反,单片机发热,猜是烧了,然后证实了,为了找毛病用了两个atmega48,全部阵亡。
后来想改一下源代码,让下载线变成hid设备。源代码只改3处,u***config.h里边class改成3,USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 改成 43 。 u***drv.c里边再设备描述符前加入
PROGMEM char u***DescriptorHidReport[] = {
0x06, 0x00, 0xFF, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xA1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8 bits)
// 14 bytes Feature report#1 ( 8 bytes sent to/from host)
0x85, 0x01, // Global Report ID (cannot be 0) Command Report 8 bytes + ID
0x95, 0x08, // Global Report Count 8 (number of Report Size fields)
0x09, 0x00, // Usage Undefined
0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage)
0x26, 0xFF, 0x00, // Local Usage Maximum
0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf)
// 28 bytes Feature report#2 ( 16 bytes sent to/from host)
0x85, 0x02, // Global Report ID (cannot be 0) Data Report 16bytes + ID
0x95, 0x10, // Global Report Count 16 (number of Report Size fields)
0x09, 0x00, // Usage Undefined
0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage)
0x26, 0xFF, 0x00, // Local Usage Maximum
0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf)
// 42 buytes
0xC0 // END_COLLECTION
};
这个hid报表描述符,我从网上看了很多教程,然后又找的现成的描述符,试了好几个,都是插入电脑只有接入声音没有拔出声音。我用的wireshark3.2.0,来分析u***数据。每次发送完设备描述符,配置描述符,字符串描述符,然后请求报表描述符,请求3次,设备没有回应,然后复位u***设备,然后反复循环如此。于是各种改源代码找原因。看不见摸不着的东西找问题很费劲,于是又接上一个指示灯。每次都要执行到一个switch里边,把灯亮语句放在switch的开头就亮 ,放到结尾就不亮。怀疑是到哪个case出了问题,于是10来个case各种删除然后编译,有时删了这个case正常有时删那个正常,最后总结case只要删的多就正常,最后明白了------》atmega48容量太小,程序超过了4k,刷机时不提示任何错误。最后把不重要的功能删除,刷入,正常。
开始我用的libu***开源库做的实验,改成hid设备之后发现libu***用不了了,又学了一下hidapi开源库。
举报