总结3

  

代码重用:1,静态重用 :将要重用的代码放在其他的文件中,如果要使用某些功能,include 相应的头文件即可

2,动态重用:一个Linux驱动可以使用另外一个Linux驱动中的资源

 

卸载由于异常情况而导致的Linux驱动模块无法卸载的情况:

1.初始化函数崩溃:将当前的Linux驱动模块的引用计数器清零即可

2.卸载函数被阻塞:将原来的卸载函数替换成一个空的卸载函数即可

 

蜂鸣器也称为PWM(脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止

注意:在实验代码中ioctl函数的使用中出现switch中的命令必须在头文件中定义,否则找不到该命令。

 

 

HAL是建立在Linux驱动之上的一套程序库,是属于Linux内核层之上的应用层。

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

Android加入HAL主要有以下目的:

1.统一硬件的调用接口

2.解决了GPL版权问题

3.针对一些特殊的要求

编写一款支持HALLinux驱动程序的步骤:

1.编写Linux驱动

2.编写HAL Library

3.编写service library

 

编写调用LED驱动的HAL模块

任何被系统自动调用的程序都会有一个标准的接口。这个接口相当于一个约定的规则。不管任何程序,只要遵循这个规则,就可以成功被调用。例如,C语言可执行程序都会有一个main函数,系统在运行程序时会实现执行main函数。Linux驱动的init函数与main函数的性质相似。在装载Linux驱动的过程中系统会调用init函数。

既然HAL模块也可以被android系统自动调用没那个自然也拥有类似maininit函数的接口,只不过这个接口不是函数,而是一个固定名称的结构体变量HAL_MODULE_INFO_SYM,也就是说,所有的HAL驱动都必须要有一个HAL_MODULE_INFO_SYM

 

编写HAL模块详细步骤:

第一步:定义结构体和宏

hw_module_t/hw_device_t/hw_module_methods_t

在后面的代码中不能直接使用结构体,需要一个继承

第二步:编写HAL模块的open函数

Open函数是HAL模块的入口点,主要3项工作:

初始化hw_device_t的子结构体

打开设备文件

初始化寄存器

第三步:定义hw_module_methods_t结构体变量

第四步:定义HAL_MODULE_INFO_SYM变量

该变量一般为hw_module_t或其子结构体。

第五步:编写HAL模块的close函数

第六步:编写控制led的函数

 

HAL模块库文件的存放路径有两个:/system/lib/hw/vendor/lib/hwHw_get_module函数会先从/system/lib/hw目录根据库文件命名规则寻找库文件。

 

android系统中使用Linux驱动有两种方式:

1、通过传统的方式直接与Linux驱动交互

2、Android特有的,通过HAL模块。HAL模块本质上就是通过Linux共享库(.so)与Linux驱动交互,然后应用程序在访问Linux共享库。每个HAL共享库指定一个id,再利用这个id配合一定的规则找到Linux共享库。

 

 

嵌入式Linux的调试技术

 

打印内核调试信息:printk

Printk函数运行在内核空间,printf函数运行在用户空间

函数原型:asmlinkage int printf(const char *fmt, ...)

Printk函数第一个参数不加信息级别,默认值是KERN_WARING

Linux系统通过/proc/sys/kernel/printk文件来控制printk函数输出日志信息的输出方向。Printk文件时一个由4个数字组成的文本文件,默认值是 6  4  1  7。含义如下:

6:将消息输出到控制台的级别。只有高于该级别的输出信息才会输出到控制台(0-5输出到控制台,6-7输出到日志文件)

4:默认的消息日志级别。如果不在printk函数中指定日志级别,就会使用该值作为默认的级别

1:控制台日志级别可被设置的最小值

7:控制台日志级别的默认值

将第一个数字设为8之后需要在字符界面下操作。(printk函数在控制台显示消息是通过/dev/console设备文件实现的。该设备文件只在字符界面的控制台下才起作用,所以printk函数只有在字符界面的控制台上才能正常输出消息)

 

可变参数的宏:

与固定参数宏的不同之处就是可变参数宏需要通过_VA_ARGS_宏获取可变参数宏的可变参数,定义可变参数宏宇定义可变参数函数的方法相同,都使用3个点(...)来表示可变参数,可变参数必须是宏和函数最后的参数。

 

通过虚拟文件系统(/proc)进行数据交互

Linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交互的工具。/proc是虚拟文件系统,是内存映射

 

http://www.cnblogs.com/875825a/

posted @ 2016-07-02 15:01  lows  阅读(113)  评论(0编辑  收藏  举报