1. 开发环境的树立在嵌入式体系中,因为方针机资源有限,因而一般是在主机上编译好驱动程序以及应用程序,然后经过串口、以太网、仿真器或其他通讯手法与方针机通讯。为了便利进行Linux设备驱动的开发和调试,首要有必要树立杰出的开发环境,包含穿插编译环境的树立、minicom的设置以及nfs网络文件体系的树立。
(1) 穿插编译环境因为我选用的是ARM9 S3C2410处理器,因而有必要在主机上树立针对方针板处理器的GNU东西链,这个进程适当杂乱繁琐,开发者能够选用编译好的针对ARM处理器的穿插东西链arm-linux-gcc,只需对其进行装置即可。首要,在/usr/local下树立目录arm,接着把压缩包arm-linux-gcc-3.3.2.tar.gz解压缩到arm目录下,然后在/etc/profile文件的pathmunge句子断后增加pathmunge /usr/local/arm/3.3.2/bin,保存对/etc/profile的修正,最终履行source /etc/profile,这样穿插编译环境就建成了。
(2) 串口东西Minicom 在嵌入式Linux的开发进程中,一般运用串口与方针机通讯。在Window环境下,常常运用的是超级终端,在Linux环境下,常常运用的是Minicom。第一次运用Minicom时,需求装备菜单选项,在Linux终端以root身份输入minicom –s,在呈现的菜单选项挑选Serial port setup,然后依据方针板对选项进行装备,退出后挑选Save as dfl即可,最终退出设置菜单就能够运用Minicom与开发板通讯了。
(3) 网络文件体系NFS NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作体系之间经过网络相互同享文件的技能。咱们能够把宿主机上编译好的程序放在NFS服务器同享目录下,然后把这些同享文件mount到方针板上进行调试、运转等操作。因为宿主机与方针机操作体系都支撑NFS体系,因而树立NFS开发环境时只需求在宿主机上对NFS服务器进行装备,用vi翻开/etc/exports,修改文本为/home/fei/test/ 192.168.2.*(rw,sync,no_root_squash),其间,/home/fei/test/表明同享的目录,192.168.2.*表明能够衔接的主机,(rw,sync,no_root_squash)则表明读写权限与其他参数。保存退出后履行/sbin/service nfs restart并封闭防火墙。这样就能够运用mount指令挂载NFS文件体系了,比方把宿主机(IP为192.168.2.10)装备的/home/fei/test目录挂载到方针板的/tmp目录下,能够运用指令:mount –t nfs 192.168.2.10:/home/fei/test /tmp
2. Linux设备驱动程序
(1) Linux 设备驱动概述体系调用是操作体系内核与应用程序之间的接口,设备驱动程序是操作体系内核和机器硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,应用程序经过体系调用或许C库拜访操作体系内核,而操作体系内核又经过驱动程序拜访硬件设备,然后运用户或许应该程序能够按操作一般文件的方法对硬件设备进行操作。Linux设备驱动程序运转在体系的内核空间,是内核非常重要的组成部分,它首要完结的功用有:1) 设备进行初始化和开释;2) 把数据从内核传送到硬件和从硬件读取数据;3) 读取应用程序传送给设备文件的数据、回送应用程序恳求的数据; 4) 检测和处理设备呈现的过错。 Linux操作体系将设备分红三种根本类型:字符设备、块设备和网络设备。字符设备是个能够像字节省相同被拜访的设备,它能够经过文件体系节点来拜访,当用户或许应用程序对字符设备宣布读/写恳求时,实践的硬件I/O一般就会紧接着产生,字符设备以单个字节为单位进行次序读写操作,一般不运用缓冲技能。块设备和字符设备相似,也是经过文件体系节点来拜访,块设备与字符设备的差异只是在于内核内部管理数据的方法,块设备是以固定巨细的数据块进行存储和读写的,如硬盘、软盘等,并运用一块体系内存作为缓冲区,若用户进程对设备的恳求能满意用户的要求,就回来恳求的数据;不然,就调用恳求函数来进行规划的I/O操作。块设备是首要针对磁盘等慢速设备规划的,避免消耗过多的CPU时刻来等候。网络设备是一个能够和其他主机交流数据的设备,网络设备驱动程序担任发送和承受数据包。
(2) Linux 设备驱动的结构
Linux设备驱动程序完结的功用包含驱动程序的注册与刊出、设备的翻开与开释、设备的读写操作、设备的操控操作等。当用户需求经过设备文件同硬件打交道时,有必要经过如open、read、write、close、ioctl等体系调用,而体系调用和驱动程序正是经过数据结构struct file_operations作为桥梁联系起来的。file_operations数据结构的每一个成员的姓名都对应着一个体系调用。用户进程运用体系调用在对设备文件进行比如read、write操作时,体系调用经过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把操控权交给该函数。这是linux的设备驱动程序作业的根本原理。因而,编写设备驱动程序的首要作业便是编写file_operations数据结构的各个子函数。下面的结构体便是一个典型的file_operations结构:
struct file_operations {
int (*seek) (struct inode * ,struct file *, off_t ,int);
int (*read) (struct inode * ,struct file *, char ,int); i
nt (*write) (struct inode * ,struct file *, off_t ,int);
int (*readdir) (struct inode * ,struct file *, struct dirent * ,int);
int (*select) (struct inode * ,struct file *, int ,select_table *);
int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *); i
nt (*open) (struct inode * ,struct file *);
int (*release) (struct inode * ,struct file *);
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (struct inode * ,struct file *);
int (*revalidate) (dev_t dev);
} file_operations
结构体中的成员都是函数指针,每个应用程序对设备的操作,都会依据major、minor设备号,转化成对file_operations结构的拜访。开发者在编写设备驱动程序的时分,依据自己的需求完结file_operations结构中的函数完结,对不需求用到的函数接口能够在file_operations结构中初始化为NULL。file_operations变量会在程度程序初始化时,注册到体系内核。当应用程序对设备进行操作时,会调用驱动程序注册的file_operations结构中的函数指针。