资源描述:
《uClinux下设备驱动程序开发》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、uClinux下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631 字体大小:【大中小】-引言 ARM器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B是一款针对网络处理而推出的专用处理器。在利用S3C4510B处理器构成的嵌入式系统中,为了保证系统的可靠稳定,多数都需要看门狗;同时,在某些应用领域还需要时钟和日历服务。Dallas公司的DS1284集成了上面两个功能。 在嵌入式系统应用越来越广泛的同时,嵌入式应用也变得越来越复杂。许多嵌入式系统都不得不借助于专用的操作系统来
2、支撑自己的应用。uClinux作为类Unix操作系统,继承了Linux的各种优秀品质,成为首选的嵌入式操作系统。本文以uClinux为背景,以S3C4510B为目标处理器,介绍uClinux下DS1284设备驱动的开发。1硬件设计1.1硬件描述 DS1284是美国Dallas公司推出的一款集成日历和看门狗功能的芯片。该芯片内部集成了实时时钟、静态RAM(内部寄存器)等,支持电池供电可以保证主机掉电后继续工作。DS1284包含了64个8位宽的寄存器,其中50个可供用户存储一些需要掉电保护的数据,所有这些寄存器都可以通过外
3、部总线直接访问。通过访问寄存器可以得到时钟、日历等信息,还可以设置定时报警和看门狗定时功能。所有这些寄存器的数据都以BCD码方式保存和读取。如果用户需要,DS1284还可以输出1024Hz的方波信号。在DS1284中,前14个寄存器为功能寄存器。各个寄存器保存内容的意义如表1所列。 命令寄存器的内部定义如表2所列。 1.2硬件连接 主机处理器采用的是三星公司出品的网络型ARM处理器S3C4510B。S3C4510B处理器同DS1284的连接电路如图1所示。 2软件设计 操作系统的作用之一就是向用户隐藏硬件设备的特殊
4、性,使应用程序的开发与低层物理设备无关。设备驱动程序就是连接应用程序和具体物理设备的桥梁。在uClinux中设备可以分成三种:字符型设备、块设备、网络设备。DS1284可以认为是一种字符型设备。uClinux中所有的设备都被看成是一个文件。因此了解uClinux下的设备驱动程序,首先要了解内核中与设备相关的一些数据结构。2.1内核中设备数据结构 在应用程序里,访问设备文件的接口是标准的和统一的。一般而言,open、release、read、write、ioctl等都是对设备文件常用的操作。不同的设备有不同的实现方式。u
5、Clinux中,通过一个结构体记录了每一种设备具体操作函数的函数指针,以便在具体调用中转入到实际操作的函数中。File_operations结构体负责记录这些信息,其结构如下:structfile_operations{structmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,
6、loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flus
7、h)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*w
8、ritev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong(*get_unmapped