当前位置:首页 > 电源 > 数字电源
[导读]摘要:在Linux 2.6内核下驱动的设计相对以往版本Linux内核有了很多改进,而ARM9被广泛用于控制领域。结合项目背景,介绍在Linux 2.6.21.7内核下基于AT91RM9200硬件平台的某仪器控制系统驱动设计,重点介绍I/O口

摘要:在Linux 2.6内核下驱动的设计相对以往版本Linux内核有了很多改进,而ARM9被广泛用于控制领域。结合项目背景,介绍在Linux 2.6.21.7内核下基于AT91RM9200硬件平台的某仪器控制系统驱动设计,重点介绍I/O口和中断驱动设计方法,引入阻塞型I/O。通过在交叉开发环境编译调试进行验证,该设计已应用到仪器中。
关键词:Linux;ARM;驱动;嵌入式系统;中断;阻塞型I/O


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结构是一个定义在<Linux/fs.h>中的函数指针数组。下面主要介绍常用的几个成员:

   

    [!--empirenews.page--]
    在这些函数指针中,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取消,另一种是使用内核已经定义好的虚拟地址。这里主要介绍第二种方式。
    对于AT91RM9200利用如下转换函数获取虚拟地址,其中宏AT91_VA_BASE_SYS是系统虚拟基地址:


    读写端口对于AT91RM9200还可使用专门函数[!--empirenews.page--]
int at9 1_set_gpio_value(unsigned pin,int value),并包含头文件asm-arm/arch-at91/gpio.h。一般端口的访问在驱动模块初始化时申请资源,在卸载时释放资源,而对于I/O口的使能则在open方法中实现,相应的禁用在release方法中实现。
1.4 ioctl方法的实现
    用户可以通过ioctl方法向内核发送各种命令,必要时传递参数,下面展示一个简单实例。


1.5 中断控制实现
    当外部信号的到来时刻不可预测时,使用轮询方式将使得效率极低,需要使用阻塞型中断实现。即没有中断信号到来时阻塞读进程,使其处于睡眠状态,当中断到来唤醒读进程,执行预定处理操作。
    首先,在open方法中使用request_irq()安装中断处理程序,在release方法中释放。函数原型如下:


    其中:参数irq为中断号;handler为ISR指针;flags为与中断管理有关的各选项字节掩码;dev_name即设备名;dev_id为中断信号线。
    其次,ISR为申请中断时使用的参数名,假设为irq0_handler,定义原型如下:


    中断阻塞即在其内部调用void wake_up_inter-ruptible(wait_queue_head_t*queue)实现,然后返回IRQ_HANDLED;在read方法中调用wait_event_in-terruptible(queue,condition)来唤醒读进程,这样,当用户程序读设备时,如果没有中断到来,读进程将进入睡眠状态,中断发生被唤醒。
    对于中断信号IRQO,因是PB29复用,要配置为外设A[4],同时还要配置中断源类型,函数分别在#in

2 编译和调试
    驱动程序可静态编译进内核,也可编译成模块动态加载。为便于调试采用动态模块加载方式,Linux 2.6内核下驱动编译方式和Linux 2.4版明显不同,其建立的Makefile只需简单地写入obj-m:=devctl.O(假设源文件为devctl.c),然后执行命令:make-C/usr/lo-cal/arm/Linux-2.6.21.7 SUBDIRS=MYMPWDmodules,注意内核源文件目录因各自系统而异,然后将生成的.ko文件置于目标系统的/home目录下,使用insmod加载模块,并使用cat/proc/devices命令查看分配到的设备号,使用mknod创建设备节点,卸载模块使用rmmod命令。
    为方便调试,可以在适当使用printk打印信息,还可以通过点LED等以便于发现问题。


3 结 语
    通过对相关的Linux 2.6内核中驱动源码的深入研究与自我设计实践,不断调试,在此阐述的方法得到实际验证,并已成功使用到某仪器的控制系统中。Linux博大精深,其开源的特点必将吸引更多的开发者投入其中,使其更好发展,应用于更多领域。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

物联网正在扩大规模并加速发展,进而驱动着全新的经济。而Arm生态系统正是这一巨大机遇背后的推动力。

关键字: ARM 物联网

ARM公司是一家知识产权(IP)供应商,它与一般的半导体公司最大的不同就是不制造芯片且不向终端用户出售芯片,而是通过转让设计方案,由合作伙伴生产出各具特色的芯片。

关键字: ARM

2018年10月26日,深圳星河丽思卡尔顿酒店,ARM中国CEO吴雄昂在ARM年度技术论坛上对记者如是说,彼时的吴坚定,温雅,意气风发。时隔两年,ARM中国CEO吴雄昂再次回到媒体视线,这一次,ARM中国与来自投资方和剑...

关键字: ARM 芯片 集成电路

摘要:详细分析了木地板自动铺设装置的工作原理,介绍了其结构组成、关键部位和控制系统,同时阐述了木地板自动铺设装置的特点,并从实用角度分析了木地板自动铺设装置的可用性。另外,运用UG NX12.0三维建模软件构建了该装置的...

关键字: 自动铺设装置 三维建模 控制系统

摘要:随着我国城镇化进程加快,汽车保用量剧增,土地资源紧缺,停车难问题日益严重,提升车位空间的利用率是目前解决这个问题的有效途径之一。鉴于此,设计了一种基于PLC与小程序的自助立体停车库,以PLC为控制系统的核心,服务器...

关键字: 控制系统 PLC 通信协议

喜欢折腾主机的小伙伴一定都知道X86和ARM架构的区别,前者在PC领域已经统治了几十年;后者则主要应用于移动领域,尤其是近几年,ARM的产品在终端应用特别是手持终端应用飞速发展。

关键字: 国产 ARM 主机

科技公司们认为,收购将使英伟达控制一个重要的供应商,该供应商向苹果、英特尔、三星电子、亚马逊和华为等公司授权基本的芯片技术,同时也向不计其数的中小技术企业提供授权。总部位于英国的ARM公司将芯片设计和相关软件代码授权给所...

关键字: 英伟达 ARM 半导体公司

在去年九月,英伟达宣布以400亿美金收购ARM时,就注定这场收购不会太顺利。因为一旦ARM成功被英伟达收购,这将使ARM改变在全球半导体市场中的中立立场,因为ARM的很多客户,都是英伟达的直接或者间接的对手。除此之外,还...

关键字: 英伟达 ARM 半导体

北京2022年10月11日 /美通社/ -- 在四川大凉山深处,有一只"凉山黑鹰"少年篮球队:队员平均年龄12岁,平均身高1米3,球队刚成立时,连个像样的球场都没有。然而,凭着一腔热情和惊人天赋,这只...

关键字: 网络 BSP 内核 腾讯

以下内容中,小编将对工控主板的相关内容进行着重介绍和阐述,希望本文能帮您增进对工控主板的了解,和小编一起来看看吧。

关键字: ARM 工控主板 主板

数字电源

15504 篇文章

关注

发布文章

编辑精选

技术子站

关闭