如何重新编译 16U2 的Firmware

Arduino Uno 上16U2 芯片的作用是烧写328P Firmware。具体来说,它负责把PC上的USB转为328P能够识别的串口,然后每次刷写的时候它会先用一个Pin将328P拉到 Reset状态下,然后从串口“喂”给328P 需要的Firmware.
本文介绍的就是:如何重新编译 16U2 上面的Firmware.
1. Download WinAVR 我使用的是 20100110 的安装版
2. Download LUFA-100807 特别注意,一定要这个版本,我试验过最新的版本,居然自己的测试编译项目都无法通过
2.1 Lufa 随便解压到一个目录,我是解压到C:\WinAVR-20100110\LUFA-100807
2.2 打开 cmd 命令行模式,进入目录中,使用 make 命令编译 Lufa 的工程,这是为了测试 Lufa 是否正常
image001

3. 正式的编译
3.1 16U2 Firmware source code 在\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial 中,你要把整个目录copy到 Lufa 的Project目录下。例如:
image002

3.2 命令行进入这个目录,输入 make 即可编译出新的 HEX
image003

image004

最后,把这个生成的HEX文件刷写到16U2上即可。
Note:编译时你可能遇到一些奇怪的错误信息,例如 “incompatible with avr”产生的原因是 2.2 步骤测试时生成了一些非 AVR8 格式的中间文件。你重新到 Lufa 根目录下,运行 make clean 清除测试生成的中间文件即可。
上面是重新编译 16U2的方法,下面说点关于USB的事情。
我们先插入一个 Arduino Uno,在设备管理器中查看他的一些信息。

image005

其中最重要的就是 USB 的 PID 和 VID.众所周知 USB 是一种 PNP (即插即用设备),当然,实际上这个名称和实际的效果差别很远,插上之后还需要安装驱动等等动作之后才能保证你的设备能够正常使用。所谓PnP的真正含义是:连接硬件之后能够自动识别。比如插上一块PCI卡,PC能够知道它用的资源是多少,基本功能是什么。X86电脑上的设备有 Non-Pnp 和 Pnp两种:
1. Non–PnP 方式。具体实现方法有两种,一种是直接“吸收”特定内存或者IO 端口数据。以ISA串口卡为例,当这个卡看到ISA总线上出现发往 0x3F8 IO端口的数据就知道这是在和串口通讯,它会要吸收这个信号并且转发到外面的实体上;另外一种方法是直接“写死”。比方说,内置驱动程序,强行加载。大多数 x86 上的安卓系统就是这样玩的。还有可以通过 ACPI 的 ASL 来通知系统,比如:平板电脑上挂接在 I2C总线上的设备需要用这样的方式通知Windows,当前这个设备的地址传输速度等等。
2. Pnp 方式。 PCI和USB 设备就是典型的 Pnp设备。协议本身就规定了设备如何报告ID给系统,系统用这个ID来识别需要的资源和驱动等等。
从发展上来看,Pnp 是后面才出现的,他的出现也避免了很多用户设置上的麻烦。比如,很早之前,如果系统中有很多使用某个io端口的ISA卡,用户只能一次次跳线来避免冲突反复尝试。时至今日,大多数电脑从生产出来开始,用户几乎没有打开机箱的必要(由于硬件接口的不断变化,电脑升级通常只意味着更换一台)。
继续说 USB ,每个USB设备在插入之后,都会向上报告自己的 VID (Vendor ID),PID (Product ID)。通过这两个ID, 系统就能够知道这是 X 厂商生产的 Y 设备。顺便说一句,如果你系统中出现了无法识别的USB设备,你可以直接在网上搜索 USB PID VID通常能够顺利找到对应的驱动。
上面的各种USB相关数据都能搜索到,下面讲点书本之外的: PID 和 VID 怎么来的。
在世界上有一个USB组织【参考1】,他们负责制定USB标准(在电脑界,越是开放的协议越容易流行,相反那些不愿意透露一点信息而大肆吹嘘厉害的协议很少有人支持或者说更多只是骗局而已)。这个组织会负责分配 VID。当然加入这个组织是要缴纳会费的,如果没有记错的话差不多是$2000一年(几年之前比较便宜,后来涨价了。对于个人来说看着比较多,但对于公司来说只是九牛一毛)。加入这个组织可以给自己申请一个 VID 。有了 VID 之后,可以自己随心编造 PID了。PID 范围是从 0到0xFFFF 。如果你想把你的设备加入到 Windows的 Update中(就是那个有时候找不到驱动,Windows提示网上搜索的功能),正规的 VID和PID是必不可少的。
说道这里,再说一个事情:我目前用到的最好用的USB转串口芯片是 FT232系列的,稳定,支持的驱动也很全。前几年很多人发现他们原来用的好好的基于FT232 芯片的产品忽然变得不正常。最终发现,FT232的生产厂家更新了驱动,新的驱动会“毁坏”产品上的FT232芯片(PID变成0000).新的驱动是通过Windows Update分发的。而厂商这样做的原因是“市场上充斥着山寨货和假货,通过包装很难区分真正的和假冒的FT232,但芯片的硅组成上有着巨大的差异,新的FT232驱动利用这些差异,对其重组,导致这些假冒产品无法兼容现有的驱动程序。这是一个大胆的策略来减少市场上的假冒FTDI。”
下面讲不正规的做法:
1. 你选用的USB IC,比如:你的产品用了CYPRESS公司出品的EZ-USBFX的某款IC,那么你可以直接找CYPRESS,让他们给你一个 PID;
2. 网上有一家公司【参考2】出售自己的PID。他是很多年前加入USB组织的,拿到了一个 VID。然后他就在网上出售自己的PID(6万多个足够卖一阵了)。后来他们收到 USB组织的律师函,意思是说你这样做是不对的,根据协议巴拉巴拉。然后他们的回复是,我们当年加入组织的时候,你们的协议没有这样的巴拉巴拉。然后USB组织说亲我可以给你退钱,不要这样玩。他们回复,根据我们国家的消费者相关法律,购买生效之后是不接受这样的事情的……然后他们继续卖
3. 在设计的时候,可以使用兼容Windows自带驱动的协议。比如:HID 或者 mass-Storage。这样的情况下,也不用考虑 PID和VID的问题,插上就可以用。
参考:
1.http://www.usb.org/about/
2.http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注