第九章 硬件抽象层:HAL

发布者:BlossomJoy最新更新时间:2024-09-29 来源: cnblogs关键字:硬件抽象层  HAL  s3c6410 手机看文章 扫描二维码
随时随地手机看文章

1.在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码.

2.android的层次结构:应用层,应用框架层,系统运行库层,linux内核层

3.为android加入HAL的目的:

(1)统一硬件的调用接口.由于HAL有标准的调用接口,所以可以利用 HAL屏蔽Linux驱动复杂,不统一的接口.

(2)解决GPL版权问题。由于 Linux 内核基于GP协议,而Android基于Apache Licence2.0协议

(3)针对一些特殊的要求.对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下 ,可以利用位于用户空间的HAL代码来辅助 Linux驱动完成一些工作.

4.HAL架构比较简单,其基本原理就是在 Android 系统中使用程序库,调用位于内核空间的linux驱动.调用HAL模块的代码并不需要直接装载.so 文件,而只需要通过一个ID来定位相应的.so文件.

5.编写一款支持HAL的linux驱动程序的步骤

(1)编写linux驱动.代码要简洁,将逻辑业务放到HAL Library中

(2)编写HAL Library.Service Library就是通过接口中定义的ID定位HAL

 (3)编写Service library.Service Manager会调用 Service Library,而APK 程序会调用Service Manager类访问 Service Library

6.编写LED驱动时注意:

(1)s3c6410_leds_hal.c文件中的代码除了 s3c64lO_leds_ hal_read 和 s3c641O leds_ hal_write函数(相对于第7章的LED驱动s3c6410_1eds_read 和s3c64lO_leds_ write函数)中的代码外,其他的代码与第7章实现的LED 驱动的代码基本相同.

(2)在s3c6410_leds_hal_read 和s3c6410_leds_hal_write函数中己经删除了所有与 LED 相关的逻辑。只使用了 iowrite32 和 ioread32 函数读写指定的寄存器.通过 s3c641O_leds_hal_read 和s3c6410_leds_hal _write 函数中的代码是无法看出操作 GPM 寄存器的业务逻辑的.

 (3)在 s3c6410_leds_hal_read 函数中在读取寄存器数据之前,先获取了 mem 数组的第l个字节(mem[O]),该字节表示寄存器类型。在设备文件读取数据之前,需要先向设备写入这个字节(其余 4 个字节可以是任意值,也可以不传值),以便事先确定要操作的寄存器类型.

7.编译和安装LED驱动:# sh build.sh

8.LED 驱动程序的设备文件接收的不是字符串,而是字节类型的数据(字节数组),因此需要单独做一个程序向设备文件写入字节形式的数据 ,或从设备文件中读取字节类型的数据.

