当前位置: 首页 > news >正文

做企业网站要哪些人员气象网站建设管理的不足

做企业网站要哪些人员,气象网站建设管理的不足,电商网站的特点,网站添加友情链接在前面两篇文章中#xff0c;我们分别讲了嵌入式Linux系统声卡注册的过程和调用的过程#xff1a; https://blog.csdn.net/qq_37659294/article/details/104748747 https://blog.csdn.net/qq_37659294/article/details/104802868 讲了那么多#xff0c;我们最终的目的无非…在前面两篇文章中我们分别讲了嵌入式Linux系统声卡注册的过程和调用的过程 https://blog.csdn.net/qq_37659294/article/details/104748747 https://blog.csdn.net/qq_37659294/article/details/104802868 讲了那么多我们最终的目的无非就是想写一个声卡驱动然后给上层的APP使用而已在之前的文章中可以看出内核里面关于声卡这部分是非常复杂的但实际上我们写驱动的时候只需要实现和硬件相关的那几个结构体如cpu_dai等。然后借助内核的ASOC框架把我们的驱动注册进去而已。下面是我们编写的驱动 一、machine部分 ①我们构造一个snd_soc_card结构体myalsa_card它的dai_link指定了要使用那些cpu_dai、codec_dai...然后我们模仿内核自带的声卡驱动调用platform_set_drvdata把myalsa_card保存在platform_device中《ASOC注册过程》machine部分的第①点有介绍。 ②构造一个名为soc-audio的平台设备然后注册它因为内核中有同名的平台驱动所以调用了相应的probe函数即我们在《ASOC注册过程》machine部分的第①点有介绍到的soc_probe函数。这个函数就会根据我们构造的myalsa_card结构体里的信息完成我们声卡的所有注册任务。 至此我们的machine部分的驱动就编写完成了。 #include linux/clk.h #include linux/gpio.h #include linux/module.h#include sound/soc.h/* 参考sound\soc\samsung\s3c24xx_uda134x.c*//** 1. 分配注册一个名为soc-audio的平台设备* 2. 这个平台设备有一个私有数据 snd_soc_card* snd_soc_card里有一项snd_soc_dai_link* snd_soc_dai_link被用来决定ASOC各部分的驱动*/static struct snd_soc_ops s3c2440_uda1341_ops {//.hw_params s3c24xx_uda134x_hw_params, };static struct snd_soc_dai_link s3c2440_uda1341_dai_link {.name 100ask_UDA1341,.stream_name 100ask_UDA1341,.codec_name uda1341-codec,.codec_dai_name uda1341-iis,.cpu_dai_name s3c2440-iis,.ops s3c2440_uda1341_ops,.platform_name s3c2440-dma, };static struct snd_soc_card myalsa_card {.name S3C2440_UDA1341,.owner THIS_MODULE,.dai_link s3c2440_uda1341_dai_link,.num_links 1, };static void asoc_release(struct device * dev) { }static struct platform_device asoc_dev {.name soc-audio,.id -1,.dev { .release asoc_release, }, };static int s3c2440_uda1341_init(void) {platform_set_drvdata(asoc_dev, myalsa_card);platform_device_register(asoc_dev); return 0; }static void s3c2440_uda1341_exit(void) {platform_device_unregister(asoc_dev); }module_init(s3c2440_uda1341_init); module_exit(s3c2440_uda1341_exit);MODULE_LICENSE(GPL); 二、platform部分 1.cpu_dai ①构造一个snd_soc_dai_driver结构体变量s3c2440_i2s_dais3c2440_i2s_dai里面的函数是我们需要自己实现的关于硬件的操作函数。 static int s3c2440_i2s_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params,struct snd_soc_dai *dai) {/* 根据params设置IIS控制器 *//* 配置GPIO用于IIS */...return 0; }static int s3c2440_i2s_trigger(struct snd_pcm_substream *substream, int cmd,struct snd_soc_dai *dai) { /* 硬件相关的操作 */ }static const struct snd_soc_dai_ops s3c2440_i2s_dai_ops {.hw_params s3c2440_i2s_hw_params,.trigger s3c2440_i2s_trigger, };#define S3C24XX_I2S_RATES \(SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)static struct snd_soc_dai_driver s3c2440_i2s_dai {.playback {.channels_min 2,.channels_max 2,.rates S3C24XX_I2S_RATES,.formats SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},.capture {.channels_min 2,.channels_max 2,.rates S3C24XX_I2S_RATES,.formats SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},.ops s3c2440_i2s_dai_ops, }; ②分别构造一个平台设备和平台驱动它们的名字必须相同且必须和machine部分的dai_lnk指定的名字相同然后就调用它们的probe函数 static struct platform_device s3c2440_iis_dev {.name s3c2440-iis,.id -1,.dev { .release s3c2440_iis_release, }, }; struct platform_driver s3c2440_iis_drv {.probe s3c2440_iis_probe,.remove s3c2440_iis_remove,.driver {.name s3c2440-iis,} }; ③在这个probe函数里调用snd_soc_register_dai(pdev-dev, s3c2440_i2s_dai);将第①步构造的结构体变量放入链表dai_list并把它命名为第②步提到的平台设备的名字。machine部分就是根据dai_link指定的名字在dai_list中把s3c2440_i2s_dai找出来。 static int s3c2440_iis_probe(struct platform_device *pdev) {return snd_soc_register_dai(pdev-dev, s3c2440_i2s_dai); } static int s3c2440_iis_remove(struct platform_device *pdev) {snd_soc_unregister_dai(pdev-dev);return 0; } 至此cpu_dai部分的驱动框架编写也已经完成具体的硬件操作函数需要根据不同的硬件来编写。dma、codec_dai和这个类似下面将不再赘述直接贴出代码示意 2.dma /* 参考 sound\soc\samsung\dma.c*/static struct snd_pcm_ops s3c2440_dma_ops {/* 需要我们自己编写的关于硬件的函数 */.open s3c2440_dma_open,.close s3c2440_dma_close,.ioctl snd_pcm_lib_ioctl,.hw_params s3c2440_dma_hw_params,.prepare s3c2440_dma_prepare,.trigger s3c2440_dma_trigger,.pointer s3c2440_dma_pointer, };static struct snd_soc_platform_driver s3c2440_dma_platform {/* 需要我们自己编写的关于硬件的函数 */.ops s3c2440_dma_ops,.pcm_new dma_new,.pcm_free dma_free_dma_buffers, };static int s3c2440_dma_probe(struct platform_device *pdev) {return snd_soc_register_platform(pdev-dev, s3c2440_dma_platform); } static int s3c2440_dma_remove(struct platform_device *pdev) {return snd_soc_unregister_platform(pdev-dev); }static void s3c2440_dma_release(struct device * dev) { }static struct platform_device s3c2440_dma_dev {.name s3c2440-dma,.id -1,.dev { .release s3c2440_dma_release, }, }; struct platform_driver s3c2440_dma_drv {.probe s3c2440_dma_probe,.remove s3c2440_dma_remove,.driver {.name s3c2440-dma, //必须和dai_link里面的platform_name相同} };static int s3c2440_dma_init(void) {platform_device_register(s3c2440_dma_dev);platform_driver_register(s3c2440_dma_drv);return 0; }static void s3c2440_dma_exit(void) {platform_device_unregister(s3c2440_dma_dev);platform_driver_unregister(s3c2440_dma_drv); }module_init(s3c2440_dma_init); module_exit(s3c2440_dma_exit); 三、codec部分 /* 参考 sound\soc\codecs\uda134x.c*//* 1. 构造一个snd_soc_dai_driver* 2. 构造一个snd_soc_codec_driver* 3. 注册它们*/static struct snd_soc_codec_driver soc_codec_dev_uda1341 {/* 硬件相关的函数 */.probe uda1341_soc_probe,.reg_cache_size sizeof(uda1341_reg),.reg_word_size sizeof(u8),.reg_cache_default uda1341_reg,.reg_cache_step 1,.read uda1341_read_reg_cache,.write uda1341_write_reg, /* 写寄存器 */ };static const struct snd_soc_dai_ops uda1341_dai_ops {/* 硬件相关的操作 */.hw_params uda1341_hw_params, };static struct snd_soc_dai_driver uda1341_dai {.name uda1341-iis, //必须和dai_link里面的codec_dai_name相同/* playback capabilities */.playback {.stream_name Playback,.channels_min 1,.channels_max 2,.rates UDA134X_RATES,.formats UDA134X_FORMATS,},/* capture capabilities */.capture {.stream_name Capture,.channels_min 1,.channels_max 2,.rates UDA134X_RATES,.formats UDA134X_FORMATS,},/* pcm operations */.ops uda1341_dai_ops, };/* 通过注册平台设备、平台驱动来实现对snd_soc_register_codec的调用**/static void uda1341_dev_release(struct device * dev) { }static int uda1341_probe(struct platform_device *pdev) {return snd_soc_register_codec(pdev-dev,soc_codec_dev_uda1341, uda1341_dai, 1); }static int uda1341_remove(struct platform_device *pdev) {return snd_soc_unregister_codec(pdev-dev); }static struct platform_device uda1341_dev {.name uda1341-codec, //必须和dai_link里面的codec_name相同.id -1,.dev { .release uda1341_dev_release, }, }; struct platform_driver uda1341_drv {.probe uda1341_probe,.remove uda1341_remove,.driver {.name uda1341-codec,} };static int uda1341_init(void) {platform_device_register(uda1341_dev);platform_driver_register(uda1341_drv);return 0; }static void uda1341_exit(void) {platform_device_unregister(uda1341_dev);platform_driver_unregister(uda1341_drv); }module_init(uda1341_init); module_exit(uda1341_exit);
http://www.yutouwan.com/news/130358/

