嵌入式编程

在嵌入式系统中,操作系统通过各种驱动程序控制硬件设备。设备驱动是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件细节,这样在应用程序看来,硬件设备只是一个设备文件,它可以像普通文件一样操作硬件设备。设备驱动程序是内核的一部分,执行以下功能:

\”

驾驶员的登记和注销。

设备的打开和释放。

设备的读写操作。

控制设备的运行。

设备的中断和轮询处理。

Linux主要把设备分为三类:字符设备、块设备和网络设备。字符设备是指以字符形式发送和接收数据,没有缓冲区的设备;块设备是指以整个数据缓冲区的形式发送和接收数据的设备;网络设备是指网络设备接入的BSD socket接口。我们以字符设备为例来写它的驱动编写框架:

首先,编写驱动程序初始化函数

驱动的初始化在函数xxx_init中完成,包括硬件初始化、中断函数、向内核注册驱动等。

首先了解硬件结构,搞清楚它的功能,接口寄存器以及CPU是如何访问和控制这些寄存器的。

其次,向内核注册驱动程序。设备驱动可以直接编译到内核中,在系统启动时初始化,也可以在需要时以模块的形式动态加载到内核中。每个字符设备或块设备都由register_chrdev函数注册。调用此功能后,您可以向系统申请主设备号。操作成功后,设备名称将出现在/proc/devices中。

另外,当设备关闭时,需要先注销原设备,需要一个清除函数,通过unregister_chrdev函数在xxx_exit中实现,然后设备就会从/proc/devices中消失。

当驱动编译成模块时,模块加载inod,调用模块的初始化函数xxx_init,向内核注册驱动;使用rmmod卸载模块,调用模块的清零函数xxx_exit。

其次,构造要在file_operations结构中使用的每个成员函数。

Linux操作系统把所有设备都当作文件,通过操作文件来访问设备。应用程序不能直接操作硬件,使用统一的接口函数调用硬件驱动程序。这组接口称为系统调用。每个系统调用都有相应的函数(open、release、read、write、ioctl等。).在字符驱动程序中,这些函数被组装在file_operations类型的数据结构中。以键盘驱动程序为例:

结构文件_操作键7279_fops =

{

。open = Key7279_Open,

。ioctl = Key7279_Ioctl,

。release = Key7279_Close

。read = Key7279_Read,

};

1.设备的打开和释放

打开设备是通过打开功能完成的。在大多数设备驱动程序中,Open会完成以下任务:

增量计数器

◇检查具体设备的特殊情况。

初始化设备

◇识别二次设备编号

释放设备是通过释放功能完成的。当一个进程释放该设备时,其他进程可以继续使用该设备,但该进程会暂时停止使用该设备。当一个进程关闭该设备时,其他进程必须在使用它之前重新打开该设备。发布完成以下任务:

倒读数

◇最后一次释放设备时,关闭设备。

2.设备的读写操作

读写设备的主要任务是将kernel 空之间的数据复制到user 空,或者从user 空复制到kernel 空,也就是将kernel 空之间的缓冲区中的数据复制到user 空。字符设备使用各自的读函数和写函数来读写数据。

3.控制设备的运行

除了读写之外,大多数设备还可以执行简单的数据传输之外的操作,因此设备驱动程序还必须具有执行各种硬件控制操作的能力,这通常由ioctl方法支持。与读写操作不同,ioctl的用法与具体设备密切相关。以键盘Key7279_Ioctl为例:

static int Key7279_Ioctl(结构信息节点*信息节点,结构文件*文件,无符号int cmd,无符号long arg)

{

开关(cmd)

{

案例密钥7279 _获取密钥:

return key7279 _ getkey

默认值:

printk(\”未知的键盘命令id . n \”);

}

返回0;

}

cmd的值和意义与具体设备有关。除了ioctl,设备驱动可能还有其他控制功能,比如llseek。

当应用使用open、release等函数打开设备时,会调用设备驱动的file_operations结构中对应的成员。

三。设备的中断和轮询处理

对于不支持中断的设备,读写时需要轮询设备状态,是否需要继续数据传输。例如,打印机。如果设备支持中断,可以在中断模式下完成。

该模块应在使用中断前请求一个中断通道(或IRQ中断请求),并在使用后释放它。中断由request_irq函数注册,由free_irq函数释放。

四、驾驶员考试

调试驱动可以通过打印来完成,即通过给驱动添加printk打印功能,可以跟踪驱动的执行过程,从而判断问题。

以上是我根据自己的学结出来的。可能比较简单。对于更复杂的驱动函数,会增加更多的函数,但大体框架是这样的。

基于操作系统的驱动是硬件接口函数加上没有操作系统的操作系统夹克。

实现嵌入式Linux设备驱动程序的一般过程如下:

(l)查看原理图,了解设备的工作原理。

(2)定义主要设备编号。设备由主设备号和辅助设备号标识。主设备号唯一标识设备。

备份类型,即设备驱动程序类型,是块设备表或字符设备表中设备表条目的索引。仅辅助设备号

由设备驱动程序解释,区分由设备驱动程序控制的独立设备。

(3)实现初始化功能。在驱动中实现驱动的注册和卸载。

(4)设计要实现的文件操作,定义文件操作结构。

(5)实现所需的文件操作调用,如读、写等。

(6)实现中断服务并用request – irq向内核注册。不是每个设备驱动程序都需要中断。

(7)将驱动编译成内核,或者使用inod命令加载模块。

(8)测试设备,编写应用程序,测试驱动程序。

典型的字符设备驱动程序编写框架;

1编写硬件接口函数

2.建立文件系统和设备驱动之间的接口,比如struct file_operations结构。

3将设备注册到chrdevfs的全局数组中。您可以随时注册或注销设备,但通常在模块加载时注册设备,在模块退出时注销设备。(模块_初始化;模块_出口;)

4用模块化的方式编译驱动源代码,加载到内核中。

5创建一个设备节点mknode

6编写应用程序来访问底层设备。

想了解嵌入式技术和物联网的可以联系松宫企鹅号3524659088电话:173-1795-1908。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论