I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之声卡驱动移植

发布者:纯真年代最新更新时间:2020-12-25 来源: eefocus关键字:I  TQE9  声卡驱动移植 手机看文章 扫描二维码
随时随地手机看文章

前面的文章简单的讲述了字符设备驱动程序的编写,用字符设备驱动的方式实现了按键驱动,但是,出了我们的自己编写的针对我们的这个驱动程序的应用程序之外,其他应用程序都无法接收我们这个驱动的键值输入,为了让所有应用程序都可以接收我们的按键驱动解析的键值,Linux内核定义了“输入子系统”的概念,也就是说,只要我们按照这个模型进行驱动开发,并为其提供必须的接口函数,那么,Linux内核就可以正常来获取我们的键盘值了。


输入子系统的原理分析强烈推荐观看韦东山老师的视频讲座,讲的非常清楚,我这里是按照输入子系统的方式实现的按键驱动,下面是源码,放在这里做个备份:


#include

#include

#include

#include

#include

#include

 

static struct input_dev *buttons_dev;

static struct timer_list timer;

struct button_desc* button_desc = NULL;

 

struct button_desc{

char* name;

unsigned int pin;

unsigned int irq;

unsigned int val;

};

 

static struct button_desc buttons_desc[8] = {

[0] = {

.name = "S1",

.pin = S5PV210_GPH0(0),

.irq = IRQ_EINT(0),

.val = KEY_L,

},

 

[1] = {

.name = "S2",

.pin = S5PV210_GPH0(1),

.irq = IRQ_EINT(1),

.val = KEY_S,

},

 

[2] = {

.name = "S3",

.pin = S5PV210_GPH0(2),

.irq = IRQ_EINT(2),

.val = KEY_C,

},

 

[3] = {

.name = "S4",

.pin = S5PV210_GPH0(3),

.irq = IRQ_EINT(3),

.val = KEY_ENTER,

},

 

[4] = {

.name = "S5",

.pin = S5PV210_GPH0(4),

.irq = IRQ_EINT(4),

.val = KEY_LEFTCTRL,

},

 

[5] = {

.name = "S6",

.pin = S5PV210_GPH0(5),

.irq = IRQ_EINT(5),

.val = KEY_MINUS,

},

 

[6] = {

.name = "S7",

.pin = S5PV210_GPH2(6),

.irq = IRQ_EINT(22),

.val = KEY_CAPSLOCK,

},

 

[7] = {

.name = "S8",

.pin = S5PV210_GPH2(7),

.irq = IRQ_EINT(23),

.val = KEY_SPACE,

},

};

 

static void timer_function(unsigned long data){

if(button_desc == NULL)

return;

 

if(gpio_get_value(button_desc->pin)){

input_event(buttons_dev, EV_KEY, button_desc->val, 0);

}

else{

input_event(buttons_dev, EV_KEY, button_desc->val, 1);

}

input_sync(buttons_dev);

}

 

static irqreturn_t irq_handler(int irq, void *devid){

button_desc = (struct button_desc*)devid;

mod_timer(&timer, jiffies + HZ/100);

return IRQ_RETVAL(IRQ_HANDLED);

}

 

static int buttons_init(void){

int i;

buttons_dev = input_allocate_device();

if(buttons_dev == NULL){

printk(KERN_ERR "Error: allocate input device failed!n");

return -ENOMEM;

}

 

__set_bit(EV_KEY, buttons_dev->evbit);

__set_bit(EV_REP, buttons_dev->evbit);

 

__set_bit(KEY_L,        buttons_dev->keybit);

__set_bit(KEY_S,        buttons_dev->keybit);

__set_bit(KEY_C,        buttons_dev->keybit);

__set_bit(KEY_SPACE,    buttons_dev->keybit);

__set_bit(KEY_MINUS,    buttons_dev->keybit);

__set_bit(KEY_ENTER,    buttons_dev->keybit);

__set_bit(KEY_LEFTCTRL, buttons_dev->keybit);

__set_bit(KEY_CAPSLOCK, buttons_dev->keybit);

 

printk("1n");

if(input_register_device(buttons_dev)){

goto error_1;

}

 

printk("2n");

init_timer(&timer);

timer.function = timer_function;

add_timer(&timer);

 

printk("3n");

for(i = 0; i != 8; ++i){

if(request_irq(buttons_desc[i].irq, irq_handler, 

IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, buttons_desc[i].name, &buttons_desc[i])){

goto error_2;

}

}

printk("4n");

return 0;

 

error_2:

for(--i; i >= 0; --i){

free_irq(buttons_desc[i].irq, &buttons_desc[i]);

}

input_unregister_device(buttons_dev);

 

error_1:

input_free_device(buttons_dev);

 

return -EBUSY;

}

 

