AW9523 linux 按键驱动解析

硬件介绍

AW9523是国产芯片,中文手册也是看着方便很多,我从datasheet中摘录一些编写驱动过程中重要信息贴到下面,当然,最好还是看芯片手册,项目使用AW9523接入16个独立按键。

AW9523A 是一款 I2C 接口、 4 路呼吸灯及 16 路扩展 GPIO 控制器,它包含 16 路双向 GPIO 端口,其中 4 路可通过指令配置LED 驱动模式。

寄存器地址 W/R 默认值 功能 描述
00H R xxH Input_Port0 P0 口输入状态
01H R xxH Input_Port1 P1 口输入状态
02H W/R 参考表 2 Output_Port0 P0 口输出状态
03H W/R 参考表 2 Output_Port1 P1 口输出状态
04H W/R 00H Config_Port0 P0 口输入或输出配置
05H W/R 00H Config_Port1 P1 口输入或输出配置
06H W/R 00H Int_Port0 P0 口中断使能
07H W/R 00H Int_Port1 P1 口中断使能
11H W/R 00H CTL 全局控制寄存器
13H W/R 0FH LED Mode Switch P1_3~P1_0 工作模式切换
20H W 00H DIM0 P1_0 口 LED 电流控制
21H W 00H DIM1 P1_1 口 LED 电流控制
22H W 00H DIM2 P1_2 口 LED 电流控制
23H W 00H DIM3 P1_3 口 LED 电流控制
7FH W 00H Software Reset 软复位寄存器
08H~10H
12H
14H~1FH
24H~7EH
80H~FFH
- - - 保留寄存器,用户不操作

注册设备

AW9523使用i2c_driver模型,在board中对应I2C i2c_board_info中注册设备如下,这里应该注意AW9523的AD0/AD1管脚应该接地。从上图中,可以确定其I2C地址。

#if defined(CONFIG_AW9523_KPD){I2C_BOARD_INFO("aw9523", 0xB0),},
#endif

驱动

probe函数

aw9523上电复位,代码如下

         // power ongpio_request(rst, "aw9523_rst");gpio_direction_output(rst, 0);udelay(100);gpio_direction_output(rst, 1);mdelay(100);gpio_free(rst);

检测ID,代码如下

err = aw9523_read(data->client, 0x10, &val);
if (!err && val == 0x23)return 0;

初始化配置,代码如下

 // port 0 input modeaw9523_write(data->client, AW9523_CONFIG_PORT_0, 0xff);  // keys input// port 0 output lowaw9523_write(data->client, AW9523_OUTPUT_PORT_0, 0x00);// port 0 enable intaw9523_write(data->client, AW9523_INT_PORT_0, 0x00);  // enable irq// port 1 input modeaw9523_write(data->client, AW9523_CONFIG_PORT_1, 0xff); // keys input// port 1 output lowaw9523_write(data->client, AW9523_OUTPUT_PORT_1, 0x00);// port 1 enable intaw9523_write(data->client, AW9523_INT_PORT_1, 0x00);  // enable irq

注册输入设备

input = input_allocate_device();if (!input) {err = -ENOMEM;goto exit_input_dev_alloc_failed;}input_set_drvdata(input, data);for(i=0; i<8*2; i++) {input_set_capability(input, EV_KEY, data->key_matrix[i]);}err = input_register_device(input);if (err) {goto exit_input_register_device_failed;}

创建工作队列

 INIT_WORK(&data->work, aw9523_work_func);data->work_q = create_singlethread_workqueue(dev_name(&client->dev));if (!data->work_q) {err = -ESRCH;goto exit_create_singlethread_failed;}schedule_work(&data->work);

申请中断,aw9523中断管教是连接到我们CPU上的,所以有按键按下,会触发中断

 err = request_irq(client->irq, aw9523_irq_handler, IRQF_TRIGGER_FALLING, client->name, data);if (err < 0) {dev_err(&client->dev, "aw9523_i2c_probe: request irq failed\n");goto exit_irq_request_failed;}

中断服务函数

中断服务函数比较简单,只需要关闭AW9523中断,将工作加入到工作队列中,最终唤醒对应内核线程

 aw9523_irq_disable(data);if (!work_pending(&data->work))queue_work(data->work_q, &data->work);return IRQ_HANDLED;

工作函数

工作函数读取AW9523 P0 P1口的管教状态,进行比对新旧状态比对,找到变化的管教,通过input系统上报。

 // get port0 valueaw9523_read(data->client, AW9523_INPUT_PORT_0, &p0);p0 = ~p0;if(p0 != data->port0_state) {chg = p0^data->port0_state; // xortmp = p0;for(i=0; i<8; i++) {if(chg & 0x01) {input_report_key(data->input_dev, data->key_matrix[i], tmp & 0x01);input_sync(data->input_dev);}chg >>= 1;tmp >>= 1;}data->port0_state = p0;}

