linuxsound驱动架构怎么写(解释一下linux驱动程序结构框架及工作原理)

1.解释一下linux驱动程序结构框架及工作原理

一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。

设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。

在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。

块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 已经提到,用户进程是通过设备文件来与实际的硬件打交道。

每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。

最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。

如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。

虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把下面的C代码输入机器,你就会获得一个真正的设备驱动程序。

由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如 open,read,write,close…, 注意,不是fopen, fread,但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结构: STruct file_operatiONs { int (*seek) (struct inode * ,struct file *, off_t ,int); int (*read) (struct inode * ,struct file *, char ,int); int (*write) (struct inode * ,struct file *, off_t ,int); int (*readdir) (struct inode * ,struct file *, struct dirent * ,int); int (*select) (struct inode * ,struct file *, int ,select_table *); int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long); int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *); int (*open) (struct inode * ,struct file *); int (*release) (struct inode * ,struct file *); int (*fsync) (struct inode * ,struct file *); int (*fasync) (struct inode * ,struct file *,int); int (*check_media_change) (struct inode * ,struct file *); int (*revalidate) (dev_t dev); } 这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。

这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。

下面就开始写子程序。 #include 基本的类型定义 #include 文件系统使用相关的头文件 #include #include #include unsigned int test_major = 0; static int read_test(struct inode *inode,struct file *file,char *buf,int count) { int left; 用户空间和内核空间 if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT ) return -EFAULT; for(left = count ; left > 0 ; left--) { __put_user(1,buf,1); buf++; } return count; } 这个函数是为read调用准备的。

当调用read时,read_test()被调用,它把用户的缓冲区全部写1。buf 是read调用的一个参数。

它是用户进程空间的一个地址。但是在read_test被调用时,系统进入核心态。

所以不能使用buf这个地址,必须用__put_user(),这是kernel提供的一个函数,用于向用户传送数据。另外还有很多类似功能的函数。

请参考,在向用户空间拷贝数据之前,必须验证buf是否可用。这就用到函数verify_area。

为了验证BUF是否可以用。 static int write_test(struct inode *inode,struct file *file,const char *buf,int count) { return count; } static int open_test(struct inode *inode,struct file *file ) { MOD_INC_USE_COUNT; 模块计数加以,表示当前内核有个设备加载内核当中去 return 0; } static void release_test(struct inode *inode,struct file *file ) { MOD_DEC_USE_COUNT; } 这几个函数都是空操作。

