在本文中,采用传统的编写驱动函数的方法来实现按键驱动程序.
采用内核函数变成的方式,首先我们需要编写一个内核驱动函数,如针对按钮:key_kernel.c,源代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/compat.h>
#include <linux/spi/spi.h>
#include <linux/spi/spidev.h>
#include <mach/platform.h>
#include <mach/devices.h>
#define OUTPUT 1
#define INPUT 0
#define HIGH 1
#define LOW 0
#define SET_VALUE 123
unsigned int GPIOC7 = PAD_GPIO_C + 7;
#define DEVICE_NAME "gpio"
static int gpio_open(struct inode *inode, struct file *file)
{
gpio_request(GPIOC7, "test");
gpio_direction_output(GPIOC7, 1);
printk("request GPIOC7\n");
return 0;
}
static int gpio_close(struct inode *inode, struct file *file)
{
printk("gpio_set_value LOW\n");
gpio_free(GPIOC7);
return 0;
}
static long gpio_key(struct file *file, unsigned int cmd)
{
if(cmd == SET_VALUE){
int ret=gpio_get_value(GPIOC7);
printk("%d\n",ret);
}
return -EMSGSIZE;
}
static struct file_operations gpio_fops = {
.owner = THIS_MODULE,
.open = gpio_open,
.release = gpio_close,
.unlocked_ioctl = gpio_key,
};
static struct miscdevice gpio_dev = {
.minor= MISC_DYNAMIC_MINOR,
.name= DEVICE_NAME,
.fops= &gpio_fops,
};
volatile unsigned * GPIOCOUT;
static int gpio_init(void){
int ret = 0;
printk("init\n");
ret = misc_register(&gpio_dev);
return ret;
}
static void gpio_exit(void){
misc_deregister(&gpio_dev);
printk("exit\n");
}
module_init(gpio_init);
module_exit(gpio_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LML");
编写针对此函数的Makefile文件(要指定相应的linux内核):
obj-m:=key_kernel.o
mymodule-objs:=key_kernel
KDIR:=/home/sf_NanoPi2/linux-3.4.y/
MAKE:=make
# EXTRA_CFLAGS += -I$(KDIR)arch/arm/mach-s5p4418/prototype/module
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
编译内核模块,得到key_kernel.ko,并将它拷贝到Nanopi2中,安装内核模块:
这里如果安装失败,提示内核版本不对的话,要去linux-3.4.y中编译内核,并且将得到的arch/arm/boot/uImage 替换掉Nanopi的boot区的uImage.hdmi,具体如下:
如果没有报错则忽略此步骤。
接下来要写一个应用程序来调用KEY的内核函数:key_app.c
在nanopi上编译并执行,如下:
执行结果如下:
按下按钮显示0,放开按钮显示1,测试完后最好rmmod key_kernel.ko,