介紹一下如何重新編譯Arduino 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


介紹一下如何重新編譯Arduino 16U2 的Firmware

2.2 打開 cmd 命令行模式,進入目錄中,使用make 命令編譯 Lufa 的工程,這是為了測試 Lufa 是否正常

3. 正式的編譯

3.1 16U2 Firmware source code 在\\hardware\\arduino\\avr\\firmwares\\atmegaxxu2\\arduino-usbserial中,你要把整個目錄copy到 Lufa 的Project目錄下。例如:

介紹一下如何重新編譯Arduino 16U2 的Firmware

3.2 命令行進入這個目錄,輸入 make 即可編譯出新的 HEX

介紹一下如何重新編譯Arduino 16U2 的Firmware

介紹一下如何重新編譯Arduino 16U2 的Firmware


最後,把這個生成的HEX文件刷寫到16U2上即可。

Note:編譯時你可能遇到一些奇怪的錯誤信息,例如 “incompatible with avr”產生的原因是 2.2 步驟測試時生成了一些非 AVR8 格式的中間文件。你重新到 Lufa 根目錄下,運行 make clean 清除測試生成的中間文件即可。

上面是重新編譯 16U2的方法,下面說點關於USB的事情。

我們先插入一個 Arduino Uno,在設備管理器中查看他的一些信息。

介紹一下如何重新編譯Arduino 16U2 的Firmware

其中最重要的就是 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


分享到:


相關文章: