Linux內核移植 part3:usb host驅動

初期教育應是一種娛樂,這樣才更容易發現一我的天生的愛好。 —— 柏拉圖ios

深深贊同柏拉圖的這個觀點,人是有天性的,教育無非就是如何引導天性朝有利的方向發展。web

繼續Linux內核移植系列,今天介紹如何移植Exynos4412 usb驅動,採用的平臺依舊是itop Exynos4412精英板。協議的知識就不介紹了,直接來移植一個能夠使用的usb host驅動。shell

一 硬件配置

1.1 外部管腳

首先usb host必須有vbus,經過vbus給端口上的設備供電,因此the very first應該是去檢查vbus的供電電路。經過查看原理圖,發現vbus是經過gpio(ETC6)控制的。因爲ETC6和其餘gpio管腳的映射方式不太同樣,這裏就不經過gpio驅動來控制了,直接在usb驅動中添加如下語句使能vbus。ruby

//exynos_setup_vbus_gpio(&pdev->dev);

    void __iomem *etc6_addr = ioremap(0x11000228, 2);
    unsigned int etc6pud, etc6drv;
    if (!etc6_addr)
        pr_info("Can't Map ETC6.\n");
    else {
        etc6pud = readl(etc6_addr);
        etc6drv = readl(etc6_addr+4);
        pr_info("ETC6PUD = 0x%x\tETC6DRV = 0x%x.\n", etc6pud, etc6drv);
        writel(etc6pud | (0x3<<12), etc6_addr);
        writel(etc6drv | (0x1<<12), etc6_addr+4);
        pr_info("Configed ETC6PUD = 0x%x, ETC6DRV = 0x%x.\n", readl(etc6_addr), readl(etc6_addr+4));
    }

內核起來後,就能夠測量到vbus的5V電壓了。svg

其次是去檢查時鐘管腳,這裏用的現成的就能夠,設備樹中默認已經配置好了。測試

1.2 hub

這裏用的是usb3503芯片,也去查看原理圖,找到reset/connect/int腳,都配置到設備樹中。spa

二 設備樹和內核配置

2.1 設備樹配置

配置控制器,phy和hub,代碼以下:code

exynos-usbphy@125B0000 {
        status = "okay";    
    };

    ehci: ehci@12580000 {
        //samsung,vbus-gpio = <&gpx3 5 1>;
        status = "okay";    
        port@0 {
            status = "okay";
        };
        port@1 {
            status = "okay";
        };
        port@2 {
            status = "okay";    
        };
    };

    usb3503 {
        compatible = "smsc,usb3503";    
        reg = <0x08 0x4>;
        connect-gpios = <&gpm3 3 GPIO_ACTIVE_LOW>;
        intn-gpios = <&gpx2 3 GPIO_ACTIVE_LOW>;
        reset-gpios = <&gpm2 4 GPIO_ACTIVE_LOW>;
        initial-mode = <1>;
    };

2.2 內核配置

  • usb3503驅動配置

usb3503.png

  • usb控制器驅動配置

exynos_ehci.png

開啓usb storage驅動,後面咱們用u盤進行測試。regexp

若是要生成設備文件節點的話,還須要添加scsi支持。xml

scsi.png

三 測試

啓動log以下:

[    1.201505] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.207715] ehci-exynos: EHCI EXYNOS driver
[    1.211970] ETC6PUD = 0xc000 ETC6DRV = 0x0.
[    1.216040] Configed ETC6PUD = 0xf000, ETC6DRV = 0x1000.
[    1.221339] usb phy_number = 0.
[    1.224474] usb phy_number = 1.
[    1.227585] usb phy_number = 2.
[    1.231196] exynos-ehci 12580000.ehci: EHCI Host Controller
[    1.236287] exynos-ehci 12580000.ehci: new USB bus registered, assigned bus number 1
[    1.244271] exynos-ehci 12580000.ehci: irq 45, io mem 0x12580000
[    1.257078] exynos-ehci 12580000.ehci: USB 2.0 started, EHCI 1.00
[    1.262439] hub 1-0:1.0: USB hub found
[    1.265482] hub 1-0:1.0: 3 ports detected
[    1.270181] usbcore: registered new interface driver usb-storage
[    1.285771] usb3503 8.usb3503: switched to HUB mode
[    1.289186] usb3503 8.usb3503: usb3503_probe: probed in hub mode

插上讀卡器試試:

[root@osee ]#[ 1205.437072] usb 1-3.3: new high-speed USB device number 7 using exynos-ehci
[ 1205.551613] usb-storage 1-3.3:1.0: USB Mass Storage device detected
[ 1205.556746] scsi host0: usb-storage 1-3.3:1.0
[ 1206.558784] scsi 0:0:0:0: Direct-Access     TS-RDF5  SD  Transcend    TS37 PQ: 0 ANSI: 6
[ 1206.566175] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 1206.923615] sd 0:0:0:0: [sda] 30881792 512-byte logical blocks: (15.8 GB/14.7 GiB)
[ 1206.930982] sd 0:0:0:0: [sda] Write Protect is off
[ 1206.935733] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 1206.950255]  sda: sda1
[ 1206.955367] sd 0:0:0:0: [sda] Attached SCSI removable disk

掛載訪問(若是沒有發現設備文件,執行mdev -s看看):

[root@osee ]#mdev -s
[root@osee ]#ls /dev/sda
sda   sda1
[root@osee ]#ls /dev/sda1 
/dev/sda1
[root@osee ]#ls home/
[root@osee ]#mkdir home/usb
[root@osee ]#
[root@osee ]#mount /dev/sda1 home/usb/
[root@osee ]#ls home/usb/
DCIM  FFDB
[root@osee ]#ls home/usb/DCIM/
100_FUJI
[root@osee ]#df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   504.9M         0    504.9M   0% /dev/shm
/dev/sda1                14.7G     83.6M     14.6G   1% /home/usb