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);