static void buttons_exit(void){

int i;

for(i = 0; i != 8; ++i){

free_irq(buttons_desc[i].irq, &buttons_desc[i]);

}

 

input_unregister_device(buttons_dev);

input_free_device(buttons_dev);

}

 

module_init(buttons_init);

module_exit(buttons_exit);

MODULE_LICENSE("GPL");


很显然,基于输入子系统的按键驱动比起直接编写的字符驱动设备要简单的多,不过按键消抖还是要加的,上面的代码加上了按键消抖。


关键字:I  TQE9  声卡驱动移植 引用地址:I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之声卡驱动移植

上一篇:S5PV210 nand 4bit ecc笔记与AM335x的ECC
下一篇:I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之触摸屏驱动移植

推荐阅读最新更新时间:2024-11-09 20:36

MSP430F5529 DriverLib 库函数学习笔记(十一)I2C / IIC
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 硬知识 USCI的I2C模式 I2C概述 MSP430单片机的USCI_B模块能够支持I2C通信,能够为MSP430单片机与具有I2C接口的设备互连提供条件。软件上只需要完成I2C功能的配置,硬件能够完全实现I2C通信的功能。相比较利用GPIO软件模拟实现I2C操作,能够减少CPU的负荷。 MSP430单片机I2C模块特征及结构框图 (1)MSP430单片机I2C模块的主要特征  与Philips半导体I2C规范V2.1兼容;  7位
[单片机]
MSP430F5529 DriverLib 库函数学习笔记(十一)<font color='red'>I</font>2C / IIC
详析数字I/O和逻辑分析仪常用术语
  本文介绍了数字I/O和逻辑分析仪的常用术语和定义。   1.抖动   抖动是指与事件理想时序的偏差,并通常基于参考信号的过零点进行测量。 抖动通常来自于串扰、同步开关输出和其它定期发生的干扰信号。 由于抖动会随时间变化,抖动的测量和量化既可以是秒级范围内视觉估计,也可以是基于统计的测量,比如基于标准偏差随时间变化的统计测量。      图1.数字信号抖动示例   2.偏移   对于定时(动态)生成,通道间偏移定义为两个数据通道对应边沿之间的时间差。 例如,如果两个数据通道均设置为在特定采样时从低电平转换为高电平,两个通道上升沿之间的时间差就是两个通道之间的通道间偏移。   对于动态采集,通道间偏移定义为每个
