嵌入式LED驱动设计Word下载.docx
- 文档编号:18004676
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:16
- 大小:73.29KB
嵌入式LED驱动设计Word下载.docx
《嵌入式LED驱动设计Word下载.docx》由会员分享,可在线阅读,更多相关《嵌入式LED驱动设计Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
0x0
GPFDAT
0x56000054
ThedataregisterforportF
Underfined
GPFUP
0x56000058
Pull-updisableregisterforportF
Reserved
0x5600005c
-
表1S3C2410相关IO口寄存器名称及地址
GPFCON—端口配置寄存器
Bit
GPF7
[15:
14]
00=Input;
01=Ouput;
10=EINT7;
11=Reserved
GPF6
[13:
12]
10=EINT6;
GPF5
[11:
10]
10=EINT5;
GPF4
[9:
8]
10=EINT4;
GPF3
[7:
6]
10=EINT3;
GPF2
[5:
4]
10=EINT2;
GPF1
[3:
2]
10=EINT1;
GPF0
[1:
0]
10=EINT0;
表2GPFCON—端口配置寄存器
GPFDATA—端口数据寄存器
GFPDAT
Bit
GPF[7:
Whentheportcongiguredasinputport,dataformextermalsourececanbereadtothecorrespondingpin.Whentheportiscongiguredasoutputpotdatawritteninthisregistercanbesenttothecorrespondingpin.Whentheportcongiguredasfunctionpin.undefinedvaluewillberead.
表3S3C2410的GPFDATA—端口数据寄存器
GPFUP—端口上拉电阻使能寄存器
Bit
Description
0:
Thepull-upfunctionattachedtothecorrespondingportpinisenable.
1:
Thepull-upfunctionisdisabled.
表4S3C2410的端口上拉电阻使能寄存器
2.2软件平台
2.2.2软件平台介绍
选择了开放源码以及强大的社群支持的Linux操作系统,根据需要对该系统进行了相应的剪裁,编译,以更好地适用于嵌入式系统中。
在嵌入式系统软件开发中,普遍采用的交叉编译的方法进行编译调试,即将软件先利用交叉编译、汇编和连接工具在宿主机上生成可执行的二进制代码(该代码不能在宿主机上运行,只能在目标板上运行),再下载到目标板上运行。
2.2.2软件开发平台的构建
2.2.2.1linux系统学习
在PC机上安装虚拟机,并在虚拟机上安装linux系统。
系统安装成功后,熟悉相关的文件系统及相关的系统命令。
如挂载命令mount、显示文件目录命令ls、改变当前工作命令cd等;
了解linux系统和windows系统间的文件共享方法;
掌握linux系统中的vi编辑器的使用并可以用GDB调试我们编译的程序;
最后还要掌握Makefile的相关知识。
2.2.2.2Linux系统中搭建交叉开发环境
为了解决目标板上资源不足的问题,我们往往采用宿主机上开发,然后移植到目标板上的方式来开发嵌入式系统。
但是由于操作系统、目标板的多样性,于是必须搭建合适的各自平台的交叉编译环境。
我们是用我们实验板厂商提供的cross-2.95.3交叉编译工具。
Linux下的串口通信软件是Minicom。
Minicom相当于Windows下的超级终端。
我们使用之前需要对他进行参数配置。
除了Minicom,NFS服务的建立是不可缺少的。
网络文件系统(NFS)是网络上多台机器之间共享主目录,当用户登录至LAN上的一台机器(*任何一台*机器)时,这为他或她提供了一致的环境。
由于NFS,挂装远程文件系统树结构并将其完全集成到系统的本地文件系统成为可能。
NFS的透明性和成熟使它成为在Linux下进行网络文件共享的有用和流行的选择。
3.设备驱动程序的概念
设备驱动程序的任务就是控制设备的硬件完成指定的I/O操作。
所以在设备管理中驱动程序是直接和设备硬件打交道的。
驱动程序包含了对设备进行各种操作的代码,在操作系统的控制下,CPU通过执行驱动程序来实现对设备底层硬件的处理和操作。
Linux的设备驱动程序的主要功能是:
对设备进行初始化;
启动或停止设备的运行;
把设备上的数据传送到内存;
把数据从内存传送到设备;
检测设备状态[1]。
Linux内核把驱动程序划分为三类:
字符设备、块设备、网络设备驱动,对于不同的设备有不同的访问方式。
本文以按键驱动为例,介绍基本的字符设备驱动程序的编写过程。
驱动程序有两种加载方式:
一是直接编译进内核,启动内核时可自动加载;
二是以模块的方式加载,在系统启动之后可以insmod加载。
我们在这里采用第二种方式。
4.LED驱动程序的主要函数
4.1Linux设备驱动程序接口
系统调用是操作系统内核与应用程序之间的接口,驱动程序则是操作系统内核与机器硬件的接口。
设备驱动程序能够直接访问硬件的代码,必须为应用程序提供系统调用。
以便应用程序能访问设备。
在Linux中,主要有三种设备即:
字符设备.块设备和网络设备,与此相关主要有三类设备驱动程序,字符设备驱动程序,块设备驱动程序和网络设备驱动程序.他们的系统调用是一致的,采用统一的接口(在数据结构file_operations中)。
应用程序使用设备就像使用读写普通的文件一样方便,使用相同的open(),close(),read(),write()等,真正做到了与设备无关。
通常Linux驱动程序接口分为如下四层:
(1)应用程序进程与内核的接口;
(2)内核与文件系统的接口;
(3)文件系统与设备驱动程序的接口;
(4)设备驱动程序与硬件设备的接口;
每个驱动程序都有个file_operations的数据结构,包含了一系列的函数指针,可以指向自己所开发的接口如open()等。
内核中有两个表,一个用于字符设备驱动程序,一个用于块设备驱动程序。
这个两个表用于保存指向file_operations数据结构的指针,驱动程序内部函数的地址保存在这一结构。
*字符设备
字符设备(chardevice)和普通文件系统的区别:
普通文件系统可以来回读/写,而大多字符设备仅仅是数据通道,只能顺序读/写。
字符设备上Linux最简单的设备,可以像文件一样访问。
应用程序使用标准系统调用打开,读取,写和关闭,完全好像这个设备是一个普通文件一样。
初始化字符设备时,它的设备驱动程序向Linux登记,并在字符设备向量表中增加一个device_struct数据结构条目,这个设备的主设备标识符(例如,对于tty设备的主设备标识符是4)用做这个向量表的索引。
一个设备的主设备标识符是固定的。
Chrdevs向量表维护已经登记的字符设备文件。
*块设备
块设备(blockdevice)是文件系统的物质基础,它也支持像文件一样访问。
这种为打开的块特殊文件提供正确的文件系统操作组的机制和字符设备的十分相似。
Linux用blkdevs向量表维护已经登记的块设备文件。
它象chrdevs向量表一样,使用设备的主设备号作为索引。
与字符设备不同,块设备进行分类,SCSI是其中一类,而IDE是另一类。
*网络设备驱动
对于每一个网络接口,都用一个device的数据结构表示。
通常,网络设备是一个物理设备,如以太网卡,但软件也可以作为网络设备,典型的是回送设备(loopback).在内核启动时,系统通过网络设备驱动程序登记已经存在的网络设备。
设备用标准的支持网络的机制来把收到的数据转送到相应的网络层。
关于网络设备驱动更详细的信息请查看相关资料。
4.2设备驱动程序的设备号和入口点
Linux系统通过设备号来区分不同设备。
设备号由两部分组成:
主设备号和次设备号。
主设备号指明对应哪些设备驱动,这种对应关系是固定不变并作为内核资源的一部分存在。
需要注意的是,同一个主设备号可以对应两个不同的设备驱动,一个可以是字符设备另一个可以是块设备。
次设备号区分被一个设备驱动控制下的某个独立的设备。
比如,同一个类型的USB设备可以在系统中有几个,它们通过次设备好加以区分,而设备驱动可以只对应一个。
在/proc/devices中列出了系统中处于活动状态设备的主设备号,所谓的活动状态是指与该设备对应的设备驱动已经被系统内核装载。
设备入口点也可以理解为“设备文件句柄”,一个设备的入口点和磁盘上的普通文件系统一样,可以删除(rm),移动(mv)和复制(cp)等。
我们可以在文件系统中使用mknod命令创建一个设备入口点或者通过系统调用mknof来创建。
在文件系统中创建了设备入口点并没有代表响应的设备驱动和硬件已经准备好,只是代表了和设备驱动通信的一部分。
下面给一个创建字符设备入口点的实例:
#mknod/dev/testCharc1000
其中c代表字符设备,如果想创建块设备则用b代替c。
参数100代表该设备的主设备号,0代表该设备的次设备号。
对于现有Linux操作系统,/dev目录是必不可少的,这个目录包含了所有Linux系统所知道的字符设备,块设备和网络设备。
操作字符设备的方法非常简单。
打开一个字符设备就像打开一个文本文件一样,只不过读/写“文件”的操作实际上是操作设备的过程,可以使用正常的文件操作命令cat或者外壳复位向语法实现和设备的数据交换。
4.3Linux驱动程序的加载
在Linux下加载驱动程序可以采用动态和静态两种方式。
静态加载就是把驱动程序直接编译到内核里,系统启动后可以直接调用。
静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译下载内核,效率较低。
动态加载利用了Linux的module特性,可以在系统启动后用insmod命令把驱动程序(.o文件)添加上去,在不需要的时候用rmmod命令来卸载。
在台式机上一般采用动态加载的方式。
在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。
设备驱动程序在加载时首先需要调用入口函数init_module(),该函数完成设备驱动的初始化工作,比如寄存器置位,结构体附值等一系列工作。
其中最重要的一个工作就是向内核注册该设备,对于字符设
备调用register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。
注册成功后,该设备获得了系统分配的主设备号,自定义的次设备号,并建立起与文件系统的关联。
设备在卸载的时候,需要回收响应的资源,;
令设备的响应寄存器值复位并从系统中注销该设备。
系统调用部分则是对设备的操作过程,比如open,read,write,ioctl等操作。
5.Linux下字符设备驱动的添加
一个字符设备驱动里面实现对GPIO端口的操作。
功能说明:
模块加载的时候跑马灯运行起来。
我们使用GX-ARM-S3C42410实验箱的4个LED指示灯由4个I/O口控制,它们分别是:
GPF4~GPF7。
当GPF4~GPF7输出低电平的时候,相应的LED指示灯亮。
5.1字符设备的驱动源程序
字符设备的驱动源程序gpiodrv.c。
使用vi编辑器编写符合上面功能的驱动源程序gpiodrv.c。
源程序的代码如下:
#include<
linux/config.h>
linux/kernel.h>
linux/sched.h>
linux/timer.h>
linux/init.h>
linux/module.h>
linux/modversions.h>
linux/version.h>
asm/hardware.h>
#defineSIMPLE_GPIO_LED_MAJOR97
devfs_handle_tdev_handle;
#defineVERSION"
2410RP-gpio_led-V1.00-09-12-23"
voidshowversion(void)
{
printk("
*********************************************\n"
);
\t%s\t\n"
VERSION);
*********************************************\n\n"
}
//-------------------READ------------------------
ssize_tSIMPLE_GPIO_LED_read(structfile*file,char*buf,size_tcount,loff_t*f_ops)
returncount;
//-------------------WRITE-----------------------
ssize_tSIMPLE_GPIO_LED_write(structfile*file,constchar*buf,size_tcount,loff_t*f_ops)
//-------------------IOCTL-----------------------
ssize_tSIMPLE_GPIO_LED_ioctl(structinode*inode,structfile*file,unsignedintcmd,longdata)
GPFCON=(GPFCON|0xFF00)&
0xFFFF55FF;
GPFUP&
=0x0f;
switch(cmd)
{
case1:
GPFDAT=(GPFDAT&
0x0f)|0xe0;
break;
case2:
0x0f)|0xd0;
case3:
0x0f)|0xb0;
case4:
0x0f)|0x70;
case5:
0x0f)|0xf0;
}
return0;
//-------------------OPEN------------------------
ssize_tSIMPLE_GPIO_LED_open(structinode*inode,structfile*file)
MOD_INC_USE_COUNT;
return0;
}
//-------------------RELEASE/CLOSE---------------
ssize_tSIMPLE_GPIO_LED_release(structinode*inode,structfile*file)
MOD_DEC_USE_COUNT;
//-------------------------------------------------
structfile_operationsGPIO_LED_ctl_ops=
open:
SIMPLE_GPIO_LED_open,
read:
SIMPLE_GPIO_LED_read,
write:
SIMPLE_GPIO_LED_write,
ioctl:
SIMPLE_GPIO_LED_ioctl,
release:
SIMPLE_GPIO_LED_release,
};
//-------------------INIT------------------------
staticint__initHW_GPIO_LED_ctl_init(void)
intret=-ENODEV;
inti,j;
ret=devfs_register_chrdev(SIMPLE_GPIO_LED_MAJOR,"
GPIO_led"
&
GPIO_LED_ctl_ops);
showversion();
if(ret<
0)
printk("
S3C2410init_modulefailedwith%d\n[--kernel--]"
ret);
returnret;
else
printk("
S3C2410gpio_led_driverregistersuccess!
!
[--kernel--]\n"
dev_handle=devfs_register(NULL,"
DEVFS_FL_DEFAULT,
SIMPLE_GPIO_LED_MAJOR,0,S_IFCHR,&
GPIO_LED_ctl_ops,NULL);
returnret;
staticint__initGPIO_LED_ctl_init(void)
ret=HW_GPIO_LED_ctl_init();
if(ret)
staticvoid__exitcleanup_GPIO_LED_ctl(void)
#ifdefOURS_GPIO_LED_DEBUG
cleanup_GPIO_LED_ctl[--kernel--]\n"
#endif
devfs_unregister_chrdev(SIMPLE_GPIO_LED_MAJOR,"
);
module_init(GPIO_LED_ctl_init);
module_exit(cleanup_GPIO_LED_ctl);
5.2驱动源程序中相关函数函数说明
GX-ARM-S3C42410实验箱的4个LED指示灯S3C2410的GPF4~GPF7控制,与这四个端口相关的寄存器有:
配置寄存器(GPFCON),数据寄存器(GPFDAT)和上拉寄存器(GPFUP),下面的代码将GPF4~GPF7的属性设置为输出:
GPFCON=0x5500。
GPFCON=(GPFCON|0xFF00)&
*file_operations数据结构,inode数据结构和file数据结构
内核通过file_operations结构识别设备,通过file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数。
file_operations定义在<linux/fs.h>中的函数指针表。
这个结构中的每一个成员的名字都对应着一个系统调用。
在用户进程利用系统调用对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备好找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这是Linux的设备驱动程序工作的基本原理。
从某种意义上说,写驱动程序的任务之一就是完成file_operations中的函数指针。
文件系统处理的文件所需要的信息在inode(索引结点)数据结构中。
inode数据结构提供了关于特别设备文件/dev/DriverName(这里的DriverName可能是任何一个设备文件,如hda0)的信息。
file数据结构主要用于与文件系统对应的设备驱动程序使用。
当然,其它设备驱动程序也可以使用,它提供有关被打开的文件的信息。
*register_chrdev函数
设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登记,以便系统适当的时候调用。
在Linux系统中,通过调用register_chrdev向系统注册字符型设备驱动程序。
register_chrdev在fs/devices.c文件中的定义如下。
intregis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 LED 驱动 设计