1. 描述符的修改:
1.1 配置描述符的修改:
在配置描述符下的HID描述符中修改HID report描述符的位元組大小。修改值改成自己編寫的HID report描述符的位元組數。
1.2 在配置描述符下的端點描述符中指定使用的端點、類型(輸入、輸出)及端點的資料長度。
1.3 在HID report描述符中定義自己的報告(難)
上例中分別定義了輸入報告(device發送資料給PC)和輸出報告(PC發送資料給device)。
每個報告的REPORT_COUNT項定義每發一次次報告中含有多少個資料(最大不能超過63,HID協議每個報告最多64個byte,REPORT ID也是一個資料,所以最大值為63)。
每個報告的REPORT SIZE項定義,報告中每個資料的有效位元,如是以byte為單位則這裡的值應為8。
2. 資料發送與接收
2.1 資料處理修改地方總結
各單片機有自己的USB處理樣本,底層USB ISE的設定、各中斷的控制均已提供相關處理函數,所以不必深究底層USB的控制。只要找到資料發送、接收相關的上層函數,並對其內部做相應修改即可。以silicon F340 HIDtoUART樣本來說,HID資料發送、接收是在ReportHandler.c檔案中。
2.2 修改地方細節描述
HID樣本中,資料發送與接收是通過調用VectorTableEntry結構體的輸入執行個體對象(IN_VECTORTABLE)和輸出執行個體對象(OUT_VECTORTABLE)的報告處理函數來完成的。
調用結構體對象的函數是在F3xx_USB0_ReportHandler.c檔案裡的
void ReportHandler_IN_ISR(unsigned charR_ID)
void ReportHandler_OUT(unsigned charR_ID)
兩個函數中完成的
這兩個函數被在USB0_InterruptServiceRoutione.c檔案裡的底層函數所調用,想瞭解該晶片USB如何工作可以分析這個檔案中的函數工作流程。
上述的voidReportHandler_IN_ISR(unsigned char R_ID)和voidReportHandler_OUT(unsigned char R_ID)兩個函數不需要修改,分析其內建函式中的內容可見,這兩個函數是通過比對ReportID然後調用對應的上層report處理函數來完成資料發送、接收的。在這個樣本中,silicon的工程師採用一個自訂的結構體(VectorTableEntry),將ReportID和Report處理函數關聯起來.
IN_VECTORTABLE和OUT_VECTORTABLE分別是VectorTableEntry結構體數組,數組個數對應著report描述符中自己定義的report個數。IN_VECTORTABLESize和OUT_VECTORTABLESize宏定義與之對應。
圖片樣本已經是我自己修改過的,原樣本中輸入、輸出還分別多一個control report的ID和處理函數。
前面講到,底層如何工作及調用相關的函數我們可以不用細究,主要找到資料輸入、輸出的處理函數即可,本例中輸入函數就是IN_Data,輸出函數就是OUT_Data。(找尋的方法如前面分析)
Silicon Lab的樣本中,就是更改F3xx_USB0_ReportHandler.c檔案裡的:
void IN_Data(void)
void OUT_Data(void)
兩個函數,這兩個函數就是處理要發送的資料和接收到的資料。
我修改完後的函數如下:
對比原樣本可以瞭解加深理解。
注意OUT_Data並不是資料發送函數,IN_Data也不是資料接收函數。在應用中我們要根據自己的要求在相應位置發送資料和對接收到的資料進行處理。
一般來說,下位機中資料接收沒有單獨的函數,這是由USB的傳輸方式決定的,USB的讀寫都是由主機發起,從機只是應答,所以下位機中接收資料,由底層硬體的ISE自動完成,然後產生中斷,一般樣本程式中的USB中斷處理函數都會將資料取出,放置到對應的接收buffer中,如本樣本Out_Data函數中的OUT_PACKET。所以主要是要找到中斷處理接收到資料放置的buffer及該buffer的處理函數(如OUT_PACKET),然後再對接收到資料按自己要求處理與main函數聯絡起來即可。
下位機的資料發送一般會有單獨的函數,也有對應的發送資料buffer。本例中是SendPacket函數。按樣本描述仔細讀樣本程式,尋找資料發送函數不難。本例中自己修改如下所示,對比原樣本可加深理解。
在HIDtoUart樣本中,還將F3xx_USB0_ReportHandler.c中的const VectorTableEntryIN_VECTORTABLE[IN_VECTORTABLESize]做了修改,將IN_VECTORTABLESize由2改到了1,即發送和接收各只要一個report,之前的例子裡發送和接收分別有control和data兩個report。
3. 連續讀寫時,去掉樣本中uart部分後,在中斷處理部分還要修改一處:
即將讀取到的資料取出後,要把標誌位清零。
4. 傳輸buffer大小的修改:
除了1中所含在描述符定義中修改buffer尺寸大小,還要注意在ReportHandler.c檔案下的這兩個函數中注意修改buffer尺寸
5. PID & VID的修改