[测试测量]
详析数字<font color='red'>I</font>/O和逻辑分析仪常用术语
关于STM32的I2C硬件DMA实现
简介:网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难。 那么就先从基础说起,只说关键点,不涉及代码。 首先说I2C这个协议:协议包括START、ACK、NACK、STOP。尽管协议中规定START必须,其他几个非必须,但实际上其他三个仍旧非常重要。 主发从收:主 START - 主发地址 - 从 ACK - (主发数据 - 从 ACK (循环)) - 主 STOP 或 主 START 启动下一次传输 这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线。 主收从发:主 START - 从发地址 - 主 A
[单片机]
STM32CubeMX GPIO模拟I2C读写M24C64
一、先了解一下硬件的连接,I2C_SDA和I2C_SCL分别接STM32的PB9、PB6 二、粗阅一下M24C64的数据手册,得知器件地址和存储器地址,器件地址是8bit,而存储器地址是16bit 三、下面是M24C64的写时序 四、下面是M24C64的读时序 五、下面是程序编写流程 六、看看时序参数 七、好啦!需要的知识点差不多都提到了开始搬砖 1、用STM32CubeMX配置生成工程,并打开工程。(具体怎么用这个软件这里不讲) 2、在我的工程里是这样配置的 《1》配置USART3,用打印读出来的数据与写入的是否一致 《2》配置PB6、PB9为开漏输出模式,配置如下: void MX_GPIO_Init(void)
[单片机]
STM32CubeMX GPIO模拟<font color='red'>I</font>2C读写M24C64
STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
AT24C系列 AT24C系列是常见的EEPROM存储芯片, 常用于保存参数及掉电记忆的数据 容量: 型号代表了其容量, 从AT24C01到AT24C1024, 存储容量为1K BIT ~ 1024K BIT, 注意单位是Bit, 如果转换为字节就是128字节 ~ 128K字节 电压: 整个系列有2.7V (2.7V至5.5V)和1.8V (1.8V至5.5V)两个版本, 都兼容3.3V和5V 封装: 8-lead PDIP, 8-lead JEDEC SOIC, 8-lead MAP, 5-lead SOT23, 8-lead TSSOP 和 8-ball dBGA2 与其他存储器件相比 容量小 皮实, 几近无限的擦
[单片机]
STC8H开发(十二): <font color='red'>I</font>2C<font color='red'>驱动</font>AT24C08,AT24C32系列EEPROM存储
英特尔公布新i9处理器,可是并不适用于iMac Pro
威锋网8月8日消息,日前英特尔Core系列处理器再增9款新的X系列产品。可是根据苹果公司此前的介绍,英特尔这几款新品中并没有适合iMac Pro使用的处理器产品。 昨天英特尔公开了X系列处理器产品中多款12核和18核处理器产品。英特尔表示这些芯片对于内容制作者来说是终极平台,在VR内容创造方面,性能有20%的提升。 英特尔本次发布的系列产品非常丰富,从四核i5-7640x到18核i9-7980XE,前者时钟频率为4.0HGz,可睿频加速至4.2GHz,后者为2.6GHz,可睿频加速至4.2GHz。 不过这些处理器均不支持ECC RAM,所有新的i9处理器使用的都是DDR4-2666 RAM而不是ECC。 苹果公司在
[半导体设计/制造]
六核游戏该选谁?R5 1600X/i7-8700K对比评测
一、 前言:六核之争 选AMD还是选Intel? 2017年,AMD推出了全新的锐龙处理器,凭借高性能低功耗的Zen架构与八核心十六线程的巨大优势打了英特尔一个措手不及。后者为了与AMD抗衡,慌忙推出了八代酷睿处理器。 与以往不同的是,英特尔此次升级破天荒地将主流级i7从四核心提升至六核心,就连入门级的i3也都全线升级为四核心,看来AMD这次对英特尔造成的压力可真不小。 毕竟,AMD锐龙不但中高端全面普及八核心,主流市场都是六核心,锐龙3系列也统统为四核心,已经彻底告别了双核心。 目前,锐龙与八代酷睿的竞争可谓十分激烈。其中,八核心处理器对于主流玩家来说还是显得有些富裕,而四核心已沦为入门级处理器,因此六核心处理器自然而然成了玩
[嵌入式]
GPRS无线通信模块MC35i及其外围电路介绍
  随着信息技术的迅速发展,无线远程监控技术得到了越来越广泛的应用,采用先进的GPRS技术的无线监控管理系统,集计算机、通信、机电、自动控制等多种先进技术于一体,成功实现了对无线分布式系统的实时监控管理和灵活部署。   解决了传统控制由于没有通讯功能,而无法实现集中监控的问题,以及没有或无法解决实时大数据量处理的问题。因此移动终端的设计也逐渐倍受关注。   本文提及的MC35i模块属于无线通讯核心模块,是结合语音、数据传输、简讯服务及传真等功能的高科技产品。此模块功能强大,利用此无线模块的通讯产品便能够很好地在客户端进行系统整合的规划。目前该无线模块的应用领域比较广泛,主要包括:   (1)移动应用,如个人数字助理、智能型手
[单片机]
GPRS无线通信模块MC35<font color='red'>i</font>及其外围电路介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved