




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
USB驱动移植教程一.USB驱动框架 在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。USB主机控制器驱动程序控制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。在USB主机控制器驱动和USB设备驱动之间还有一层叫USB核心层。USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。说了那么多,无图无真相啊 LinuxUSB主机侧驱动总体框架二USB驱动移植步骤 1.S5PV210主机控制驱动的移植USB主机控制器有3种规范,UHCI(UniversalHostControllerInterface),这种规范主要是Intel、Via芯片公司提供支持PC主板的;OHCI(OpenHostControllerInterface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式领域上的USB芯片;EHCI(EnhancedHostControllerInterface),这种后来为提高USB速度而提出的规范,它支持最高速度为480Mbps。在S5PV210_UM_REV1.1手册上搜索OHCI关键词,会发现下面一段话 这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。2.1移植ohci-s5p驱动 打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。很遗憾,3.8的内核没有提供S5PV210的USBHOST控制器驱动程序。最好验证有没有提供的办法就是,烧写网蜂提供的第二版的uImage进去,然后找个U盘、或者鼠标插入Webee210开发板的USBHOST接口,看看串口有没有打印什么信息,结果是不会有任何反应的。既然没有提供,这就需要我们自己来编写了,这下不好办了吧? 不用紧张,仔细再找找,还是能发现一些类似的源码,可供我们移植的。我们发现,内核虽然没有提供ohci-s5p.c源码,但是有提供ehci-s5p.c源码,还有ohci相关的其他平台的源码,比如ohci-s3c2410.c、ohci-exynos.c供我们移植参考。2.1.1ohci-s5p.c程序 内核既然没有ohci-s5p.c,那我们使用其他平台的ohci源码,这里我们拷贝driversusbhost目录下的ohci-exynos.c为ohci-s5p.c。然后将所有exynos字符串替换成s5p,由于有些地方是exynos4,所以还需要将s5p4替换为s5p。最后还需要修改一下头文件,将#include改为:#include2.2usb-ohci-s5p.h程序 打开内核目录includelinuxplatform_data,然后拷贝usb-exynos.h为usb-ohci-s5p.h。将所有的exynos4字符串替换为s5p,将EXYNOS替换为S5P。最后添加平台数据:staticstructs5p_ohci_platdatas5p_ohci_platdata;为了以后支持EHCI还添加echi的平台数据,最后usb-ohci-s5p.h修改为:#ifndef_MACH_S5P_OHCI_H#define_MACH_S5P_OHCI_H/*AddbyWebee*/#ifdefCONFIG_S5P_DEV_USB_EHCIstaticstructs5p_ehci_platdatas5p_ehci_platdata;#endifstaticstructs5p_ohci_platdatas5p_ohci_platdata;/*AddbyWebee*/structs5p_ohci_platdataint(*phy_init)(structplatform_device*pdev,inttype);int(*phy_exit)(structplatform_device*pdev,inttype);externvoids5p_ohci_set_platdata(structs5p_ohci_platdata*pd);#endif/*_MACH_S5P_OHCI_H*/2.3添加s5p_ohci_driver到ohci_hcd.c 打开driversusbhostohci-hcd.c,在CONFIG_USB_OHCI_EXYNOS前面添加如下代码:#ifdefCONFIG_USB_OHCI_S5P#includeohci-s5p.c#definePLATFORM_DRIVERs5p_ohci_driver#endif 因为S5PV210 USB HOST控制器驱动由driversusbhostohci-hcd.c(支持各种SoC下的主机控制器驱动的通 用部分)和driversusbhostohci-s5p.c共同完成。2.4添加平台设备前面我们移植ohci-s5p.c主要是围绕platform_driver来编程的,这又回到了平台驱动设备模型了。还记得我们移植gpio-key驱动了吗?里面就添加了平台设备来支持平台驱动。今天,我们同样需要添加平台设备来支持s5p_ohci_driver这个平台驱动。怎么添加呢?参考别人怎么写! 打开archarmplat-samsungdevs.c,找到s5p_device_ehci这个平台设备,模仿它来修改。 打开archarmmach-s5pv210mach-smdkv210.c,在smdkv210_devices前,添加如下代码:#include#include#include#include#include#includestaticstructresources5p_ohci_resource=0=DEFINE_RES_MEM(0xEC300000,SZ_256),1=DEFINE_RES_IRQ(S5P_IRQ_VIC1(23),;staticu64samsung_device_dma_mask=DMA_BIT_MASK(32);structplatform_devices5p_device_ohci=.name=s5p-ohci,.id=-1,.num_resources=ARRAY_SIZE(s5p_ohci_resource),.resource=s5p_ohci_resource,.dev=.dma_mask=&samsung_device_dma_mask,.coherent_dma_mask=DMA_BIT_MASK(32),;void_inits5p_ohci_set_platdata(structs5p_ohci_platdata*pd)structs5p_ohci_platdata*npd;npd=s3c_set_platdata(pd,sizeof(structs5p_ohci_platdata),&s5p_device_ohci);if(!npd-phy_init)npd-phy_init=s5p_usb_phy_init;if(!npd-phy_exit)npd-phy_exit=s5p_usb_phy_exit; 怎么确定s5p_ohci_resource里面的内存地址呢?这自然要回到S5PV210_UM_REV1.1手册了,在USB HOST这章的寄存器介绍里面有这么一段描述: 而IRQ的确定,则是找到下面这段话。/ *参考archarmmach-s5pc100includemachirqs.h*/#defineIRQ_UHOSTS5P_IRQ_VIC1(23)然后将定义设置好的s5p_device_ohci添加到smdkv210_devices,如:staticstructplatform_device*smdkv210_devices_initdata=&s5p_device_ohci,/*AddbyWebee*/&webee210_button_device,/*AddbyWebee*/;最后,在smdkv210_machine_init函数中添加平台数据的设置函数。#ifdefCONFIG_S5P_DEV_USB_OHCIs5p_ohci_set_platdata(&s5p_ohci_platdata);#endif2.5修改Kconfig2.5.1移植driversusbhost目录下的Kconfig打开driversusbhost目录下的Kconfig,在USB_OHCI_EXYNOS前面添加USB_OHCI_S5P的配置支持。修改后如下:#AddbyWebeeconfigUSB_OHCI_S5PbooleanOHCIsupportforSamsungS5PSoCSeriesdependsonUSB_OHCI_HCD&PLAT_S5PselectS5P_DEV_USB_OHCIhelpEnablesupportfortheSamsungS5PSOCson-chipOHCIcontroller.#AddbyWebee2.5.2移植archarmplat-samsung目录下的Kconfig打开archarmplat-samsung目录下的Kconfig,在S5P_DEV_USB_EHCI后面添加S5P_DEV_USB_OHCI的配置支持,修改后如下:#AddbyWebeeconfigS5P_DEV_USB_OHCIboolhelpCompileinplatformdevicedefinitionforUSBOHCI#AddbyWebee2.5.3移植driversusb目录下的Kconfig 在内核目录下输入makemenuconfig配置内核时,搜索S5P_DEV_USB_OHCI发现如下现象,它表明S5P_DEV_USB_OHCI的配置需要先将PLAT_S5P配置上。搜索:先按/打开driversusb目录下的Kconfig,在USB_ARCH_HAS_OHCI模块下添加如下内容:defaultyifPLAT_S5P2.6创建setup-usb-phy.c文件在archarmmach-s5pv210目录下创建setup-usb-phy.c文件,为什么要创建这么一个文件呢?还记得前面在smdkv210_machine_init()函数里添加过s5p_ohci_set_platdata(&s5p_ohci_platdata);这个函数吗? 其中就会去设置s5p_ohci_platdata里的phy_init、phy_exit这两个成员函数。那么就需要实现,s5p_usb_phy_init函数和s5p_usb_phy_exit函数。最后将setup-usb-phy.c文件添加如下代码:#include#include#include#include#include#include#include#include#include#include#include#includeints5p_usb_phy_init(structplatform_device*pdev,inttype)interr;structclk*otg_clk;if(type!=S5P_USB_PHY_HOST)return-EINVAL;otg_clk=clk_get(&pdev-dev,otg);if(IS_ERR(otg_clk)dev_err(&pdev-dev,Failedtogetotgclockn);returnPTR_ERR(otg_clk);err=clk_enable(otg_clk);if(err)clk_put(otg_clk);returnerr;if(readl(S5PV210_USB_PHY_CON)&(0x11)clk_disable(otg_clk);clk_put(otg_clk);return0;_raw_writel(_raw_readl(S5PV210_USB_PHY_CON)|(0x11),S5PV210_USB_PHY_CON);_raw_writel(_raw_readl(S3C_PHYPWR)&(0x17)&(0x16)|(0x18)|(0x15)|(0x14),S3C_PHYPWR);_raw_writel(_raw_readl(S3C_PHYCLK)&(0x17)|(0x30),S3C_PHYCLK);_raw_writel(_raw_readl(S3C_RSTCON)|(0x14)|(0x13),S3C_RSTCON);_raw_writel(_raw_readl(S3C_RSTCON)&(0x14)&(0x13),S3C_RSTCON);/*atleast10uSforPHYresetelsewhere,20notenoughhere.*/udelay(50);clk_disable(otg_clk);clk_put(otg_clk);return0;ints5p_usb_phy_exit(structplatform_device*pdev,inttype)if(type!=S5P_USB_PHY_HOST)return-EINVAL;_raw_writel(_raw_readl(S3C_PHYPWR)|(0x17)|(0x16),S3C_PHYPWR);_raw_writel(_raw_readl(S5PV210_USB_PHY_CON)&(1SCSIdevicesupport-SCSIdevicesupport*legacy/proc/scsi/supportSCSIdisksupportSCSICDROMsupportSCSIgenericsupportHIDsupport-GenericHIDdriver*USBsupport-SupportforHost-sideUSBEHCIHCD(USB2.0)support*ImprovedTransactionTranslatorscheduling*S5PEHCIsupportOHCIHCDsupport*OHCIsupportforSamsungS5PSoCSeries*GenericOHCIdriverforaplatformdeviceGenericEHCIdriverforaplatformdeviceUSBMassStoragesupport*USBMassStorageverbosedebugSanDiskSDDR-09(andotherSmartMedia,includingDPCMsupport)SanDiskSDDR-o5SmartMediasupport 完成以上所有移植后,就可以编译内核了,在内核目录下使用makeuImage命令编译内核。如果编译过程中出现说获取不到usbhost时钟,那么将ohci-s5p.c里的s5p_ohci_probe()函数里的:s5p_ohci-clk=devm_clk_get(&pdev-dev,usbhost);改为:s5p_ohci-clk=devm_clk_get(&pdev-dev,usb-host);三S5PV210主机控制器驱动的测试移植了那么久,终于可以见证下结果了,是不是有点兴奋呢。好啦,废话就不多说了,让我们一起见证奇迹吧。将新的uImage烧到webee210开发板,启动内核,如果能够成功启动内核,并且出现下面的信息: 表明前面的移植是成功的。在这里先肯定下自己。接下来,好戏即将上场。四驱动之手动测试4.1U盘测试将U盘(注意,不要插USB3.0的U盘)插入webee210开发板的USBHOST接口,观察打印信息(不同U盘信息可能不完全一致):插入U盘的瞬间,就输出那么多的信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高层电梯乘坐安全知识培训
- 高尔夫基础知识培训课件
- 电池片知识培训课件
- 高考历史考试题及答案:唐代辽宁安东都护府的设立与边疆管理
- 高考历史考试题及答案:清代广西金田起义(1851年)的爆发背景
- FRM(金融风险管理师)-巴塞尔协议流动性规则题目及答案
- CFA(特许金融分析师)-ESG投资评估指标题目及答案
- 加油站油品销售与储存管理协议
- 全省农商银行信贷人员持证上岗考试复习试题
- 2025年北京市石景山中考地理真题卷含答案解析
- 某体育公园可行性研究报告
- T-CCSAS 050-2024 化学化工实验室化学品安全操作规程编写指南
- 《生态学园林》课件
- 幼儿园教学主任培训
- 展会主办项目合同范例
- 装饰装修工程施工方案(完整版)
- 11YG301钢筋混凝土过梁(完整)
- 游戏陪玩行业社交化平台设计与推广策略
- 人教版初中全部英语单词表(含音标)
- 燃气市场风险分析报告
- 2024年山东省泰安市义务教育教师课程标准应用能力大赛初赛语文学科试题
评论
0/150
提交评论