Linux内核提供了多个与I/O内存交互的函数,如ioread1六、ioread3二、iowrite1六、iowrite32等。Linux内核的内存管理模块负责同步I/O内存与硬件中的数据。java
每个链接linux的硬件在I/O内存中都会有映射首地址。在使用ioread1六、ioread32等函数读写I/O内存时须要指定这些首地址,开发板上的led也有其映射首地址。linux
此例子的原理:如图,LED1-LED2分别与GPC0_三、GPC0_4相连,经过GPC0_三、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驱动经常使用的代码重用方式很重要。