(八)USB驱动--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

目录

 

一、前言

1、USB host和USB device的区别

2、硬件解析

二、设备树修改

1、.dtsi文件修改

2、.dts文件修改

三、驱动修改

1、phy-sun4i-usb.c文件修改

2、sunxi.c文件修改

四、驱动使能

五、U盘读取测试

六、主要参考内容


一、前言

1、USB host和USB device的区别

不知道你能否区分什么是USB host、什么是USB device?下面做一些简单的介绍,用最简单的语言描述大致的原理:

  • USB Host(主设备):字面意思为USB主机,类似于电脑的USB接口,可以连接移动硬盘、鼠标、键盘等等;
  • USB Device(从设备)字面意思是USB设备,概念与USB host相对,类似于我们的移动硬盘。
  • 注意:只有USB host和USB device连接时,数据才能正确传输。 

那什么是USB otg呢? USB otg既可以做USB host也可以做USB device,通过ID信号来控制主、从切换。otg技术就是实现host设备不存的的情况下,设备间的数据传输。

2、硬件解析

F1C200s芯片支持USB的OTG模式,也就是可以通过更改usbid拉低或拉高方式定义当前的开发板可以作为host还是device。

  • usbid 拉高时,开发板作为外设方式。
  • usbid 拉低时,开发板作为主机方式。

F1C200s中PE2引脚具有usbid功能,来决定开发板作为外设方式或是主机方式,本文直接将PE2拉高,也即将开发板作为外设方式(device),有的朋友可能会问,我们写USB驱动是为了外接键鼠、U盘等设备,但此处为什么作为外设方式呢?

墨云说 ”是为了利用sunxi-tool烧录工具,并且硬件电路里面把PE2拉高了,也就是默认是otg模式。“(本系统硬件电路主要参考墨云和稚辉君,至于这里为什么设置为外设方式,说下我的理解,大概是因为需要通过sunxi-tool将编译后的文件下载到RAM或者flash中,需要将板子作为从机,关于sunxi-tool详见sunxi-tools工具的使用)。

后记:在询问过晕哥之后,得知这个引脚其实不用拉高也可以,所以这里大家不用care,因为我们可以使用软件设置otg方式。sunxi-tool具体作用是什么?F1C200s & SD卡,能否使用这个工具?

那我们就不能将开发板作为host外接其他设备了嘛?不是。因为我们不仅可以通过硬件修改OTG模式,还可以通过软件修改。


二、设备树修改

1、.dtsi文件修改

在soc结点下添加如下两个结点:

		// modify by kashine 3
		usb_otg: usb@1c13000 {
			compatible = "allwinner,suniv-musb";
			reg = <0x01c13000 0x0400>;
			clocks = <&ccu CLK_BUS_OTG>;
			resets = <&ccu RST_BUS_OTG>;
			interrupts = <26>;
			interrupt-names = "mc";
			phys = <&usbphy 0>;
			phy-names = "usb";
			extcon = <&usbphy 0>;
			allwinner,sram = <&otg_sram 1>;
			status = "disabled";
		};

		// modify by kashine 3
		usbphy: phy@1c13400 {
			compatible = "allwinner,suniv-usb-phy";
			reg = <0x01c13400 0x10>;
			reg-names = "phy_ctrl";
			clocks = <&ccu CLK_USB_PHY0>;
			clock-names = "usb0_phy";
			resets = <&ccu RST_USB_PHY0>;
			reset-names = "usb0_reset";
			#phy-cells = <1>;
			status = "disabled";
		};

2、.dts文件修改

使能一些功能,USB otg设置为主机方式,因为我们要连接类似鼠标、键盘、U盘等的外设,也就是开发板作为主机。

// modify by kahsine 3
&otg_sram {
        status = "okay";
};

// modify by kahsine 3
&usb_otg {
        dr_mode = "host"; /* 三个可选项: otg / host / peripheral  我在这里指定为host模式*/
        status = "okay";
};

// modify by kahsine 3
&usbphy {
        usb0_id_det-gpio = <&pio 4 2 GPIO_ACTIVE_HIGH>; /* PE2 */
        status = "okay";
};

三、驱动修改

1、phy-sun4i-usb.c文件修改

// 枚举变量修改

enum sun4i_usb_phy_type {
	suniv_phy,// modify by kashine 3
	sun4i_a10_phy,
	sun6i_a31_phy,
	sun8i_a33_phy,
	sun8i_a83t_phy,
	sun8i_h3_phy,
	sun8i_r40_phy,
	sun8i_v3s_phy,
	sun50i_a64_phy,
	sun50i_h6_phy,
};

// 结构体声明 

// modify by kashine 3
static const struct sun4i_usb_phy_cfg suniv_cfg = {
    .num_phys = 1,
    .type = suniv_phy,
    .disc_thresh = 3,
    .phyctl_offset = REG_PHYCTL_A10,
    .dedicated_clocks = true,
};

// compatible驱动匹配表属性修改

static const struct of_device_id sun4i_usb_phy_of_match[] = {
	{ .compatible = "allwinner,suniv-usb-phy", .data = &suniv_cfg }, // modify by kashine 3
	{ .compatible = "allwinner,sun4i-a10-usb-phy", .data = &sun4i_a10_cfg },
	{ .compatible = "allwinner,sun5i-a13-usb-phy", .data = &sun5i_a13_cfg },
	{ .compatible = "allwinner,sun6i-a31-usb-phy", .data = &sun6i_a31_cfg },
	{ .compatible = "allwinner,sun7i-a20-usb-phy", .data = &sun7i_a20_cfg },
	{ .compatible = "allwinner,sun8i-a23-usb-phy", .data = &sun8i_a23_cfg },
	{ .compatible = "allwinner,sun8i-a33-usb-phy", .data = &sun8i_a33_cfg },
	{ .compatible = "allwinner,sun8i-a83t-usb-phy", .data = &sun8i_a83t_cfg },
	{ .compatible = "allwinner,sun8i-h3-usb-phy", .data = &sun8i_h3_cfg },
	{ .compatible = "allwinner,sun8i-r40-usb-phy", .data = &sun8i_r40_cfg },
	{ .compatible = "allwinner,sun8i-v3s-usb-phy", .data = &sun8i_v3s_cfg },
	{ .compatible = "allwinner,sun50i-a64-usb-phy",
	  .data = &sun50i_a64_cfg},
	{ .compatible = "allwinner,sun50i-h6-usb-phy", .data = &sun50i_h6_cfg },
	{ },
};

2、sunxi.c文件修改

// sunxi_musb_probe函数修改

static int sunxi_musb_probe(struct platform_device *pdev)
{
	struct musb_hdrc_platform_data	pdata;
	struct platform_device_info	pinfo;
	struct sunxi_glue		*glue;
	struct device_node		*np = pdev->dev.of_node;
	int ret;

    ...

	glue->dev = &pdev->dev;
	INIT_WORK(&glue->work, sunxi_musb_work);
	glue->host_nb.notifier_call = sunxi_musb_host_notifier;

	if (of_device_is_compatible(np, "allwinner,sun4i-a10-musb") || of_device_is_compatible(np, "allwinner,suniv-musb"))// modify by kashine 3
		set_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags);

	if (of_device_is_compatible(np, "allwinner,sun6i-a31-musb"))
		set_bit(SUNXI_MUSB_FL_HAS_RESET, &glue->flags);

	if (of_device_is_compatible(np, "allwinner,sun8i-a33-musb") ||
	    of_device_is_compatible(np, "allwinner,sun8i-h3-musb") || 
		of_device_is_compatible(np, "allwinner,suniv-musb") ) {// modify by kashine 3
		set_bit(SUNXI_MUSB_FL_HAS_RESET, &glue->flags);
		set_bit(SUNXI_MUSB_FL_NO_CONFIGDATA, &glue->flags);
	}

    ...
}

// 驱动匹配表修改

static const struct of_device_id sunxi_musb_match[] = {
	{ .compatible = "allwinner,suniv-musb", }, // modify by kashine 3
	{ .compatible = "allwinner,sun4i-a10-musb", },
	{ .compatible = "allwinner,sun6i-a31-musb", },
	{ .compatible = "allwinner,sun8i-a33-musb", },
	{ .compatible = "allwinner,sun8i-h3-musb", },
	{}
};

四、驱动使能

通过make menuconfig图形化配置界面,进入下方路径中使能驱动。

Device Drivers

        -> USB support

五、U盘读取测试

重新编译,得到新的zImage、设备树,上电启动,观察输出信息,

进入Debian系统后,将U盘插入到任意一个USB接口,串口打印出下面的信息,可以看到,我们插入的3.0接口U盘容量可用大小,还需要注意一个重要的信息,我们的U盘在系统下面盘符为sda,只有一个分区sda1。   

使用df -h命令查看Debian系统磁盘占用情况:

咦,怎么没有我们的U盘?因为没有挂载😂😂😂。使用如下命令将我们的U盘挂载在/media/UPan目录下,UPan文件夹是我们新建的哈。挂载完成重新使用df -h命令查看磁盘状况,发现了我们的U盘,也就是红色箭头指向的内容。

mount /dev/sda1 /media/UPan/

进入U盘内部,测试能否正常查看其中的文件,如下图所示,U盘内的确为我备份的一些文件,一切正常。

拔出U盘之前最好先将U盘卸载(umount),使用如下命令卸载U盘后拔出即可。

有关USB驱动我们就不详细分析了(其实我不会,哈哈哈),先照葫芦画个瓢吧。USB驱动是一门很庞大、很复杂的内容,后面有时间多了解下。


六、主要参考内容

1.USB device 和 USB host区别

2. 小白自制Linux开发板 七. USB驱动配置 - 淡墨青云 - 博客园;(本文主要参bai考piao)

3. 全志sunxi-tools烧录工具安装和使用

4. sunxi-tool具体作用是什么?F1C200s & SD卡,能否使用这个工具?

5. USB PHY芯片_时光-易逝的博客-CSDN博客_usb phy


  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值