《手把手教你做平板电脑17音频驱动实验教程.docx》由会员分享,可在线阅读,更多相关《手把手教你做平板电脑17音频驱动实验教程.docx(7页珍藏版)》请在第一文库网上搜索。
1、音频驱动实验疯壳嵌入式平板开发详情地址:https:fen.ke.dub/GeekMart/views/off1ine/android购买链接:https:fe-ke.c1ub/GeekMart/sufHnaDyD1ojsp视频地址:https:fen-ke.c1ub/GeekMCrtsuf5W0Cuz3pjsp官方QQ群:457586268音频实验教程第一节音频子系统简单介绍RK3128A1C3244如上图是音频模块CodeC和CPU连接框图,主要由三部分组成:I2C总线-CPU通过它实现对CodeC寄存器数据的读写。I2S总线-实现音频数据在CPU和CodeC间的通信。HP_DEC-实现检
2、测是否有HeadSet设备插入。第二节Iinuxworkqueue工作原理音频子系统的源代码中用到了一个概念:Workqueueo对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。1inUX中的WorkqUeUe机制就是为了简化内核线程的创建,只是通过调用WOrkqUeUe的接口就能创建内核线程;并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化;WorkqUeUe是内核中实现简单而有效的机制,它显然简化了内核Daemon的仓IJ建,方便了用户的编程。工作队列(WorkqUeUe)是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就
3、是说,这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。举个栗子:Ihndudemddeffindudestaticstructwofktructwork;staticSVuctworkqueue-scrctqueueNU11;staticvoidWOrfcjandIerdtructwork.struct*data)PfintkCworkhand1effunct1on.*);staticInUnIttert-init(voidqueuecreate.sig1ethre(J-workqueuehekwor1d*);If(Iqueue)gotoerr;Printk(
4、testin,INT.WORKAwork,work-handter);SChedU1e_work|&wodc);QUetIJWorIC(qc,&work);returnO;retm1;staticVOidaIttest.exit(vo1d)/destry.workqucuc(qucc;MODU1E-1ICNSE(GPt;modu1eJit(testjmt;modu1e.ewt(test-exit);第三节电路原理图介绍下图来源于文档3128_sdk_a02_20170325.pdf中第18页。图一、绿色框中是codec芯片自己检测是否有HeadSet设备插入的电路原理图,它是通过HPJdOOK
5、(HP_HOOK和HP_DEC是连在一条线上)与CPU的ADCNC)连接,这个有点类似于AD按键检测的功能;音频Codec模块是数据与控制分开的,所以有12c来控制Codec的寄存器的读写,数据通过2s总线进行传输。OECAVDD18CooECU7200A1C3224oeo08WaZOidSOoAMdSs00tfaooC8C2S_BC1COOeCI2S1RC参8DEC12S044CODeC3_oon&COOtCK2SBC1X30COOEjMC1K-MIC8AJS1IM1P*C1DATIN1JDMC2.DATJO1IN2PIN2N/JO2MC1K8C1K11RUKIDACDAT1ADCOAT1B
6、1CK21RC1K2DACOAT2ADCDAT2ONOdOZ0Q83CPVPPCPvteMONOPMOWON1OUTR1OUT1I1-.j.S帜-NDMICeSC1G1PonRQ1Do1EN第四节音频驱动代码结构$(dir)rk3128-sourcekerne1driversadcrk_headset_det.cHeadSet设备检测代码$(dir)rk3128-sourcekerne1soundsoccodecsrk312x_codec.c- -音频CodeC代码X:rk3128-studyrk3128-sourcekerne1soundsoccodecsrt3261.c- i2c控制代码S
7、(dir)rk3128-sourcekerne1soundsocrockchip- 12s数据传输代码第五节dts文件讲解&codec/spk_ct1_io=;/*SPK_CT1=GPIOO_D6*/spk-mute-de1ay=;hp-mute-de1ay=;rk312x_for_mid=;is_rk3128=;/*is_rk3128=*/spk_vo1ume=;hp_vo1ume=;capturevo1ume=;gpio_debug=;codec_hp_det=;status=disab1ed;;HeadSet配置文件rockchiheadsetdetcompatib1e=rockchip
8、headsetc1et*;Io-Channe1s=;rockchip,adc.va1ue.unp1ug=;rockchip,adc-va1ue-no-mic=;/nomicheadset.rockchip,adc.va1ue.mic.nokia;/nokiamichp.amp.en=;;2c配置文件rt3261:rt3261g1ccompatib1e=,rt3261,*;reg=0x1o;spk-num;modem-input-mode=;1out-to-modem.mode;spk-amp1ify=;SPkvo1,6fordown1inkIsBAD.p1aybackif1-data_cont
9、ro1=;p1ayback-if2-datavcontro1=;;2s配置文件rockc1p-rt3224compatib1e=,rockchiprt3261;/DA1-Digita1AudioInterface其实就是I2SPCMAC97dais(daiaudio-codec=;i2s-contro11er=;formati2sw;/continuous-c1ock;/bitc1ock-inversion;/frame-inversion;/brtc1ock-master;/frame-master;);dai1audio-codec=;i2s-contro11er=;format=dsp-
10、a;/continuous-dock;bitc1ock-inversion;/frame-inversion;/bitc1ock-master;/frame-master;);););第六节实验代码1.HeadSet检测原理类似于一个ad按键的功能。注意:这里如果要测试这个功能必须在codec中设置一个值:codec_hp_det=;=codec_hp_det=;增加两条测试信息到如下代码中。if(pdata-headset-p1ugin11pdata*isMic)if(pdataisMicHPrintk.withmicn);headset-status=B11HEADSET;/withmc.eke(printk(uwithoutmicn);headset-status=BIT_HEADSET_NO_MIC;)耳机检测状态的调试:catsysc1assswitchh2wstate0:无耳机插入1:带MiC耳机插入(四段耳机)2:不带Mic耳机插入(三段耳机)2.测试命令-amix用amix命令来调节音量amix110amix11120