相关文章:

  • 基于wordpress学校网站建筑方案设计收费标准
  • 辽宁鲲鹏建设集团网站手机wap支付
  • 文学网站开发设计报告蓝天下品牌运营业务展示
  • 忻州网络公司网站建设dt模板网
  • 外包网站建设哪家好企业做网站的必要性
  • 网站推广服务费会计分录怎么做做网站哪种编程语言最好
  • 杭州建网站哪家口碑好wordpress卡片阴影
  • 手机移动端网站建设邢台网站建设哪家专业
  • 网站建设后的团队总结wordpress 申请
  • 网站用户体验设计传奇类游戏网站
  • 西宁整站优化电商网站建设收费
  • asp网站开发教程入门上海网站制作公司
  • 实木餐桌椅移动网站建设山西省诚信建设网站
  • 蚂蚁中国网站建设建筑工程包括哪些项目
  • 科技网站建设分析网站建设如何交税
  • 网站首页 关键词兰州建设局网站公告
  • 做公司的网站的需求有哪些内容前端开发常用网站
  • 广州市建设工程招标管理办公室网站高端建筑材料有哪些
  • 网站备案平台的服务简介做的好的电商网站项目
  • 网站建设dw实训总结陕西网站建设设计
  • 无代码快速搭建网站网页制作代码html制作一个网页
  • 网站整体设计流程国际人才网招聘网
  • tp5.1做的网站云南个旧建设局网站
  • 团购网站自个做国内国际新闻最新消息10条
  • 汉阴网站建设电商到底是什么
  • 北京网站建设项目腾讯云服务器12元一年
  • 营销策略从哪几个方面分析seo内容优化方法
  • 一般去哪个网站做写手wordpress图片尺寸
  • 怎样网站制作设计网站备案信息核验单怎么
  • 公司网站建设为什么不直接买模版网站信息管理平台