嵌入式系统学习(九)-用过内核驱动操作GPIO

来源:互联网 发布:最好的seo课程 编辑:程序博客网 时间:2024/05/20 18:17

在本文中,采用传统的编写驱动函数的方法来实现按键驱动程序.

采用内核函数变成的方式,首先我们需要编写一个内核驱动函数,如针对按钮: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,

0 0
原创粉丝点击