第九章、硬件抽象层:HAL 读书笔记

编写linux驱动程序的步骤

第一步:建立linux驱动骨架(装载和卸载linux驱动)

第二步:注册和注销设备文件

第三步:指定与驱动相关的信息

第四步:指定回掉函数

第五步:编写业务逻辑

第六步:编写makefile文件

第七步:编写linux驱动程序

第八步:安装和卸载linux驱动

Printf函数运行在用户空间,printk函数运行在内核空间。

测试linux驱动步骤

第一步:导入test_count.c文件

第二步:设置include路径

第三步:建立target

第四步:build工程

第五步:运行测试程序

对于一个Linux驱动程序,一开始可以在UbuntuLinux上做前期的开发和测试。对于访问硬件的部分可以在ubuntuLinux用软件进行模拟。当基本开发完以后,就需要在开发板或者工程样机上使用真实的硬件进行测试。我们可以使用多种方式测试Linux驱动,主要有ubuntuLinux测试、在Android模拟器上通过原生(native)C程序测试Linux驱动、使用AndroidNDK测试Linux驱动、使用Java源代码直接操作设备文件来测试Linux驱动、使用S3C6410开发板测试Linux驱动,还可以将驱动编译进Linux内核进行测试。

一个完整的linux驱动主要由内部处理和与硬件交互两部分组成。其中内部处理主要是指linux驱动的装载、卸载、与设备文件相关的动作处理以及业务逻辑等。与硬件交互主要是指通过ioweite、ioread32等函数与硬件中的寄存器进行数据的交互。Linux驱动在不同平台的移植也是处理这两部分。如果在不同Linux内核版本之间的移植,主要是移植第1部分,如果在不同硬件平台的移植,主要是移植第二部分。

编写Led灯驱动的步骤如下:

1、 创建LED驱动设备文件:

(1)   使用cdev-init函数初始化cdev;

(2)   指定设备号;

(3)   使用cdev_add函数将字符设备添加到内核中的字符设备数组中;

(4)   使用class_creat宏创建struct class;

(5)   使用device_create函数创建设备文件;

2、  卸载Led驱动的设备文件

3、 设置寄存器和初始化led驱动

4、 控制led灯:

(1)   通过字符串控制LED

(2)   通过I/O命令控制

5、 LED驱动的模块参数

6、 测试LED驱动

(1)   编写测试I/O控制命令的通用程序;

(2)   使用NDK测试LED驱动;

(3)   使用Java测试LED驱动;

7、Led驱动移植

时间: 2024-10-19 18:37:27

第九章、硬件抽象层:HAL 读书笔记的相关文章

第九章 硬件抽象层:HAL

1.在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码. 2.android的层次结构:应用层,应用框架层,系统运行库层,linux内核层 3.为android加入HAL的目的: (1)统一硬件的调用接口.由于HAL有标准的调用接口,所以可以利用 HAL屏蔽Linux驱动复杂,不统一的接口. (2)解决GPL版权问题.由于 Linux 内核基于GP协议,而Android基于Apache Licence2.0协议 (3)针对一些特殊的要求.对于有些硬件,

《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中,HAL设备用值D3DDEVTYPE_HAL来表示.该值是一个枚举变量.REF设备用D3DDEVTYPE_REF来表示.这种类型非常重要,你需要铭记,因为在创建设备的时候,我们必须指定使用哪种设备类型. COM(组件对象模型) 创建COM接口时不可以使用c++关键字new.此外使用完接口,应调用Rel

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

Java 线程第三版 第三章数据同步 读书笔记

多线程间共享数据问题 一.Synchronized关键字 atomic一词与"原子"无关,它曾经被认为是物质的最小的单元,不能再被拆解成更小的部分. 当一个方法被声明成synchronized,要执行此方法的thread必须先取得一个token,我们将它称为锁.一旦该方法取得(或者说是获得)锁,它将运行此方法然后释放掉(或者返回)此锁.不管方法时怎样返回的(包括通过异常)该锁会被释放. 二.Volatile关键字 如果变量被标示为volatile,每次使用该变量时都必须从主寄存器中读出

《C++primer》v5 第2章 C++基础 读书笔记 习题答案

2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节,double是双精度,一般占用8个字节,它们可表示的数据范围也不相同. 2.2 利率用double,本金和付款用int 2.3 unsigned u=10,u2=42; cout<<u2-u<<endl; cout<<u-u2<<endl; int i=10,

《Java并发编程实战》第二章 线程安全性 读书笔记

一.什么是线程安全性 编写线程安全的代码 核心在于要对状态访问操作进行管理. 共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范完全一致. 多个线程同时操作共享的变量,造成线程安全性问题. * 编写线程安全性代码的三种方法: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 Java同步机制工具: synchronized volatile类型变量 显示锁(Explicit Lock

Android深度探索HAL读书笔记9

看了本书第九章,我学习到了: HAL(抽象硬件层)是建立在linux驱动之上的一套程序库,这套程序库是属于内核层之上的应用层——系统运行库层. Linux驱动代码类型:访问硬件寄存器的代码和业务逻辑代码. Linux内核采用GPL协议,该协议要求源代码必须开源,即linux驱动必须开源. Android增加HAL的目的:①避免应用程序直接访问linux驱动②保护私人财产,满足不想开源的linux驱动作者的要求,带HAL的linux驱动相当于将数据从HAL传到寄存器,即从寄存器传到HAL的“数据二

《TCP/IP详解卷1:协议》第2章 链路层-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 1.引言 从图1-4可以看出,在TCP/IP协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报: (2)为ARP模块发送ARP请求和接收ARP应答. (3)为RARP发送RARP请求和接收RARP应答. TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网.令牌环网.FDDI(光纤分布式数据接口)及RS-232串行线路等. 2.以太网和IEEE 802封装 (1)以太网 以太网一般是指数字

Android深度探索(卷1)HAL与驱动开发 第九章&#160;硬件抽象层:HAL 读书笔记

HAL是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层.HAL的主要目的一个是用来保护"私人财产",另一个是尽量避免应用程序直接访问Linux驱动程序. 传统的Linux系统中Linux驱动一般有两种类型的代码,访问硬件寄存器和业务逻辑代码.对于访问硬件寄存器代码,并无秘密可言,因为都是调用Linux内核的标准函数进行的标准操作.而Linux的业务逻辑部分对于有些企业或者个人并不想讲源代码公开.Linux内核采用GPL协议,