您的位置 首页 动态

解读选用ARM+Linux 2.6 内核的仪器控制系统规划

0 引 言嵌入式系统的开发都有其特殊的应用场合与特定功能,而嵌入式Linux操作系统因其开源和广泛的处理器支持、易于移植而备受行业青睐。AT91RM9200是

0 引 言

嵌入式体系的开发都有其特别的运用场合与特定功用,而嵌入式Linux操作体系因其开源和广泛的处理器支撑、易于移植而备受职业喜爱。AT91RM9200是Atmel公司针对体系操控、通讯范畴推出的依据ARM920T内核的32位RISC微处理器,它具有小体积,低功耗,低成本及高性能等特色,其内部集成了SPI、串口、PIO、以太网、EBI、USB、MCI等多种接口。

Linux体系中,运用层不能够直接操作硬件,需规划驱动程序向下屏蔽硬件特性,完结硬件与用户间的通讯。体系渠道为在虚拟机中装置 Fedora 8,方针体系选用Linux 2.6.21.7内核,定制文件体系树立NFS根文件体系,运用双网卡办法建立成穿插开发环境,并运用超级终端或minicom作为操控台。

l 设备驱动程序规划

该操控体系结构如图1所示。ARM经过USARTl接纳外来的操控指令,经过SPI接口和通用PIO口与外部设备通讯,到达操控效果。在 Linux下,一切的设备以文件的办法来运用。其间Linux现已供给了支撑AT91RM9200的SPI驱动,DBGU和UART驱动,只要对其源代码进行一些修正并在编译内核时将其选中就能够直接运用。所以首要会集在PIO口驱动规划中,外部设备运用一个.PB29引脚(即IRQO)作为外部中止信号供给给ARM,别的运用一些I/O引脚对外部设备进行操控。

Linux设备分为3类:字符设备、块设备和网络设备,该体系规划的是模块化字符设备驱动程序。Linux 2.6内核与Linux 2.4内核首要有3点不同:

(1)内核的API改变,增加了不少新功用;

(2)供给了sysfs用于描绘设备树;

(3)驱动模块从.o变为.ko。

1.1 驱动程序重要数据结构

翻开的设备在内核内部由file结构标识,内核运用file_operaTIons结构拜访驱动程序的函数。file_opera_tions结构是一个界说在中的函数指针数组。下面首要介绍常用的几个成员:

在这些函数指针中,open和release用于设备的翻开和封闭,是每个驱动程序有必要完结的函数。其他函数依据实践需求来完结,在该项目中完结办法如下:

另一个重要数据结构是file结构体,首要包含以下成员:

它代表一个翻开的文件,只出现在内核空间,与用户空间的file是不同的。在open操作时创立,然后传递给file_operations的其他函数指针,直到close。

第三个重要数据结构即inode,其成员包含:dev_ti_rdev和struet cdev*i_cdev,其间i_rdev中包含实践设备号,能够经过下面两个宏函数获取主从设备号:

初始化file_operations结构体后,要将其间界说的各个办法如open,release,write,read,ioctl等逐个完结。其函数名即初始化这个file_operations结构体时各成员函数指针。当在用户空间调用open时,内核空间的open办法即相应操作,其他办法同理。

1.2 驱动初始化和卸载整理作业

驱动加载需求进行设备注册等一系列初始化作业;并且在卸载驱动时要开释资源进行一些整理作业以使其不影响内核。所以界说两个函数static int devctl_init()和static void devctl_exit(),然后经过module_init(devctl_init)和module_exit(devctl_exit)来告诉内核。为了保护Linux的开源性,调用下面的宏来声明:

在初始化函数中,首要进行设备的注册。主设备号表明对应的驱动程序,次设备号由内核运用,用于正确确认设备文件所指的设备。能够动态恳求或许静态恳求设备号。动态恳求运用下面的函数:

dev是一个只输出的参数,它在函数成功完结时持有分配规模的榜首个数;firstminor是恳求的榜首个要用的次编号;count是恳求的接连设备编号的总数;name为设备名,返回值小于0表明分配失利。然后经过major=MMOR(dev)获取主设备号。假如注册不成功或许卸载驱动时需求撤销设备的注册,运用下面的函数完结(其参数意义同上):

关于字符型设备还要界说一个cdev结构体变量,并运用cdev_init()初始化,然后调用cdev_add()告诉内核增加一个字符设备。同样在卸载时要运用cdev_del()移除,不然用户运用驱动时,有时不能翻开设备。由于不运用cdev或许cdev在模块卸载时不删去会导致内核处在一个不稳定状况,在用户层或许无法翻开设备文件。  1.3 I/O端口拜访

在体系操控要求中,需求拜访ARM的I/O端口,包含一般I/O口和复用为IRQO的PB29引脚,但是Linux中对I/O端12和I/0内存的读写指令中运用的都是虚拟地址,所以在拜访前要先将物理寄存器地址映射到I/O内存。有两种办法完结地址映射,一种是运用ioremap为I/O内存区域分配虚拟地址,用iounmap撤销,另一种是运用内核现已界说好的虚拟地址。这儿首要介绍第二种办法。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/147724.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部