usb驱动 linux,Linux usb驱动

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

初期教育应是一种娱乐,这样才更容易发现一个人天生的爱好。 —— 柏拉图

深深赞同柏拉图的这个观点,人是有天性的,教育无非就是如何引导天性朝有利的方向发展。

继续Linux内核移植系列,今天介绍如何移植Exynos4412 usb驱动,采用的平台依旧是itop Exynos4412精英板。协议的知识就不介绍了,直接来移植一个可以使用的usb host驱动。

一 硬件配置

1.1 外部管脚

首先usb host必须有vbus,通过vbus给端口上的设备供电,所以the very first应该是去检查vbus的供电电路。通过查看原理图,发现vbus是通过gpio(ETC6)控制的。由于ETC6和其他gpio管脚的映射方式不太一样,这里就不通过gpio驱动来控制了,直接在usb驱动中添加以下语句使能vbus。

//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%xtETC6DRV = 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电压了。

其次是去检查时钟管脚,这里用的现成的就可以,设备树中默认已经配置好了。

1.2 hub

这里用的是usb3503芯片,也去查看原理图,找到reset/connect/int脚,都配置到设备树中。

二 设备树和内核配置

2.1 设备树配置

配置控制器,phy和hub,代码如下:

[email protected] {

status = "okay";

};

ehci: [email protected] {

//samsung,vbus-gpio = ;

status = "okay";

[email protected] {

status = "okay";

};

[email protected] {

status = "okay";

};

[email protected] {

status = "okay";

};

};

usb3503 {

compatible = "smsc,usb3503";

reg = <0x08 0x4>;

connect-gpios = ;

intn-gpios = ;

reset-gpios = ;

initial-mode = <1>;

};

2.2 内核配置usb3503驱动配置

8d439f03a72945f66591e66c42408d80.pngusb控制器驱动配置

b8e3024aa06d1eeb605f9bded0f69057.png

开启usb storage驱动,后面我们用u盘进行测试。

如果要生成设备文件节点的话,还需要添加scsi支持。

c62cfeb0a3e7961a87f6866ab0c5590a.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 inhub mode

插上读卡器试试:

[[email protected] ]#[ 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 type0

[ 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, readcache: 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看看):

[[email protected] ]#mdev -s

[[email protected] ]#ls /dev/sda

sda sda1

[[email protected] ]#ls /dev/sda1

/dev/sda1

[[email protected] ]#ls home/

[[email protected] ]#mkdir home/usb

[[email protected] ]#

[[email protected] ]#mount /dev/sda1 home/usb/

[[email protected] ]#ls home/usb/

DCIM FFDB

[[email protected] ]#ls home/usb/DCIM/

100_FUJI

[[email protected] ]#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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux USB驱动是用于支持和控制USB设备的软件模块。Linux内核几乎支持所有的USB设备,包括键盘、鼠标、打印机、调制解调器和扫描仪等。USB驱动分为主机驱动和gadget驱动两种类型。 主机驱动用于设备连接到计算机上,通过主机驱动扫描USB设备并控制所连接的设备。主机驱动的注册是通过向USB总线注册一个USB接口驱动来实现的。在Linux内核中,可以使用usb_driver结构体来定义USB接口驱动,其中包括驱动的名称、probe函数、disconnect函数和id_table等信息。probe函数用于在设备连接时进行初始化和配置,disconnect函数用于在设备断开时进行清理和释放资源。通过调用usb_register函数将USB接口驱动注册到USB总线上。 gadget驱动一般用于嵌入式设备,用于控制嵌入式设备的USB功能。gadget驱动的注册方式与主机驱动类似,也是通过向USB总线注册一个USB接口驱动来实现的。 在Linux中,一个设备可以有多个接口,每个接口对应着不同的功能。USB接口驱动的初始化是通过在USB总线上注册USB接口驱动来实现的。在注册USB接口驱动时,需要指定驱动的名称、probe函数和disconnect函数等信息。 总之,Linux USB驱动是用于支持和控制USB设备的软件模块,包括主机驱动和gadget驱动两种类型。主机驱动用于控制设备连接到计算机上的USB设备,而gadget驱动用于控制嵌入式设备的USB功能。 #### 引用[.reference_title] - *1* [Linux USB驱动详解](https://blog.csdn.net/cjianeng/article/details/111995688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* *3* [《Linux驱动USB设备驱动看这一篇就够了》](https://blog.csdn.net/qq_40709487/article/details/126570448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值