首页 基于ARM的平板电脑的底层硬件驱动设计

基于ARM的平板电脑的底层硬件驱动设计

举报
开通vip

基于ARM的平板电脑的底层硬件驱动设计摘要推出平板的目的是为了弥补手机和笔记本电脑之间的这块空白区域,就是为人们提供一款和手机一样携带方便、操作简单,但比手机视觉效果更好,并能像笔记本电脑一样可以快速流畅的上网、观看视频和玩游戏的产品。软件方面,除苹果自己有自己的IOS外,不管是国内还是国外厂商,由于google的开源,基本都选择了andriod操作系统作为开发平台。Android是一个基于linux内核的操作系统,在一款产品的开发过程中,硬件驱动程序的开发和调试是一项艰巨的任务,驱动程序的质量直接影响产品的性能和稳定性,所以对平板上驱动程序的研究和设...

基于ARM的平板电脑的底层硬件驱动设计
摘要推出平板的目的是为了弥补手机和笔记本电脑之间的这块空白区域,就是为人们提供一款和手机一样携带方便、操作简单,但比手机视觉效果更好,并能像笔记本电脑一样可以快速流畅的上网、观看视频和玩游戏的产品。软件方面,除苹果自己有自己的IOS外,不管是国内还是国外厂商,由于google的开源,基本都选择了andriod操作系统作为开发平台。Android是一个基于linux内核的操作系统,在一款产品的开发过程中,硬件驱动程序的开发和调试是一项艰巨的任务,驱动程序的质量直接影响产品的性能和稳定性,所以对平板上驱动程序的研究和 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 具有实际工程意义。此次设计针对平板电脑中常用的几个硬件驱动进行了研究和设计,如LCD驱动,PWM背光驱动,按键驱动等。旨在熟悉驱动设计流程,掌握驱动设计的一般方法。关键字:平板电脑,Android,linux,硬件驱动ABSTRACTThepurposeofthelaunchofthetabletisinordertomakeupthepieceofblankareabetweenmobilephonesandlaptopcomputersforpeopletoofferadeviceaseasyasmobilephonetocarry,simpletooperate,butbetterthanthemobilephonevisualeffects,andthesameasthelaptopcanquicklyaccesstotheInternet,watchingvideosandplayinggames.Onthesoftwareside,inadditiontoApple'sownIOS,whetherdomesticorforeignmanufacturers,becauseofgoogleopenedtheandroidsourcecode,basicallychoosetheandriodoperatingsystemasthedevelopmentplatform.AndroidisaLinuxkernel-basedoperatingsystem,intheprocessofaproductdevelopment,developinganddebugginghardwaredriversisanarduoustask,thequalityofthedriverdirectlyimpactonproductperformanceandstability,SotheresearchanddesignofthedriverontheTabletPChasapracticalengineeringsignificance.ThispaperwillresearchanddesignafewhardwaredriversthatcommonlyusedintheTabletPC,suchasLCDdrivers,PWMbacklightdriver,keydriversandsoon.Thepurposeofthisdesignistofamiliartothedriverdesignprocessandgraspthegeneralapproachtodriverdesign.Keywords:tabletpc,android,linux,hardwaredrivers目录5第一章引言51.1ARM处理器介绍61.2android操作系统介绍71.3平板电脑驱动开发概述9第二章软硬件平台介绍和启动过程分析92.1硬件平台介绍92.2软件平台介绍102.3启动过程分析13第三章LCD驱动设计及实现133.1显示控制器及显示器硬件配置133.1.1S5PV210显示控制器133.1.2三星9.7寸IPS屏LTN097XL02143.1.3显示模块硬件连接方式153.2android下的LCD驱动153.2.1LCD硬件时序参数设置163.2.2LCD硬件设备注册183.2.3frambuffer驱动注册19第四章PWM背光驱动设计及实现194.1PWM背光控制器硬件连接194.2linux内核PWM驱动194.2.1PWM背光设备注册204.2.2PWM背光驱动注册224.3PWM背光在androidHAL层移植224.3.1什么是硬件抽象层234.3.2HAL的实现机制244.3.3pwm背光的HAL层实现27第五章接键驱动设计及实现275.1接键硬件链接以及功能要求275.2内核空间按键驱动设计和实现325.2android对按键的重映射35第六章振动电机驱动设计及实现356.1功能要求以及硬件连接356.2内核空间振动电机驱动设计及实现356.2.1什么是timedGPIO366.2.2振动电机的TimedGPIO驱动实现406.3振动电机驱动HAL层的实现43第七章WM8976声道自动切换设计及实现437.1功能要求以及硬件链接447.2内核空间声道自动切换设计及实现447.2.1什么是switchIO447.2.1switchIO耳机插拔检测驱动设计及实现487.2.2wm8976声道切换控制实现51总结52参考文献53致谢54外文资料原文57译文第一章引言2010年1月份苹果公司发布了iPad平板电脑,从此为IT行业带来了一个全新的产业。iPad定位是介于智能手机和笔记本电脑之间的产品,提供浏览互联网、收发电子邮件、观看电子书、播放音频或视频等功能。从产品定位我们可以看出,苹果公司推出iPad的目的是为了弥补手机和笔记本电脑之间的这块空白区域,就是为人们提供一款和手机一样携带方便、操作简单,但比手机视觉效果更好,并能像笔记本电脑一样可以快速流畅的上网、观看视频和玩游戏的产品。iPad的推出,可以说开启了后PC时代,其火爆的销量让以前其他众多处于观望的厂商也迅速杀入的这块市场。得益于集成电路的高速发展,以前需要很多电路才可以完成的功能现在都被高度整合到了SOC之中(片上系统)。所以和PC相比,平板电脑可以把体积做得更小。功耗做得更底。从硬件和软件的角度来讲,最关键的分别是SOC和操作系统。在SOC这一块,国外主要被高通、三星、TI、NVIDIA这些厂商所占据。这些厂商做出来的SOC集成度高,功能强劲,CPU主频现一般在1G-1.5G左右。基本已经过渡到双核时代。终端制造厂商做出来的平板终端主要面向高端消费市场。在国内,几家面向移动多媒体终端的IC设计公司也推出了性能优异的SOC芯片。如:珠海全志,福州瑞芯微,北京君正,晶晨半导体等。这些厂商的推出的SOC集成度也较高。主频从800MHZ-1.2GHZ,均为单核处理器。整体上比国外大厂要低一个档次。但是,用这些厂商做出来的平板 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 成本很低,更复合中国消费者的消费习惯。所以市场也非常的广阔。在软件方面。除苹果自己有自己的IOS外,不管是国内还是国外厂商,由于google的开源,基本都选择了andriod操作系统作为开发平台。所以在这个平台上的软件资源非常丰富。对于方案设计商和终端制造商,只要具备一定的开发实力,都可以以这个平台做出差异化地方案。1.1ARM处理器介绍ARM是AdvancedRISCMachines的缩写,即可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是种技术的名字。目前,ARM公司专门从事基于RISC技术芯片的设计开发,作为知识产权供应商,ARM的商业模式主要涉及IP的设计和许可,而非生产和销售实际的半导体芯片。他们向合作伙伴(包括世界领先的半导体公司和系统公司)授予IP许可证。这些合作伙伴可利用ARM的IP设计创造和生产片上系统设计,但需要向ARM支付原始IP的许可费用并为每块生产的芯片或晶片交纳版税。除了处理器IP外,他们还提供了一系列工具、物理和系统IP来优化片上系统设计.图1-1ARM产品线:提供领先的设计、实现和应用正因为ARM的IP多种多样以及支持基于ARM的解决方案的芯片和软件体系十分庞大,全球领先的原始设备制造商(OEM)都在广泛使用ARM技术,应用领域涉及手机、数字机顶盒以及汽车制动系统和网络路由器。当今,全球95%以上的手机以及超过四分之一的电子设备都在使用ARM技术。在平板领域,国外厂商基本青一色的使用了ARM的内核或者具有ARMISA的处理器。在国内,除北京群正自主研发基于MIPSISA的xburst架构CPU以外。其他厂商都采用了ARMcortexA8或cortexA9内核,在此基础上再加入厂商自己的外设如USB,LCDC,HDMI,audiocodec,videocodec等,形成具有自主特色的SOC。1.2android操作系统介绍Android最早是由google在2007年发布的一款操作系统,Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。Android操作系统最初由AndyRubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。自2007年发布以来,Android已经经历了数个版本的更新,市面上采用该系统的移动设备数量也在飞速增长。目前市面上实用的比较多的版本为android2.3,代号为姜饼。Google最新的版本为4.0,代号为冰欺凌三明治。根据google的官方统计,就目前的市场占有率来看,2.3版本为市场占有市场份额最多的anroid版本。约占了整个android的63.9%。在该平台上软件资源也是最丰富的。图1-2Anroid设备中各版本占有率1.3平板电脑驱动开发概述驱动程序是一种实现硬件具体功能的软件。做驱动程序开发不仅仅要明白操作系统为我们提供的驱动模型,常用的数据结构。而且要理解我们所操作的硬件。明白硬件的工作原理。所以驱动程序的开发工作非常具有挑战性。在现在市长上销售的平板中,大多数在硬件平台上,选用ARM处理器,软件平台上选用android(苹果有自家的IOS),所以,平板电脑上的驱动开发可以说是在ARM平台上的android驱动开发,由于android是linux内核,所以android下有很多为 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的linux驱动,如串口驱动,framebuffer驱动,touchpanel驱动等。但android也有自己的专有驱动。具体如下:1.AndroidBinder:基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通信功能。2.Android电源管理(PM):一个基于标准liunx电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。3.低内存管理器(LowMemoryKiller):根据系统运行的需要杀死进程以释放需要的内存。4.匿名共享内存(Asheme):为进程间提供大量共享内存,同时为内核提供回收和管理这个内存的机制。5.AndroidPMEM(physical):PMEME用于向用户空间提供连续的物理内存区域。6.AndroidLogger:一个轻量级的日志设备,用于抓取Android系统的各种日志。7.AndroidAlarm:提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。8.USBGadget:驱动一个基于标准liunxusbgadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架。9.AndroidramConsole:为了提供调试功能,Android允许将调试日志信息写入一个被称为RAMConsole的设备里,它是一个基于RAM的Buffer.10.Androidtimeddeivce:提供了对设备进行定时控制功能,目前支持vibrator和LED设备.11.Yaffs2文件系统:Android采用Yaffs2作为MTDnandflash文件系统。同时,同标准的linux相比,android驱动开发中,为我们提出了一个新的概念HAL(HardwareAbstractLayer硬件抽象层).是Google因应厂商希望不公开源码的要求下,所推出的新观念。HAL运行在用户空间,这样,驱动程序就可以不受GPL的限制,不用公开源代码。他们的硬件规格和驱动代码就可以很好的保护驱动。这对很多设备制造商来说,是一种良好的自我保护。在android移植中,HAL也是需要驱动人员去开发的一部分。针对我们的自己搭建的硬件平台,在本文中将重点阐述如下驱动的移植和开发:1.三星9.7英寸IPS显示面板显示驱动设计。2.显示面板PWM背光驱动程序设计。3.平板电脑上按键驱动设计。4.振动电机驱动设计。5.WM8976codec研究,配合硬件实现耳机插入检测,着重解决外放喇叭和耳机声道自动切换问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。第二章软硬件平台介绍和启动过程分析2.1硬件平台介绍在硬件平台上选用三星蜂鸟ARM处理器s5pv210.其具有如下特性:CortexTM-A8架构32KBI/D缓存,512KB二级缓存64位多总线架构·支持MPEG4,H.263,H.2641080P@30fps编解码以及MPEG4·1080P@30fps解码JPEG解码高达80Mpixels/s2D,3D高性能加速HDMI,TVOUT根据应用需求,我们板载如下硬件:1.三星K4T1G084QE512MBDDR2.2.9.7寸IPS显示屏,分辨率为1024*768.3.9.7寸10点电容触摸屏。采用深圳goodixGT8105芯片组.4.HDMI高清输出接口.5.OV2655200W像素前置摄像头.6.WM8976audiocodec,自带AB类功放.7.KionixKXTF9-2050加速度传感器.8.AtherosAR6102WIFI.9.7400MA锂电池,并设计了充电电路.10.振动电机.2.2软件平台介绍在软件开发上选用xboot作为启动引导bootloader。xboot是由深圳九鼎展创科技有限公司自主开发的开源bootloader。具有如下特性:支持多操作系统选择启动,默认系统可自定义;支持开机LOGO;支持shell命令行脚本解析;(源码架构清晰易懂,无需繁琐的宏定义;(添加程序简单,类似linux驱动加载;完全免费开源工程,无须license;支持打包内核,调试更加出色;支持打包文件系统,boot,kernel,ramdisk只需一个文件;Android采用目前兼容性最好的android2.3。内核采用linux2.6.37.整个开发过程在ubuntu10.10下完成.2.3启动过程分析系统启动过程是一个代码从闪存到内存,初始化必须的硬件并为操作系统的运行做好前期准备的过程。本系统中启动代码由三部分组成:IROM,一级bootloader,二级bootloader。其中IROM由CPU自身硬件实现,一级和二级bootloader由xboot实现.每一个阶段的特点为:·iROM代码:包含小而简单的代码,是独立于平台和存储在内部存储器·一级引导装载程序:包含小而简单的代码,这是独立于平台和存储在外部存储设备。·二级引导装载程序:包含复杂的代码,这是特定于平台和存储在外部存储设备。S5PV210内带64KROM和96KSRAM。内部的64KBROM和内部96KBSRAM的地区都可以用于引导。可通过外部引脚设置选择从不同的设备启动.图2-1启动引导过程具体启动过程如下:IROM代码被放置在内部的64KBROM。它初始化基本系统功能,如时钟,堆栈和堆。该IROM从一个特定的外部引导设备复制一级bootloader到内部96KB的SRAM。引导设备的选择由工作模式(OM)引脚确定。在一级bootloader中主要完成如下功能:1.关闭看门狗2.设置CPU到管理模式3.关MMU4.初始化系统时钟5.初始化DRAM控制器6.锁定系统电源状态7.跳转到二级bootloader其中在锁定系统电源这个步骤是为了用户开机的实现。在硬件上系统有如下开机电路:图2-2硬件开机电路整个供电电路中,首先按住SW12,即POWER键,MOS管Q5的栅级由高电平变为低电平,MOS管导通,DCDC芯片MP1482的使能脚被拉高,5V电压产生。随后,3.3V的DC-DC电源芯片由于5V电源已近输入也会开始工作,产生3.3V电压,给整个板卡供电,程序开始运行。在bootloader中将网络标号为PWR_LOCK的GPIO口拉高,注意这时5V供电部分的三极管Q6导通,MOS管Q5维持导通,至此,可以松开POWER按键整个电源已经置锁。在二级bootloader中主要完成如下功能:1.初始化本阶段用到的外设2.拷贝内核镜像和根文件系统到DRAM中3.设置启动参数4.调用内核.第三章LCD驱动设计及实现3.1显示控制器及显示器硬件配置3.1.1S5PV210显示控制器S5PV210自带显示控制器,它可以将总线上图像数据和系统内存中的视屏缓冲区里的数据传输到外部LCD接口上。外部的LCD接口支持三种类型:RGB接口,间接I80接口,和YUV接口。显示控制器具有五个叠加图形窗口,支持多种颜色模式,256级alpha混合,色键,XY位置控制,软滚动,可变窗口大小.同时支持各种颜色格式,如RGB(1BPP~24BPP)和YCbCr4:4:4.可通过软件配置以支持在屏幕上的水平和垂直像素,数据接口数据线的宽度,接口时序,和刷新率的不同要求.显示控制器传输视频数据,并产生必要的控制信号,如,RGB_VSYNC,RGB_HSYNC,RGB_VCLK,RGB_VDEN和SYS_CS0,SYS_CS1,SYS_WE。除了产生控制信号,显示控制器包含视频数据的数据端口。其结构框图如下:3-1S5PV210显示控制器结构框图3.1.2三星9.7寸IPS屏LTN097XL02LTN097X02是一个完整的具有LED背光系统的彩色有源矩阵液晶显示器。矩阵采用的a-Si薄膜晶体管作为有源元件。它是一种透射型显示操作系统。这块TFT-LCD具有9.7英寸XGA主动显示区域分辨率(1024×768像素)。每个像素被分为红,绿,蓝子像素。每个子像素具有6级灰度信号,一共呈现出262,144种颜色。LTN097XL02采用了LVDS接口,以使整个模块达到低功耗,高速,低EMI要求。基于这些特点他非常适合作为平板电脑显示器。其整个模块框图如下:图3-2LTN097XL02内部结构框图3.1.3显示模块硬件连接方式由于S5PV210的显示控制器不支持LVDS接口,所以外接电路需要实现RGB到LVDS的转换电路。选用DOESTEKDTC34LM85A作为LVDS发送器,完成RGB接口到LVDS接口的时序转换其硬件电路如下:图3-3RGB接口转LVDS接口电路特别值得注意的是,芯片具有一个PDN引脚,该引脚为低电平时,整个芯片进入低功耗模式,芯片停止工作,整个IC的从3.3V吸收的电流从大约35mA降到10uA,可大大降低功耗。因此把此引脚连入到CPU上的GPIO,通过驱动控制以达到控制显示模块挂起时的低功耗的目的。3.2android下的LCD驱动三星公司把LCD的驱动程序在内核中以platformdriver的形式注册。针对不同的LCDdvice,需要补充实现不同的platformdvice。注册后,驱动程序根据注册的硬件信息来配置和初始化显示控制器。以达到硬件上的时序要求,同时伴随注册的为LCD的操作方法,如LCDgpio配置,打开背光,关闭背光,LCD复位等操作。3.2.1LCD硬件时序参数设置图3-4RGB接口驱动时序上图给出了LCD屏的典型时序,时序图中的VCLK,HSYNC和VYSNC分别为像素时种信号,行同步信号,帧同步信号,VDEN为数据有效标志,VD为图像的数据信号。作为帧同步信号的VSYNC,每发出一个脉冲,都意味着新的一屏数据开始发送,上一屏数据结束和下一屏数据开始中间的时间为场消隐(fieldblanking)。而作为行同步信号的HSYNC,每发出一个脉冲都表明新的一行图像数据开始发送。在一行数据结束和下一行数据开始之间的时间为行消隐(lineblanking)。在帧同步和行同步之前和之后都必须留下消隐时间。场消隐时间=VFPD+1+VSPW+1+VBPD+1;其中VFPD为场消隐前沿,VSPW为场消隐脉冲宽度,VBPD为场消隐后沿。行消隐时间=HFPD+1+HSPW+1+HBPD+1;其中HFPD为行消隐前沿,HSPW为行消隐脉冲宽度,HBPD为行消隐后沿。图3-5LTN097XL02硬件时序参数其参数可通过LTN097XL02硬件手册得到。如上图所示。3.2.2LCD硬件设备注册在系统初始化过程中,调用staticvoid__initsmdkv210_machine_init(void)函数,在其中注册frambuffer的platformdevice:platform_device_register(&s3c_device_fb);然后为frambuffer设置平台数据:s3cfb_set_platdata(&LTN097xl02_data);其中LTN097xl02定义为:staticstructs3c_platform_fbLTN097xl02_fb_data__initdata={.hw_ver=0x62,.nr_wins=5,.default_win=CONFIG_FB_S3C_DEFAULT_WINDOW,.swap=FB_SWAP_WORD|FB_SWAP_HWORD,.lcd=&LTN097lx02,.cfg_gpio=LTN097lx02_cfg_gpio,.backlight_on=LTN097lx02_backlight_on,.backlight_onoff=LTN097lx02_backlight_off,.reset_lcd=LTN097lx02_reset_lcd,};其中ek070tn93定义为:staticstructs3cfb_lcdLTN097lx02={.width=1024,.height=768,.bpp=32,.freq=60,.timing={.h_fp=260,.h_bp=480,.h_sw=10,.v_fp=22,.v_fpe=1,.v_bp=18,.v_bpe=1,.v_sw=7,},.polarity={.rise_vclk=0,.inv_hsync=1,.inv_vsync=1,.inv_vden=0,},};这个结构体中决定了lcd显示分辨率,显示帧率,以及色深。.timing域就决定了LCD的硬件时序参数。.polarity域决定了LCD控制性号的有效电平为高有效还是低有效。3.2.3frambuffer驱动注册由于显示控制器已经集成在三星的SOC中作为一个独立的硬件模块布存在,因此LCD驱动包含了平台驱动。这样在frambuffer设备注册的过程中只需要注册平台驱动。当找到匹配的平台设备时,在探测函数中完成了如下4个工作:(1)申请fb_info结构体内存空间,初始化FBI结构体中固定和可变的屏幕参数。(2)根据注册的LCDdvice传递的硬件信息,完成显示控制器的初始化。(3)申请frambuffer设备显示缓冲空间。(4)注册frambuffer设备。注册的frambuffer设备将在用户空间生成相应的节点,操作系统调用相应的操作节点,以达到操作LCD硬件的目的。第四章PWM背光驱动设计及实现4.1PWM背光控制器硬件连接图4-1PWM背光驱动电路在硬件上采用MPSMP3202升压恒流IC,CPU发出受软件控制的PWM信号。经过R64,C34滤波后改变参考直流DC电势,以达到调节背光的目的。CPU通过一个GPIO控制MP3202EN端,从而控制背光的打开和关闭。4.2linux内核PWM驱动4.2.1PWM背光设备注册由于S5PV210自带PWM控制器,所以PWM设备在内核被抽象为一个平台设备。我们使用PWM_TOUT0作为背光驱动设备。在mach-smdkv210.c中定义PWM背光设备为:staticstructplatform_devicesmdk_backlight_device={.name="pwm-backlight",.id=-1,.dev={.parent=&s3c_device_timer[0].dev,.platform_data=&smdk_backlight_data,},};其中.name定义了背光设备的名字.platform_data成员指向了此背光设备的平台数据,其定义为:staticstructplatform_pwm_backlight_datasmdk_backlight_data={.pwm_id=0,.max_brightness=255,.dft_brightness=255,.pwm_period_ns=78770*4,};此结构体中比较重要的两个成员为max_brightness:最大亮度值。由于android平台上规定PWM背光亮度范围为0~255.所以设置最大亮度值为255。pwm_period_ns决定了pwm的周期:Tpwm=78770*4=315080(ns)。故PWM的输出频率为:Fpwm=1/Tpwm=3.17(KHz)。定义的PWM设备通过platform_device_register(&smdk_backlight_device)函数调用注册为一个平台设备。4.2.2PWM背光驱动注册由于PWM背光设备被实现为一个平台设备,则需要与之对应的平台驱动来驱动该设备。此驱动在内核代码/driver/video/backlight/Pwm_bl.c中实现。在模块加载过程中先执行模块初始化函数:staticint__initpwm_backlight_init(void){returnplatform_driver_register(&pwm_backlight_driver);}在初始化中完成对PWM背光平台驱动的注册。其中pwm_back_light_driver定义为:staticstructplatform_driverpwm_backlight_driver={.driver={.name="pwm-backlight",.owner=THIS_MODULE,},.probe=pwm_backlight_probe,.remove=pwm_backlight_remove,.suspend=pwm_backlight_suspend,.resume=pwm_backlight_resume,};在此结构体中实现了平台驱动的几个方法:探测硬件是否存在的probe方法,移除驱动的remove方法,睡眠挂起的suspend方法和恢复的resume方法。当此驱动加载时,通过匹配驱动名和设备名来遍历系统中是否存在相应的设备,如匹配成功,则调用pwm_backlight_probe函数,在此函数中完成的操作为:图4-2pwm_backlight_probe函数执行流程其中注册背光设备到backlight类的实现为:backlight_device_register(dev_name(&pdev->dev),&pdev->dev,pb,&pwm_backlight_ops,&props);其中dev_name(&pdev->dev)为注册设备的名字。最终被解析为“pwm-backlight”,pwm_backlight_ops参数的定义为:staticconststructbacklight_opspwm_backlight_ops={.update_status=pwm_backlight_update_status,.get_brightness=pwm_backlight_get_brightness,};pwm_backlight_update_status为用户空间对相应节点的写操作实现的内核空间的回调函数,pwm_backlight_get_brightness向用户空间反回当前的PWM背光亮度.整个探测过程结束后,在sys文件系统下,生成/sys/class/backlight/pwm-backlight/brightness节点,用户空间通过写这个节点来实现背光亮度的调节。4.3PWM背光在androidHAL层移植4.3.1什么是硬件抽象层AndroidHAL是google应厂商希望不公开源代码的要求所推出的一个概念。它能以封闭源码的形式提供硬件驱动模块。其目的是把AndroidFramwork与LinuxKernel隔开,让Android不至于过度依赖LinuxKernel,以达成KernelIndependent的概念,也让AndroidFramwork的开发能在不考虑驱动程序的前提下进行。HAL提供了简单的设备驱动程序接口,应用程序使用设备驱动程序与底层硬件进行通信。另外,HAL应用程序接口和ANSIC标准库结合在一起,用户可以使用C语言库函数来访问Android文件系统。其在android中的位置如下图所示:图4-3android软件框架图从上图可以看到,HAL位于LinuxKernel与Libraries和AndroidRuntime之间,也就是说,HAL是底层硬件设备驱动程序提供给ApplicationFramwork的一个接口,它将直接和底层的设备驱动程序挂接。因此当我们需要将Android移植到具体硬件时,或者给Android添加硬件支持时,都需要对Android的HAL层进行移植或实现。4.3.2HAL的实现机制4.3.2.1通过链接库模块实现早期的AndroidHAL通过链接库模块实现,在“hardware/libhardware_legacy”目录中实现,它需要将HAL实现为一个*.so的共享库,然后在Runtime中通过函数直接调用HALModule来操作驱动程序。其调用流程如下图所示:图4-4AndroidHAL通过链接库实现的调用流程由于采用了直接调用方式,可被多个进程使用,但会被映射到多个进程空间,从而造成资源浪费,同时需要考虑代码能否安全重入的问题。4.3.2.1通过HALstub方式实现HALstub方式是Android改进后的方式,引入了桩(stub)的概念,stub虽然仍是以*.so库的形式存在,但HAL已经将*.so库隐藏起来了。Stub向HAL提供操作函数(operations),而runtime则是向HAL取得特定模块(stub)的操作函数,再回调这些操作函数。和以链接库模块方式实现的不同就在于:HALstub是通过回调函数间接的调用操作。这就 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 HAL中包含了各种各样的stub,Runtime只需要通过不同的类型(moduleID)就可以取得不同设备驱动的操作。其调用流程如下图所示:图4-5AndroidHAL通过stub方式实现的调用流程实际上,这种方式也将Android在不同的硬件中的移植工作进行了简化,统一了访问硬件的接口,不同的硬件只需要按照规则实践这些接口即可。4.3.3pwm背光的HAL层实现由于HAL层是以模块的方式被加载,所以HAL层的实现也可以看成是一个硬块的实现。在device\samsung\proprietary\liblight下建立lights.c和Android.mk文件.其中Android.mk文件内容如下:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_SRC_FILES:=lights.cLOCAL_PRELINK_MODULE:=falseLOCAL_MODULE_PATH:=$(TARGET_OUT_SHARED_LIBRARIES)/hwLOCAL_SHARED_LIBRARIES:=liblogLOCAL_MODULE:=lights.$(TARGET_BOARD_PLATFORM)LOCAL_MODULE_TAGS:=optionalinclude$(BUILD_SHARED_LIBRARY)通过这个makefile,在整个android编译时就会生成相应的共享库,由于我们的目标平台为smdkv210。所以最后生成lights.smdkv210.so,并放到目标平台上lib/hw/目录下。在lights.c中实现如下模块结构:conststructhw_module_tHAL_MODULE_INFO_SYM={.tag=HARDWARE_MODULE_TAG,.version_major=1,.version_minor=0,.id=LIGHTS_HARDWARE_MODULE_ID,.name="lightsModule",.author="Google,Inc.",.methods=&lights_module_methods,};hw_module_t结构体的methods成员是一个指向hw_module_methods_t结构体的一个指针,hw_module_methods_t结构体定义如下:typedefstructhw_module_methods_t{int(*open)(conststructhw_module_t*module,constchar*id,structhw_device_t**device);}hw_module_methods_t;据此我们定义一个hw_module_methods_t类型的参数lights_module_methods如下:staticstructhw_module_methods_tlights_module_methods={.open=open_lights,};其中open_lights实现流程如下:图4-6open_light函数实现流程首先设置了背光回调函数,以在需要对背光操作的时候回调这个函数。初始化一个线程互斥锁用于保护在回调调光函数内对节点的写操作。然后分配light_device_t结构体。可看出在open_light函数中主要完成用light_device_t这个结构体去初始化device这个二重指针。并向其中传入了对背光操作的回调函数,其原型为:staticintset_light_backlight(structlight_device_t*dev,structlight_state_tconst*state){interr=0;intbrightness=rgb_to_brightness(state);//rgb到亮度转换pthread_mutex_lock(&g_lock);//写线程加锁err=write_int(LCD_FILE,brightness);//写亮度值到驱动节点pthread_mutex_unlock(&g_lock);//写线程解锁returnerr;}其中LCD_FILE定义:charconst*constLCD_FILE="/sys/class/backlight/pwm-backlight/brightness";可以看出,LCD_FILE为linux内核空间向用户空间提供的驱动节点。调用write_int(LCD_FILE,brightness)函数完成对这个驱动节点的写操作,以达到调节背光的目的.第五章接键驱动设计及实现5.1接键硬件链接以及功能要求在本设计中,根据一般用户需求,在硬件板卡做了如下6个按键:1.Power键,实现长按开机,长按关机,短按睡眠;2.volumeup键,实现音频声音的增大;3.volumedown键,实现音频声音的减少;4.Home键,实现android下主界面的返回;5.菜单键,实现短按弹出选择菜单;6.返回键,实现返回到上一个界面;其中每个按键链接到s5pv210的一个IO上,其对应关系如下: Power键 S5PV210_GPH0(1)) volumeup键 S5PV210_GPH0(7) volumedown键 S5PV210_GPH3(4) Home键 S5PV210_GPH3(5) 菜单键 S5PV210_GPH2(0) 返回键 S5PV210_GPH1(1)图5-1功能按键和硬件IO的对应关系5.2内核空间按键驱动设计和实现在按键驱动设计中,我们把按键设备抽象为一个平台设备,相应的驱动程序也作为一个平台设备驱动给出。其模块初始化代码如下:staticint__inits3c_button_init(void){//注册按键平台设备platform_device_register(&s3c_device_button);//注册按键平台驱动returnplatform_driver_register(&s3c_button_device_driver);}其中s3c_button_device_driver的定义为:staticstructplatform_drivers3c_button_device_driver={.probe=s3c_button_probe,.remove=s3c_button_remove,.suspend=s3c_button_suspend,.resume=s3c_button_resume,.driver={.name="s3c-button",.owner=THIS_MODULE,}};可以看出,在此结构体中,也给出了这个按键平台驱动的几个方法,包括:探测硬件的probe方法,移除驱动的remove方法,睡眠挂起的suspend方法和恢复的resume方法。由于在s3c_button_init函数中已经注册了相应的设备和设备驱动。一旦设备和驱动相匹配,就会调用驱动程序的probe方法。在probe过程中完成以下步骤:图5-2s3c_button_probe实现流程至此,整个初始化过程完成。由于此驱动采用了用定时器轮寻按键的方式来实现按键的状态扫描,所以在扫描定时器超时之后,会回调我们预先设置的回调函数,其回调函数如下:staticvoids3cbutton_timer_handler(unsignedlongdata){intflag;/*power*/flag=gpio_get_value(S5PV210_GPH0(1));if(flag!=s3c_button_history[6]){if(flag)input_report_key(input,s3c_Keycode[6],0);elseinput_report_key(input,s3c_Keycode[6],1);s3c_button_history[6]=flag;}/*HOME*/flag=gpio_get_value(S5PV210_GPH3(5));if(flag!=s3c_button_history[0]){//printk("homebuttonpressed!\n");if(flag)input_report_key(input,s3c_Keycode[0],0);elseinput_report_key(input,s3c_Keycode[0],1);s3c_button_history[0]=flag;}/*VOLUMEUP*/flag=gpio_get_value(S5PV210_GPH0(7));if(flag!=s3c_button_history[1]){if(flag)input_report_key(input,s3c_Keycode[1],0);elseinput_report_key(input,s3c_Keycode[1],1);s3c_button_history[1]=flag;}/*VOLUMEDOWN*/flag=gpio_get_value(S5PV210_GPH3(4));if(flag!=s3c_button_history[2]){if(flag)input_report_key(input,s3c_Keycode[2],0);elseinput_report_key(input,s3c_Keycode[2],1);s3c_button_history[2]=flag;}/*menu*/flag=gpio_get_value(S5PV210_GPH2(0));if(flag!=s3c_button_history[4]){if(flag)input_report_key(input,s3c_Keycode[4],0);elseinput_report_key(input,s3c_Keycode[4],1);s3c_button_history[4]=flag;}/*back*/flag=gpio_get_value(S5PV210_GPH1(1));if(flag!=s3c_button_history[5]){//printk("backbuttonpressed!\n");if(flag)input_report_key(input,s3c_Keycode[5],0);elseinput_report_key(input,s3c_Keycode[5],1);s3c_button_history[5]=flag;}/*KernelTimerrestart*/mod_timer(&timer,jiffies+HZ/100);}可以看出在回调函数中,依次获取我们所需要的按键IO的状态,然后和上一个状态做比较,如果相同,说明没有按键按下,或者说按下还未松手,故不上报当前按键状态。否则通过input_report_key上报相应的按键状态。其中相应的按键码定义为:staticints3c_Keycode[MAX_BUTTON_CNT]={KEY_HOME,KEY_VOLUMEUP,KEY_VOLUMEDOWN,,KEY_MENU,KEY_BACK,KEY_POWER};通过每个按键的功能定义,在上报的时候设置不同的数组偏移,以找到相应的按键码与之匹配。然后保存当前的按键状态到历史状态。最后修改扫描定时器下一次的超时时间。以在超时之后继续扫描。其整个程序流程图如下:图5-2按键扫描上报流程5.2android对按键的重映射内核把按键事件传递到用户空间后,android并没有实用标准的内核映射方式,而是对按键进行了二次映射。从内核标准键值到android所用的键值映射表定义在android文件系统的/system/usr/keylayout目录下。Android标准的键值映射表文件为qwerty.kl,其中部分定义如下:key399GRAVEkey21key32key43key54key65key76key87key98key109key110key1BACKWAKE_DROPPEDkey158BACKWAKE_DROPPEDkey230SOFT_RIGHTWAKEkey60SOFT_RIGHTWAKEkey107ENDCALLWAKE_DROPPEDkey62ENDCALLWAKE_DROPPEDkey229MENUWAKE_DROPPEDkey139MENUWAKE_DROPPEDkey59MENUWAKE_DROPPEDkey127SEARCHWAKE_DROPPEDkey217SEARCHWAKE_DROPPEDkey228POUNDkey227STARkey231CALLWAKE_DROPPEDkey61CALLWAKE_DROPPEDkey232DPAD_CENTERWAKE_DROPPEDkey108DPAD_DOWNWAKE_DROPPEDkey103DPAD_UPWAKE_DROPPEDkey102HOMEWAKEkey105DPAD_LEFTWAKE_DROPPEDkey106DPAD_RIGHTWAKE_DROPPEDkey115VOLUME_UPkey114VOLUME_DOWNkey116POWERWAKEkey212CAMERAAndroid按键的处理是由WindowManager负责,主要的键值映射转换实现是在android源代码frameworks/base/libs/ui/EventHub.cpp此文件处理来自底层的所有输入事件,并根据来源对事件进行分类处理,对于按键事件处理过程如下:(a)记录驱动名称(例如上面的驱动程序的驱动名称为:s3c-button。(b)获取环境变量ANDROID_ROOT为系统路径(默认是/system,在android源代码system/core/rootdir/init.rc文件中)。(c)查找路径为“系统路径/usr/keylayout/驱动名称.kl”的按键映射文件,如果该文件(“驱动名称.kl”)不存在,则默认用路径为“系统路径/usr/keylayout/qwerty.kl”文件中的键值映射表。所以我们需要android文件系统相应的目录中建立”s3c-button.kl”文件。文件内容如下:key116ENDCALLWAKE_DROPPEDkey102HOMEWAKE_DROPPEDkey158BACKWAKE_DROPPEDkey139MENUWAKE_DROPPEDkey114VOLUME_DOWNWAKEkey115VOLUME_UPWAKE如按键码102在内核中定义:#defineKEY_HOME102,则在内核上报102这个按键码时,android通过对s3c-button.kl中:key102HOMEWAKE_DROPPED这句的解析得知102这个按键码实现了HOME按键功能。其中WAKE关键字意味着有此按键按下时则唤醒系统,但是不激活显示。相应的WAKE_DROPPED代表唤醒系统并激活显示。第六章振动电机驱动设计及实现6.1功能要求以及硬件连接在平板终端产品中,几乎都存在振动电机,振动电机的目的是给用户的操作以一种物理的形式给予反馈。以增加操作的真实性和确认操作的成功。在本设计中,振动电机硬件连接如下:图6-1震动电机硬件连接通过一只NPN三级管来驱动电机,MOTOR_PWR标号连接到S5PV210_GPH0(6).当软件控制这个IO为高电平时,三级管导通,马达开始振动,当软件控制这个IO为低电平时,三级管截止,马达停止振动。驱动程序需要向用户空间提供接口以控制马达的开关,以及运行的时间。6.2内核空间振动电机驱动设计及实现6.2.1什么是timedGPIOtimedGPIO是将普通的GPIO和内核定时器进行绑定。从而实现了一个时钟GPIO,也即是一个受时钟控制的GPIO。TimedGPIO驱动实现为一个platformdriver,因此初始化时同样会先执行probe函数,然后在sysfs中创建相应的设备文件和类文件,并在/dev目录下创建节点。应用程序可以通过设备文件实现与内核驱动的交互。比如,设置GPIO引脚的输出电平,设置关联内核定时器的过期时间等。6.2.2振动电机的TimedGPIO驱动实现由于TimedGPIO在内核中被实现为一个平台驱动,所以,振动电机被抽象为一个平台设备:structplatform_devicetimed_gpio_device={.name=TIMED_GPIO_NAME,.id=-1,.dev={.platform_data=&timed_gpio_data},};其中timed_gpio_data定义为:structtimed_gpio_platform_datatimed_gpio_data={.num_gpios=ARRAY_SIZE(t
本文档为【基于ARM的平板电脑的底层硬件驱动设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
robert
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:0
分类:房地产
上传时间:2020-02-10
浏览量:2