linux 4.4 USB Gadget Mass Stroage

硬件平台: licheepi nano衍生

调试记录

驱动信息

  │ This driver is a replacement for now removed File-backed                                                                                                                                                  │
│ Storage Gadget (g_file_storage). │
│ │
│ Say "y" to link the driver statically, or "m" to build │
│ a dynamically linked module called "g_mass_storage". │
│ │
│ Symbol: USB_MASS_STORAGE [=m] │
│ Type : tristate │
│ Prompt: Mass Storage Gadget │
│ Location: │
│ -> Device Drivers │
│ -> USB support (USB_SUPPORT [=y]) │
│ -> USB Gadget Support (USB_GADGET [=m]) │
│ -> USB Gadget precomposed configurations (<choice> [=m]) │
│ Defined at drivers/usb/gadget/legacy/Kconfig:240 │
│ Depends on: <choice> && BLOCK [=y] │
│ Selects: USB_LIBCOMPOSITE [=m] && USB_F_MASS_STORAGE [=m]

config位置

[*] Device drivers
[*] USB Support
[M] USB Gadget Support
[M] Mass Storage Gadget

dt node信息

// suniv.dtsi
usb_otg: usb@1c13000 {
compatible = "allwinner,suniv-f1c100s-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";
}; // suniv-f1c100s-lichee-nano.dts
&usb_otg {
dr_mode = "peripheral";
status = "okay";
};

err log

[   40.564794] musb-sunxi 1c13000.usb: Invalid or missing 'dr_mode' property
[ 40.578424] musb-sunxi: probe of 1c13000.usb failed with error -22

err log相关代码

// drivers/usb/musb/sunxi.c sunxi.ko
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; if (!np) {
dev_err(&pdev->dev, "Error no device tree node found\n");
return -EINVAL;
} glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
if (!glue)
return -ENOMEM; memset(&pdata, 0, sizeof(pdata));
switch (usb_get_dr_mode(&pdev->dev)) {
#if defined CONFIG_USB_MUSB_DUAL_ROLE || defined CONFIG_USB_MUSB_HOST
case USB_DR_MODE_HOST:
pdata.mode = MUSB_PORT_MODE_HOST;
glue->phy_mode = PHY_MODE_USB_HOST;
break;
#endif
#if defined CONFIG_USB_MUSB_DUAL_ROLE || defined CONFIG_USB_MUSB_GADGET
case USB_DR_MODE_PERIPHERAL:
pdata.mode = MUSB_PORT_MODE_GADGET;
glue->phy_mode = PHY_MODE_USB_DEVICE;
break;
#endif
#ifdef CONFIG_USB_MUSB_DUAL_ROLE
case USB_DR_MODE_OTG:
pdata.mode = MUSB_PORT_MODE_DUAL_ROLE;
glue->phy_mode = PHY_MODE_USB_OTG;
break;
#endif
default:
dev_err(&pdev->dev, "Invalid or missing 'dr_mode' property\n");
return -EINVAL;
}

查看 usb_get_dr_mode代码

dr_mode match代码

static const char *const usb_dr_modes[] = {
[USB_DR_MODE_UNKNOWN] = "",
[USB_DR_MODE_HOST] = "host",
[USB_DR_MODE_PERIPHERAL] = "peripheral",
[USB_DR_MODE_OTG] = "otg",
}; static enum usb_dr_mode usb_get_dr_mode_from_string(const char *str)
{
int ret; ret = match_string(usb_dr_modes, ARRAY_SIZE(usb_dr_modes), str);
return (ret < 0) ? USB_DR_MODE_UNKNOWN : ret;
} enum usb_dr_mode usb_get_dr_mode(struct device *dev)
{
const char *dr_mode;
int err; err = device_property_read_string(dev, "dr_mode", &dr_mode);
if (err < 0)
return USB_DR_MODE_UNKNOWN; return usb_get_dr_mode_from_string(dr_mode);
}
EXPORT_SYMBOL_GPL(usb_get_dr_mode);

dt配置应该没问题

usb_get_dr_mode返回了0,导致sunxi.c return -EINVAL;

看起来没什么问题,需要修改代码进行调试。

修改打印usb dr mode序号,位于default中

[   40.909639] USB_DR_MODE: 2
[ 40.915745] musb-sunxi 1c13000.usb: Invalid or missing 'dr_mode' property
[ 40.929251] musb-sunxi: probe of 1c13000.usb failed with error -22

dr_mode序号是2 对应"peripheral",看来问题出在宏上

//CONFIG_USB_MUSB_DUAL_ROLE
//CONFIG_USB_MUSB_GADGET
#if defined CONFIG_USB_MUSB_DUAL_ROLE || defined CONFIG_USB_MUSB_GADGET
case USB_DR_MODE_PERIPHERAL:
pdata.mode = MUSB_PORT_MODE_GADGET;
glue->phy_mode = PHY_MODE_USB_DEVICE;
break;
#endif

menuconfig中搜索相关宏

 Symbol: USB_MUSB_DUAL_ROLE [=n]                                                                                                                                                                           │
│ Type : boolean │
│ Prompt: Dual Role mode │
│ Location: │
│ -> Device Drivers │
│ -> USB support (USB_SUPPORT [=y]) │
│ -> Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...) (USB_MUSB_HDRC [=y]) │
│ (1) -> MUSB Mode Selection (<choice> [=y]) │
│ Defined at drivers/usb/musb/Kconfig:54 │
│ Depends on: <choice> && (USB [=y]=y || USB [=y]=USB_MUSB_HDRC [=y]) && (USB_GADGET [=m]=y || USB_GADGET [=m]=USB_MUSB_HDRC [=y]) && HAS_DMA [=y]
 Symbol: USB_MUSB_GADGET [=n]                                                                                                                                                                              │
│ Type : boolean │
│ Prompt: Gadget only mode │
│ Location: │
│ -> Device Drivers │
│ -> USB support (USB_SUPPORT [=y]) │
│ -> Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...) (USB_MUSB_HDRC [=y]) │
│ (1) -> MUSB Mode Selection (<choice> [=y]) │
│ Defined at drivers/usb/musb/Kconfig:46 │
│ Depends on: <choice> && (USB_GADGET [=m]=y || USB_GADGET [=m]=USB_MUSB_HDRC [=y]) && HAS_DMA [=y]

根据依赖关系可以得知,若要产生USB_MUSB_GADGET选项,需要满足

USB_GADGET [=m]=y || USB_GADGET [=m]=USB_MUSB_HDRC [=y]) && HAS_DMA [=y]

将CONFIG_USB_GADGET 设为y后,菜单中已经可以进行设置

dr_mode=host, peripheral, otg
( ) Host only mode
( ) Gadget only mode
(X) Dual Role mode

[未完] Linux 4.4 USB —— spiflash模拟usb大容量存储设备 调试记录 Gadget Mass Stroage的更多相关文章

  1. golang在linux下的开发环境部署[未完]

    uname -a Linux symons_laptop 4.8.2-1-ARCH #1 SMP PREEMPT Mon Oct 17 08:11:46 CEST 2016 x86_64 GNU/Li ...

  2. 构建Linux根文件系统(未完待续)

          所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...

  3. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  4. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  5. Codeforces Round #395 (Div. 2)(未完)

    2.2.2017 9:35~11:35 A - Taymyr is calling you 直接模拟 #include <iostream> #include <cstdio> ...

  6. 布隆过滤器(Bloom Filter) 未完待续

    布隆过滤器雏形 未完待续..... 计算错误率 现在有一个空额布隆过滤器, 过滤器里的bit array的大小是m. 咱来插入一个元素. 这次插入过程中的第一个hash函数会算出一个位置, 然后把这个 ...

  7. 从Socket入门到BIO,PIO,NIO,multiplexing,AIO(未完待续)

    Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...

  8. linux平台模拟生成CAN设备

    前言 使用socketCan的过程中有时候没有can接口设备,但是需要测试一下can接口程序是否有问题, 此时需要系统模拟生成can设备,本文介绍linux平台模拟生成CAN设备的方法. 实现步骤 1 ...

  9. CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)

    一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...

随机推荐

  1. 配置文件管理维护到gitlab上

    一.简介 在日常维护服务器中,会修改配置文件或者相应脚本,在修改前要对文件进行按照日期备份,这样会很麻烦,频繁修改的时候也会懒得去备份多个. 维护脚本分为服务端和客户端,服务端监听端口,接收客户端的采 ...

  2. iphone4 与iphone5适配

    转:http://www.cnblogs.com/ygm900/archive/2013/05/24/3098015.html iphone4/4s 应用程序升级适配 iphone5 的方法有很多,而 ...

  3. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

  4. 删除列Table.RemoveColumns(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  5. CF493A Vasya and Football 题解

    Content 有两个球队在踢足球,现在给出一些足球运动员被黄牌或红牌警告的时间,求每个队员第一次被红牌警告的时间. 注意:根据足球比赛规则,两张黄牌自动换成一张红牌. 数据范围:比赛时间 \(90\ ...

  6. LuoguP7534 [COCI2016-2017#4] Kartomat 题解

    Content 火车站里头有一个售票机,其键盘可以看作是一个 \(4\times 8\) 的矩阵,其中第一行的前面三个键和最后一行的最后三个键都是 *,剩余的键按照从上到下,从左到右的顺序依次按照 A ...

  7. Java 数据类型:集合接口Collection之Set接口HashSet类;LinkedHashSet;TreeSet 类

    Collection 之 Set 实现类: HashSet TreeSet 特点: 无序. 元素不可重复. (如果试图添加一个已经有的元素到一个Set集合中,那么会添失败,add()方法返回false ...

  8. loger4j时间一长,就不向数据库里写日志啦,然而重新启动工程后就可以再次向数据库写日志,好奇怪

    loger4j时间一长,就不向数据库里写日志啦,然而重新启动工程后就可以再次向数据库写日志,好奇怪

  9. JAVA连接redis报错 :stop-writes-on-bgsave-error option

    (error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist o ...

  10. SpringBoot 整合es(elasticsearch)使用elasticsearch-rest-high-level-client实现增删改

    引入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok< ...