在內核目錄下先配置支持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日