实际调用发生时什么也不做,他们仅仅为下面的结构提供函数指针。 struct file_operations test_fops = {? read_。

2.为什么Linux的音频驱动位于sound目录下而不是driver/sound

1、早期的2.4内核所有的音频驱动和其他驱动一样都是位于drivers目录下的:drivers/sound

2、到了2.5开发版内核,所有的音频驱动包括音频框架代码由drivers/sound移到了sound目录下:

(1)2.6内核之前的git记录查找:mit;h=

author Jaroslav Kysela <perex@perex.cz>

Wed, 13 Feb 2002 03:32:11 +0000 (19:32 -0800)

committer Jaroslav Kysela <perex@perex.cz>

Wed, 13 Feb 2002 03:32:11 +0000 (19:32 -0800)

commit

tree tree | snapshot

parent commit | diff

[PATCH] ALSA patch for 2.5.4

Integrate ALSA into v2.5.4

Jaroslav

这个提交是在2.5.4~2.5.5-pre1之间发生的

从这个提交信息可以看出,是在Linux内核正式引入ALSA音频构架的时候,所有的代码都被移动到了drivers/sound下。

也就是在同一天,音频子系统的维护由原来的Alan Cox转为Jaroslav Kysela:

mit;h=

Make Jaroslav the sound maintainer, remove Alan on his request.

author Linus Torvalds <torvalds@home.transmeta.com>

Wed, 13 Feb 2002 04:05:43 +0000 (20:05 -0800)

committer Linus Torvalds <torvalds@home.transmeta.com>

Wed, 13 Feb 2002 04:05:43 +0000 (20:05 -0800)

commit

tree tree | snapshot

parent commit | diff

Make Jaroslav the sound maintainer, remove Alan on his request.

所以这个代码的移动应该是在ALSA那个分支开发的时候就已经是这样的了

3.声卡驱动说明这一段英文是什么意思

步骤1:解压缩源码tar xfvj 高级Linux声音架构(Advanced Linux Sound Architecture)-驱动 1.0.xx.tar.bz2步骤2:a.读取光碟中高级Linux声音架构-1.0 xx驱动b..声卡配置--inter 高保真音频(High Definition Audio-inter )c.创建d.创建安装步骤3:重启您的机器步骤4.使用音频混音器,终止静音 (所有音频设备默认设置静音)必须编译和安装高级Linux声音架构库和程序 (使用自动安装已执行安装)执行音频混音器Note:注意:1.详细细节可以查阅位于azx-021705.tar.bz2有关高级Linux声音架构内核/程序说明书/ 高级Linux声音架构配置文本文档.2.内核版本必须为2.6或者更新版3.所有混音器通道均被默认设置为静音,你必须使用本地的或者一个unix平台上一个统一的音频接口(Open Sound System )混音器程序打开音频通道.4.如无法读取源码,尝试重命名/usr/src/linux-2.x 文件为 /usr/src/linux.5.驱动增加支持索尼-飞利浦数字界面格式(Sony-Philips Digital Interface Format,)功能.6.a.你可以访问/ sound/其中,sound 就是声卡模块存放目录,大多数的硬件驱动放在 drivers目录,fs 是文件系统模块的目录;net是与网络有关的存放目录,比如一些网络协议支持的模块、防火墙支持的模块等;arch 是cpu方面 。 。

如果我们想自己加载模块,就到这些目录中查看相应模块的信息,然后用 modprobe 来加载; [root@localhost beinan]# modinfo snd-intel8x0 查看一个模块的信息,我们用 modinfo 来查看,所要查看的模块不要带 .ko 或者.o 之类的;比如查看到类似下面的信息; description: Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7012; Ali 5455 通过这个我们足可以知道这是Intel 集成声卡,通过lspci -v 得到的声卡信息,感觉他们很相近;所以就能尝试用这个模块来驱动; [root@localhost beinan]# modprobe snd-intel8x0 用 modprobe 加载了模块,然后我们通过 lsmod 就能看到了;对于声卡模块是这么加载的,其它设备的驱动模块也是如此。

linuxsound驱动架构怎么写

转载请注明出处育才学习网 » linuxsound驱动架构怎么写(解释一下linux驱动程序结构框架及工作原理)

知识

老板的优点怎么写(领导优点缺点怎么写)

阅读(337)

本文主要为您介绍老板的优点怎么写,内容包括领导优点缺点怎么写,老板让写公司的优点和缺点,应该怎么写,老板的好处优点说出来25条来。方法1不要一味的进行赞赏:很多人觉得既然是对领导的评语,就应该抓住这个机会去拍马屁,但是领导对自己的缺点

知识

单位事迹材料怎么写(工作事迹怎么写)

阅读(217)

本文主要为您介绍单位事迹材料怎么写,内容包括工作事迹怎么写,部门先进事迹怎么写,公司事迹该怎么写。第一,基本情况概述首先要概述工作内容、工作的主客观条件、有利和不利因素以及工作环境等。虽然这些与业绩的取得没有必然的联系,但是,显然

知识

童装品牌故事怎么写(T100童装的品牌故事)

阅读(275)

本文主要为您介绍童装品牌故事怎么写,内容包括如果是童装,怎么写品牌故事呢从那些方面入手谢谢了很急的,如果是童装,怎么写品牌故事呢从那些方面入手谢谢了很急的,谁帮我写一段有关童装运动品牌的品牌故事,100字左右就行,有关运。巴尔扎克

知识

小孩入户口证明怎么写(给小孩上户口,村里开的证明怎么写)

阅读(294)

本文主要为您介绍小孩入户口证明怎么写,内容包括给小孩上户口,村里开的证明怎么写,给小孩上户村里开的证明怎么写,新生儿入户证明怎么写。小孩上户口证明 XXX派出所: 兹有我村村民XXX,男,身份证号XXXXXX,于XX年X月于XX地的XXX结为夫妻,现生育一

知识

lol军团公告怎么写(LOL军团,战队,工会)

阅读(297)

本文主要为您介绍lol军团公告怎么写,内容包括LOL军团公告怎么写,lol军团介绍怎么写,英雄联盟的军团公告帮我设计个威武霸气点的公告军团名叫兄弟情深。公会和战队还有军团各指3个部门,公会是腾讯公会,腾讯公会不止一个LOL,所以是一个大概括的

知识

内部招聘广告怎么写(招聘广告怎么写更吸引人)

阅读(265)

本文主要为您介绍内部招聘广告怎么写,内容包括招聘广告怎么写如何写好招聘信息,招聘广告怎么写更吸引人,招工广告怎么写。现在找工作的人都很忙的,他们没有这么多的时间,也没这个耐心去读这么长的信息。招聘信息写这么长,不仅让读者产生厌烦,同

知识

企业形象宣传片观后感怎么写(企业文化感受500字,怎么写)

阅读(253)

本文主要为您介绍企业形象宣传片观后感怎么写,内容包括企业文化感受500字,怎么写,企业形象宣传片的企业形象宣传片文案的写作要求,企业形象宣传片的企业形象宣传片综述怎么做。企业文化是一个企业的灵魂,一个人如果没有灵魂,就是行尸走肉,企业

知识

疫字的繁体字怎么写(征字的繁体字怎么写)

阅读(352)

本文主要为您介绍疫字的繁体字怎么写,内容包括“征”字的繁体字怎么写,瘟疫的繁体字怎么写,声字的繁体字怎么写。徵徵 拼音:zhēng zhǐ 简体字:征部首:彳,部外笔画:12,总笔画:15基本字义● 徵zhǐ ㄓˇ◎ 古代五音之一,相当于简谱“

知识

成字大写怎么写(0,1,2,3,4,5,6,7,8,9,10的大写怎么写)

阅读(310)

本文主要为您介绍成字大写怎么写,内容包括成字的大写是什么字,成字的大写是,成字大写拼音怎么写。大写数字 壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元(圆)、角、分、零、整。这是大家经常要填写的大写数字,问什么要用大写

知识

班会感悟怎么写('学习中的快乐'主题班会的感想怎么写)

阅读(377)

本文主要为您介绍班会感悟怎么写,内容包括主题班会感悟咋写,&#39;学习中的快乐&#39;主题班会的感想怎么写,班级的班会总结怎么写。今天我们办举行了一次以“学习中的快乐”为主题的班会我明白了学习应该寻找快乐而不是寻找烦恼(这里你随便写

知识

c5定速巡航怎么用(雪铁龙C5定速巡航怎么使用)

阅读(357)

本文主要为您介绍c5定速巡航怎么用,内容包括雪铁龙C5定速巡航怎么使用,雪铁龙C5定速巡航怎么使用,2014款2.0雪铁龙c5怎么定速巡航。你好这个功能使用很简单,首先要保证车速在40码以上,然后按一下ON/OFF按钮,打开这个功能。注意并不是打开这个

知识

50万用英语怎么说(50用英语怎么写)

阅读(283)

本文主要为您介绍50万用英语怎么说,内容包括五十万用英语怎么说,50万用英语怎么写,50万用英语怎么写。1到50的英语为:1到20的英语:one、 two、three、four、five、six、seven、eight、nine、ten、e

知识

交行境外刷卡金怎么用(交行刷卡金到底怎么用,直接抵扣的吗)

阅读(257)

本文主要为您介绍交行境外刷卡金怎么用,内容包括交通银行境外刷卡金怎么用,交通银行信用卡境外刷卡金怎么用,交通银行信用卡境外刷卡金怎么用交通银行信用卡境外刷卡金怎么用。交行信用卡的刷卡金是直接抵扣的刷卡的账单金额。但是刷卡金有

知识

系统的架构设计怎么写(在系统设计中怎样写系统体系结构的设计)

阅读(312)

本文主要为您介绍系统的架构设计怎么写,内容包括在系统设计中怎样写系统体系结构的设计,如何写网站系统架构设计书,什么是系统架构设计。简单来说,就是:画图,全方位的剖析系统,设计类。其中要画出用例图,状态图,时序图,类图。下面就我做过的一个“

知识

怎么写cs架构的项目

阅读(308)

本文主要为您介绍怎么写cs架构的项目,内容包括MyEclipse如何建立CS结构的项目,MyEclipse如何建立CS结构的项目,CS架构的介绍。相对于二层体系结构(Client/Server构架)是由逻辑上相互分离的表示层、业务层和数据层构成。表示层向客户提供数据,

知识

驱动精灵怎么用啊

阅读(258)

本文主要为您介绍驱动精灵怎么用啊,内容包括驱动精灵怎么用啊,驱动精灵这个软件怎么用啊,驱动精灵怎么用啊,我下载了但是搞不明白。备份: 安装完操作系统后,第一件事就是要安装各种硬件设备的驱动程序,在平常中,就要将各种硬件设备的驱动程序备

知识

联想驱动光盘怎么用

阅读(166)

本文主要为您介绍联想驱动光盘怎么用,内容包括联想驱动光盘怎么用有什么作用,联想驱动光盘怎么用,联想驱动盘怎么用。请问你指的是什么类型的驱动?台式机的还是笔记本的,台式机有联想台式电脑系统驱动程序4.0.8B,V5.5A,5.7A,Lenovo Dr

知识

论文架构概述怎么写

阅读(220)

本文主要为您介绍论文架构概述怎么写,内容包括论文概述怎么写,论文组织结构怎么写,论文结构是什么,要怎么写。() 论文基本结构 论文属于议论文,其基本结构般包括三部:论题,论证结论. 1.论题:指论文真实性需要证明命题. 2.论证:即论述并证明

知识

单片机驱动程序怎么写

阅读(307)

本文主要为您介绍单片机驱动程序怎么写,内容包括单片机外部设备驱动程序怎么写,谢谢,stc51单片机彩屏驱动程序怎么写希望具体点,谢谢,如何在电脑上安装单片机的驱动程序。武汉 谷鑫科技基于STC单片机彩屏驱动程序实例部分展示,篇幅有限 AUXR

知识

液晶电视万能驱动板怎么写程序

阅读(579)

本文主要为您介绍液晶电视万能驱动板怎么写程序,内容包括液晶电视万能驱动板怎么写程序,液晶电视万能驱动板怎么写程序,怎样给驱动板写程序我想知道给液晶电视驱动板写程序的操作过程。需要准备一个U盘就可以更换所有的LVDS接口的液晶屏程

知识

电路板怎么写驱动

阅读(204)

本文主要为您介绍电路板怎么写驱动,内容包括怎么把程序写在电路板上,如何写元件的驱动,怎么把程序写在电路板上。工具:下载器二、操作步骤1.将下载器接入电脑中。

[/e:loop]