硬件抽象层(HAL).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9讲 硬件抽象层(HAL) 讲师:李宁 讲师 李宁 主要内容 什么是HAL 为什么要在Android在添加HAL 编写和测试基于HAL的LED驱动 讲师 李宁 什么是HAL HAL(Hardware Abstraction Layer,硬件抽象层)是建立在Linux驱动之上的一套动态库。这套动态库并不属于Linux内核,而是属于Linux内核层之上的系统运行库层。Google为Android增加HAL的主要目的除尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,那就是保护“私人财产”。对于那些既想发布基于Android的Linux驱动程序,又不想将核心业务逻辑公开的企业或个人,HAL简直就是福音。 讲师 李宁 为什么要在Android中加入HAL 讲师 李宁 加入HAL的主要目的 统一硬件的调用接口。由于HAL有标准的调用接口,所以可以利用HAL屏蔽Linux驱动复杂、不统一的接口。 解决了GPL版权问题。由于Linux内核基于GPL协议,而Android基于Apache Licence 2.0协议。因此Google玩了个“穿越”,将原本位于Linux内核中的Linux驱动的敏感代码向上移了一个层次。这样这些敏感代码就摆脱了GPL协议的束缚。那写不想开源的Linux驱动作者也就没必要开源了。 针对一些特殊的要求。对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间的HAL代码来辅助Linux驱动完成一些工作。 讲师 李宁 Android HAL的旧架构 讲师 李宁 Android HAL的新架构 讲师 李宁 Android HAL程序库的路径 Android HAL的源代码存储的位置并不固定。一般会存储在Android源代码目录/hardware目录中。其中Android源代码目录/hardware/libhardware_legacy用于保存旧的HAL架构的源代码。新HAL架构的源代码在Android源代码目录/hardware/libhardware目录中,当然,这些源代码可以放在Android源代码目录/hardware或其他的目录。最终编译生成的.so文件主要放在Android系统的/system/lib/hw目录,也可以放在其他的目录。 讲师 李宁 精简LED驱动 基于HAL的LED驱动去掉了所有与读写寄存器规则相关的代码,只保留了创建设备文件已经与寄存器交互的代码(不涉及到任何规则,只是将数据简单地写入指定的寄存器,或从指定的寄存器读取数据)。 LED驱动利用了设备文件的read和write函数来读写指定的寄存器。基本原理是只从指定寄存器读取或写入5个字节。第1个字节用于指定读写的动作以及寄存器。后4个字节是读写的实际的数据(因为LED驱动只涉及到操作一个int类型数据的寄存器,因此使用4个字节个来表示一个int类型的数据)。在与LED驱动交互是,只要向设备文件(/dev/s3c6410_leds_hal)读取或发送5个字节的数据,就可以读写指定的寄存器。 讲师 李宁 测试读写寄存器操作 由于LED驱动程序的设备文件接收的不是字符串,而是字节类型的数据(字节数组),因此需要单独做一个程序向设备文件写入字节形式的数据,或从设备文件中读取字节类型的数据。 命令行参数来传递设备文件名、字节数和要传递的字节等信息。命令行语法格式如下: rwdev r|w dev_file byte_count [byte1] [byte2] ... [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) 任何被系统自动调用的程序都会有一个标准的接口。这个接口相当与一个约定的规则。不管任何程序,只要遵循这个规则,就可以成功被调用。例如,C语言可执行程序都会有一个main函数,系统中执行程序是都会寻找main函数来执行;Linux驱动也有多个接口,最常用的就是init和exit函数,除此之外,还有与设备文件相关的read、write、ioctl等函数。只要Linux驱动程序安装接口的要求定义和实现,就可以成功安装在Linux驱动中。 讲师 李宁 调用LED驱动的HAL程序库(2) 既然HAL程序库也可以被Andr

文档评论(0)

ldj215323 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档