Linux怎么样识别usb分线器哪个牌子好每个USB

【USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版】USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版价格 - 中国供应商
您好,欢迎回来
您好,欢迎来到中国供应商!
当前位置:
&USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版
USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版
订货量(个)
发 &货&期:不限
供货总量:0PCS(个)
最小起订量:
联系人:黄达星先生
经营模式:
中国 广东 深圳市 深圳市福田区华强北路赛格科技园3栋5楼A505室
主营产品:
供应信息分类
联系人:黄达星
职 位 :运营经理
电 话 :086-8
传 真 :086-8
地 址 :中国 广东 深圳市 深圳市福田区华强北路赛格科技园3栋5楼A505室
价格:¥17.50
价格:¥18.50
价格:¥19.00
价格:¥145.00
价格:¥55.00
价格:¥40.00
价格:¥95.00
品牌:TINAMY
型号:DN130
传输速率:480Mbps
接口数:DN130:7口带开关HUB
USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版
宝贝参数:产品型号:USB3.0 HUB;接口类型:超高速USB3.0接口即插即用。产品色系:黑色/白色(以实际在售颜色为准,请勿备注);外观尺寸:7口:16.5cm&3.5cm&2.2cm;USB线长:60cm(误差&2cm)。产品重量:7口:约140g(带包装);设备支持:USB3.0接口&7;支持系统:Windows2000/XP/ME/Win7/VISTA或Linux2.4/Mac OS 10.2及以上版本。包装内容物:USB3.0分线器〔1〕,USB3.0数据线〔1〕重要提醒:请确认电脑带有USB3.0的接口,如果用于USB2.0接口的电脑使用,无法实现USB3.0速率(但会好过USB2.0HUB),分线器仅会向下兼容。----USB HUB是USB接口扩展器,仅供连接电脑增加USB接口使用,不保证可以用做其他任何用途,请知悉!----此款USB HUB在不配外接电源的情况下可带U盘、键盘、鼠标、USB风扇、U盾等小功率设备;如需带大功率设备(如打印机,移动硬盘等)建议搭配外接电源使用,效果更佳!----请确认电脑自身带有USB3.0的接口,如果没有电脑不带USB3.0的接口,USB HUB只会向下兼容,发挥不出USB3.0的作用,请勿认为接上USB3.0的分线器就可以达到3.0的效果。----请确认电脑自身可以带动相关电脑外置设备,如果电脑自身带不起,即使搭配外接电源不保证一定可以解决相关问题,请知悉!主要特点:**采用GENESYS台湾创惟GL3520芯片,真正超高速3.0芯片,动力更强劲。**电脑1个USB3.0口扩展为7个3.0接口,解决USB接口不够用,每个接口配备独立开关,独立工作,互不影响。**此款分线器另配备了外接电源接口,可以接外部电源,保障设备供电稳定不缺电,满足大功率设备需求,简单好用。**电脑系统自带驱动,自动识别安装, 无须人为安装任何驱动程序,即插即用,支持热插拔功能。**真正超高速USB3.0接口,最高可达5Gbps,并向下兼容USB2.0/1.1标准规格。**设计前卫,彩光系列,时尚大方,色彩靓丽而独特的发光效果,吸引众人的目光。
深圳市天莱美贸易有限公司经销批发的手机配件、手机外壳、数据线、皮套、耳机、无线wifi、汽车检测仪、行车记录仪、手表带配件畅销消费者市场,在消费者当中享有较高的地位,公司与多家零售商和代理商建立了长期稳定的合作关系。深圳市天莱美贸易有限公司经销的手机配件、手机外壳、数据线、皮套、耳机、无线wifi、汽车检测仪品种齐全、价格合理。深圳市天莱美贸易有限公司实力雄厚,重信用、守合同、保证产品质量,以多品种经营特色和薄利多销的原则,赢得了广大客户的信任。
主营产品或服务:
主营行业:
经营模式:
注册资本:
公司成立日期:
公司所在地:
中国 广东 深圳市 深圳市福田区华强北路赛格科技园3栋5楼A505室
企业类型:
中国 广东 深圳市 深圳市福田区华强北路赛格科技园3栋5楼A505室
深圳市天莱美贸易有限公司
价格:¥21.00
价格:¥65.00
价格:¥37.00
价格:¥33.00
价格:¥64.00
价格:¥21.00
价格:¥18.00
价格:¥14.90
价格:¥50.00
价格:¥57.00
价格:¥1.50
价格:¥90.00
日-27日上海新国际博览中心
日-30日北京
国家会议中心
日-16日西安曲江国际会展中心
日-7日国家会展中心(上海)
日-13日青岛国际会展中心
日-17日上海新国际博览中心
日-18日中国国际展览中心(老馆)
日-21日深圳会展中心
日-17日上海新国际博览中心
日-21日福州海峡国际会展中心
免责声明:
本商铺内所展现的USB3.0 HUB usb分线器 带独立开关 集线器 7口高速扩展器极速版信息及其他相关信息均由商铺所属企业自行提供,信息的真实性、准确性和合法性由商铺所属企业完全负责。中国供应商对此不承担任何保证责任。
友情提醒:
建议您在购买相关产品前务必确认供应商资质及产品质量,过低的价格有可能是虚假信息,请谨慎对待,谨防欺诈行为。
地址:中国 广东 深圳市 深圳市福田区华强北路赛格科技园3栋5楼A505室&&
电话:086-8&&
按拼音检索:
技术支持:包邮 蓝绚 7口hub USB分线器 usb2.0 高速USB HUB 1拖7集线器
|浏览71399次
请选择您想要的商品信息
扫码下单,更多惊喜
*由于资质原因部分商商家无法支持,请以下单页为准。
热卖商品排行榜
商家编码:hub-7
品牌:蓝绚
分类:7口hub
适用品牌:通用
开始时间: 14:45
结束时间: 14:42
保修:有保修
2014最新升级加强款(95CM顶级铜芯线材,双核芯片),100%品质保证,不好用包退!值得信赖!&
& 究竟多少个USB接口才够用?----手机、U盘、MP4、鼠标、移动硬盘、摄像头......电脑上的USB接口是不是早就显得捉襟见肘了?同时,电脑上的USB接口主要集中在机箱的后面,对于U盘、移动硬盘这类需要即插即用的设务而言,就不太方便。因此,我们需要一个外接的USB的集线器(简称USB HUB),它不但能提供额外的USB接口,还可以放置在电脑桌上,方便设备的接驳。
产品特点:
1)该分线器USB线更长(近1米)达到95厘米以上,不再担心USB线不够长;
2)带电源保护功能,保障您的设备安全,为您的设备保驾护航;
3)采用最新优质面板,并新增通电指示灯,蓝灯效果更炫。
产品规格:长16.5厘米×宽3.5厘米×高2.2厘米。
USB线长:(近1米)95厘米以上。
产品重量:约120g(带包装)。
接口类型:高速USB2.0即插即用。
设备支持:USB2.0接口×7
支持系统:Windows98/SE/2000/XP/ME/WIN7/VISTA或Linux2.4/Mac OS 8.5及以上版本。
重要提醒:
--USB HUB即为USB接口分线器器、扩展器,连接电脑使用,不保证可以用做他途,请知悉!
--此款USB HUB在不配外接电源的情况下可带U盘、键盘、鼠标、USB风扇、U盾等小功率设备;如 需带大功率设备(如移动硬盘等)请搭配外接电源!
--请确认电脑自身可以带动相关电脑外置设备,如果电脑自身带不起,即使搭配外接电源不保证一定可以解决相关问题,请知悉!
主要特点:
* 采用双FE11S芯片,双核均采用真正高速2.0芯片,动力更强劲。
* 电脑1个USB接口扩展为7个USB接口,解决USB接口不够用,同时每个接口均配备独立开关,独立工作,互不影响。
* 每一个分线器都配备了外接电源接口,可以接外部电源,保障设备供电稳定不缺电,满足大功率设备需求,简单好用。
* 电脑自动识别安装, 无须安装任何驱动程序,即插即用,支持热插拔功能。
* 真正高速USB2.0接口,最高可达480Mbps,并向下兼容USB1.1/1.0标准规格。
* 彩光系列,时尚大方,色彩靓丽而独特的发光效果,吸引众人的目光。
温馨提示:本产品默认不带电源适配器哦,如需要外加电源适配器,请联系客购买。
1、什么是电源适配器?电源适配器有什么用?
HUB本身采用双核芯片主板和铜芯线缆,功率已经很强大,在不接电源适配器的情况下可以轻松带动:键盘/鼠标/网卡/U盘等小功率USB设备和一个大功能USB设备(如移动硬盘/打印机),如果需求较高的朋友。可能同时会接上几个大功率的USB外接设备。这样就需要更强大的外接电源支持。
本对照表依据中国常用衣服尺码对照表为基础
如果您对尺码对照表有更好的建议,。
销售情况<em soldNum="
买家使用财付通购买“”标志的商品,在确认收货后14天内出现质量问题,与卖家协商无果的情况下有权申请先行赔付。
如实填写商品信息,确保商品质量,并按照承诺为买家提供合理的售后服务。
如买卖方在交易过程中产生纠纷,沟通无果并发起维权的情况下,平台将在7天内介入处理。
(1) 全部卖家都加入了诚信保证计划
(2) 全站商品都是诚保商品
(3) 质量有问题,平台可先行赔付给买家
维权过程中请注意:
(1) 买家赔付申请在形式上符合相关法律法规的规定;
(2) 赔付请求金额仅以买家实际支付的商品价款、邮费(含退货回邮费用)为限;
(3) 提出“先行赔付”申请应在线上确认收货后的14天内。
买家使用财付通购买“”标志的商品,在确认收货后的7天内如果不满意,有权申请无理由退款退货。
对于符合条件的买家所发起的7天无理由退换货要求,需按规受理。
如买卖方在交易过程中产生纠纷,沟通无果并发起维权的情况下,平台将在7天内介入处理。
(1) 门槛低,在普通卖家店铺也能享受此服务
(2) 确认收货后7天内,只要不喜欢就能自由退
(3) 平台协助处理,公平公正
维权过程中请注意:
(1) 如商品存在质量问题则不适用此服务,可直接申请“先行赔付”;
(2) 需要退货请保证商品及配件完好;
(3) 提出“7天包退”申请应在线上确认收货后的7天内。
买家使用财付通购买“”标志的商品,若卖家未履行当日4:00至16:00之间付款的订单在12小时内发货、当日16:00次日4:00之间付款的订单在24小时内发货的承诺,在交易完成后的15天内,买家有权申请“快速发货”赔付。
卖家须按快速发货规定的时间准时发货
如买卖方在交易过程中产生纠纷,沟通无果并发起维权的情况下,平台将在7天内介入处理。
(1) 付款后卖家快速响应发货,减少等待时间,享受12小时极速发货的体验
(2) 若卖家未履行快速发货承诺,买家可发起维权,享受最高30元的额外赔付
(3) 明确的发货时间预期。
维权过程中请注意:
(1) 当卖家未按时标记发货时,买家发起维权后,可立即获得赔付,无需提交任何证据
(2) 当卖家虚假标记发货后,买家需在退款失败后或退款完成后或交易完成后,才能发起维权
(3) 买家针对卖家虚假标记发货发起维权时,买家需提供物流流水记录截图等相关证据,平台客服将在7天内介入处理。
使用货到付款,安全放心。收到您需要的商品之后把款付给物流公司,物流公司再转给卖家。
常见问题:
诚信保证计划
下载拍拍app
更懂你的购物神器
下载拍拍小店APP
一键开店当老板
关注拍拍服务号
关注拍拍 惊喜多多
Copyright &
广东省通管局 增值电信业务经营许可证B2-  插入U盘之后,按照下面的步骤:
  1.fdisk -l /dev/sd*
  通常这一步就能找到U盘,如果U盘有指示灯也会亮,表示被找到。
  2.如果执行上一个命令没有反应,或者某些信息显示模块没有加入
  可以lsmod查看一下是否有usb-storage scsi_mod sd_mod模块。
  没有就modprobe [module],添加所缺模块。
  然后再试就ok
  3.最后就是把U盘mount上去,这里需要先在mnt目录下面建一个usb目录
  mount /dev/sda /mnt/usb
  某些系统需要指定文件系统的类型,可以用
  mount -t vfat /dev/sda /mnt/usb
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向上学吧网站投诉>>
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益加载中,请稍候...
加载中,请稍候...
商品编号:735842
京 东 价:
在线客服:
服务支持:
极智(Jizz)冰蝎 魔镜蓝调USB分线器 USB转换器 集线器 黑色
加载中,请稍候...
如果您发现商品信息不准确,
商品介绍加载中...
接口4个USB接口
尺寸7.2*1.8*7.2cm
特性高速USB 2.0接口,向下兼容 USB1.1版本 内置电流过载短路保护装置 系统支持:Win95/98/Me/2000/XP/Vista/Win7,Linux2.4andMac os8.5或以上版本 USB连线,长约0.8米
冰蝎分线器 × 1
质保卡 × 1
本产品全国联保,享受三包服务,质保期为:六个月质保
京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。
凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和,请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...为什么linux不能识别usb接口的音频设备
为什么linux不能识别usb接口的音频设备
09-08-20 &匿名提问 发布
本章导读在Linux中,先后出现了音频设备的两种框架OSS和ALSA,本节将在介绍数字音频设备及音频设备硬件接口的基础上,展现OSS和ALSA驱动的结构。17.1~17.2节讲解了音频设备及PCM、IIS和AC97硬件接口。17.3节阐述了Linux OSS音频设备驱动的组成、mixer接口、dsp接口及用户空间编程方法。17.4节阐述了Linux ALSA音频设备驱动的组成、card和组件管理、PCM设备、control接口、AC97 API及用户空间编程方法。17.5节以S3C2410通过IIS接口外接UDA1341编解码器的实例讲解了OSS驱动。17.6节以PXA255通过AC97接口外接AC97 编解码器的实例讲解了ALSA驱动。17.1数字音频设备目前,手机、PDA、MP3等许多嵌入式设备中包含了数字音频设备,一个典型的数字音频系统的电路组成如图17.1所示。图17.1中的嵌入式微控制器 /DSP中集成了PCM、IIS或AC97音频接口,通过这些接口连接外部的音频编解码器即可实现声音的AD和DA转换,图中的功放完成模拟信号的放大功能。图17.1 典型的数字音频系统电路音频编解码器是数字音频系统的核心,衡量它的指标主要有:o 采样频率采样的过程就是将通常的模拟音频信号的电信号转换成二进制码0和1的过程,这些0和1便构成了数字音频文件。如图17.2中的正弦曲线代表原始音频曲线,方格代表采样后得到的结果,二者越吻合说明采样结果越好。采样频率是每秒钟的采样次数,我们常说的 44.1kHz 采样频率就是每秒钟采样44100 次。理论上采样频率越高,转换精度越高,目前主流的采样频率是48kHz。o 量化精度量化精度是指对采样数据分析的精度,比如24bit量化精度就是是将标准电平信号按照2的24次方进行分析,也就是说将图17.2中的纵坐标等分为224等分。量化精度越高,声音就越逼真。图17.2 数字音频采样17.2音频设备硬件接口17.2.1 PCM接口针对不同的数字音频子系统,出现了几种微处理器或DSP与音频器件间用于数字转换的接口。最简单的音频接口是PCM(脉冲编码调制)接口,该接口由时钟脉冲(BCLK)、帧同步信号(FS)及接收数据(DR)和发送数据(DX)组成。在FS信号的上升沿,数据传输从MSB(Most Significant Bit)字开始,FS频率等于采样率。FS信号之后开始数据字的传输,单个的数据位按顺序进行传输,1个时钟周期传输1个数据字。发送MSB时,信号的等级首先降到最低,以避免在不同终端的接口使用不同的数据方案时造成MSB的丢失。PCM接口很容易实现,原则上能够支持任何数据方案和任何采样率,但需要每个音频通道获得一个独立的数据队列。17.2.2 IIS接口IIS 接口(Inter-IC Sound)在20世纪80年代首先被飞利浦用于消费音频,并在一个称为LRCLK(Left/Right CLOCK)的信号机制中经过多路转换,将两路音频信号变成单一的数据队列。当LRCLK为高时,左声道数据被传输;LRCLK为低时,右声道数据被传输。与PCM相比,IIS更适合于立体声系统。对于多通道系统,在同样的BCLK和LRCLK条件下,并行执行几个数据队列也是可能的。17.2.3 AC97接口AC&#39;97(Audio Codec 1997)是以Intel为首的五个PC厂商Intel、Creative Labs、NS、Analog Device与Yamaha共同提出的规格标准。与PCM和IIS不同,AC&#39;97不只是一种数据格式,用于音频编码的内部架构规格,它还具有控制功能。 AC&#39;97采用AC-Link与外部的编解码器相连,AC-Link接口包括位时钟(BITCLK)、同步信号校正(SYNC)和从编码到处理器及从处理器中解码(SDATDIN与SDATAOUT)的数据队列。AC&#39;97数据帧以SYNC脉冲开始,包括12个20位时间段(时间段为标准中定义的不同的目的服务)及16位“tag”段,共计256个数据序列。例如,时间段“1”和“2”用于访问编码的控制寄存器,而时间段“3”和“4”分别负载左、右两个音频通道。“tag”段表示其他段中哪一个包含有效数据。把帧分成时间段使传输控制信号和音频数据仅通过4根线到达9个音频通道或转换成其他数据流成为可能。与具有分离控制接口的IIS方案相比,AC&#39;97明显减少了整体管脚数。一般来说,AC&#39;97 编解码器采用TQFP48封装,如图17.3所示。图17.3 AC97 Codec芯片PCM、IIS和AC97各有其优点和应用范围,例如在CD、MD、MP3随身听多采用IIS接口,移动电话会采用PCM接口,具有音频功能的PDA则多使用和PC一样的AC&#39;97编码格式。17.3 Linux OSS音频设备驱动17.3.1 OSS驱动的组成OSS标准中有2个最基本的音频设备:mixer(混音器)和DSP(数字信号处理器)。在声卡的硬件电路中,mixer是一个很重要的组成部分,它的作用是将多个信号组合或者叠加在一起,对于不同的声卡来说,其混音器的作用可能各不相同。OSS驱动中,/dev/mixer设备文件是应用程序对mixer进行操作的软件接口。混音器电路通常由两个部分组成:输入混音器(input mixer)和输出混音器(output mixer)。输入混音器负责从多个不同的信号源接收模拟信号,这些信号源有时也被称为混音通道或者混音设备。模拟信号通过增益控制器和由软件控制的音量调节器后,在不同的混音通道中进行级别(level)调制,然后被送到输入混音器中进行声音的合成。混音器上的电子开关可以控制哪些通道中有信号与混音器相连,有些声卡只允许连接一个混音通道作为录音的音源,而有些声卡则允许对混音通道做任意的连接。经过输入混音器处理后的信号仍然为模拟信号,它们将被送到A/D转换器进行数字化处理。输出混音器的工作原理与输入混音器类似,同样也有多个信号源与混音器相连,并且事先都经过了增益调节。当输出混音器对所有的模拟信号进行了混合之后,通常还会有一个总控增益调节器来控制输出声音的大小,此外还有一些音调控制器来调节输出声音的音调。经过输出混音器处理后的信号也是模拟信号,它们最终会被送给喇叭或者其它的模拟输出设备。对混音器的编程包括如何设置增益控制器的级别,以及怎样在不同的音源间进行切换,这些操作通常来讲是不连续的,而且不会像录音或者放音那样需要占用大量的计算机资源。由于混音器的操作不符合典型的读/写操作模式,因此除了 open()和close()两个系统调用之外,大部分的操作都是通过ioctl()系统调用来完成的。与/dev/dsp不同,/dev/mixer允许多个应用程序同时访问,并且混音器的设置值会一直保持到对应的设备文件被关闭为止。DSP也称为编解码器,实现录音(录音)和放音(播放),其对应的设备文件是/dev/dsp或/dev/sound/dsp。OSS声卡驱动程序提供的/dev/dsp是用于数字采样和数字录音的设备文件,向该设备写数据即意味着激活声卡上的D/A转换器进行放音,而向该设备读数据则意味着激活声卡上的A/D转换器进行录音。在从DSP设备读取数据时,从声卡输入的模拟信号经过A/D转换器变成数字采样后的样本,保存在声卡驱动程序的内核缓冲区中,当应用程序通过 read()系统调用从声卡读取数据时,保存在内核缓冲区中的数字采样结果将被复制到应用程序所指定的用户缓冲区中。需要指出的是,声卡采样频率是由内核中的驱动程序所决定的,而不取决于应用程序从声卡读取数据的速度。如果应用程序读取数据的速度过慢,以致低于声卡的采样频率,那么多余的数据将会被丢弃(即overflow);如果读取数据的速度过快,以致高于声卡的采样频率,那么声卡驱动程序将会阻塞那些请求数据的应用程序,直到新的数据到来为止。在向DSP设备写入数据时,数字信号会经过D/A转换器变成模拟信号,然后产生出声音。应用程序写入数据的速度应该至少等于声卡的采样频率,过慢会产生声音暂停或者停顿的现象(即underflow)。如果用户写入过快的话,它会被内核中的声卡驱动程序阻塞,直到硬件有能力处理新的数据为止。与其它设备有所不同,声卡通常不需要支持非阻塞(non-blocking)的I/O操作。即便内核OSS驱动提供了非阻塞的I/O支持,用户空间也不宜采用。无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),如无符号8位、单声道、8KHz采样率,如果默认值无法达到要求,可以通过ioctl()系统调用来改变它们。通常说来,在应用程序中打开设备文件/dev/dsp之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。17.3.2 mixer接口int register_sound_mixer(struct file_operations *fops, int dev);上述函数用于注册1个混音器,第1个参数fops即是文件操作接口,第2个参数dev是设备编号,如果填入-1,则系统自动分配1个设备编号。mixer是 1个典型的字符设备,因此编码的主要工作是实现file_operations中的open()、ioctl()等函数。mixer接口file_operations中的最重要函数是ioctl(),它实现混音器的不同IO控制命令,代码清单17.1给出了1个ioctl()的范例。代码清单17.1 mixer()接口ioctl()函数范例1 static int mixdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)2 {3 &#160; &#160;...4 &#160; &#160;switch (cmd)5 &#160; &#160;{6 &#160; &#160; &#160;case SOUND_MIXER_READ_MIC:7 &#160; &#160; &#160; &#160;...8 &#160; &#160; &#160;case SOUND_MIXER_WRITE_MIC:9 &#160; &#160; &#160; &#160;...10 &#160; &#160; case SOUND_MIXER_WRITE_RECSRC:11 &#160; &#160; &#160; ...12 &#160; &#160; case SOUND_MIXER_WRITE_MUTE:13 &#160; &#160; &#160; ...14 &#160; }15 &#160; //其它命令16 &#160; return mixer_ioctl(codec, cmd, arg);17 }17.3.3 DSP接口int register_sound_dsp(struct file_operations *fops, int dev);上述函数与register_sound_mixer()类似,它用于注册1个dsp设备,第1个参数fops即是文件操作接口,第2个参数dev是设备编号,如果填入-1,则系统自动分配1个设备编号。dsp也是1个典型的字符设备,因此编码的主要工作是实现file_operations中的 read()、write()、ioctl()等函数。dsp接口file_operations中的read()和write()函数非常重要,read()函数从音频控制器中获取录音数据到缓冲区并拷贝到用户空间,write()函数从用户空间拷贝音频数据到内核空间缓冲区并最终发送到音频控制器。dsp接口file_operations中的ioctl()函数处理对采样率、量化精度、DMA缓冲区块大小等参数设置IO控制命令的处理。在数据从缓冲区拷贝到音频控制器的过程中,通常会使用DMA,DMA对声卡而言非常重要。例如,在放音时,驱动设置完DMA控制器的源数据地址(内存中 DMA缓冲区)、目的地址(音频控制器FIFO)和DMA的数据长度,DMA控制器会自动发送缓冲区的数据填充FIFO,直到发送完相应的数据长度后才中断一次。在OSS驱动中,建立存放音频数据的环形缓冲区(ring buffer)通常是值得推荐的方法。此外,在OSS驱动中,一般会将1个较大的DMA缓冲区分成若干个大小相同的块(这些块也被称为“段”,即 fragment),驱动程序使用DMA每次在声音缓冲区和声卡之间搬移一个fragment。在用户空间,可以使用ioctl()系统调用来调整块的大小和个数。除了read()、write()和ioctl()外,dsp接口的poll()函数通常也需要被实现,以向用户反馈目前能否读写DMA缓冲区。在OSS驱动初始化过程中,会调用register_sound_dsp()和register_sound_mixer()注册dsp和mixer设备;在模块卸载的时候,会调用如代码清单17.2。代码清单17.2 OSS驱动初始化注册dsp和mixer设备1 static int xxx_init(void)2 {3 &#160; &#160;struct xxx_state *s = &xxx_4 &#160; &#160;...5 &#160; &#160;//注册dsp设备6 &#160; &#160;if ((audio_dev_dsp = register_sound_dsp(&xxx_audio_fops, - 1)) & 0)7 &#160; &#160; &#160;goto err_dev1;8 &#160; &#160;//设备mixer设备 9 &#160; &#160;if ((audio_dev_mixer = register_sound_mixer(&xxx_mixer_fops, - 1)) & 0)10 &#160; &#160; goto err_dev2;11 &#160; ...12 }1314 void __exit xxx_exit(void)15 {16 //注销dsp和mixer设备接口17 unregister_sound_dsp(audio_dev_dsp);18 unregister_sound_mixer(audio_dev_mixer);19 ...20 }根据17.3.2和17.3.3节的分析,可以画出一个Linux OSS驱动结构的简图,如图17.4所示。图17.4 Linux OSS驱动结构17.3.4 OSS用户空间编程1、DSP编程对OSS驱动声卡的编程使用Linux文件接口函数,如图17.5,DSP接口的操作一般包括如下几个步骤:① 打开设备文件/dev/dsp。采用何种模式对声卡进行操作也必须在打开设备时指定,对于不支持全双工的声卡来说,应该使用只读或者只写的方式打开,只有那些支持全双工的声卡,才能以读写的方式打开,这还依赖于驱动程序的具体实现。Linux允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够很方便地在放音状态和录音状态之间进行切换。② 如果有需要,设置缓冲区大小。运行在Linux内核中的声卡驱动程序专门维护了一个缓冲区,其大小会影响到放音和录音时的效果,使用ioctl()系统调用可以对它的尺寸进行恰当的设置。调节驱动程序中缓冲区大小的操作不是必须的,如果没有特殊的要求,一般采用默认的缓冲区大小也就可以了。如果想设置缓冲区的大小,则通常应紧跟在设备文件打开之后,这是因为对声卡的其它操作有可能会导致驱动程序无法再修改其缓冲区的大小。③ 设置声道(channel)数量。根据硬件设备和驱动程序的具体情况,可以设置为单声道或者立体声。④ 设置采样格式和采样频率采样格式包括AFMT_U8(无符号8位)、AFMT_S8(有符号8位)、AFMT_U16_LE(小端模式,无符号16位)、 AFMT_U16_BE(大端模式,无符号16位)、AFMT_MPEG、AFMT_AC3等。使用SNDCTL_DSP_SETFMT IO控制命令可以设置采样格式。对于大多数声卡来说,其支持的采样频率范围一般为5kHz到44.1kHz或者48kHz,但并不意味着该范围内的所有连续频率都会被硬件支持,在Linux下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz 和44100Hz。使用SNDCTL_DSP_SPEED IO控制命令可以设置采样频率。⑤ 读写/dev/dsp实现播放或录音。图17.5 OSS dsp接口用户空间操作流程代码清单17.3的程序实现了利用/dev/dsp接口进行声音录制和播放的过程,它的功能是先录制几秒钟音频数据,将其存放在内存缓冲区中,然后再进行放音。代码清单17.3 OSS DSP接口应用编程范例1 #include &unistd.h&2 #include &fcntl.h&3 #include &sys/types.h&4 #include &sys/ioctl.h&5 #include &stdlib.h&6 #include &stdio.h&7 #include &linux/soundcard.h&8 #define LENGTH 3 &#160; &#160;/* 存储秒数 */9 #define RATE 8000 &#160; /* 采样频率 */10 #define SIZE 8 &#160; &#160; &#160;/* 量化位数 */11 #define CHANNELS 1 /* 声道数目 */12 /* 用于保存数字音频数据的内存缓冲区 */13 unsigned char buf[LENGTH *RATE * SIZE * CHANNELS / 8];14 int main()15 {16 &#160; /* 声音设备的文件描述符 */17 &#160; /* 用于ioctl调用的参数 */18 &#160; /* 系统调用的返回值 */19 &#160; /* 打开声音设备 */20 &#160; fd = open(&/dev/dsp&, O_RDWR);21 &#160; if (fd & 0)22 &#160; {23 &#160; &#160; perror(&open of /dev/dsp failed&);24 &#160; &#160; exit(1);25 &#160; }26 &#160; /* 设置采样时的量化位数 */27 &#160; arg = SIZE;28 &#160; status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);29 &#160; if (status == - 1)30 &#160; &#160; perror(&SOUND_PCM_WRITE_BITS ioctl failed&);31 &#160; if (arg != SIZE)32 &#160; &#160; perror(&unable to set sample size&);33 &#160; /* 设置采样时的通道数目 */34 &#160; arg = CHANNELS;35 &#160; status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);36 &#160; if (status == - 1)37 &#160; &#160; perror(&SOUND_PCM_WRITE_CHANNELS ioctl failed&);38 &#160; if (arg != CHANNELS)39 &#160; &#160; perror(&unable to set number of channels&);40 &#160; /* 设置采样率 */41 &#160; arg = RATE;42 &#160; status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);43 &#160; if (status == - 1)44 &#160; &#160; perror(&SOUND_PCM_WRITE_WRITE ioctl failed&);45 &#160; /* 循环,直到按下Control-C */46 &#160; while (1)47 &#160; {48 &#160; &#160; printf(&Say something:\n&);49 &#160; &#160; status = read(fd, buf, sizeof(buf)); /* 录音 */50 &#160; &#160; if (status != sizeof(buf))51 &#160; &#160; &#160; perror(&read wrong number of bytes&);52 &#160; &#160; printf(&You said:\n&);53 &#160; &#160; status = write(fd, buf, sizeof(buf)); /* 放音 */54 &#160; &#160; if (status != sizeof(buf))55 &#160; &#160; &#160; perror(&wrote wrong number of bytes&);56 &#160; &#160; /* 在继续录音前等待放音结束 */57 &#160; &#160; status = ioctl(fd, SOUND_PCM_SYNC, 0);58 &#160; &#160; if (status == - 1)59 &#160; &#160; &#160; perror(&SOUND_PCM_SYNC ioctl failed&);60 &#160; }61 }2、mixer编程声卡上的混音器由多个混音通道组成,它们可以通过驱动程序提供的设备文件/dev/mixer进行编程。对混音器的操作一般都通过ioctl()系统调用来完成,所有控制命令都以SOUND_MIXER或者MIXER开头,表17.1列出了常用的混音器控制命令。表17.1 混音器常用命令命 令 作 用SOUND_MIXER_VOLUME 主音量调节SOUND_MIXER_BASS 低音控制SOUND_MIXER_TREBLE 高音控制SOUND_MIXER_SYNTH FM合成器SOUND_MIXER_PCM 主D/A转换器SOUND_MIXER_SPEAKER PC喇叭SOUND_MIXER_LINE 音频线输入SOUND_MIXER_MIC 麦克风输入SOUND_MIXER_CD CD输入SOUND_MIXER_IMIX 放音音量SOUND_MIXER_ALTPCM 从D/A 转换器SOUND_MIXER_RECLEV 录音音量SOUND_MIXER_IGAIN 输入增益SOUND_MIXER_OGAIN 输出增益SOUND_MIXER_LINE1 声卡的第1输入SOUND_MIXER_LINE2 声卡的第2输入SOUND_MIXER_LINE3 声卡的第3输入对声卡的输入增益和输出增益进行调节是混音器的一个主要作用,目前大部分声卡采用的是8位或者16位的增益控制器,声卡驱动程序会将它们变换成百分比的形式,也就是说无论是输入增益还是输出增益,其取值范围都是从0到100。o SOUND_MIXER_READ宏在进行混音器编程时,可以使用 SOUND_MIXER_READ宏来读取混音通道的增益大小,例如如下代码可以获得麦克风的输入增益:ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);对于只有一个混音通道的单声道设备来说,返回的增益大小保存在低位字节中。而对于支持多个混音通道的双声道设备来说,返回的增益大小实际上包括两个部分,分别代表左、右两个声道的值,其中低位字节保存左声道的音量,而高位字节则保存右声道的音量。下面的代码可以从返回值中依次提取左右声道的增益大小:int left,left = vol & 0right = (vol & 0xff00) && 8;o SOUND_MIXER_WRITE宏如果想设置混音通道的增益大小,则可以通过SOUND_MIXER_WRITE宏来实现,例如下面的语句可以用来设置麦克风的输入增益:vol = (right && 8) +ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);o 查询Mixer信息声卡驱动程序提供了多个ioctl()系统调用来获得混音器的信息,它们通常返回一个整型的位掩码,其中每一位分别代表一个特定的混音通道,如果相应的位为1,则说明与之对应的混音通道是可用的。通过 SOUND_MIXER_READ_DEVMASK返回的位掩码查询出能够被声卡支持的每一个混音通道,而通过 SOUND_MIXER_READ_RECMAS返回的位掩码则可以查询出能够被当作录音源的每一个通道。例如,如下代码可用来检查CD输入是否是一个有效的混音通道:ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);if (devmask & SOUND_MIXER_CD)printf(&The CD input is supported&);如下代码可用来检查CD输入是否是一个有效的录音源:ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask);if (recmask & SOUND_MIXER_CD)printf(&The CD input can be a recording source&);大多数声卡提供了多个录音源,通过 SOUND_MIXER_READ_RECSRC可以查询出当前正在使用的录音源,同一时刻可使用2个或2个以上的录音源,具体由声卡硬件本身决定。相应地,使用 SOUND_MIXER_WRITE_RECSRC可以设置声卡当前使用的录音源,如下代码可以将CD输入作为声卡的录音源使用:devmask = SOUND_MIXER_CD;ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &devmask);此外,所有的混音通道都有单声道和双声道的区别,如果需要知道哪些混音通道提供了对立体声的支持,可以通过SOUND_MIXER_READ_STEREODEVS来获得。代码清单17.4的程序实现了利用/dev/mixer接口对混音器进行编程的过程,该程序可对各种混音通道的增益进行调节。代码清单17.4 OSS mixer接口应用编程范例1 &#160; #include &unistd.h&2 &#160; #include &stdlib.h&3 &#160; #include &stdio.h&4 &#160; #include &sys/ioctl.h&5 &#160; #include &fcntl.h&6 &#160; #include &linux/soundcard.h&7 &#160; /* 用来存储所有可用混音设备的名称 */8 &#160; const char *sound_device_names[] = SOUND_DEVICE_NAMES;9 &#160; /* 混音设备所对应的文件描述符 */10 int devmask, /* 混音器信息对应的bit掩码 */11 char *12 /* 显示命令的使用方法及所有可用的混音设备 */13 void usage()14 {15 &#160; &#160;16 &#160; &#160;fprintf(stderr, &usage: %s &device& &left-gain%%& &right-gain%%&\n&17 &#160; &#160; &#160;&%s &device& &gain%%&\n\n&&Where &device& is one of:\n&, name, name);18 &#160; &#160;for (i = 0; i & SOUND_MIXER_NRDEVICES; i++)19 &#160; &#160; &#160;if ((1 && i) &devmask)20 &#160; &#160; /* 只显示有效的混音设备 */21 &#160; &#160; &#160; &#160;fprintf(stderr, &%s &, sound_device_names[i]);22 &#160; &#160;fprintf(stderr, &\n&);23 &#160; &#160;exit(1);24 }25 26 int main(int argc, char *argv[])27 {28 &#160; &#160;int left, right, /* 增益设置 */29 &#160; &#160; /* 系统调用的返回值 */30 &#160; &#160; /* 选用的混音设备 */31 &#160; &#160;char * /* 混音设备的名称 */32 &#160; &#160;33 &#160; &#160;name = argv[0];34 &#160; &#160;/* 以只读方式打开混音设备 */35 &#160; &#160;fd = open(&/dev/mixer&, O_RDONLY);36 &#160; &#160;if (fd == - 1)37 &#160; &#160;{38 &#160; &#160; &#160;perror(&unable to open /dev/mixer&);39 &#160; &#160; &#160;exit(1);40 &#160; &#160;}41 42 &#160; &#160;/* 获得所需要的信息 */43 &#160; &#160;status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);44 &#160; &#160;if (status == - 1)45 &#160; &#160; &#160;perror(&SOUND_MIXER_READ_DEVMASK ioctl failed&);46 &#160; &#160;status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);47 &#160; &#160;if (status == - 1)48 &#160; &#160; &#160;perror(&SOUND_MIXER_READ_STEREODEVS ioctl failed&);49 &#160; &#160;/* 检查用户输入 */50 &#160; &#160;if (argc != 3 && argc != 4)51 &#160; &#160; &#160;usage();52 &#160; &#160;/* 保存用户输入的混音器名称 */53 &#160; &#160;dev = argv[1];54 &#160; &#160;/* 确定即将用到的混音设备 */55 &#160; &#160;for (i = 0; i & SOUND_MIXER_NRDEVICES; i++)56 &#160; &#160; &#160;if (((1 && i) &devmask) && !strcmp(dev, sound_device_names[i]))57 &#160; &#160; &#160; &#160;58 &#160; &#160;if (i == SOUND_MIXER_NRDEVICES)59 &#160; &#160;{60 &#160; &#160; &#160; /* 没有找到匹配项 */61 &#160; &#160; &#160;fprintf(stderr, &%s is not a valid mixer device\n&, dev);62 &#160; &#160; &#160;usage();63 &#160; &#160;}64 &#160; &#160;/* 查找到有效的混音设备 */65 &#160; &#160;device =66 &#160; &#160;/* 获取增益值 */67 &#160; &#160;if (argc == 4)68 &#160; &#160;{69 &#160; &#160; &#160;/* 左、右声道均给定 */70 &#160; &#160; &#160;left = atoi(argv[2]);71 &#160; &#160; &#160;right = atoi(argv[3]);72 &#160; &#160;}73 &#160; &#160;else74 &#160; &#160;{75 &#160; &#160; &#160;/* 左、右声道设为相等 */76 &#160; &#160; &#160;left = atoi(argv[2]);77 &#160; &#160; &#160;right = atoi(argv[2]);78 &#160; &#160;}79 80 &#160; &#160;/* 对非立体声设备给出警告信息 */81 &#160; &#160;if ((left != right) && !((1 && i) &stereodevs))82 &#160; &#160;{83 &#160; &#160; &#160;fprintf(stderr, &warning: %s is not a stereo device\n&, dev);84 &#160; &#160;}85 86 &#160; &#160;/* 将两个声道的值合到同一变量中 */87 &#160; &#160;level = (right && 8) +88 89 &#160; &#160;/* 设置增益 */90 &#160; &#160;status = ioctl(fd, MIXER_WRITE(device), &level);91 &#160; &#160;if (status == - 1)92 &#160; &#160;{93 &#160; &#160; &#160;perror(&MIXER_WRITE ioctl failed&);94 &#160; &#160; &#160;exit(1);95 &#160; &#160;}96 &#160; &#160;/* 获得从驱动返回的左右声道的增益 */97 &#160; &#160;left = level &098 &#160; &#160;right = (level &0xff00) && 8;99 &#160; &#160;/* 显示实际设置的增益 */100 &#160; fprintf(stderr, &%s gain set to %d%% / %d%%\n&, dev, left, right);101 &#160; /* 关闭混音设备 */102 &#160; close(fd);103 &#160; return 0;104 }编译上述程序为可执行文件mixer,执行./mixer &device& &left-gain%& &right-gain%&或./mixer &device& &gain%&可设置增益,device可以是vol、pcm、speaker、line、mic、cd、igain、line1、 phin、video。17.4 Linux ALSA音频设备驱动17.4.1 ALSA的组成虽然OSS已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,而ALSA (Advanced Linux Sound Architecture)恰好弥补了这一空白,它符合GPL,是在Linux下进行音频编程时另一种可供选择的声卡驱动体系结构,其官方网站为除了像OSS那样提供了一组内核驱动程序模块之外,还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些。ALSA的主要特点有:o 支持多种声卡设备o 模块化的内核驱动程序o 支持SMP和多线程o 提供应用开发函数库(alsa-lib)以简化应用程序开发o 支持OSS API,兼容OSS应用程序ALSA 具有更加友好的编程接口,并且完全兼容于OSS,对应用程序员来讲无疑是一个更佳的选择。ALSA系统包括驱动包alsa-driver、开发包 alsa-libs、开发包插件alsa-libplugins、设置管理工具包alsa-utils、其他声音相关处理小程序包alsa-tools、特殊音频固件支持包alsa- firmware、OSS接口兼容模拟层工具alsa-oss共7个子项目,其中只有驱动包是必需的。alsa- driver指内核驱动程序,包括硬件相关的代码和一些公共代码,非常庞大,代码总量达数十万行;alsa-libs指用户空间的函数库,提供给应用程序使用,应用程序应包含头文件asoundlib.h,并使用共享库libasound.so;alsa-utils包含一些基于ALSA的用于控制声卡的应用程序,如alsaconf(侦测系统中声卡并写一个适合的ALSA配置文件)、alsactl(控制ALSA声卡驱动的高级设置)、 alsamixer(基于ncurses的混音器程序)、amidi(用于读写ALSA RawMIDI)、amixer(ALSA声卡混音器的命令行控制)、aplay(基于命令行的声音文件播放)、arecord(基于命令行的声音文件录制)等。目前ALSA内核提供给用户空间的接口有:o 信息接口(Information Interface,/proc/asound)o 控制接口(Control Interface,/dev/snd/controlCX)o 混音器接口(Mixer Interface,/dev/snd/mixerCXDX)o PCM接口(PCM Interface,/dev/snd/pcmCXDX)o Raw迷笛接口(Raw MIDI Interface,/dev/snd/midiCXDX)o 音序器接口(Sequencer Interface,/dev/snd/seq)o 定时器接口(Timer Interface,/dev/snd/timer)和OSS类似,上述接口也以文件的方式被提供,不同的是这些接口被提供给alsa-lib使用,而不是直接给应用程序使用的。应用程序最好使用alsa-lib,或者更高级的接口,比如jack提供的接口。图17.6给出了ALSA声卡驱动与用户空间体系结构的简图,从中可以看出ALSA内核驱动与用户空间库及OSS之间的关系。图17.6 ALSA体系结构17.4.1 card和组件管理对于每个声卡而言,必须创建1个“card”实例。card是声卡的“总部”,它管理这个声卡上的所有设备(组件),如PCM、mixers、MIDI、synthesizer等。因此,card和组件是ALSA声卡驱动中的主要组成元素。1、创建cardstruct snd_card *snd_card_new(int idx, const char *xid, &#160; &#160;struct module *module, int extra_size);idx是card索引号、xid是标识字符串、module一般为THIS_MODULE,extra_size是要分配的额外数据的大小,分配的extra_size大小的内存将作为card-&private_data。2、创建组件int snd_device_new(struct snd_card *card, snd_device_type_t type, &#160; &#160; void *device_data, struct snd_device_ops *ops);当 card被创建后,设备(组件)能够被创建并关联于该card。第1个参数是snd_card_new()创建的card指针,第2个参数type 指的是device-level即设备类型,形式为SNDRV_DEV_XXX,包括SNDRV_DEV_CODEC、 SNDRV_DEV_CONTROL、SNDRV_DEV_PCM、SNDRV_DEV_RAWMIDI等,用户自定义设备的device-level是 SNDRV_DEV_LOWLEVEL,ops参数是1个函数集(定义为snd_device_ops结构体)的指针,device_data是设备数据指针,注意函数snd_device_new()本身不会分配设备数据的内存,因此应事先分配。3、组件释放每个ALSA预定义的组件在构造时需调用snd_device_new(),而每个组件的析构方法则在函数集中被包含。对于PCM、AC97此类预定义组件,我们不需关心它们的析构,而对于自定义的组件,则需要填充snd_device_ops中的析构函数指针dev_free,这样,当snd_card_free()被调用时,组件将自动被释放。4、芯片特定的数据(Chip-Specific Data)芯片特定的数据一般以struct xxxchip结构体形式组织,这个结构体中包含芯片相关的I/O端口地址、资源指针、中断号等,其意义等同于字符设备驱动中的 file-&private_data。定义芯片特定的数据主要有2种方法,一种方法是将sizeof(struct xxxchip)传入snd_card_new()的extra_size参数,它将自动成员snd_card的private_data成员,如代码清单17.5;另一种方法是在snd_card_new()传入给extra_size参数0,再分配sizeof(struct xxxchip)的内存,将分配内存的地址传入snd_device_new()的device_data的参数,如代码清单17.6。代码清单17.5 创建芯片特定的数据方法11 struct xxxchip //芯片特定的数据结构体2 {3 &#160; &#160;...4 };5 card = snd_card_new(index, id, THIS_MODULE, sizeof(struct6 xxxchip)); //创建声卡并申请xxx_chi内存作为card-& private_data7 struct xxxchip *chip = card-&private_代码清单17.6 创建芯片特定的数据方法21 struct snd_card *2 struct xxxchip *3 //使用0作为第4个参数,并动态分配xxx_chip的内存:4 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);5 ...6 chip = kzalloc(sizeof(*chip), GFP_KERNEL);7 //在xxxchip结构体中,应该包括声卡指针:8 struct xxxchip9 {10 &#160; struct snd_card *11 &#160; ...12 };13 //并将其card成员赋值为snd_card_new()创建的card指针:14 chip-&card =15 static struct snd_device_ops ops =16 {17 &#160; .dev_free = snd_xxx_chip_dev_free, //组件析构18 };19 ...20 //创建自定义组件21 snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);22 //在析构函数中释放xxxchip内存23 static int snd_xxx_chip_dev_free(struct snd_device *device)24 {25 &#160; return snd_xxx_chip_free(device-&device_data); //释放26 }5、注册/释放声卡当snd_card被准备好以后,可使用snd_card_register()函数注册这个声卡:int snd_card_register(struct snd_card *card)对应的snd_card_free()完成相反的功能:int snd_card_free(struct snd_card *card);
请登录后再发表评论!

我要回帖

更多关于 usb分线器供电不足 的文章

 

随机推荐