AW9523 linux 按键驱动解析相关推荐

  1. 有限状态机的嵌入式Linux按键驱动设计(转载)

    本文转载自边缘之火<有限状态机的嵌入式Linux按键驱动设计(转载)> 原文链接:  http://www.eccn.com/design_2010052509381340.htm 秦国栋 ...

  2. linux 按键驱动中断 rockchip_嵌入式linux快速入门(转载)

    从上图可以知道: ① 组成:嵌入式Linux系统 = bootloader + linux内核 + 根文件系统(里面含有APP). ② bootloader:它的目的是启动内核,去哪读内核?读到哪里? ...

  3. linux 按键驱动代码分析

    原文地址:http://blog.csdn.NET/woshidahuaidan2011/article/details/51695147 二.按键驱动 1.对按键驱动添加设备信息 linux-3.1 ...

  4. linux按键驱动中的结构体,linux 驱动之input子系统(gpio-keys)实现

    1.概述 Gpio-keys 是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一般按键驱动,都是基于gpio-keys进行开发的 ...

  5. linux 按键驱动中断 rockchip_7.自己写中断方式按键驱动程序(详解)

    request_irq()和free_irq()分析完毕后,接下来开始编写上升沿中断的按键驱动 如下图,需要设置4个按键的EINT0, EINT2, EINT11, EINT19的模式为双边沿,且设置 ...

  6. linux内核按键驱动,嵌入式Linux按键驱动框架

    前言 本文将通过轮询.中断.poll机制.异步通知和同步互斥阻塞等方式编写按键驱动程序.本节的驱动框架是在<嵌入式Linux驱动框架的搭建>的基础上进行改进的,所以本文只讲解修改的部分. ...

  7. linux 薄膜键盘驱动,有限状态机的嵌入式Linux按键驱动设计

    0  引言 一般的按键驱动程序通常非常简单.在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口.如果仍然是低电平则表示有按键按下,便转入执行按键处理程序:否则,当按键 ...

  8. linux键盘驱动程序分析,基于Linux按键驱动分析与编程

    硬件平台:Mini2440 Size of NAND:256M linux kernel:linux-2.6.32.2 一.首先编写按键驱动要用到的Mini2440的硬件是中断控制器和定时器 那么li ...

  9. linux按键驱动设计(V3S开发板)

    1.前言 本文描述了基于全志V3S开发板的按键驱动程序和测试应用程序的设计流程. 本次设计系统内核是基于linux3.4. 2.设计流程概述 本次设计的步骤是: 步骤一.编写一个driver_butt ...

最新文章

  1. 【转】on delete cascade
  2. ubuntu和windows实现互相之间远程控制
  3. win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...
  4. 寻找冬日里的流量美食,发现了李子柒走红的秘密
  5. v-modedl的修饰符
  6. YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.r
  7. 30336控制转移指令
  8. case when影响性能吗_字段为NULL会影响查询性能吗?
  9. springJDBC一对多关系,以及Java递归,jsp递归的实现
  10. java 执行shell 卡住_Aid learning/Termux之Jupyter的Java编程高级篇——包管理
  11. 好未来:今年12月31日停止内地义务教育阶段学科类培训
  12. ArcGIS制图(一)之流向图
  13. cad小插件文字刷_必备CAD插件大全,内含最全字体库
  14. 华为企业网络营销系统分析报告
  15. 038--想和权证恋个爱
  16. 搜狗输入法linux版 rpm,wps for linux 不能使用搜狗输入法
  17. java操作word替换文字和在固定位置插入表格
  18. kafka消费组查看和删除
  19. tp路由器 拨号失败 服务器无响应,tp路由器wdr8500拨号不成功怎么办
  20. 区块链学习:区块链分类

热门文章

  1. 几种梯度下降法比较最小值与鞍点(SGD、Momentum、NAG、Adagrad、Adadelta与Rmsprop)
  2. LeetCode 167.Two Sum II 解题报告
  3. java全栈系列之JavaSE-面向对象之多态038
  4. SEO小白学习与实践(二):SEO相关基础知识与自有网站诊断
  5. 用html写QQ音乐首页,使用HTML5仿制的QQ音乐PC版界面
  6. makefile和make
  7. C++探索之旅 | 第一部分第一课:什么是C++
  8. 英语不好可以学python_想学Python这个,英语基础不好,可以学会吗?
  9. 密码学_SM4国密算法
  10. 【思前享后】区块链的发展历史