版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式设备驱动陈文智 浙江大学计算机学院2019年4月提纲l1、Linux下设备驱动程序简介 l2、设备驱动程序构造 l3、设备驱动实验l实验一:编写一个简单的驱动程序 l实验二:设计和实现一个KED&LED驱动程序 l实验三:静态编译驱动程序,衔接到内核 l实验四:运用中断方式的驱动程序设计 1、Linux下设备驱动程序简介l系统调用是操作系统内核和运用程序之间的接口 l设备驱动程序是操作系统内核和机器硬件之间的接口 lLinux设备驱动的特点是可以以模块的方式加载各种设备类型 l由于嵌入式设备往往具有大量的独有外设,开发人员需求把很多精神放在设备驱
2、动方面 1.1 Linux设备的分类 l字符设备l以字节为单位逐个进展I/O操作 l字符设备中的缓存是可有可无 l不支持随机访问 l如串口设备/dev/cua0和/dev/cua1 l块设备 l块设备的存取是经过buffer、cache来进展 l可以进展随机访问 l例如IDE硬盘设备/dev/hda l可以支持可安装文件系统l网络设备 l经过BSD套接口访问 1.2 Linux设备文件 lLinux笼统了对硬件的处置,一切的硬件设备都可以作为普通文件一样来对待 l可以运用和操作文件一样的、规范的系统调用接口来完成翻开、封锁、读写和I/O控制操作 l对用户来说,设备文件与普通文件并无区别 1.3
3、 主设备号和次设备号 l主设备号:标识该设备的种类,也标识了该设备所运用的驱动程序l次设备号:标识运用同一设备驱动程序的不同硬件设备 l一切曾经注册即曾经加载了驱动程序的硬件设备的主设备号可以从/proc/devices文件中得到 l rootwzchent# mknod /dev/lp0 c 6 01.4 Linux设备驱动代码的分布 l/block l/char l/cdrom l/pci l/scsi l/net l/sound l注:IDE接口的CD驱动位于drivers/block/ide-cd.c中,而SCSI CD驱动位于drivers/scsi/scsi.c中 1.5 Linu
4、x设备驱动程序的特点 l设备驱动是内核的一部分,影响内核稳定l为内核或其从属子系统提供一个规范接口l运用规范的内核效力如内存分配、中断和等待队列等 l大多数Linux设备驱动可以动态可加载 lLinux设备驱动程序可配置 l驱动程序维护其控制的设备,该设备即使不存在也不影响系统的运转,此时设备驱动只是占用少量系统内存,不会对系统呵斥什么危害 2、设备驱动程序构造 lLinux的设备驱动程序与外界的接口可以分成三部分:l与操作系统内核的接口 l与系统引导的接口 l与设备的接口 lLinux设备驱动程序的代码构造大致可以分为如下几个部分:l驱动程序的注册与注销、设备的翻开与释放、设备的读写操作、设
5、备的控制操作、设备的中断和轮询处置。 2.1驱动程序的注册与注销 l注册 lregister_chrdev( );/在fs/devices.clregister_blkdev( );/在fs/block_dev.cl注销 lunregister_chrdev( ) lunregister_blkdev( ) 2.2 翻开、释放、读、写、控制等struct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char
6、 *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct
7、 file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct
8、file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct f
9、ile *, unsigned long, unsigned long, unsigned long, unsigned long);lLinux内核将经过file_operations构造访问驱动程序提供的函数 l字符设备的读写直接运用函数read( )和write( ) l块设备需求调用函数block_read( )和block_write( ) lioctl( )的用法与详细设备亲密关联,因此需求根据设备的实践情况进展详细分析 2.3 设备的轮询和中断处置 l轮询l内核定期对设备的形状进展查询 l耗费不少的内核资源 l假设设备驱动被衔接进入内核,这时运用轮询方式将会带来灾难性的后果 l中
10、断l设备驱动向内核注册其运用的中断 l内核担任把硬件产生的中断传送给相应的设备驱动 l设备驱动在其中断处置过程中做得越少越好 l问题:l如何查看设备驱动所对应的中断号及类型 ?3、设备驱动实验l实验一:编写一个简单的驱动程序 l实验二:设计和实现一个KED&LED实验 l实验三:动态加载和静态编译驱动到内核 l实验四:运用中断方式的驱动程序设计 实验一:编写简单的驱动程序1l1) 义务:l 在XSBase开发板上编写一个简单的字符设备驱动程序。该字符设备具备4个根本操作:xsbase_open()、xsbase_write()、 xsbase_read() 、xsbase_releas
11、e(),实现向这个新建的字符设备先写入一些数据,然后再从这个设备中读取这些数据。 实验一:编写简单的驱动程序2l2)主要数据构造和全局变量 l系统fs/devices.c的struc device_struct构造 l创建一个xsbase.c文件,其中包含一些必要的头文件、宏和全局变量 struct device_struct const char * name; struct file_operations * fops;static struct device_struct chrdevsMAX_CHRDEV;实验一:编写简单的驱动程序3l主要接口函数 lfile_operations 构
12、造的实例 l注:这种构造的声明方法是一种标志化格式声明,便于移植。 static struct file_operations chr_fops = read: xsbase_read, write: xsbase_write, open: xsbase_open, release: xsbase_release,;实验一:编写简单的驱动程序4lxsbase_open()和xsbase_release() static int xsbase_open(struct inode *inode, struct file *file) MOD_INC_USE_COUNT; printk(This c
13、hrdev is opened!n); return 0;static int xsbase_release(struct inode *inode, struct file *file) MOD_DEC_USE_COUNT; printk(this chrdev is released!n); return 0;实验一:编写简单的驱动程序5lxsbase_read() static ssize_t xsbase_read(struct file *file, char *buf, size_t count, loff_t *f_pos) int len; if(count 0) return
14、 -EINVAL; len = strlen(data); if(len count) count = len; copy_to_user(buf, data, count+1); return count;实验一:编写简单的驱动程序6lxsbase_write() static ssize_t xsbase_write( struct file *file, const char *buffer, size_t count, loff_t *f_pos) if(count 0) return -EINVAL; kfree(data); data = (char *)kmalloc(sizeo
15、f(char)*(count+1), GFP_KERNEL); if(!data) return -ENOMEM; copy_from_user(data, buffer, count+1); return count;实验一:编写简单的驱动程序7l3)模块加载:是两种将驱动参与内核的方式之一l编写init_module()llres = register_chrdev(0, xsbase, &chr_fops); llif(xsbase_major = 0)l xsbase_major = res;l编写cleanup_module() llunregister_chrdev(xsb
16、ase_major, xsbase);l实验一:编写简单的驱动程序8l4)驱动安装过程l新建xsbase.c文件,实现主要数据构造和函数接口。l编译生成xsbase.ol把目的文件加载到内核 l在Minicom中运用ZMODEM协议发送文件l执行$ arm-linux-gcc xsbase.c I /usr/src/xscale-linux/include c xsbase.c D_KERNEL_ -DMODULE$ insmod f xsbase.o实验一:编写简单的驱动程序9l创建一个设备文件 l测试lOVER$ mknod /dev/xsbase c major minor实验二:编写K
17、ED&LED驱动1l在这个实验中,经过设计和实现一个KED&LED驱动程序,来控制目的板上的一组LED灯,在安装完驱动后,运转测试程序,就能点亮LED灯。 实验二:编写KED&LED驱动2#define EXT_KEY_CS EXT_PORT2#define EXT_LED_CS EXT_PORT3void led_off_on()int i;EXT_LED_CS = 0 xff;for(i =0 ; i8;+i)EXT_LED_CS = (1 i) & 0 xff);udelay(30000);EXT_LED_CS = 0 xff;实验三:静态编译驱动到内核1
18、 l在确定本人代码位置的前提下,建立本人的源码目录、文件、Makefile、Config.in等。 l修正上层的config.in文件,把本人的驱动参与到内核配置系统中。 l修正上层Makefile,把本人的程序参与到内核编译系统中。 l确保本人的初始化函数被调用。 ldrivers/char/mem.c中的chr_dev_init() 或drivers/block/ll_rw_blk.c中的blk_dev_init() l用宏module_init来声明他的初始化函数 实验三:静态编译驱动到内核2l驱动位置和目录构造 $ cd drivers/xsbase$ tree .|- Config.
19、in|- Makefile|- xsbase.c- xsbase_test.c实验三:静态编译驱动到内核3l修正配置文件 l1drivers/xsbase/Config.in # XSBASE driver configurationmainmenu_option next_commentcomment XSBASE Driverbool XSBASE support CONFIG_XSBASEif $CONFIG_XSBASE = y ; then tristate TEST user-space interface CONFIG_TEST_USER bool TEST CPU CONFIG
20、_TEST_CPUfiendmenu实验三:静态编译驱动到内核4l2 arch/arm/config.in l编写Makefile l1drivers/xsbase/Makefile source drivers/xsbase/Config.inL_TARGET := test.aexport-objs := test.oobj-$(CONFIG_TEST) += test.oinclude $(TOPDIR)/Rules.makeclean:rm -f *.oa .*.flags实验三:静态编译驱动到内核5l2drivers/Makefile l3Makefilesubdir-$(CONFI
21、G_MMC) += mmcsubdir-$(CONFIG_XSBASE) += xsbaseinclude $(TOPDIR)/Rules.makeDRIVERS-$(CONFIG_PLD) += drivers/pld/pld.oDRIVERS-$(CONFIG_MMC) += drivers/mmc/mmcdrivers.oDRIVERS-$(CONFIG_XSBASE) += drivers/xsbase/xsbase.oDRIVERS := $(DRIVERS-y)实验四:中断方式的驱动程序1 l注册中断处置程序 l什么叫中断信号线IRQ号?l何时恳求IRQ号更适宜?l初始化时l设备第
22、一次翻开时 int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);void free_irq(unsigned int irq, void *dev_id);实验四:中断方式的驱动程序2l编写中断处置程序 static void rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_lock (&am
23、p;rtc_lock); rtc_irq_data += 0 x100; rtc_irq_data &= 0 xff; rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0 xF0); if (rtc_status & RTC_TIMER_ON) mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); spin_unlock (&rtc_lock); wake_up_interruptible(&rtc_wait); kill_fasync
24、(&rtc_async_queue, SIGIO, POLL_IN);实验四:中断方式的驱动程序3l中断处置机制的实现 实验四:中断方式的驱动程序4l中断控制l 这些函数更新可编程中断控制器PIC中指定中断的掩码,因此,这样就可以在一切的处置器上制止或者启动 IRQ。对这些函数的调用是可以嵌套的假设 disable_irq() 被胜利调用两次,在 IRQ 真正重新翻开之前,需求执行两次 enable_irq() 调用。 void disable_irq(int irq); void disable_irq_nosync(int irq); void enable_irq(int irq);驱动设计中涉及的一些详细问题驱动设计中涉及的一些详细问题 l用户空间和内核空间 l/proc文件系统 文件/目录名描述Apm高级电源管理信息Bus包含了总线以及总线上设备信息的目录,子目录以总线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 271-2026安全与韧性业务连续性管理体系制定业务连续性计划和程序的指南
- T/ZKJXX 00030-2022水下侧扫声呐探测仪规范
- T/JGE 0060-2025江西绿色生态 小龙虾
- T/CNCA 100-2024煤炭企业绿色矿山标准体系建设指南
- T/CAV 007-2024 T/CAS 903-2024预防用疫苗临床试验现场选用指南
- T/CSMT YB024-2026机载被动腔气溶胶光谱仪校准方法
- GB/T 592-2026船用法兰铸铁止回阀
- 2025~2026学年广东省深圳市福田区北师大版六年级上册11月份月考数学试卷【附答案】
- 2026学年黑龙江省双城市六年级数学期末深度自测培优拓展题详细参考解析详细答案和解析
- PHP中级面试题及详细答案(企业真实版)
- GB/Z 271-2026安全与韧性业务连续性管理体系制定业务连续性计划和程序的指南
- 福建泉州德化县2026年专职网格员招聘考试试卷-含答案解析
- 2027届高三语文上学期全国各地名校9月模考病句修改汇编(含答案)
- 四川成都简阳市2026年四级城乡社区工作者招聘考试试卷-含答案解析
- 2026年科研院所成果转化岗竞聘笔试真题附带答案
- FDE模式行业观察与实践
- 柴油发电机操作规程
- JBT 14445-2025 TYP系列变频调速三相永磁同步电动机技术规范及能效分级(机座号80~355)标准立项发展报告
- (正式版)T∕CSNAME 153-2025 沿海内河船舶智能航行感知系统设计要求
- 四川省2026年高职单招文化考试(中职类)语文试卷+答案
- T∕AOPA 0082-2025 无人驾驶航空器系统遥控站适航技术规范
评论
0/150
提交评论