摸索了一个星期,终于把海思HI3515开发板的按键中断程序搞出来了,hi3515的核心芯片与网上例子较多的s3c之类的有一些区别,以至于浪费了好些时间去琢磨。管脚配置方式不一样,中断的使用情况也不一样。而比较麻烦的是网上关于海思的资料太少了。对于水平不太高的人,老自己摸索还是会走不少弯路。现在就把本人写的能在开饭板测试运行通过的程序贴出来,但愿这个不会违反到保密协议的内容,代码可都是我自己写的哈。希望能给后来者带来些帮助,也希望大家多提意见,一起进步·,^_^
第一步,编写按键驱动程序,button.c代码如下:
/*所有模块都需要的头文件*/
#include<linux/module.h>
/*声明printk()这个内核态的函数*/
#include<linux/kernel.h>
/*文件系统有关的,结构体file_operations也在fs头文件定义*/
#include<linux/fs.h>
/*init和exit相关宏*/
#include<linux/init.h>
#include<linux/delay.h>
#include<linux/poll.h>
/*linux中断定义*/
#include<linux/irq.h>
/**/
#include<asm/irq.h>
/*包含与中断相关的大部分宏及结构体的定义,request_irq()等*/
#include<linux/interrupt.h>
/*linux中的用户态内存交互函数,copy_from_user(),copy_to_user()等*/
#include<asm/uaccess.h>
//#include<mach/regs-gpio.h>
//#include<mach/hardware.h>
#include<linux/platform_device.h>
#include<linux/cdev.h>
/*misc混合设备注册与注销*/
#include<linux/miscdevice.h>
#include <asm/io.h>
#include <asm/system.h>
#define BUTTON_READ 0x01
#define DEVICE_NAME "BUTTON_irq"
#define REG_WRITE(addr,value) ((*(volatile unsigned int *)(addr)) = (value))
#define REG_READ(Addr) (*(volatile unsigned int *)(Addr))
static unsigned int gpio3_virtual_addr = 0;
static unsigned int reg_virtual_addr = 0;
/*数组中是否有数据标志,0表示无数据可读,1表示有数字可读*/
static volatile char key;
/*定义和初始化一个等待队列头*/
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
/*定义一个整形变量,判断按键是否按下*/
static volatile int ev_press = 0;
/*
*定义结构体类型,由它把按钮中断的信息综合起来
*/
struct button_irq_desc {
int irq;/*中断号*/
int pin;/*中断标志寄存器,有中断产生时为1,无中断时为0*/
int number;/*编号*/
char *name;/*名称*/
};
static struct button_irq_desc button_irqs[]={
{8,2,1,"KEY1"},
};
static void hi3515_button_pin_cfg(void)
{
/*配置作为普通输入*/
REG_WRITE(reg_virtual_addr + 0x08,0x1);/*reg2管脚复用配置gpio3_0,按键1*/
REG_WRITE(reg_virtual_addr + 0x0c,0x1);/*reg3管脚复用配置gpio3_1