初期教育應是一種娛樂,這樣才更容易發現一我的天生的愛好。 —— 柏拉圖ios
深深贊同柏拉圖的這個觀點,人是有天性的,教育無非就是如何引導天性朝有利的方向發展。web
繼續Linux內核移植系列,今天介紹如何移植Exynos4412 usb驅動,採用的平臺依舊是itop Exynos4412精英板。協議的知識就不介紹了,直接來移植一個能夠使用的usb host驅動。shell
首先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
其次是去檢查時鐘管腳,這裏用的現成的就能夠,設備樹中默認已經配置好了。測試
這裏用的是usb3503芯片,也去查看原理圖,找到reset/connect/int腳,都配置到設備樹中。spa
配置控制器,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>;
};
開啓usb storage驅動,後面咱們用u盤進行測試。regexp
若是要生成設備文件節點的話,還須要添加scsi支持。xml
啓動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