rwdev [bytel] [byte2」 ... [byten]

# 执行read_write_dev目录中的build.sh 脚本文件,该脚本文件用于编译 rw.dev.c文件

# 并上传可执行文件(rwdev)开发板

sh /root/drivers/read_write_dev/build.sh

# 下面的两行语句用于测试 LED 驱动

#向开发板的GPMDAT(3表示向 GPMDAT 寄存器写入数据,见 LED 驱动中定义的宏)寄存器写入数据

#写入的数据是30000,分别表示5个字节的10 进制表示,执行结果是4个LED全部点亮

adb shell /data/1o cal/rwdev w /dev/s3c6410_leda_hal 530000

# 从GPMDAT寄存器 读取数据(6表示从 GPMDAT 寄存器读取数据)。

# 在读取数据时只需要指定第1个字节即可,该字节用于指定读取那个寄存器中的数据

adb shell '/data/local/rwdav r /dev/a3c6410_leda_bal 5 6'

下面看看read_write_dev目录中的build.sh脚本文件的代码

# 交叉编译器要使用- static 选项,将所需要的程序库全部连接进可执行程序,否则 rwdev 无法正常执行

arm-none- linux-gnueabi-gcc -static -o /root/drivers/read_write_dev/rwdev /root/dri ve

rs /read write dev/rw_dev.c

adb push /root/drivers/read_write_dev/rwdev/data/1ocal/rwdev

9.HAL模块的步骤和原理

(1)定义结构体和宏,用到三个非常重要的结构体(hw_module_t,hw_device_t,hw_module_ methods_t),还需要为HAL模块定义一个ID.hw_module_t是最先使用到的,然后通过 hw_module_t.methods 找到

hw_module_methods_t.open函数,并调用该函数.这个 open函数相当于HAL模块的入口.一般在这个函数里打开设备文件、初始化 hw_device_t结构体以及一些控制硬件设备的函数.

 (2)编写HAL模块的open函数

初始化hw_device_t的子结构体.

打开设备文件.

初始化寄存器

(3)定义hw_module_methods_t结构体变量

需要open函数指针变量指定open入口函数

(4)定义HAL_MODULE_INFO_SYM变量

所有的HAL模块都必须有一个 HAL_MODULE_INFO_SYM变量.该变量的类型一 般为hw_module_ t或其子结构体

(5)编写HAL模块的close函数

当HAL模块被卸载后会调用 close 函数

(6)编写控制LED的函数

由于HAL模块属于Android系统的一部分,因此不能像独立运行在ARM 处理器上的程序一样直接使用交叉编译器来编译。因为HAL需要很多Android-中的头文件和共享库。最简单的方法就是使用下面的命令在Android源代码目录的 hardware子目录建立一个leds_hal符号链接.然后进入hardware/leds_hal目录使用mm命令编译leds_hal.

# ln -s /toot/drivers/ch09/s3c6410_1eds_hal/leds_hal /working/android2. 3. 4_src/hardware/leds_hal

10.HAL模块(so文件)通常存放在system/lib/hw目录. 文件名中一 般都有一个 default.

11.hardware.c 文件的代码并不复杂,只包含了两个函数(load和hw_get_ module)和一些变量和宏

12.HAL 模块库文件的命名规则是ID.suffix.so.其中 TD 通过 hw_get_ module 函数的id 参数指定.suffix (后缀)通过属性文件指定.

13.打开_system_properties.h文件后,就会在后面看到如下4个宏

#define PROP_PATH_RAMDISK_DEFAULT      '/default.prop ”

#define PROP_PATH_SYSTEM_BUILD         '/system/build.prop”

#define PROP_PATH_SYSTEM_DEFAULT       ”/system/default.prop ”

#define PROP_PATH_LOCAL_OVERRIDE       ”/data/local.prop”    

14.编写调用Service的java库:为了使程序更易于使用,可以将调用 Service 程序库的 Java类单独封装在jar文件中,这样做任何的 Android 应用程序中只要引用了这个jar文件就可以向调用普通Java类一样访问LED驱动了.

15.测试LED驱动:首先 test_s3c6410_leds-hal_eclipsejava 工程必须引用上一节生成的ledHalService.jar文件,然后S3C64lOLedHalMain.java 中编写代码控制LED


关键字:硬件抽象层  HAL  s3c6410 引用地址:第九章 硬件抽象层:HAL

上一篇:Android深度探索--HAL与驱动开发第五章读后感
下一篇:交叉编译生成模块的makefile写法

推荐阅读最新更新时间:2024-11-09 11:20

【STM32】使用HAL库进行电机测速,原理、代码、滤波
STM32是一款非常强大的微处理器,广泛应用于各种电机控制系统中。对于电机控制系统来说,测速是非常重要的,因为只有知道电机的转速,才能控制电机的转动。在STM32中,我们可以使用HAL库来实现电机测速。 测速原理: 电机测速的原理是通过测量电机转子的转速来得到电机的转速,一般有两种测速方式,一种是使用霍尔传感器,另一种是使用反电动势法。使用霍尔传感器的测速方法是在电机转子上安装三个霍尔传感器,通过测量这三个传感器的输出电压来确定电机转子的位置和转速。使用反电动势法的测速方法是通过测量电机绕组上的反电动势来确定电机的转速。 代码实现: 使用HAL库的电机测速需要先初始化定时器,然后在中断函数中计算电机转速。具体代码实现如下: 1
[单片机]
【STM32】使用<font color='red'>HAL</font>库进行电机测速,原理、代码、滤波
S3C6410 LCD Overlay Test Program
测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作。 内核选项的Windows至少要为2。 具体支持如下操作: 1 使能OSD 2 关闭OSD 3 增加OSD的Alpha值 4 减少OSD的Alpha值 5 手动设置Alpha值(0-15) 6 上移OSD层 7 下移OSD层 8 左移OSD层 9 右移OSD层 10 设置OSD层 其中设置OSD层最重要,可以重新设置窗口的大小和起始位置,主要设置完后需要重新填充窗口数据,旧的数据将错乱。 /////////////////////////////////////////////////////
[单片机]
<font color='red'>S3C6410</font> LCD Overlay Test Program
LINUX 3.0.8支持RT3070 USB Wifi(S3C6410)
在LINUX 3.0.8 目录下运行make xconfig, 如下图所示选上Ralink rt27xx/rt28xx/rt30xx (USB) support 这样就添加上了支持 RT3070 USB Wifi的驱动,保存并退出xconfig,然后make,得到新内核zImage。更新内核,接上usb wifi,将会看到 usb 1-1.3: new full speed USB device number 4 using s3c2410-ohci usb 1-1.3: New USB device found, idVendor=148f, idProduct=3070 usb 1-1.3: New USB device
[单片机]
第17章 STM32F429之GPIO的HAL库API
17.1 初学者重要提示 1、如何阅读HAL库源码的问题 HAL库实现的函数有复杂的,也有简单的,简单的可以直接阅读代码。复杂的代码阅读起来比较耗时间,如果再配合参考手册抠每个寄存器的配置,那就更消耗时间了。所以对于这种函数,用户仅需了解每个部分实行的功能即可,而且HAL库都做了关键注释,以说明这部分实现的功能。所以用户没有必要去抠每个配置是如何实现的,仅需知道实现了什么功能。以后工程项目有需要了解具体配置时,再看即可。 2、学习本章节前,务必保证已经学习了第15章。 17.2 GPIO涉及到的寄存器 GPIO外设涉及到的寄存器比较少,也容易理解,推荐大家阅读GPIO源码的时候将参考手册中对应的寄存器功能做一个了解。
[单片机]
中科阿尔法低功耗全极霍尔开关AH466(替代HAL248)助力咖啡机位置变化
咖啡机中咖啡豆的余量自动检测功能是咖啡机的必备功能,应用霍尔传感器对咖啡机的工作状态进行监测能有效地解决水汽对测量的影响。中科阿尔法的低功耗高灵敏度全极霍尔开关芯片AH466正是这种应用的首选。 工作原理: 咖啡机或者豆浆机可以通过检测原料重量的变化,来实现对其咖啡豆剩余情况进行监控。咖啡机中原料重量的变化会引起连带磁体位置的变化,从而导致内部安装的霍尔传感器附近的磁场强度的变化。霍尔元件将这种磁场的变化来和工作点或者释放点的磁场强度值进行比较。通过输出引脚来输出高电平或者低电平,控制芯片通过IO引脚读取这个电平,来判断是否需要发出续咖啡豆或者豆浆原料的警告。 典型应用电路: AH466内部电路包含了电压调
[嵌入式]
中科阿尔法低功耗全极霍尔开关AH466(替代<font color='red'>HAL</font>248)助力咖啡机位置变化
【STM32】HAL库-DMA
DMA 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。 DMA配置过程 DMA的数据对齐 一句话,如果目标的容量存放不了源数据,则只能尽可能存放源数据(小端模式) 操作一个不支持字节或半字写的AHB设备 当DMA模块开始一个
[单片机]
【STM32】<font color='red'>HAL</font>库-DMA
关于s3c6410 实现opengl的分析
1. 什么是EGL EGL是用来管理绘图表面的(Drawing surfaces),并且提供了如下的机制 (1) 与本地窗口系统进行通信 (2) 查找绘图表面可用的类型和配置信息 (3) 创建绘图表面 (4) 同步OpenGL ES 2.0和其他的渲染API(Open VG、本地窗口系统的绘图命令等) (5) 管理渲染资源,比如材质 2. EGL 和 OpenGL ES API的联系 (1) 通过解析OpenGL ES API函数库 libGLES_android.so来获取函数指针,进行调用。 (2) 通过线程局部存储机制进行联系 关于通过函数指针进行联系在前面已经分析过了。下面着重分析通过线程局部存储机制进行联系分析一下。 2
[单片机]
关于<font color='red'>s3c6410</font> 实现opengl的分析
STM32四种库对比 STM32标准库和HAL库有什么不同?
  STM32的四种库:STM32Snippets、Standard Peripheral Library、STM32Cube LL、STM32Cube HAL。   1STM32Snippets什么是STM32Snippets?STM32Snippets可翻译为“代码片段”、“裁剪”,其实他就是我们常说的“寄存器”开发STM32的底层驱动代码。比如配置ADC引脚的代码片段:   __INLINE void ConfigureGPIOforADC(void)   {   /* (1) Enable the peripheral clock of GPIOA, GPIOB and GPIOC */   /* (2) Select a
[单片机]
STM32四种库对比 STM32标准库和<font color='red'>HAL</font>库有什么不同?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved