ok6410按键驱动程序

author author     2023-05-03     371

关键词:

求OK6410开发板按键驱动程序和测试程序

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-m.h>

#define DEVICE_NAME "s3c6410_keys" //定义设备名字
static int major; //定义按键设备的主设备号变量

volatile unsigned long *gpncon;
volatile unsigned long *gpndat;

static struct class *keys_class; //使用mdev机制让内核自动创建对应的设备节点文件
static struct class_device *keys_class_devs;

//key驱动程序的open函数,用来初始化key设备 对应应用程序里面的open函数
static long s3c6410_keys_open(struct inode *inode, struct file *file)

//OK6410A的key1-6连接到gpn0-5
//gpn0-5 input mode
*gpncon &=~((0x3<<(0*2))|(0x3<<(1*2))|(0x3<<(2*2))|(0x3<<(3*2))|(0x3<<(4*2))|(0x3<<(5*2)));

return 0;


//key驱动程序的读函数
static long s3c6410_keys_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)

/*返回6个引脚的电平状态*/
unsigned char key_vals[6];
int regzhi,i;

if(size!=sizeof(key_vals))
return -EINVAL;

regzhi=*gpndat;
for (i=0;i<6;i++)
key_vals[i]=(regzhi & (1<<i)) ? 1 : 0;

copy_to_user(buf,key_vals,sizeof(key_vals)); //将内核空间的数据key_vals复制到用户空间buf指向的内存空间

return sizeof(key_vals);


//定义file_operations类型的结构体,当应用程序操作设备文件时使用的read . write .open等系统调用,
//最终会调用该结构体中的对应函数
static struct file_operations OK6410A_keys_fops=
.owner = THIS_MODULE,
.open = s3c6410_keys_open,
.read = s3c6410_keys_read,
;

//当执行insmod 命令安装key驱动程序时会调用该函数,该函数实现将该驱动注册进内核
static int __init ok6410a_key_init(void)


major = register_chrdev(0, DEVICE_NAME, &OK6410A_keys_fops); //由内核自动分配key的主设备号,将key的主设备号与设备操作结构体OK6410A_keys_fops关联起来
if (major < 0) //分配失败
printk(DEVICE_NAME " can't register major number\n");
return major;

keys_class = class_create(THIS_MODULE, "ok6410_keys"); //创建一个类,在根文件系统的/sys/class/目录下会创建对应的类(ok6410_keys)目录
if (IS_ERR(keys_class))
return PTR_ERR(keys_class);

keys_class_devs = device_create(keys_class, NULL, MKDEV(major, 0), NULL, DEVICE_NAME); //创建该类的一个设备
if (unlikely(IS_ERR(keys_class_devs))) //创建设备节点文件/dev/DEVICE_NAME (s3c6410_keys)
return PTR_ERR(keys_class_devs);

gpncon=(volatile unsigned long *)ioremap(0x7f008830,12);
gpndat=gpncon+1 ;

printk(DEVICE_NAME " initialized\n");
return 0;


//执行rmmod 命令时卸载key驱动是调用的函数
static void __exit ok6410a_key_exit(void)

/* 卸载驱动程序 */
unregister_chrdev(major, DEVICE_NAME);

device_unregister(keys_class_devs);

iounmap(gpncon);

class_destroy(keys_class); //删除创建的类


//以下两行指定驱动程序的初始化函数和卸载函数
module_init(ok6410a_key_init);
module_exit(ok6410a_key_exit);

MODULE_LICENSE("GPL"); //遵循的协议

测试程序:
/***********************************************************************************************************
key驱动程序的应用测试程序
命令格式: key_test on
key_test off
************************************************************************************************************/
//包含进内核中有的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//一个应用程序有一个main函数,为该应用程序的入口处
int main(int argc, char **argv) //argc为使用key_test 命令时传入的参数个数,argv为具体的参数

int fd,cnt=0;
unsigned char key_vals[6];

fd = open("/dev/s3c6410_keys", O_RDWR); //打开key设备对应的设备文件,前提是必须存在
if (fd < 0)

printf("can't open /dev/key\n");
return -1;

while
(1)
read(fd,key_vals,sizeof(key_vals));
if(!key_vals[0] || !key_vals[1] || !key_vals[2] || !key_vals[3] || !key_vals[4] || !key_vals[5])
printf("%04d key pressed: %d %d %d %d %d %d\n",cnt++,key_vals[0],key_vals[1],key_vals[2],key_vals[3],key_vals[4],key_vals[5]);


return 0;


ps:这是采用查询方式设计的按键驱动程序,望采纳!
参考技术A 您好,类似于这样的驱动程序建议您在官网更新到最新版本试一下,一般是比较有效果的。 参考技术B 您好,对于您这样的情况建议您下载最新版本的驱动软件,更新到最新版本的驱动。 参考技术C 我就是来露个脸的

ok6410裸机驱动学习c语言内嵌汇编

1.C语言内嵌汇编使用方法C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略优化后的代码 2.汇编程序框架.section.data<初始... 查看详情

ok6410[002]ubuntu1604系统下搭配ckermit和dnw基于ram的裸机程序调试环境

 ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境  系统: ubuntu16.04裸板:飞凌公司OK6410开发板目标:搭建基于ubuntu1604系统和基于RAM的裸机程序开发环境  1、安装配置ckermit在ubuntu1604下一般做裸板开... 查看详情

