您的位置:首页 > 其它

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

2016-10-01 22:40 441 查看
在本文中,采用传统的编写驱动函数的方法来实现按键驱动程序.

采用内核函数变成的方式,首先我们需要编写一个内核驱动函数,如针对按钮: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,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