I.MX6 make menuconfig OTG to slave only mode
/******************************************************************************* I.MX6 make menuconfig OTG to slave only mode* 声明:* 本文通过跟踪代码的方式来了解如何将I.MX6的OTG的Host模式去掉,仅仅剩下* slave模式,主要是有些场合仅仅需要slave模式。** 2015-9-5 晴 深圳 南山平山村 曾剑锋*****************************************************************************/<kernel path>/drivers/usb/otg/fsl_otg.cstatic int __init fsl_usb_otg_init(void) <----------------------------+{ |printk(KERN_INFO DRIVER_DESC " loaded, %s\n", DRIVER_VERSION); |return platform_driver_register(&fsl_otg_driver); |} | || |static void __exit fsl_usb_otg_exit(void) +-------------+ |{ | |platform_driver_unregister(&fsl_otg_driver); | |printk(KERN_INFO DRIVER_DESC " unloaded\n"); | |} | || |subsys_initcall(fsl_usb_otg_init); --------------------|---------------+module_exit(fsl_usb_otg_exit); ||MODULE_DESCRIPTION(DRIVER_INFO); |MODULE_AUTHOR(DRIVER_AUTHOR); |MODULE_LICENSE("GPL"); |||struct platform_driver fsl_otg_driver = { <-------------+.probe = fsl_otg_probe,.remove = fsl_otg_remove,.driver = {.name = driver_name, --------+.owner = THIS_MODULE, |}, |}; |Vstatic const char driver_name[] = "fsl-usb2-otg"; -------------+|| <kernel path>/arch/arm$ grep fsl-usb2-otg * -R |Binary file boot/Image matches |mach-mx5/devices.c: .name = "fsl-usb2-otg", |...... |Binary file plat-mxc/devices/built-in.o matches V -+- plat-mxc/devices/platform-fsl-usb2-otg.c: const char *name = "fsl-usb2-otg";| Binary file plat-mxc/built-in.o matches |+--------------------------------------------+ |V | <kernel path>/arch/arm/plat-mxc/devices/platform-fsl-usb2-otg.c |#define imx_fsl_usb2_otg_data_entry_single(soc) \ |{ \ |.iobase = soc ## _USB_OTG_BASE_ADDR, \ |.irq = soc ## _INT_USB_OTG, \ |} |||#ifdef CONFIG_SOC_IMX6Q |const struct imx_fsl_usb2_otg_data imx6q_fsl_usb2_otg_data __initconst = |imx_fsl_usb2_otg_data_entry_single(MX6Q); |#endif /* ifdef CONFIG_SOC_IMX6Q */ ||struct platform_device *__init imx_add_fsl_usb2_otg( ----------+ |const struct imx_fsl_usb2_otg_data *data, | |const struct fsl_usb2_platform_data *pdata) | |{ | |struct resource res[] = { | |{ | |.start = data->iobase, | |.end = data->iobase + SZ_512 - 1, | |.flags = IORESOURCE_MEM, | |}, { | |.start = data->irq, | |.end = data->irq, | |.flags = IORESOURCE_IRQ, | |}, | |}; | || |int ret = -ENOMEM; | |const char *name = "fsl-usb2-otg"; <-------------------------|---+int id = -1; |unsigned int num_resources = ARRAY_SIZE(res); |size_t size_data = sizeof(*pdata); |u64 dmamask = DMA_BIT_MASK(32); |struct platform_device *pdev; ||pdev = platform_device_alloc(name, id); |if (!pdev) |goto err; ||if (dmamask) { |/* |* This memory isn't freed when the device is put, |* I don't have a nice idea for that though. Conceptually |* dma_mask in struct device should not be a pointer. |* See http://thread.gmane.org/gmane.linux.kernel.pci/9081 |*/ |pdev->dev.dma_mask = |kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL); |if (!pdev->dev.dma_mask) |/* ret is still -ENOMEM; */ |goto err; ||*pdev->dev.dma_mask = dmamask; |pdev->dev.coherent_dma_mask = dmamask; |} ||ret = platform_device_add_resources(pdev, res, num_resources); |if (ret) |goto err; ||if (data) { |ret = platform_device_add_data(pdev, pdata, size_data); |if (ret) |goto err; |} ||return pdev; |err: |if (dmamask) |kfree(pdev->dev.dma_mask); |platform_device_put(pdev); |return ERR_PTR(ret); |} |EXPORT_SYMBOL(imx_add_fsl_usb2_otg); || <kernel path>/arch/arm$ grep imx_add_fsl_usb2_otg * -R <-------------+Binary file boot/Image matches -+- mach-mx6/devices-imx6q.h: imx_add_fsl_usb2_otg(&imx6q_fsl_usb2_otg_data, pdata) ----------+| ...... || plat-mxc/devices/platform-fsl-usb2-otg.c:struct platform_device *__init imx_add_fsl_usb2_otg( || plat-mxc/devices/platform-fsl-usb2-otg.c:EXPORT_SYMBOL(imx_add_fsl_usb2_otg); || Binary file plat-mxc/built-in.o matches |+----------------------------------+ |V | <kernel path>/arch/arm/mach-mx6/devices-imx6q.h |extern const struct imx_fsl_usb2_otg_data imx6q_fsl_usb2_otg_data __initconst; |#define imx6q_add_fsl_usb2_otg(pdata) \ -------------------+ |imx_add_fsl_usb2_otg(&imx6q_fsl_usb2_otg_data, pdata) <------------------*------+| <kernel path>/arch/arm$ grep imx6q_add_fsl_usb2_otg * -R |Binary file mach-mx6/.usb_dr.c.swp matches |mach-mx6/devices-imx6q.h:#define imx6q_add_fsl_usb2_otg(pdata) \ |mach-mx6/devices-imx6q.h:#define imx6q_add_fsl_usb2_otg_wakeup(pdata) \ |mach-mx6/usb_dr.c: pdev[i] = imx6q_add_fsl_usb2_otg(&dr_utmi_config); |mach-mx6/usb_dr.c: pdev_wakeup = imx6q_add_fsl_usb2_otg_wakeup(&dr_wakeup_config); || <kernel path>/arch/arm/mach-mx6/usb_dr.c |static int __init mx6_usb_dr_init(void) |{ |int i = 0; |void __iomem *anatop_base_addr = MX6_IO_ADDRESS(ANATOP_BASE_ADDR); |struct imx_fsl_usb2_wakeup_data imx6q_fsl_otg_wakeup_data = |imx_fsl_usb2_wakeup_data_entry_single(MX6Q, 0, OTG); |struct imx_mxc_ehci_data __maybe_unused imx6q_mxc_ehci_otg_data = |imx_mxc_ehci_data_entry_single(MX6Q, 0, OTG); |struct imx_fsl_usb2_udc_data __maybe_unused imx6q_fsl_usb2_udc_data = |imx_fsl_usb2_udc_data_entry_single(MX6Q); |struct imx_fsl_usb2_otg_data __maybe_unused imx6q_fsl_usb2_otg_data = |imx_fsl_usb2_otg_data_entry_single(MX6Q); ||/* Some phy and power's special controls for otg |* 1. The external charger detector needs to be disabled |* or the signal at DP will be poor |* 2. The EN_USB_CLKS is always enabled. |* The PLL's power is controlled by usb and others who |* use pll3 too. |*/ |__raw_writel(BM_ANADIG_USB1_CHRG_DETECT_EN_B \ || BM_ANADIG_USB1_CHRG_DETECT_CHK_CHRG_B, \ |anatop_base_addr + HW_ANADIG_USB1_CHRG_DETECT); |__raw_writel(BM_ANADIG_USB1_PLL_480_CTRL_EN_USB_CLKS, |anatop_base_addr + HW_ANADIG_USB1_PLL_480_CTRL_SET); |mx6_get_otghost_vbus_func(&mx6_set_usb_otg_vbus); |dr_utmi_config.platform_driver_vbus = mx6_set_usb_otg_vbus; ||#ifdef CONFIG_USB_OTG |/* wake_up_enable is useless, just for usb_register_remote_wakeup execution*/ |dr_utmi_config.wake_up_enable = _device_wakeup_enable; |dr_utmi_config.operating_mode = FSL_USB2_DR_OTG; |dr_utmi_config.wakeup_pdata = &dr_wakeup_config; |pdev[i] = imx6q_add_fsl_usb2_otg(&dr_utmi_config); <------------------------+dr_wakeup_config.usb_pdata[i] = pdev[i]->dev.platform_data;i++;#endif#ifdef CONFIG_USB_EHCI_ARC_OTG -------------------------+dr_utmi_config.operating_mode = DR_HOST_MODE; |dr_utmi_config.wake_up_enable = _host_wakeup_enable; |if (usb_icbug_swfix_need()) { |dr_utmi_config.platform_rh_suspend = _host_platform_rh_suspend_swfix; |dr_utmi_config.platform_rh_resume = _host_platform_rh_resume_swfix; |} else { |dr_utmi_config.platform_rh_suspend = _host_platform_rh_suspend; |dr_utmi_config.platform_rh_resume = _host_platform_rh_resume; |} |dr_utmi_config.platform_set_disconnect_det = fsl_platform_otg_set_usb_phy_dis; |dr_utmi_config.phy_lowpower_suspend = _host_phy_lowpower_suspend; |dr_utmi_config.is_wakeup_event = _is_host_wakeup; |dr_utmi_config.wakeup_pdata = &dr_wakeup_config; |dr_utmi_config.wakeup_handler = host_wakeup_handler; |dr_utmi_config.platform_phy_power_on = dr_platform_phy_power_on; |pdev[i] = imx6q_add_fsl_ehci_otg(&dr_utmi_config); |dr_wakeup_config.usb_pdata[i] = pdev[i]->dev.platform_data; |i++; |#endif |#ifdef CONFIG_USB_GADGET_ARC |dr_utmi_config.operating_mode = DR_UDC_MODE; |dr_utmi_config.wake_up_enable = _device_wakeup_enable; |dr_utmi_config.platform_rh_suspend = NULL; |dr_utmi_config.platform_rh_resume = NULL; |dr_utmi_config.platform_set_disconnect_det = NULL; |dr_utmi_config.phy_lowpower_suspend = _device_phy_lowpower_suspend; |dr_utmi_config.is_wakeup_event = _is_device_wakeup; |dr_utmi_config.wakeup_pdata = &dr_wakeup_config; |dr_utmi_config.wakeup_handler = device_wakeup_handler; |dr_utmi_config.charger_base_addr = anatop_base_addr; |dr_utmi_config.platform_phy_power_on = dr_platform_phy_power_on; |pdev[i] = imx6q_add_fsl_usb2_udc(&dr_utmi_config); |dr_wakeup_config.usb_pdata[i] = pdev[i]->dev.platform_data; |i++; |#endif |devnum = i; |/* register wakeup device */ |pdev_wakeup = imx6q_add_fsl_usb2_otg_wakeup(&dr_wakeup_config); |for (i = 0; i < devnum; i++) { |platform_device_add(pdev[i]); |((struct fsl_usb2_platform_data *)(pdev[i]->dev.platform_data))->wakeup_pdata = |(struct fsl_usb2_wakeup_platform_data *)(pdev_wakeup->dev.platform_data); |} ||return 0; |} |module_init(mx6_usb_dr_init); || <kernel path>$ make menuconfig || Symbol: USB_EHCI_ARC_OTG [=n] <--------------------------------*--------------------+│ Type : boolean |│ Prompt: Support for DR host port on Freescale controller |│ Defined at drivers/usb/host/Kconfig:80 |│ Depends on: USB_SUPPORT [=y] && USB_EHCI_ARC [=y] |│ Location: |│ -> Device Drivers |│ -> USB support (USB_SUPPORT [=y]) |│ -> Support for Freescale controller (USB_EHCI_ARC [=y]) |
I.MX6 make menuconfig OTG to slave only mode相关推荐
- linux 移动目录至u 盘,Linux下通过OTG把板卡上的一个磁盘或文件映射成移动磁盘...
我们经常会把手机或其他电子设备插入PC机来进行一些文件的互传,当把手机插入PC机时,会看到PC上出现了一个移动磁盘,但具体在Linux下如何实现,现把方法介绍如下,至于详细的原理这里就不介绍了,因为我 ...
- USB OTG原理+ ID 检测原理
OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...
- USB OTG ID 检测原理
OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...
- USB Host Device And OTG
USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公 ...
- USB OTG 的进一步理解
一直以来在做安卓系统相关的嵌入式通讯(USB.BLE.网络.串口等),最近在讨论 OTG 问题的时候,对该规范又重新理解了一次,这里仅做一些概要和核心点说明,下方会给出具体 OTG 包含协议的参考链接 ...
- USB OTG原理简述
USB OTG即USB On-The-Go的缩写,他目的是实现在没有Host的情况下,实现设备间的数据传送.例如数码相机直接连接到打印机上,通过OTG技术,连接两台设备间的USB口,将拍出的相片立即打 ...
- android otg开发笔记
探讨otg是否支持读写功能---答案:是可以的,可读,可写. --参考网址:https://blog.csdn.net/csdn635406113/article/details/70146041 探 ...
- AndroidUSB—OTG通信
背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设 ...
- i.MX6 ARM工控板 开发设计
i.MX 6系列的应用处理器将可扩展平台与广泛的集成和高能效处理功能相结合,尤其适合多媒体应用.i.MX6 Quad处理器的特性包括: 满足操作系统和游戏的MIPS需求,增强高层便携式应用的功能 多级 ...
最新文章
- sql 自动增加排序 并且初始值是000001
- 如何从新开发的程序中提炼服务
- 加速收敛_引入Powerball 与动量技术,新SGD优化算法收敛速度与泛化效果双提升 | IJCAI...
- 支付签约_已成燎原之势!蜻蜓支付出库、签约、地推火爆!
- 列出搜索过的数据(类似京东顶部搜索框)
- 网络工程师的人生之路是这样的开始的!
- 详细关闭iiop方法_安卓手机卡顿清理垃圾是没用的,教你关闭几个设置,告别手机迟钝...
- CCS安装多版本编译器 Compiler version__更新手动下载、安装方法
- 喵喵机器人--elasticsearch被入侵删库
- freeradius+ldap搭建认证服务器
- Jsckson 实现 java 对象与 JSONObject 和 JSONArray 互转
- 促销 Eventide Clockworks 经典传奇效果器插件合集
- linux mysql dengl_mysql中类似oracle的over分组实现
- 2020年12月电子学会Python等级考试试卷(一级)考题解析
- 底层网络知识详解:如何连接外网
- java获取下载链接文件流并上传至OSS
- python boxplot 多组_Matlab boxplot for Multiple Groups(多组数据的箱线图)
- 你知道OSPF多区域配置和区域优化吗?(华为OSPF多区域理论,路由重分发,末梢区域和完全末梢区域的优化,NSSA区域的优化)
- 电脑无法连接oppo手机热点
- 《舌尖上的中国》经典语录
热门文章
- linux 云主机安装方法,虚拟主机linux服务器安装教程
- linux jira mysql_JIRA配置连接MySQL数据库
- tinymce 工具栏 不显示_VBA自动创建outBar式样的工具栏
- 阿里mysql笔记_MySQL学习笔记(一)
- nodejs mysql save_NodeJs Mysql简易操作工具
- linux man 手册翻译,close (linux man) 翻译
- 超级计算机手机芯片,美国开建arm超级计算机,单节点性能是手机芯片100倍
- java中json对象去重复_如何忽略Java中JSON对象的多个属性?
- redis 缓存目标
- opencv-api findContours