硬件抽象层(HAL).ppt
《硬件抽象层(HAL).ppt》由会员分享,可在线阅读,更多相关《硬件抽象层(HAL).ppt(33页珍藏版)》请在咨信网上搜索。
1、第第9讲讲 硬件抽象层(硬件抽象层(HAL)讲师:李宁讲师李宁主要内容什么是HAL为什么要在Android在添加HAL编写和测试基于HAL的LED驱动讲师李宁什么是HALHAL(HardwareAbstractionLayer,硬件抽象层)是建立在Linux驱动之上的一套动态库。这套动态库并不属于Linux内核,而是属于Linux内核层之上的系统运行库层。Google为Android增加HAL的主要目的除尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,那就是保护“私人财产”。对于那些既想发布基于Android的Linux驱动程序,又不想将核心业务逻辑公开的企业或个人,HAL简直就是
2、福音。讲师李宁为什么要在Android中加入HAL讲师李宁加入HAL的主要目的l统一硬件的调用接口。由于HAL有标准的调用接口,所以可以利用HAL屏蔽Linux驱动复杂、不统一的接口。l解决了GPL版权问题。由于Linux内核基于GPL协议,而Android基于ApacheLicence2.0协议。因此Google玩了个“穿越”,将原本位于Linux内核中的Linux驱动的敏感代码向上移了一个层次。这样这些敏感代码就摆脱了GPL协议的束缚。那写不想开源的Linux驱动作者也就没必要开源了。l针对一些特殊的要求。对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需
3、求。在这种情况下,可以利用位于用户空间的HAL代码来辅助Linux驱动完成一些工作。讲师李宁AndroidHAL的旧架构讲师李宁AndroidHAL的新架构讲师李宁AndroidHAL程序库的路径AndroidHAL的源代码存储的位置并不固定。一般会存储在/hardware目录中。其中/hardware/libhardware_legacy用于保存旧的HAL架构的源代码。新HAL架构的源代码在/hardware/libhardware目录中,当然,这些源代码可以放在/hardware或其他的目录。最终编译生成的.so文件主要放在Android系统的/system/lib/hw目录,也可以放在其
4、他的目录。讲师李宁精简LED驱动基于HAL的LED驱动去掉了所有与读写寄存器规则相关的代码,只保留了创建设备文件已经与寄存器交互的代码(不涉及到任何规则,只是将数据简单地写入指定的寄存器,或从指定的寄存器读取数据)。LED驱动利用了设备文件的read和write函数来读写指定的寄存器。基本原理是只从指定寄存器读取或写入5个字节。第1个字节用于指定读写的动作以及寄存器。后4个字节是读写的实际的数据(因为LED驱动只涉及到操作一个int类型数据的寄存器,因此使用4个字节个来表示一个int类型的数据)。在与LED驱动交互是,只要向设备文件(/dev/s3c6410_leds_hal)读取或发送5个字
5、节的数据,就可以读写指定的寄存器。讲师李宁测试读写寄存器操作由于LED驱动程序的设备文件接收的不是字符串,而是字节类型的数据(字节数组),因此需要单独做一个程序向设备文件写入字节形式的数据,或从设备文件中读取字节类型的数据。命令行参数来传递设备文件名、字节数和要传递的字节等信息。命令行语法格式如下:rwdevbyte1byte2.byten编译rw_dev.c程序arm-gcc -static-o/root/drivers/read_write_dev/rwdev/root/drivers/read_write_dev/rw_dev.c讲师李宁调用LED驱动的HAL程序库(1)任何被系统自动调
6、用的程序都会有一个标准的接口。这个接口相当与一个约定的规则。不管任何程序,只要遵循这个规则,就可以成功被调用。例如,C语言可执行程序都会有一个main函数,系统中执行程序是都会寻找main函数来执行;Linux驱动也有多个接口,最常用的就是init和exit函数,除此之外,还有与设备文件相关的read、write、ioctl等函数。只要Linux驱动程序安装接口的要求定义和实现,就可以成功安装在Linux驱动中。讲师李宁调用LED驱动的HAL程序库(2)既然HAL程序库也可以被Android系统自动调用,那么自然也拥有标准的接口。只不过这个接口不是函数,而是一个固定名称的结构体变量HAL_MO
7、DULE_INFO_SYM。也就是说,所有的HAL程序都必须要有一个HAL_MODULE_INFO_SYM变量,并且初始化该结构体变量的common成员变量。讲师李宁调用LED驱动的HAL程序库(3)第1步:定义结构体定义结构体和宏和宏编写HAL程序库需要使用到3个非常重要的结构体(hw_module_t、hw_device_t和hw_module_methods_t),在第1步需要定义两个新的结构体,这两个结构体的第1个变量的类型必须是hw_module_t和hw_device_t。一般还需要为HAL模块定义一个ID。实际上在这1步就是编写leds_hal.h头文件的代码。讲师李宁调用LED
8、驱动的HAL程序库(4)typedefstructhw_module_t/*模块的Tag,值必须是HARDWARE_MODULE_TAG*/uint32_ttag;/*模块主版本号*/uint16_tversion_major;/*模块从版本号*/uint16_tversion_minor;/*模块的ID,通过该ID可以找到当前模块*/constchar*id;/*模块名称*/constchar*name;/*模块作者*/constchar*author;/*与模块相关的函数指针,都包含着hw_module_methods_t结构体中*/structhw_module_methods_t*me
9、thods;/*模块的dso,dlopen函数返回的HAL动态库的handler*/void*dso;/*保留的空间*/uint32_treserved32-7;hw_module_t;讲师李宁调用LED驱动的HAL程序库(5)描述硬件设备(或称为描述硬件设备(或称为HAL设备)的结构体设备)的结构体hw_device_t。typedefstructhw_device_t/*设备的Tag,值必须是HARDWARE_DEVICE_TAG*/uint32_ttag;/*硬件设备的版本号*/uint32_tversion;/*指向描述硬件模块的hw_module_t结构体指针*/structhw_m
10、odule_t*module;/*保留的内存空间*/uint32_treserved12;/*关闭设备的函数指针*/int(*close)(structhw_device_t*device);hw_device_t;讲师李宁调用LED驱动的HAL程序库(6)描述模块入口函数的结构体描述模块入口函数的结构体hw_module_methods_t。typedefstructhw_module_methods_t/*打开设备是调用的open函数的指针*/int(*open)(conststructhw_module_t*module,constchar*id,structhw_device_t*de
11、vice);hw_module_methods_t;在这3个结构体中,hw_module_t是最先使用到的,然后通过hw_module_t.methods找到hw_module_methods_t.open函数,并调用该函数。这个open函数相当与HAL程序库的入口函数。一般会在这个函数里打开设备文件,初始化hw_device_t结构体设置一些控制硬件设备的函数。讲师李宁调用LED驱动的HAL程序库(7)在第1步先考虑hw_module_t和hw_device_t两个结构体。HAL规则建议不直接使用hw_module_t和hw_device_t(直接使用这,而要新定义两个结构体,将hw_mod
12、ule_t和hw_device_t分别作为新结构体的第1个变量的类型。就像leds_hal.h文件中的led_module_t和led_control_device_t。那么HAL为什么要这么建议呢?讲师李宁调用LED驱动的HAL程序库(8)在说明原因之前,先看一下led_device_open函数和led_control_device_t结构体。staticintled_device_open(conststructhw_module_t*module,constchar*name,structhw_device_t*device)structled_control_device_tstru
13、cthw_device_thw_device;int(*set_on)(structled_control_device_t*dev,int32_tled);int(*set_off)(structled_control_device_t*dev,int32_tled);讲师李宁调用LED驱动的HAL程序库(9)led_device_open函数将在NDK程序中被调用。该函数的最后1个参数类型是hw_device_t*,不过在调用该函数时,传进来的却是led_control_device_t*。从这一点看。hw_device_t相当与led_control_device_t的父类(C语言中并没
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 抽象 HAL
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。