I.MX6Q GPIO驅動的編寫

I.MX6Q GPIO驅動的編寫

                              作者:盧浩  

                                     時間:2017.2.20

                                    轉載請註明出處

                                                                 嵌入式愛好者開發羣:122879839



#include <linux/major.h>
#include <linux/miscdevice.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/sched.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include "linux/version.h"
#include <linux/blkdev.h>
#include <linux/mm.h>
#include <linux/module.h> 
#include <linux/init.h> 

#include <mach/gpio.h>
#include <mach/hardware.h>
#include <mach/iomux-mx6q.h>

#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <asm/gpio.h>
#include <asm/irq.h>

/*
Set the DEVICE_NAME,you can change it 
*/
#define DEVICE_NAME "GPIO_DEVICE"

/*
OUT level control  
1:high
0:low
Isn't it?You can read the reference mentual
*/
#define IOCTL_GPIO_HIGH	1
#define IOCTL_GPIO_LOW	0

#define NUM_5_16 IMX_GPIO_NR(5, 16)
#define NUM_5_17 IMX_GPIO_NR(5, 17)
//#define NUM_4_28 IMX_GPIO_NR(4, 28)
//#define NUM_4_29 IMX_GPIO_NR(4, 29)
//#define NUM_4_30 IMX_GPIO_NR(4, 30)

static unsigned int num[] = {
	NUM_5_16,
	NUM_5_17,
//	NUM_4_28,
//	NUM_4_29,
//	NUM_4_30,
};

static long gpio_ioctl(
	struct file *file, 
	unsigned int cmd, 
	unsigned long arg)
{
	if (arg > 3)
	{
		return -EINVAL;
	}

	switch(cmd)
	{
		case IOCTL_GPIO_HIGH:
	
			gpio_set_value(num[arg], 1);
			return 0;

		case IOCTL_GPIO_LOW:
			gpio_set_value(num[arg], 0);
			return 0;

		default:
			return -EINVAL;
	}
}

static struct file_operations gpio_fops = {
	.owner	=		THIS_MODULE,
	.unlocked_ioctl	=	gpio_ioctl,
//	.release        = 	gpio_release,
//	.read   = 	gpio_read, 
//  .write  = 	gpio_write,
};


static struct miscdevice misc = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEVICE_NAME,
	.fops = &gpio_fops,
};

static int __init gpio_init(void)
{
	int ret;

	int i;
	for(i = 0 ; i<2; i++){
		gpio_request(num[i],"fsl_gpio");
		gpio_direction_output(num[i],1);
		gpio_set_value(num[i], 0);
	}
	ret = misc_register(&misc);
	printk (DEVICE_NAME" initialized.\n");
	return ret;
}

static void __exit gpio_exit(void)
{
	misc_deregister(&misc);
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR("luhao");
module_init(gpio_init);
module_exit(gpio_exit);


發佈了41 篇原創文章 · 獲贊 8 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章