JZ2440笔记:声卡驱动

vi s3c-wm8976.c

在s3c2410-uda1341.c修改驱动,修改硬件部分的控制接口,I2S部分通用不用修改。

1、增加写寄存器操作函数wm8976_write_reg

static void wm8976_write_reg(unsigned char reg, unsigned int data)
{int i;unsigned long flags;unsigned short val = (reg << 9) | (data & 0x1ff);s3c2410_gpio_setpin(S3C2410_GPB2,1);s3c2410_gpio_setpin(S3C2410_GPB3,1);s3c2410_gpio_setpin(S3C2410_GPB4,1);local_irq_save(flags);for (i = 0; i < 16; i++){if (val & (1<<15)){s3c2410_gpio_setpin(S3C2410_GPB4,0);s3c2410_gpio_setpin(S3C2410_GPB3,1);udelay(1);s3c2410_gpio_setpin(S3C2410_GPB4,1);			}else{s3c2410_gpio_setpin(S3C2410_GPB4,0);s3c2410_gpio_setpin(S3C2410_GPB3,0);udelay(1);s3c2410_gpio_setpin(S3C2410_GPB4,1);			}val = val << 1;}s3c2410_gpio_setpin(S3C2410_GPB2,0);	udelay(1);s3c2410_gpio_setpin(S3C2410_GPB2,1);s3c2410_gpio_setpin(S3C2410_GPB3,1);s3c2410_gpio_setpin(S3C2410_GPB4,1);local_irq_restore(flags);	
}

2、修改控制器初始化函数init_wm8976

static void init_wm8976(void)
{uda1341_volume = 57;uda1341_boost = 0;wm8976_write_reg(0, 0);wm8976_write_reg(0x3, 0x6f);wm8976_write_reg(0x1, 0x1f);wm8976_write_reg(0x2, 0x185);wm8976_write_reg(0x6, 0x0);wm8976_write_reg(0x4, 0x10);		wm8976_write_reg(0x2B,0x10);  wm8976_write_reg(0x9, 0x50);wm8976_write_reg(0xD, 0x21);wm8976_write_reg(0x7, 0x01);
}

3、修改音量uda1341_volume相关设置smdk2410_mixer_ioctl

