usb gadget 模拟U盘问题

tanwanjieke 2016-09-06 04:33:50
最近在做一个项目,要把linux设备插到电脑上模拟u盘。板子的usb口支持otg。按照网上的方法采用usb gadget实现,
配置内核支持U盘模拟
<*> USB Gadget Support --->
USB Peripheral Controller --->
<M> USB Gadget Drivers
<M> File-backed Storage Gadget
编译生成g_file_storage.ko,然后想把设备的某一分区挂载到电脑上执行
insmod g_file_storage.ko file=/dev/mtdblock4 stall=0 removable=1命令。
但是加载该驱动时出现错误:
g_file_storage gadget: unable to autoconfigure all endpoints
gadget driver register failed -524
insmod: can't insert 'g_file_storage.ko': Unknown error 524
查看错误位置,file_storage.c中fsg_bind函数下,usb_ep_autoconfig函数分配端点时出错,进一步定位发现
static struct usb_ep * __init
find_ep (struct usb_gadget *gadget, const char *name)
{
struct usb_ep *ep,*ep1;
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
if (0 == strcmp (ep->name, name))
return ep;
}
return NULL;
}

无法进入list_for_each_entry 循环,应该是gadget传递有问题。打印gadget的name值为ip9028_udc_udc(对),speed为0
(USB_SPEED_UNKNOWN)。请大家帮我分析一下是哪里有问题,多谢!!
...全文
1195 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanwanjieke 2016-09-14
  • 打赏
  • 举报
回复
定位到ip9028_udc.c这个文件里fsl_otg_udc_probe做gadget配置, udc_controller->max_ep = (dccparams & DCCPARAMS_DEN_MASK) * 2; for (i = 1; i < (int)(udc_controller->max_ep / 2); i++) { char name[14]; sprintf(name, "ep%dout", i); struct_ep_setup(udc_controller, i * 2, name, 1); sprintf(name, "ep%din", i); struct_ep_setup(udc_controller, i * 2 + 1, name, 1); } 这个循环进不去,导致端点名称没有配置, dccparams = fsl_readl(&dr_regs->dccparams);这个值是从寄存器读出的,我直接改寄存器的值可以么?

1,319

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