iTop-4412的Linux驱动之查询方式获取按键值的完整整理笔记及分析

这部分是比较简单的,了解下边几个函数:
一、

//GPIO申请函数,include/linux/gpio.h中
static inline int gpio_request(unsigned gpio, const char *label)
//GPIO状态查询函数原型在include/linux/gpio.h中
static inline int gpio_get_value(unsigned gpio)
//三星平台配置GPIO函数,linux/arch/arm/plat-s3c/gpio-config.c
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)

主要是通过注册杂项设备然后通过file_operations结构体中的read成员来实现的;
二、代码部分,比较简单就是在大体的框架中把上边的几个函数加进去就可以了,编译后运行之前一定要烧写配置了平台文件(这里就是通过平台文件来注册设备)的内核:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
//#include <mach/gpio-bank.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
//#include "gps.h"
#include <linux/delay.h>
//copy_to_user的头文件
#include <asm/uaccess.h>

/*声明是开源的,没有内核版本限制*/
MODULE_LICENSE("Dual BSD/GPL");
/*声明作者*/
MODULE_AUTHOR("iTOPEET_dz");

#define DPRINTK(x...) printk("POLLKEY_CTL DEBUG:" x)//调试用
#define DRIVER_NAME "pollkey"//驱动NAME

static int key_gpios[] = {
	EXYNOS4_GPX1(1),
	EXYNOS4_GPX1(2),
};

int pollkey_open(struct inode *inode,struct file *filp)
{
	DPRINTK("Device Opened Success!\n");
	return nonseekable_open(inode,filp);
}

int pollkey_release(struct inode *inode,struct file *filp)
{
	DPRINTK("Device Closed Success!\n");
	return 0;
}

/*状态读取*/
static ssize_t pollkey_read(struct file *filp, char __user *buff, size_t size, loff_t *ppos)
{
	unsigned char key_value[2];
	if(size != sizeof(key_value)){
		return -1;
	}
	key_value[0] = gpio_get_value(key_gpios[0]);
	key_value[1] = gpio_get_value(key_gpios[1]);
	copy_to_user(buff,key_value,sizeof(key_value));
	return 0;
}

static struct file_operations pollkey_ops = {
	.owner 	= THIS_MODULE,
	.open 	= pollkey_open,
	.release= pollkey_release,
	.read 	= pollkey_read,
};

static struct miscdevice pollkey_dev = {
	.minor	= MISC_DYNAMIC_MINOR,
	.fops	= &pollkey_ops,
	.name	= "pollkey",
};

/*初始化函数*/
static int pollkey_probe(struct platform_device *pdev)
{
	int ret,i;
	char *banner = "pollkey Initialize\n";
		printk(banner);
	
	for(i=0;i<2;i++){
		ret = gpio_request(key_gpios[i],"KEY_GPIO");//GPIO申请函数
		s3c_gpio_cfgpin(key_gpios[i],S3C_GPIO_INPUT); //输入INPUT
		s3c_gpio_setpull(key_gpios[i],S3C_GPIO_PULL_NONE);//浮空
	}
	ret = misc_register(&pollkey_dev);//注册杂项设备
	return 0;
}

static int pollkey_remove (struct platform_device *pdev)
{
	misc_deregister(&pollkey_dev);//移除杂项设备	
	return 0;
}

static int pollkey_suspend (struct platform_device *pdev, pm_message_t state)
{
	DPRINTK("pollkey suspend:power off!\n");
	return 0;
}

static int pollkey_resume (struct platform_device *pdev)
{
	DPRINTK("leds resume:power on!\n");
	return 0;
}

static struct platform_driver pollkey_driver = {
	.probe = pollkey_probe,
	.remove = pollkey_remove,
	.suspend = pollkey_suspend,
	.resume = pollkey_resume,
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
	},
};

static void __exit pollkey_exit(void)
{
	platform_driver_unregister(&pollkey_driver);//卸载驱动
}

static int __init pollkey_init(void)
{
	return platform_driver_register(&pollkey_driver);//注册驱动
}

/*初始化函数*/
module_init(pollkey_init);
/*卸载函数*/
module_exit(pollkey_exit);

下一篇文章就是,中断的注册以及外部中断的应用(按键外部中断),敬请关注!!

又到了这个环节,请欣赏我的鸡汤时刻!一GO我嘞GOGO!!!!
送给阅读过这篇文章的人:把语言化为行动,比把行动化为语言困难得多。
下篇文章见。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 2012 年,四核 ARM 处理器还是个新鲜事物,但短短一年时间之后,嵌入式多核系统 已经深入人心,并开始大面积普及应用,以极快的速度向工控、仪表等行业延伸,这些都是我 们始料不及的。 面对这样的形势,我们是固守还是迎接新的挑战?答案是肯定的,世界的潮流永远是浩 浩荡荡,不会停止前进的脚步。 如果我们固守,老旧的芯片价格将越来越贵,例如多年前大量使用的 SDRAM 价格已经 很高昂,几年前的 DDR2 也开始不便宜,现在的 DDR3 反倒性价比更高,其他芯片包括存储 介质也是这样。 如果我们停滞不前,一些新系统、新架构所带来的生产力将不能在新产品中体现,竞争 能力以及产品优势随之会受到影响。 同时,以前掌握的知识和能力将逐渐陈旧,越来越不能适应时代不断发展、需求不断进 步给我们提出的新要求。 发展是硬道理,尤其在信息技术这个领域,只有不断学习,积极改变才能把握先机,赢 得更多的机遇和挑战。 从架构上来讲,多核系统比单核要复杂很多,性能也成倍增长,但掌握它真的很难吗? 实际上,从嵌入式系统开发的角度来看,所谓的‘四核’其实并没有多少改变,留给我 们开发人员的工作跟以前也没有多少差别,因为 Linux 本身一直是支持多核的。 实际开发的时候,我们会发现,多核系统的驱动和应用程序的编程方式、编程理念、编 译工具、以及开发方法和原来单核系统并无差别。 作为一款开发板的产品手册,我们将尽可能详尽的为大家讲解 Exynos 4412 这款处理器 的系统应用特点,对于开发过程中可能碰到的难点和问题给予较全面的说明。 欢迎广大用户提出宝贵意见,便于我们更好的改进和提高!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值