基于LUFA開源框架庫對AVR芯片進行USB終端設備開發(fā)
從示例可以看出,在LUFA框架下,bootloader的開發(fā)有了極大的效率提升。開發(fā)者可以通過簡單地修改USB設備的描述頁信息,添加或修改相關(guān)的傳輸協(xié)議,即可快速開發(fā)出符合需求的bootloader模塊。
本文引用地址:http://cafeforensic.com/article/262220.htm● 設備開發(fā)示例說明
對于USB設備來說,首先進行USB枚舉設定(setup過程),然后如果沒錯誤,就可以開始USB設備的正常工作狀態(tài)了。既然LUFA已經(jīng)為開發(fā)者做出了眾多可能的基本設置,開發(fā)者只需要知道個大概流程,大多數(shù)事情都可以留給LUFA來做了。
首先,是0號端點(Endpoint 0)和控制傳輸模式。0號端點主要用于USB設備枚舉。在枚舉過程中,主機給設備分配相應的地址信息,同時也在讀取設備信息,如設備類型。主機通過發(fā)送相應的控制指令給設備,設備回復相關(guān)信息給主機,完成握手通信,最后完成相關(guān)的設置。LUFA基本上能全自動地完成所有的相關(guān)工作,開發(fā)者只需要知道該怎么設置而已。如圖4。
接下來,是數(shù)據(jù)傳輸過程。當設定過程完成之后,數(shù)據(jù)傳輸過程的方向、可用端點的大小等基本信息已經(jīng)確定下來了。這個時候,設備和主機之間就能進行正常的數(shù)據(jù)傳輸了。LUFA提供了多種不同的方式來接收數(shù)據(jù)包。通常來說,設備端點收到數(shù)據(jù)之后,會向主機返回“ACK”指令,以告知數(shù)據(jù)包已收到,但是最終的一個“ACK”指令包則不會自動回復,需要用戶在程序里面實現(xiàn)。不過,對于開發(fā)者來說,只需要認真研讀一下示例文件就可以理解,并得知實現(xiàn)方式。
以Demo/Device/ClassDriver/Keyboard/這個項目為例。文件Descriptors.c里面,記錄了USB設備的描述值,包括傳輸過程中的設備描述值,和枚舉階段的配置描述值,還有返回設備描述值調(diào)用的一個函數(shù)。這些相應參數(shù),可在工程實踐中,按需修改。文件Keyboard.c里面,包含了程序的主入口main()函數(shù)。
main()函數(shù)中,SetupHardware()實現(xiàn)了基本的硬件初始化功能,值得注意的是USB_Init()函數(shù)。這個USB_Init()函數(shù),是LUFA框架實現(xiàn)的一個函數(shù)。在這個函數(shù)中,它實現(xiàn)了USB接口相關(guān)的寄存器及I/O的初始化功能,調(diào)用了USB_ResetInterface()函數(shù),以實現(xiàn)USB設備的相關(guān)設置。其中的一個功能是按照開發(fā)的需要,初始化USB設備,使其成為USB控制器或USB設備,在此示例中,初始化為USB設備,調(diào)用USB_Init_Device()函數(shù)。USB_Init_Device()函數(shù)又調(diào)用了一個需要自己按需實現(xiàn)的函數(shù)CALLBACK_USB_GetDescriptor(...)(在Descriptors.c文件中)。至此,完成USB設備的初始化過程。
完成USB設備的初始化過程之后,就開始了一個不斷循環(huán)的函數(shù)體。如果是想實現(xiàn)USB設備的相關(guān)功能,就把相關(guān)的功能模塊寫入這個函數(shù)體內(nèi)就可以了。以Demo/Device/ClassDriver/Keyboard/項目為例,這個循環(huán)體內(nèi)包括兩個函數(shù)模塊:HID_Device_USBTask(&Keyboard_HID_Interface)和USB_USBTask()。前者,調(diào)用了一個函數(shù)CALLBACK_HID_Device_CreateHIDReport(...),以記錄測試哪個按鍵被按下或松開,并記錄下來。后者,純粹地把相應的按鍵信息按照USB協(xié)議的要求發(fā)送出去。實現(xiàn)相關(guān)的USB通信。
因此,如果此時需要完成一個矩陣鍵盤,那么只需要在CALLBACK_HID_Device_CreateHIDReport(...)之內(nèi),插入相應的矩陣鍵盤掃描語句,延時消抖功能等,即可實現(xiàn)開發(fā)需求。其他的設備,如USB音頻設備,U盤,鼠標等,也是類似的實現(xiàn)方式。
4 結(jié)語
對于開發(fā)者而言,LUFA開源框架庫不僅能幫助快速完成相應的項目開發(fā),如果能細讀其代碼,還可以大大地提高相應的編程水平。同時,LUFA開源框架庫的引入,大大地降低了在AVR單片機上開發(fā)USB設備的門檻,極大地提高開發(fā)效率,并且減少了開發(fā)過程中的調(diào)試測試時間,增加了系統(tǒng)的穩(wěn)定性。其示例文檔豐富,入門容易,代碼優(yōu)美穩(wěn)定,邏輯架構(gòu)完美。因此,無論是出于項目開發(fā)的需要,還是能力提升的需要,都可以好好研究或閱讀LUFA開源代碼,借鑒其開發(fā)經(jīng)驗,做出更好更快更優(yōu)質(zhì)的工程項目。
參考文獻:
[1]Atmel.ATmega32u4 Datasheet[M]
[2]Universal Serial Bus Revision 2.0 Specification[S]
[3]LUFA Online Documents[R/OL].(2014-03).http://www.fourwalledcubicle.com/files/LUFA/Doc/140302/
[4]Redecker C.USB Control Transfers with LUFA[R/OL].(2011-10).http://www.avrbeginners.net/new/wp-content/uploads/2011/10/avrbeginners_40_USB_Control_Transfers_with_LUFA_1.0.pdf
[5]USB in a Nutshell[R/OL].(2014-04).http://www.beyondlogic.org/usbnutshell
評論