ok6410[000]搭建裸机开发环境

...4.3.2到一个目录中,然后,配置环境变量 2、编译示例程序编译arm-linux-gcc-g-cled.S链接arm-linux-ld-Tled.lds-oled.elfled.o格式转换arm-linux- 查看详情

修改飞凌ok6410的默认lcd显示设备(代码片段)

...此每次烧完系统后,都要重新用DNW来配置为高清显示驱动,比较麻烦,所以我打算修改一下eboot的程序,使其烧入系统后的默认 查看详情

ok6410[000]ubuntu1604_64bit下安装wps

虽说Ubuntu下有自动的office工具,不过使用上体验很差。而国内最好的office软件也就是金山的wps。----------------------------------------------------------------从官网下载wps-office_10.1.0.5672~a21_amd64.deb安装程序 使用命令安装sudodpkg-i wps-off 查看详情

ok6410的lcd裸机范例

/******************************************实验步骤1.配置引脚功能,将其GPI、GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出;2.设置LCD时序值,初始化时序值。(1)需要初始化时序:VSPW、VBPD、LINEVAL、VFPD、HSPW、HBPB、HOZVAL... 查看详情

ok6410内存初始化--未完待续

•DRAM:它的基本原件是小电容,电容可以在两个极板上保留电荷,但是需要定期的充电(刷新),否则数据会丢失。缺点:由于要定期刷新存储介质,存取速度较慢。•SRAM:它是一种具有静止存取功能的内存,不需要定期... 查看详情

ok6410上移植uboot出现nand:nonanddevicefound!!!打印信息如下:

U-Boot2010.03(8月262013-09:43:51)forSMDK6410CPU:S3C6400@533MHzFclk=533MHz,Hclk=133MHz,Pclk=66MHz(ASYNCMode)Board:SMDK6410By青天DRAM:256MBFlash:0kBNAND:NoNANDdevicefound!!!0MiB***Warning-badCRC,usingdefaultenvironmentIn:serialOut:serialErr:serialNet:CS8900-0Hitanykeytostopautoboot:0参考技术A... 查看详情

修改eboot使ok6410a(128m内存+256mnand)支持hdmi高清显示(代码片段)

       之前一直使用OK6410A(256M内存+2GNand)(WinCE6.0系统),买了块HDMI高清显示,跟飞凌技术要了资料,按照所给的资料说明,对Eboot做了修改后,就可以正常使用HDMI高清显示了。最近为... 查看详情

通过按键玩中断

中断源产生信号->中断控制器->cpu处理中断 2440:非向量方式,中断总服务程序入口---保护环境---判断中断源---调用对应该中断源的终端服务程序---恢复环境6410/210:向量方式,当中断产生,CPU直接跳转到用户设置好的中... 查看详情

tiny6410之nandflash驱动

一、NANDFLASH的特点S3C6410的NANDFLASH控制器有如下特点1、自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STEPPINGSTONE中执行。导入期间,NANDFLASH控制器不支持ECC矫正。2、NANDFLSH控制器I/F... 查看详情

tiny6410之重定位代码到sram+6096

重定位代码  两个不同的地址概念:  对于程序而言,需要理解两个地址,一个是程序当前所处的地址,即程序运行时所处的当前地址。二是程序应该位于的运行地址,即编译程序时所指定的程序的链接地址。在Tiny6410中板... 查看详情

第5章:搭建s3c6410开发板的测试环境

第5章:搭建S3C6410开发板的测试环境本章主要介绍了在三星公司推出的S3C6410开发板的基础上开发的OK6410开发板上安装Android系统。安装串口调试工具:minicom第1步:检测当前系统是否支持USB转串口第2步:安装minicom第3步:配置minico... 查看详情

tiny6410之uart裸机驱动

UART简介:  UART(UniversalAsynchronousReceiverandTransmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS... 查看详情

tiny6410之控制icache驱动

什么是cache:   基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的、容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU在一段时间内使用,这对提高... 查看详情

字典按键值排序

d={"ok":1,"no":2}#对字典按键排序,用元组列表的形式返回d1=sorted(d.items(),key=lambdad:d[0],reverse=False)#[(‘no‘,2),(‘ok‘,1)]#对字典按值排序,用元组列表的形式返回d2=sorted(d.items(),key=lambdad:d[1],reverse=True)#[(‘ok‘,1),(‘no‘,2)]prin 查看详情

tiny6410之led裸机驱动

操作步骤:第一步:查看开发板电路原理图  找到LED的管脚所对应的寄存器  nLED_1-GPK4  nLED_2-GPK5  nLED_3-GPK6  nLED_4-GPK7  由原理图可知LED对应的寄存器为GPK寄存器,由二极管的特性可知当LED_n为低电平时LED灯亮第二... 查看详情

s3c6410+fpga+2*rtl8211驱动iperf測试

驱动也写的差点儿相同了,所以有必要測试下性能怎样?本次採用了iperf进行測试。而且对照了下s3c6410+ks8851的測试结果1、iperf怎样交叉编译?https://iperf.fr/ 官网总是要靠谱一些,測试版本号为Iperf2.0.5弄到虚拟机运行解压后... 查看详情