第七章描述LED驱动的实现原理
Linux内核提供了多个与I/O内存交互的函数,如ioread16、ioread32、iowrite16、iowrite32等。Linux内核的内存管理模块负责同步I/O内存与硬件中的数据。
每一个连接linux的硬件在I/O内存中都会有映射首地址。在使用ioread16、ioread32等函数读写I/O内存时需要指定这些首地址,开发板上的led也有其映射首地址。
此例子的原理:如图,LED1-LED2分别与GPC0_3、GPC0_4相连,通过GPC0_3、GPC0_4引脚的高低电压来控制三极管的导通性,从而控制LED的亮灭。
根据三极管的特性,当这个引脚输出高电平时,集电极和发射极导通,发光二极管点亮;反之,发光二极管熄灭;
通过控制GPC0CON和GPC0DAT来控制GPC0_3和GPC0_4对应的led。
具体步骤:
一:创建led驱动的设备文件
1.使用cdev_init 函数初始化cdev
2.指定设备号
3.使用cdev_init函数将字符设备添加到内核中的字符设备数组中
4.使用class_create宏创建struct class
5.使用device_create函数创建设备文件
二:卸载led驱动的设备文件
卸载Linux驱动的设备文件稍微简单一些,需要依次调用 device_destroy、class_destroy和 unregister_chrdev_region方法。
三:设置寄存器与初始化led驱动
通过设置不同寄存器的值,可恶意设置led引脚的状态、打开或禁止上拉电路以及控制led的亮和灭。
四:控制led
可以通过 1:字符串控制led;(file_oprations.write函数) 2 :I/O命令控制led(file_oprations.icoctl函数)
五:led驱动的模块参数
使用模块参数是为了装载led驱动时指定默认状态值
测试led驱动
编写测试I/O控制命令的通用程序
LED驱动有两种与设备文件交互的方式:直接写入字符串数据和I/O控制命令。直接向设备文件写入数据可以使用命令行方式来完成,也可以通过write函数完成。
使用NDK测试led驱动
NDK程序测试和可执行程序测试差不多。只不过NDK Library 可以被Java程序调用,而在Android系统中测试Linux驱动,最直接的方法就是使用NDK。
使用java测试led驱动
Java只能通过发送控制字符测试led驱动
Led驱动的移植
在新的内核下重新编译即可
建立工作目录,拷贝源码
$ mkdir worker/driver
$ cd /workdir/driver/
$ cp /mnt/hgfs/share/linux-3.2-FS210-V3.tar.bz2 ./
$ cp /mnt/hgfs/share/linux3.2Drivers/ ./ -a
解压内核代码
$ tar xvf linux-3.2-FS210-v3.tar.bz2
编译内核源码
$ cd /workdir/driver/linux-3.2-FS210-V3
$ cp fs210_defconfig .config
$ make zImage
编译驱动源码
$ cd /workdir/driver/linux-3.2Drivers/fs210_led
修改Makefile文件,修改为我们的内核源码的路径和交叉工具链。保存退出。
$ make
查看编译生成的ko文件,并拷贝到nfs文件系统目录中。
$ ls
$ cp fs210_led.ko /source/rootfs/
执行make led_test命令编译测试文件。
$ make led_test
执行代码:
启动开发板,查看文件系统文件
$ ls
加载驱动
$ insmod fs210_led.ko
$ mknod /dev/led c 250 0
$ chmod 777 /dev/led
$ ./led_test
实验现象
Led1间隔闪烁。
第八章
1. 什么是PWM?
PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。如果还不是很清楚,好吧,来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就
会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化;还有待会儿我们要讲的蜂鸣器也会根据不同的输入值而发出不同频率的叫声等等!!这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。
2. 蜂鸣器的种类和工作原理
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。
一个完整的PWM驱动,通过I/O命令可以打开和停止PWM。PWM驱动包含3个文件pwm.c、pwm_fun.h、pwm_fun.c组成。其中pwm.c是主程序,pwm_fun.h引用了相应的头文件,以及定义了一些宏。pwm_fun.c文件包含了打开和停止pwm的两个函数(pwm_start和pwm_stop)。Pwm驱动和led驱动的实现流程相似,因此掌握linux驱动常用的代码重用方式很重要。