功率电感生产厂家
联系我们
热门搜索
点击排行
推荐阅读
猜猜你喜欢的
最新动态 您所在的位置: 首页 > 最新动态

嵌入式Linux字符设备驱动的设计与应用

来源:    作者:    发布时间:2015-08-17 07:11:26    浏览量:

3.3 设备驱动接口的实现

在Linux内核中,字符设备使用 struct file_operations结构体来实现设备的各种操作接口,这些操作主要用来实现系统调用,命名为 open、read等等。file_operations结构是定义在 <linux/fs.h>工字电感;中的函数指针数组,每个设备文件都与它自己的操作函数相关联。编写字符设备驱动程序,主要是实现 struct file_operations结构中的各个函数。

本系统各设备驱动的设计主要实现 open、read、write和 release这四个方法接口。 file_operation结构成员如下: /* DEVICE驱动程序设备操作方法集 */ struct file_operations device_fops = {

open方法提供给驱动程序以初始化的能力,从而为以后的操作完成初始化做准备。本系统中存在多个设备共用一个驱动的情况,驱动中的 open方法程序框架如下:

  int device_open(struct inode *inode, struct file *filp){ int minor = MINOR(kdev); //次设备号的读取 switch(minor) {

  case first_device: device_first_vaddr = (unsigned long)ioremap (DEVICE_ FIRST _ADDR, 2);

  ……

  case second_device:

  ……

  default:

  ……

  } MOD_INC_USE_COUNT; // 递增模块引用计数 , 防止模块在使用中被卸载 if (down_interruptible(&device_mutex)) { …… }; }

1)open方法调用 MINOR(kdev)宏实现次设备号的读取,使用 switch语句完成设备的匹配初始化。Linux系统为每一个设备分配了一个主设备号和次设备号。主设备号标识具体的设备驱动程序,次设备号标识具体设备。开发板电机设备有直流一体电感电机和步进电机,它们的主设备号都是 252,次设备号分别为 0和 1。数码管、串口、扁平型电感 mini键盘的驱动设计只针对单个设备,次设备号设计为 0。

2)ioremap函数在 open方法中实现对电机、数码管、串口、mini键盘寄存器的访问。 PXA255处理器有专门的存储器管理单元(MMU),在驱动中不能直接对设备 I/O内存的物理地址进行读写,需要调用ioremap 等内核函数将寄存器的实际物理地址映射到内核统一的地址空间中,从而实现了对物理地址的间接调用。例如寄存器 DEVICE_ FIRST _ADDR的读写操作,通过读写 device_first_va电感器线圈ddr变量实现。在 asm/arch/pxa-regs.h头文件中定义了各种寄存器的宏,文件中的宏变量都是经过地址映射的可以直接使用。

release方法的作用正好与 open相反,通过调用 iounmap函数撤销 device设备的虚拟地址映射,同时释放互斥锁,递减模块引用计数,当模块引用计数减到 0时,close函数才能真正的关闭设备。read和 write方法的任务是相似的,主要完成用户空间和内核空间之间的数据拷贝。

read方法程序框架如下:

  ssize_t device_read(struct file *filp, char *buf, size_t count, loff_t *offp){

  ……

  if (copy_to_user(buf, (u8 *)&BUF, count)) { ……} //写数据给用户空间

  return count; // 返回成功读取的字节数 }

其中,copy_to_user函数实现内核空间到用户空间的数据拷贝。应用程序调用该方法接口实现串口数据的接收。

write方法的实现同read方法类似。通过调用 copy_from_user函数实现用户空间到内核空间的数据拷贝。该方法接口实现串口数据的发送、LED和MOTO控制寄存器的设置。

3.4 驱动的装载和卸载

Linux驱动程序的编译加载有两种方式。一种是编译成模块在运行时加载,不需要重新启动内核,它使用 insmod工具将驱动模块加载进内核,使用 rmmod从内核中卸载模块。该方法实现如下:1)编译驱动并下载驱动到开发板:$ arm功率电感-linux-gcc device_driver.c -I /home/eflag/kernel/include/ -c生成 device_driver.o文件,通过 tftp工具下载到开发板;2)驱动的加载:$ insmod device_driver.o。设备驱动的加载成功后,可以编写应用程序进行设备驱动的检测;3)驱动的卸载:$ rmmod device_driver。

  • 电压和电流传输方式的不同工业上通常用电压 0 5(10)V 或电流 0(4) 20mA 作为模拟信号传输的方法,也是被程 控机经常采用的一种方法。那么电压和电流的传输方式有什么不同,什么时候采用什么方法,下面将对此进行简要介

  • 采用软件无线电架构加速无线设备开发和测试随着现在无线电应用数量的增加—从相距数公里的两个朋友之间的视频交谈到PDA控制的库房环境和照明,无线标准的数量也在增加。每个行业都进入无线通信的应用领域,然而每个行业具有其自己的要求和规范,需要根据特

  • 分析无极灯在路灯照明中的应用 引言无极灯是21世纪的一种高效节能绿色新光源,主要由灯泡、耦合器和高频发生器组成,其工作原理是:高频电磁场能量以感应方式耦合到灯泡内,使灯泡内的气体击穿,形成等离子体,等离子体受激发原子返回基态时,

  •