Linux上USB移植錯誤解決筆記


       在內核目錄下先配置支持USB設備,無論你是什么設備,這一步都是必須的,USB驅動和其他的驅動不同,它分為USB設備驅動,另外還有USB-Host主機控制器的驅動,配置如下:

          Device Drivers  --->  

                       SCSI device support  ---> 

                                   <*> SCSI device support

                                   <*> SCSI disk support

以上是為了支持U盤掛載,U盤在Linux中被識別為SCSI設備。

              Device Drivers  ---> 

                            <*>     USB Monitor

                            <*>     OHCI HCD support

                            [*]     USB device filesystem (DEPRECATED)                              

                         [*]     USB device class-devices (DEPRECATED)                    

                         [*]     Dynamic USB minor allocation

這就可以了,這幾項是必須選的,因為這里面的OHCI HCD是主機控制器的驅動,不選的話,就算你USB設備驅動寫出來了,也無法被主機識別。

接下來再選一下HID設備:

                            [*] HID Devices  --->

這個可以自主的選擇,我關注的是主機控制器的驅動:

              直接編譯內核,燒寫,啟動,彈出錯誤,插入USB設備:

usb 1-1: device descriptor read/64, error -62

usb 1-1: device descriptor read/64, error -62

usb 1-1: new full speed USB device using s3c2410-ohci and address 3

usb 1-1: device descriptor read/64, error -62

usb 1-1: device descriptor read/64, error -62

usb 1-1: new full speed USB device using s3c2410-ohci and address 4

usb 1-1: device not accepting address 4, error -62

usb 1-1: new full speed USB device using s3c2410-ohci and address 5

usb 1-1: device not accepting address 5, error -62

hub 1-0:1.0: unable to enumerate USB device on port 1

 

最后一句的意思是,設備枚舉失敗,error -62的意思時超時錯誤。從這里可以看出,系統應該是識別到了USB設備,但是設備卻無法工作,而且可以斷定是USB主機控制器的錯誤。的確如此,百度一下,網上說這是時鍾錯誤,也就是USB是時鍾沒有起來,對於2440,USB時鍾需要工作在48M。修改內核源碼:

       添加時鍾初始化的代碼,這個網上有很多版本,自己隨意去找一個,無非就是給UPLLCON寄存器寫個數值進去。這里我就不詳細介紹了,但是我不知道為什么,我在內核中添加時鍾初始化代碼,就是寫入UPLLCON寄存器,寫入了0x00038022,這是配置USB時鍾為48M的數值,但是很不幸,寫入是成功的,我把這個寄存器的值重新讀出來,printk了一下,也是對的。編譯,下載,測試,照樣出錯。

       也就是說USB時鍾還是不工作。遇到這種情況,看數據手冊去,手冊上說配置PLL的時候,有MPLLCON和UPLLCON兩個寄存器,要先配置UPLLCON,再配置MPLLCON寄存器,而MPLLCON在哪配置的呢,原來是這樣,也就是說我們配置順序不對,所以在內核中配置UPLLCON會失敗,那我們就去改改u-boot代碼吧,在u-boot的start.S中添加UPLLCON的配置,也就三行代碼:

       ldr r0,= 0x4c0000008;

       ldr r1,=0x000038022;

       str r1, [r0]

這三句要加在MPLLCON之前,同時在兩次配置之間至少要起個nop指令的間隔,這是數據手冊要求的。

重新燒寫u-boot,啟動內核,插入USB無線鼠標,奇跡出現了,

usb 1-1: new low speed USB device using s3c2410-ohci and address 3

usb 1-1: New USB device found, idVendor=1bcf, idProduct=05ca

usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0

usb 1-1: Product: 2.4GHz 2way RF Receiver

usb 1-1: configuration #1 chosen from 1 choice

input: 2.4GHz 2way RF Receiver as /class/input/input1

generic-usb 0003:1BCF:05CA.0001: input,hidraw0: USB HID v1.00 Keyboard [2.4GHz 2way RF Receiver] on usb-s3c24xx-1/input0

input: 2.4GHz 2way RF Receiver as /class/input/input2

generic-usb 0003:1BCF:05CA.0002: input,hiddev0,hidraw1: USB HID v1.00 Mouse [2.4GHz 2way RF Receiver] on usb-s3c24xx-1/input1

識別出來了,OK,移植成功。之前在內核源碼部分改了將近一天,但是還是不行。不知道有些人為什么改內核源碼卻成功了,唯一的解釋就是內核的版本不同,可能會有一些差異,所以在這里我的建議是你先改內核源碼,這個網上有很多介紹,如果改完了不行,就用我這里介紹的改u-boot的源碼,你可以仔細閱讀一些數據手冊。

       我做這個移植,搞了將近兩天,我從來沒有想到問題是在bootloader上面,因為現在在准備考研階段,也就是沒事隨便搞搞,今天上午,差點就放棄了,去看考研書去了。當初要是放棄了,真的,那么昨天的一天真就白花了,浪費了一天還啥都沒搞明白,所以又堅持了一下,總算搞定了,所以凡事都要不要輕言放棄,想放棄的時候想想當初為何走到這一步……

       PS:我們的榮譽不是在於永遠成功,而是在於失敗和絕望時能找到重新站起來的希望,勇敢的面對困難戰勝困難。

                                                                                                               

                                                                                                         冰雪王爵.obj

                                                                                                         2014年6月10日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM