教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 说明书 >

19.Linux驱动程序原理

来源:网络收集 时间:2025-11-15
导读: 华南理工MSE嵌入式课件 Linux驱动程序原理陈虎 tommychen74@http://www.77cn.com.cn 华南理工MSE嵌入式课件 参考数目Johnathan Corbet等著, 魏永明等译,Linux 设备驱动程序,中国电力出版社,2006年 华南理工MSE嵌入式课件 什么是驱动程序设备驱动程序是操作系

华南理工MSE嵌入式课件

Linux驱动程序原理陈虎 tommychen74@http://www.77cn.com.cn

华南理工MSE嵌入式课件

参考数目Johnathan Corbet等著, 魏永明等译,Linux 设备驱动程序,中国电力出版社,2006年

华南理工MSE嵌入式课件

什么是驱动程序设备驱动程序是操作系统内核和机器硬件之间的接口, 为应用程序屏蔽了硬件的细节. 在应用程序看来,硬件设备只是一个设备文件,应用程 序可以像操作普通文件一样对硬件进行操作.设备驱动 程序主要完成这些功能: 探测设备和初始化设备; 从设备接收数据并提交给内核; 从内核接收数据送到设备; 检测和处理设备错误.

嵌入式设备往往具有大量独有的外设,开发人员需要把 很多精力放在设备驱动方面.

华南理工MSE嵌入式课件

Linux中设备类型字符型设备 字符设备的读写以字节为单位,存取时没有缓存. 对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了.一般来说,字符 设备不支持随机访问. 典型的字符设备包括鼠标,键盘及串行口等.

块设备. 块设备读写以块为单位,典型的块大小为512或1024字节. 利用一块系统内存作为缓冲区,当用户进程对设备发出读写请求时,驱动程序先 察看缓冲区中的内容,若缓冲区中的数据能满足用户的要求就返回相应的数据, 否则就调用相应的请求函数来进行实际的I/O操作,以提高效率. 块设备主要包括硬盘,软盘,CD-ROM等.

网络设备 Linux的网络系统主要基于BSD Unix的Socket机制.在系统和驱动程序之间定义 有专门的数据结构进行数据的传递.系统里支持对发送数据和接收数据的缓存, 提高流量控制机制,提供对多协议的支持.

华南理工MSE嵌入式课件

驱动程序的公共特征读写 几乎所有设备都有输入和输出. 操作系统定义一些读写接口,由驱动程序完成具体的读写操作. 在驱动程序初始化时,需要把具有这种接口的读写函数注册到操作 系统中. 中断 驱动程序把一个中断处理程序注册到系统中去,操作系统在硬件中 断发生后调用驱动程序中的中断处理程序. 时钟 在实现驱动程序时,很多地方会用到时钟,如某些协议里的超时处 理等.操作系统应该为驱动程序提供定时机制,一般是在预定的时 间过去以后回调注册的时钟函数.

华南理工MSE嵌入式课件

设备文件每个设备对应一个文件,放在/dev目录下 每个设备文件都对应有两个设备号,存放在inode节点中 主设备号标示设备的种类,也标识了该设备所使用的驱动程序; 次设备号标识了使用同一设备驱动程序的不同硬件设备. 一些典型的设备: 设备名 类型 主设备号 从设备号 说明 /dev/fd0 块设备 2 0 软盘 /dev/hda 块设备 3 0 第一个IDE硬盘 /dev/ttyp0 字符设备 3 0 控制终端 /dev/ttys0 字符设备 4 64 第一个串口 创建一个设备节点 mknod /dev/hda1 b 8 0

华南理工MSE嵌入式课件

字符设备文件的数据结构

华南理工MSE嵌入式课件

驱动程序的注册与注销设备驱动程序可以在系

统启动时初始化,也 可以在需要时动态加载. 字符设备初始化由chr_dev_init()完成 块设备初始化由blk_dev_init()完成

从内核中注销设备时,还需要通过 字符设备unregister_chrdev() 块设备unregister_blkdev()

华南理工MSE嵌入式课件

设备的打开和关闭打开设备是由open()完成的.在大部分驱动程序中, open完成如下工作: 增加设备的使用计数. 检查设备相关错误. 如果是首次打开,则初始化设备. 识别次设备号,如有必要则更新f_op指针.

关闭操作由close()完成的,主要完成以下工作: 递减设备的使用计数. 如果是最后一个释放,则关闭设备.

华南理工MSE嵌入式课件

编写驱动程序的注意事项驱动程序是在内核空间运行 堆栈很小 尽量使用静态变量 不能使用标准的Linux库函数调用!!!只能使用 Linux Linux内核提供的函数接口 必须具有正确版本的编译器和操作系统内核

华南理工MSE嵌入式课件

AD转换器的驱动程序分析基本数据结构 static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_adc_open, read:s3c2410_adc_read, write: s3c2410_adc_write, release: s3c2410_adc_release, }; typedef struct { struct semaphore lock; //互斥锁 wait_queue_head_t wait; //等待队列 int channel; //当前通道号 int prescale; //比例因子 }ADC_DEV;

华南理工MSE嵌入式课件

驱动程序注册#include <linux/module.h> #define DEVICE_NAME "s3c2410-adc" static int adcMajor = 0; int __init s3c2410_adc_init(void){ int ret; ADCTSC = 0; //XP_PST(NOP_MODE); ret = request_irq(IRQ_ADC_DONE, adcdone_int_handler, SA_INTERRUPT, DEVICE_NAME, NULL); if (ret) return ret; ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); if (ret < 0) return ret; adcMajor=ret; #ifdef CONFIG_DEVFS_FS …… #endif printk (DEVICE_NAME"\tinitialized\n"); return 0; } module_init(s3c2410_adc_init);

华南理工MSE嵌入式课件

重要注解指定初始化的宏 __init, __initdata, __exit, __exitdata

模块的初始化函数和注销函数 #include<linux/module.h> module_init(init_function); module_exit(cleanup_function);

在内核中打印 printk(const char *fmt, …);

华南理工MSE嵌入式课件

设备注册函数int register_chdev(unsigned int major, const char *name, struct file_operations *fops); major:主设备号 name:驱动程序名称(出现在/proc/devices中) fops: 文件操作表

相关代码ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); if (ret < 0) return ret; adcMajor=ret;

华南理工MSE嵌入式课件

驱动程序申请中断int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char * devname, void *dev_id); irq: 要申请的中断号; handler: 中断处理函数指针; irq_flags: 中断管理掩码; devname:设备名称; dev_id:设备相关的私用存储区,用于标示自身 例子中的程序: ret = request_irq(IRQ_ADC_DONE, adcdone_int_handler, SA_INTERRUPT, DEVICE_NAME, NULL);

华南理工MSE嵌入式课件

设备注销void __exit s3c2410_adc_exit(void) { #ifdef CONFIG_DEVFS_FS …… #endif unregister_chrdev(adcMajor, DEVICE_NAME); //释放中断 free_irq(IRQ_ADC_DONE,

NULL); } module_exit(s3c2410_adc_exit);

…… 此处隐藏:1941字,全部文档内容请下载后查看。喜欢就下载吧 ……
19.Linux驱动程序原理.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1484545.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)