首页 > 系统相关 >按键 芯片pcf50633 linux 驱动程序

按键 芯片pcf50633 linux 驱动程序

时间:2024-12-07 21:57:06浏览次数:7  
标签:PCF50633 驱动程序 irq dev pcf50633 linux input struct

/* NXP PCF50633 Input Driver
*

  • © 2006-2008 by Openmoko, Inc.
  • All rights reserved.
  • Broken down from monstrous PCF50633 driver mainly by
  • Harald Welte, Andy Green and Werner Almesberger
  • This program is free software; you can redistribute it and/or modify it
  • under the terms of the GNU General Public License as published by the
  • Free Software Foundation; either version 2 of the License, or (at your
  • option) any later version.

*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/slab.h>

#include <linux/mfd/pcf50633/core.h>

#define PCF50633_OOCSTAT_ONKEY 0x01
#define PCF50633_REG_OOCSTAT 0x12
#define PCF50633_REG_OOCMODE 0x10

struct pcf50633_input {
struct pcf50633 *pcf;
struct input_dev *input_dev;
};

static void
pcf50633_input_irq(int irq, void *data)
{
struct pcf50633_input *input;
int onkey_released;

input = data;

/* We report only one event depending on the key press status */
onkey_released = pcf50633_reg_read(input->pcf, PCF50633_REG_OOCSTAT)
					& PCF50633_OOCSTAT_ONKEY;

if (irq == PCF50633_IRQ_ONKEYF && !onkey_released)
	input_report_key(input->input_dev, KEY_POWER, 1);
else if (irq == PCF50633_IRQ_ONKEYR && onkey_released)
	input_report_key(input->input_dev, KEY_POWER, 0);

input_sync(input->input_dev);

}

static int pcf50633_input_probe(struct platform_device *pdev)
{
struct pcf50633_input *input;
struct input_dev *input_dev;
int ret;

input = kzalloc(sizeof(*input), GFP_KERNEL);
if (!input)
	return -ENOMEM;

input_dev = input_allocate_device();
if (!input_dev) {
	kfree(input);
	return -ENOMEM;
}

platform_set_drvdata(pdev, input);
input->pcf = dev_to_pcf50633(pdev->dev.parent);
input->input_dev = input_dev;

input_dev->name = "PCF50633 PMU events";
input_dev->id.bustype = BUS_I2C;
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
set_bit(KEY_POWER, input_dev->keybit);

ret = input_register_device(input_dev);
if (ret) {
	input_free_device(input_dev);
	kfree(input);
	return ret;
}
pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYR,
			pcf50633_input_irq, input);
pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYF,
			pcf50633_input_irq, input);

return 0;

}

static int pcf50633_input_remove(struct platform_device *pdev)
{
struct pcf50633_input *input = platform_get_drvdata(pdev);

pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYR);
pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYF);

input_unregister_device(input->input_dev);
kfree(input);

return 0;

}

static struct platform_driver pcf50633_input_driver = {
.driver = {
.name = “pcf50633-input”,
},
.probe = pcf50633_input_probe,
.remove = pcf50633_input_remove,
};
module_platform_driver(pcf50633_input_driver);

MODULE_AUTHOR(“xxx”);
MODULE_DESCRIPTION(“PCF50633 input driver”);
MODULE_LICENSE(“GPL”);
MODULE_ALIAS(“platform:pcf50633-input”);

标签:PCF50633,驱动程序,irq,dev,pcf50633,linux,input,struct
From: https://blog.csdn.net/baidu_37552881/article/details/144246843

相关文章

  • Linux硬盘挂载与磁盘分区基础(二)(物理卷、卷组、逻辑卷)
      上篇介绍了分区,都是建立在硬盘的基础之上,但是问题出现了,硬盘的空间是固定的,一般的,无论我们的电脑还是服务器,都可以容纳多块硬盘,甚至还可以使用USB等接口接入额外的存储,这样,如果都是用单个硬盘的分区来管理,比如扩容,非常不方便,有没有办法把多个硬盘视为一个整理,当做一块硬盘来管......
  • Linux 常用命令
    目录一、cp复制文件复制文件复制目录二、mv移动文件一、cp复制文件cp[option]srcdest-r:递归复制,用于复制目录时,将其子目录全部复制-v:显示详细的复制过程复制文件1、复制单个文件到指定路径下,将srcFile01.txt复制到dir目录下cpsrcFile01.txt/dir/2、复制单个文......
  • 【51编程经验笔记】第五节:蜂鸣器的驱动程序
    第五节:蜂鸣器的驱动程序。开场白:上一节讲了利用累计定时中断次数实现LED灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框架:用switch语句实现状态机,外加定时中断。这个框架看似简单,实际上就是那么简单。我做的所有开发项目都是基于这个简单框架,但是非常好用。上一节只有一个......
  • Source Insight 导入linux内核源码
    参考https://www.cnblogs.com/joezh/p/13894145.html用法将脚本中的ABS_PATH="D:/si_code/linux-6.12/"路径换成在windows上可以访问的路径将源码完整编译一遍在源码目录下执行下面的脚本即可,最后会在当前目录下生成文件si_filelist_ARCH.txt,其中包含的是需要导入的文件列......
  • Linux磁盘存储概念
    本文为UbuntuLinux操作系统-第六弹今天开始新的知识点,讲磁盘存储问题上期回顾:Linux文件、目录权限问题今天由帝皇侠陪伴大家学习!!!文章目录磁盘数据组织低级格式化磁盘分区高级格式化磁盘设备命名磁盘分区分区样式:MBR与GPT磁盘分区命名Linux文件系统概述ext4文......
  • [Linux]共享内存
    共享内存共享内存允许两个或多个进程访问同一块物理内存空间,就好像它们对这块内存拥有共同的读写权限一样。这块共享的内存区域由操作系统内核负责管理和维护,进程通过特定的系统调用将其映射到自己的虚拟地址空间中,之后便可以像访问普通内存一样对其进行读写操作,从而实现进程间的......
  • 逻辑卷的创建和扩容linux
    创建逻辑卷 1、lsblk、blkid查看磁盘是否可以正常显示2、制作物理卷,pvcreate/dev/sdb如果需要磁盘分区,MBR(2T以下)方式,可以使用fdisk命令 n  #创建新分区p  #选择主分区(e扩展分区)   #选择分区号(如果需要)   #指定起始位置   #指定分区......
  • Linux -初识 与基础指令2
    博客主页:【夜泉_ly】本文专栏:【Linux】欢迎点赞......
  • 嵌入式linux系统中实现I2C通信的方法
    第一章 I2C编程  I2C(Inter-IntegratedCircuitBUS)是I2CBUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。1.1I2C协议1.1.1概述I2C是一种串行通信总线,使用多主从架构,最初设计目的为了让主板、嵌入式系统......
  • 深入了解Linux —— 学会使用vim编辑器
    前言学习了Linux中的基本指令也理解了权限这一概念,但是我们怎么在Linux下写代码呢?本篇就来深入学习Linux下的vim编辑器;学会在Linux下写代码。软件包管理器1.软件包?在Linux下安装软件,通常是下载程序的源码,进行编译获得可执行程序。这样太麻烦了,于是就有了将常用的软......