07 Linux USB主機控制器和裝置驅動

2021-09-02 17:32:53 字數 4434 閱讀 4367

移植 ohci-s5p 驅動

拷貝drivers\usb\host\目錄下的 ohci-exynos.c 為 ohci-s5p.c。 然後將所有 exynos 字串替換成 s5p, 由於有些地方是 exynos4,所以還需要將 s5p4 替換為 s5p。最後還需要修改下標頭檔案,將#include修改為#include開啟核心目錄 include\linux\platform_data\,然後拷貝 usb-exynos.h 為usb-ohci-s5p.h。將所有的 exynos4 字串替換為 s5p, 將 exynos 替換為 s5p。為了以後支援 ehci 還新增 echi 的平台資料,最後 usb-ohci-s5p.h 修改為:

#ifndef __mach_s5p_ohci_h

#define __mach_s5p_ohci_h

#ifdef config_s5p_dev_usb_ehci

static struct s5p_ehci_platdata s5p_ehci_platdata;

#endif

static struct s5p_ohci_platdata s5p_ohci_platdata;

struct s5p_ohci_platdata ;

extern void s5p_ohci_set_platdata(struct s5p_ohci_platdata *pd);

#endif

新增 s5p_ohci_driver 到 ohci-hcd.c

開啟 drivers\usb\host\ ohci-hcd.c,在 config_usb_ohci_exynos 前面新增如下**:

#ifdef config_usb_ohci_s5p

#include "ohci-s5p.c"

#define platform_driver s5p_ohci_driver

#endif

新增平台裝置

開啟 arch\arm\mach-s5pv210\mach-smdkv210.c,在 smdkv210_devices[ ]前,新增如下**:

#include static struct resource s5p_ohci_resource = ;

static u64 samsung_device_dma_mask = dma_bit_mask(32);

struct platform_device s5p_device_ohci =

};void __init s5p_ohci_set_platdata(struct s5p_ohci_platdata *pd)

然後將定義設定好的 s5p_device_ohci 新增到 smdkv210_devices[ ]

static struct platform_device *smdkv210_devices __initdata = ;
最後在smdkv210_machine_init 函式中新增平台資料的設定函式。

#ifdef config_s5p_dev_usb_ohci

s5p_ohci_set_platdata(&s5p_ohci_platdata);

#endif

移植 kconfig

開啟 drivers\usb\host\目錄下的 kconfig,在 usb_ohci_exynos 前面新增 usb_ohci_s5p 的配置支援。

config usb_ohci_s5p

boolean "ohci support for samsung s5p soc series"

depends on usb_ohci_hcd && plat_s5p

select s5p_dev_usb_ohci

help

enable support for the samsung s5p soc's on-chip ohci controller.

開啟 arch\arm\plat-samsung 目錄下的 kconfig,在 s5p_dev_usb_ehci後面新增 s5p_dev_usb_ohci 的配置支援

config s5p_dev_usb_ohci

bool

help

compile in platform device definition for usb ohci

開啟 drivers\usb\目錄下的 kconfig,在 usb_arch_has_ohci 模組下新增如下內容:

default y if plat_s5p
建立 setup-usb-phy.c 檔案

在 arch\arm\mach-s5pv210\目錄下建立 setup-usb-phy.c 檔案

#include #include #include #include #include #include #include #include #include #include #include #include int s5p_usb_phy_init(struct platform_device *pdev, int type)

err = clk_enable(otg_clk);

if (err)

if (readl(s5pv210_usb_phy_con) & (0x1<<1))

__raw_writel(__raw_readl(s5pv210_usb_phy_con) | (0x1<<1), s5pv210_usb_phy_con);

__raw_writel((__raw_readl(s3c_phypwr) & ~(0x1<<7) & ~(0x1<<6))

| (0x1<<8) | (0x1<<5) | (0x1<<4), s3c_phypwr);

__raw_writel((__raw_readl(s3c_phyclk) & ~(0x1<<7)) | (0x3<<0), s3c_phyclk);

__raw_writel((__raw_readl(s3c_rstcon)) | (0x1<<4) | (0x1<<3), s3c_rstcon);

__raw_writel(__raw_readl(s3c_rstcon) & ~(0x1<<4) & ~(0x1<<3), s3c_rstcon);

/* "at least 10us" for phy reset elsewhere, 20 not enough here... */

udelay(50);

clk_disable(otg_clk);

clk_put(otg_clk);

return 0;

}int s5p_usb_phy_exit(struct platform_device *pdev, int type)

編寫 setup-usb-phy.h 檔案

在 include/linux/platform_data 目錄下建立 setup-usb-phy.h 檔案。

//include/linux/platform_data

#ifndef __setup_usb_phy_h

#define __setup_usb_phy_h

int s5p_usb_phy_init(struct platform_device *pdev, int type);

int s5p_usb_phy_exit(struct platform_device *pdev, int type);

#endif

make menuconfig 配置核心選項

device drivers ——>

scsi device support ——>

<*> scsi device support

[ * ] legacy /proc/scsi/ support

<*> scsi disk support

<*> scsi cdrom support

<*> scsi generic support

hid support ——>

<*> generic hid driver

[ * ] usb support ——>

<*> support for host-side usb

<*> ohci hcd support

[ * ] ohci support for samsung s5p soc series

[ * ] generic ohci driver for a platform device

<*> usb mass storage support

[ * ] usb mass storage verbose debug

USB主機控制器ECHI

1.主機控制器 host controller uhci universal host controller inte ce 通用主機控制介面,usb1.0 1.1 ohci open host controller inte ce 開放主機控制介面,usb1.0 1.1 ehci enhanced...

usb主機控制器說明

usb拓撲 對於每個嵌入式的cpu晶元中一般都會整合乙個或多個host 控制器,每個host控制器其實就是乙個pci裝置,掛載在pci匯流排上,在linux系統中,驅動開發人員應該給host 控制器提供驅動程式,host 控制器用usb hcd結構來表示。該結構體在 include linux us...

USB驅動之主機控制器驅動

usb 主機驅動的整體結構 usb 主機控制器有 34種規格 ohci open host controller inte ce uhci universal host controllerinte ce 和 ehci enhanced host controller inte ce ohci 驅動...