static int smdk2410_mixer_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
{int ret;long val = 0;switch (cmd) {case SOUND_MIXER_INFO:{mixer_info info;strncpy(info.id, "UDA1341", sizeof(info.id));strncpy(info.name,"Philips UDA1341", sizeof(info.name));info.modify_counter = audio_mix_modcnt;return copy_to_user((void *)arg, &info, sizeof(info));}case SOUND_OLD_MIXER_INFO:{_old_mixer_info info;strncpy(info.id, "UDA1341", sizeof(info.id));strncpy(info.name,"Philips UDA1341", sizeof(info.name));return copy_to_user((void *)arg, &info, sizeof(info));}case SOUND_MIXER_READ_STEREODEVS:return put_user(0, (long *) arg);case SOUND_MIXER_READ_CAPS:val = SOUND_CAP_EXCL_INPUT;return put_user(val, (long *) arg);case SOUND_MIXER_WRITE_VOLUME:ret = get_user(val, (long *) arg);if (ret)return ret;uda1341_volume = (((val & 0xff) + 1) * 63) / 100;wm8976_write_reg(52, (1<<8)|uda1341_volume);wm8976_write_reg(53, (1<<8)|uda1341_volume);//uda1341_l3_address(UDA1341_REG_DATA0);//uda1341_l3_data(uda1341_volume);break;case SOUND_MIXER_READ_VOLUME:val = (uda1341_volume * 100) / 63;return put_user(val, (long *) arg);case SOUND_MIXER_READ_IGAIN:val = ((31- mixer_igain) * 100) / 31;return put_user(val, (int *) arg);case SOUND_MIXER_WRITE_IGAIN:ret = get_user(val, (int *) arg);if (ret)return ret;mixer_igain = 31 - (val * 31 / 100);/* use mixer gain channel 1*///uda1341_l3_address(UDA1341_REG_DATA0);//uda1341_l3_data(EXTADDR(EXT0));//uda1341_l3_data(EXTDATA(EXT0_CH1_GAIN(mixer_igain)));break;default:DPRINTK("mixer ioctl %u unknown\n", cmd);return -ENOSYS;}audio_mix_modcnt++;return 0;
}

测试驱动:确认内核已经配置了I2S驱动,同时将s3c-wm8976.c编译到uImage里。

# ls -l /dev/dsp /dev/mixer
crw-rw----    1 0        0         14,   3 May 31 17:45 /dev/dsp
crw-rw----    1 0        0         14,   0 May 31 17:45 /dev/mixer
# cat Alarm01.wav > /dev/dsp
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
# cat Alarm01.wav > /dev/dsp
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
# cat /dev/dsp > good.bin
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66

# ls
Alarm01.wav      good.bin
# cat good.bin > /dev/dsp
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【三维重建NeRF(三)】Mip-NeRF论文解读

本文结合深蓝学院课程学习和本人的理解&#xff0c;欢迎交流指正 文章目录 Mip-NeRF流程简述混叠问题与MipMapMip-NeRF提出的解决办法圆锥台近似计算与集成位置编码(IPE) Mip-NeRF流程简述 Mip-NeRF的大体流程和NeRF基本是一样的&#xff0c;NeRF介绍 创新的部分就是针对NeRF…

生活随笔|我们要成为牛人,不要成为牛马。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近看群里聊天&#xff0c;有个在设计院做建筑电气设计的被裁员了&#xff0c;一顿抱怨&#xff1b; 也有人说今年项目多需要招人的&#xff0c;但招不到合适的&#xff1b; 或许这是常态&#xff0c;任何时候都是&a…

系统安全及应用11

一个新的服务器到手之后&#xff0c;部署服务器的初始化 1、配置IP地址 网关 dns解析&#xff08;static&#xff09;内网和外网 2、安装源外网&#xff08;在线即可&#xff09;&#xff0c;内网&#xff08;只能用源码包编译安装&#xff09; 3、磁盘分区&#xff0c;lvm …

[JAVA数组] 三个数的最大乘积

给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;6示例 2&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;24示例 3&#xff1a; 输…

mybatis—plus和mybatis的区别

一前置知识&#xff1a; CRUD操作&#xff08;create 添加数据read读取数据 update 修改数据delete删除数据&#xff09; 二&#xff0c;总体概览 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发工作、提高…

二人订单共享模式:新零售电商盈利新秘诀

电商江湖日新月异&#xff0c;竞争如火如荼&#xff0c;如何脱颖而出&#xff0c;赢得消费者&#xff1f;二人订单共享模式&#xff0c;这是一种全新的商业模式&#xff0c;旨在打造爆款产品&#xff0c;迅速吸引大量客源&#xff0c;并激发消费者重复购买欲望。 首先&#xf…

Centos 报错 One of the configured repositories failed

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用yum update更新命令就出现下面问题&#xff0c;系统是刚安装的&#xff0c;然后修改了一下IP变成手动。&#xff08;排查问题前&#xff0c;先回顾自己做了哪些操作&#xff0c;方便进一步排错&a…

accelerate 的一个tip:early stopping 处可能存在的bug

在分布式训练中进行提前停止时&#xff0c;如果每个进程都有特定的停止条件&#xff08;例如验证损失&#xff09;&#xff0c;这可能不会在所有进程中同步。 因此&#xff0c;可能在进程 0 中发生中断&#xff0c;而进程 1 则不会——>这将导致代码无限期挂起&#xff0c;直…

C++程序命令行参数学习

argc是参数个数&#xff1b; argv[0]是程序名&#xff0c;argv[1]是第一个参数&#xff1b; 如果输入osgptr1 x &#xff0c;osgptr1是程序名&#xff0c;argc是2&#xff1b; 不算程序名&#xff0c;实际的参数个数是argc-1&#xff1b; #include <iostream>using …

免费!手把手教你用扣子搭建个人知识库

很多人都在寻找一个高效的方式来构建个人知识库&#xff0c;好消息是&#xff0c;随着AI大模型的兴起&#xff0c;每个人都有机会拥有一个熟悉自身的专属AI助手。今天&#xff0c;我就来跟大家详细分享一下如何使用字节跳动推出的神器——扣子&#xff0c;零代码构建个人或企业…

推荐低成本低功耗的纯数字现场可重构IC

CPLD采用CMOS EPROM、EEPROM、快闪存储器和SRAM等编程技术&#xff0c;从而构成了高密度、高速度和低功耗的可编程逻辑器件。 RAMSUN提供的型号LS98003是通用可配置的数字逻辑芯片&#xff0c;有体积小、超低功耗和高可靠性等特点。客户可以根据自己的功能需求设计芯片&#x…

MyBatis:简化数据库操作的强大工具

摘要&#xff1a;本文将介绍MyBatis&#xff0c;一个流行的Java持久层框架&#xff0c;它通过简单的API和易用的特性&#xff0c;帮助开发者更高效地进行数据库操作。我们将探讨MyBatis的核心概念、配置和使用方法&#xff0c;并通过示例展示其在实际项目中的应用。 正文&…

Flutter 中的 TooltipTheme 小部件:全面指南

Flutter 中的 TooltipTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建美观、响应式的用户界面。在 Flutter 的 Material 组件库中&#xff0c;Tooltip 是一个轻量级的组件&#xff0c;用于在用…

O2O : Finetuning Offline World Models in the Real World

CoRL 2023 Oral paper code Intro 算法基于TD-MPC&#xff0c;利用离线数据训练世界模型&#xff0c;然后在线融合基于集成Q的不确定性估计实现Planning。得到的在线数据将联合离线数据共同训练目标策略。 Method TD-MPC TD-MPC由五部分构成: 状态特征提取 z h θ ( s ) …

Mongodb的数据库简介、docker部署、操作语句以及java应用

Mongodb的数据库简介、docker部署、操作语句以及java应用 本文主要介绍了mongodb的基础概念和特点&#xff0c;以及基于docker的mongodb部署方法&#xff0c;最后介绍了mongodb的常用数据库操作语句&#xff08;增删改查等&#xff09;以及java下的常用语句。 一、基础概念 …

PhpSpreadsheet表格导出

个人笔记记录 使用PhpSpreadsheet 导出excel。 多重表头生成excel 表 //读取数据库public function demo1(){// 连接spc数据库$config Config::get(databaseedc);$db Db::connect($config);$data $db->name("xxxx")->alias(a)->field(main_header, sub_…

《网络安全技术 生成式人工智能服务安全基本要求》征求意见稿

1. 训练数据安全要求 &#xff08;1&#xff09;数据来源安全&#xff1a; 采集来源管理&#xff1a; 采集数据前应进行安全评估&#xff0c;含违法不良信息超过5%的数据源不得使用。 采集后需核验&#xff0c;含违法不良信息超过5%的数据不得用于训练。 不同来源训练数据搭…

004 MySQL练习

选课系统中存在这样的三种表 学生表(Student): 学号(S#)、学生姓名(Sname)、学生年龄(Sage)、学生性别(Ssex)&#xff1b; 课程表(Course):课程编号(C#)、课程名称(Cname)、教师编号(T#)&#xff1b; 成绩表(SC)&#xff1a;学号(S#)、课程编号(C#)、成绩(score)&#xff1b; 教…

【实用技巧】Unity的Transform组件实用技巧

使用Unity的Transform组件时&#xff0c;有一些技巧可以帮助你更高效地进行游戏开发&#xff1a; 局部与全局变换&#xff1a; transform.localPosition 和 transform.localRotation 允许你在父对象的局部坐标系中设置位置和旋转&#xff0c;这在处理复杂的层次结构时非常有用。…

四川汇聚荣聚荣科技有限公司评价怎么样?

四川汇聚荣聚荣科技有限公司评价如何?在科技日新月异的今天&#xff0c;四川汇聚荣聚荣科技有限公司作为业界的一员&#xff0c;其表现自然引起了广泛关注。那么&#xff0c;这家公司究竟如何呢?接下来&#xff0c;我们将从四个不同方面对其进行深入剖析。 一、技术实力 四川…