3 CAN设备驱动程序的设计
Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,由内核调用相应的设备驱动。因此首先建立Linux设备管理、设备驱动、设备注册、Linux中断这几个概念。
3.1 Linux的设备管理
Linux支持各种各样的外围设备,对这些设备的管理通称为设备管理。设备管理分为两部分:一部分是驱动程序的上层,与设备无关的,这部分根据输入输出请求,通过特定的设备驱动程序接口与设备进行通信;另一部分是下层,与设备有关的,通常称为设备驱动程序,它直接与硬件打交道,并且向上层提供一组访问接口。Linux设备管理为了对设备进行读、写等操作,把物理设备逻辑化,把它看成特殊的文件,称为设备文件,采用文件系统接口和系统调用来管理和控制设备。Linux把设备分为三类,块设备、字符设备和网络设备。每类设备都有不同管理控制方式和不同的驱动程序,这样方便于对系统进行裁减。Linux内核对设备的识别是根据设备类型和设备号。在字符设备中使用同一个驱动程序的每种设备都有唯一的主设备号。CAN设备通过在/vendor/Samsung/44b0/Makefile文件下设置设备类型和设备号分别为can、125。
3.2 file_operations结构体
Linux对设备操作的具体实现是由设备驱动程序完成。设备驱动程序加载到系统中通过设备注册实现。Linux驱动程序对文件的操作通过 file_operations结构体来完成。file_operations结构体是文件操作函数指针的集合。在设备管理中该结构体各个成员项指向的操作函数就是设备驱动程序的各个操作例程,编写驱动程序实质上就是编写该结构体中的各个函数。对不同的设备可以配备其中全部或部分的操作函数,不使用的函数指针置为NULL。下面是CAN设备file_operations结构体:
Static struct file_operations {
write: s3c44b0_mcp2510_write,//写操作
read: s3c44b0_mcp2510_read,//读操作
ioctl: s3c44b0_mcp2510_ioctl,//读写之外的操作
open: s3c44b0_mcp2510_open,//打开设备
release: s3c44b0_mcp2510_release};//关闭设备
这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用,来调用自己的驱动接口,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。
3.3 设备注册
在linux中,当一种设备安装到系统时必须向系统进行注册,设备注册的主要任务是把设备驱动程序加载到系统中。Linux对不同的设备(如字符设备和块设备)分开进行注册管理。每个设备描述符包括两个指针:name指向设备名字符串,fops指向文件操作函数结构file_operations,该结构体中包含着指向驱动程序各个操作例程的指针。图2给出了linux字符设备注册表的示意图。CAN字符设备的注册函数是内核函数:register_chrdev(MAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops);
其中参数DEVICE_NAME表示设备名,s3c44b0_mcp2510_fops表示指向file_operations结构体的指针,即指向设备的驱动程序。
3.4 Linux中断的处理
在linux系统里,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过用request_irq函数来申请中断,通过free_irq来释放中断。由于本实验未用到中断,因此在此不作详细介绍。
3.5 CAN驱动程序的实现
3.5.1 编写驱动程序操作例程
CAN设备属于字符设备,对于CAN总线设备,除了发送(使用write方法)、接受(使用read方法)以外,还需要控制CAN总线通信的波特率、设置工作模式、设置ID等,所以使用ioctl是最合适的方法。
3 CAN设备驱动程序的设计
Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,由内核调用相应的设备驱动。因此首先建立Linux设备管理、设备驱动、设备注册、Linux中断这几个概念。
3.1 Linux的设备管理
Linux支持各种各样的外围设备,对这些设备的管理通称为设备管理。设备管理分为两部分:一部分是驱动程序的上层,与设备无关的,这部分根据输入输出请求,通过特定的设备驱动程序接口与设备进行通信;另一部分是下层,与设备有关的,通常称为设备驱动程序,它直接与硬件打交道,并且向上层提供一组访问接口。Linux设备管理为了对设备进行读、写等操作,把物理设备逻辑化,把它看成特殊的文件,称为设备文件,采用文件系统接口和系统调用来管理和控制设备。Linux把设备分为三类,块设备、字符设备和网络设备。每类设备都有不同管理控制方式和不同的驱动程序,这样方便于对系统进行裁减。Linux内核对设备的识别是根据设备类型和设备号。在字符设备中使用同一个驱动程序的每种设备都有唯一的主设备号。CAN设备通过在/vendor/Samsung/44b0/Makefile文件下设置设备类型和设备号分别为can、125。
3.2 file_operations结构体
Linux对设备操作的具体实现是由设备驱动程序完成。设备驱动程序加载到系统中通过设备注册实现。Linux驱动程序对文件的操作通过 file_operations结构体来完成。file_operations结构体是文件操作函数指针的集合。在设备管理中该结构体各个成员项指向的操作函数就是设备驱动程序的各个操作例程,编写驱动程序实质上就是编写该结构体中的各个函数。对不同的设备可以配备其中全部或部分的操作函数,不使用的函数指针置为NULL。下面是CAN设备file_operations结构体:
Static struct file_operations {
write: s3c44b0_mcp2510_write,//写操作
read: s3c44b0_mcp2510_read,//读操作
ioctl: s3c44b0_mcp2510_ioctl,//读写之外的操作
open: s3c44b0_mcp2510_open,//打开设备
release: s3c44b0_mcp2510_release};//关闭设备
这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用,来调用自己的驱动接口,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。
3.3 设备注册
在linux中,当一种设备安装到系统时必须向系统进行注册,设备注册的主要任务是把设备驱动程序加载到系统中。Linux对不同的设备(如字符设备和块设备)分开进行注册管理。每个设备描述符包括两个指针:name指向设备名字符串,fops指向文件操作函数结构file_operations,该结构体中包含着指向驱动程序各个操作例程的指针。图2给出了linux字符设备注册表的示意图。CAN字符设备的注册函数是内核函数:register_chrdev(MAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops);
其中参数DEVICE_NAME表示设备名,s3c44b0_mcp2510_fops表示指向file_operations结构体的指针,即指向设备的驱动程序。
3.4 Linux中断的处理
在linux系统里,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过用request_irq函数来申请中断,通过free_irq来释放中断。由于本实验未用到中断,因此在此不作详细介绍。
3.5 CAN驱动程序的实现
3.5.1 编写驱动程序操作例程
CAN设备属于字符设备,对于CAN总线设备,除了发送(使用write方法)、接受(使用read方法)以外,还需要控制CAN总线通信的波特率、设置工作模式、设置ID等,所以使用ioctl是最合适的方法。
举报