📄 gpio.c
字号:
//#include <linux/config.h>#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/interrupt.h>#include <linux/errno.h>#include <linux/ioport.h>#include <linux/crc32.h>#include <linux/device.h>#include <linux/spinlock.h>#include <linux/workqueue.h>#include <linux/miscdevice.h>#include <linux/list.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/time.h>#include <asm/hardware.h>#include <asm/system.h>#include <linux/fs.h>#include <linux/types.h>#include <asm/uaccess.h>#include <linux/spinlock.h>#include <linux/irq.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/arch/gpio.h>#define OUT0 0x00#define OUT1 0x01#define OUT2 0x02#define OUT3 0x03#define OUT4 0x04#define OUT5 0x05#define OUT6 0x06#define OUT7 0x07#define OUT8 0x08#define OUT9 0x09#define OUT10 0x0A#define OUT11 0x0B#define OUT12 0x0C#define OUT13 0x0D#define OUT14 0x0E#define OUT15 0x0F#define IN0 0x00#define IN1 0x01#define IN2 0x02#define IN3 0x03#define IN4 0x04#define IN5 0x05#define IN6 0x06#define IN7 0x07#define IN8 0x08#define IN9 0x09#define IN10 0x0A#define IN11 0x0B#define IN12 0x0C#define IN13 0x0D#define GPIO_SET 0x01#define GPIO_GET 0x02//#define DEBUG#ifdef DEBUG#define DPRINTK(x...) printk("AT9260 GPIO: %s",x)#else#define DPRINTK(x...)#endiftypedef struct gpio_data { unsigned int pin; unsigned int data;}gpio_data;void OutputLatch(unsigned int port){ if(port == 1){ //Enable inputs(active-High)74ALVT16373,端口使能 at91_set_gpio_output(AT91_PIN_PA9, 0); udelay(3); at91_set_gpio_output(AT91_PIN_PA9, 1); }else{ at91_set_gpio_output(AT91_PIN_PC4, 0); udelay(3); at91_set_gpio_output(AT91_PIN_PC4, 1); }}static int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){ static struct gpio_data local_data; if (copy_from_user(&local_data, (struct gpio_data *)arg, sizeof(local_data))) return -EFAULT; switch (cmd) { case GPIO_SET: switch(local_data.pin) { case OUT0: //printk("OUT0 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB2, local_data.data); OutputLatch(1); break; case OUT1: //printk("OUT1 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PC9, local_data.data); OutputLatch(1); break; case OUT2: //printk("OUT2 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PC10, local_data.data); OutputLatch(1); break; case OUT3: //printk("OUT3 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB3, local_data.data); OutputLatch(1); break; case OUT4: //printk("OUT4 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB16, local_data.data); OutputLatch(1); break; case OUT5: //printk("OUT5 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB17, local_data.data); OutputLatch(1); break; case OUT6: //printk("OUT6 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB18, local_data.data); OutputLatch(1); break; case OUT7: //printk("OUT7 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB19, local_data.data); OutputLatch(1); break; case OUT8: //printk("OUT8 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB19, local_data.data); OutputLatch(2); break; case OUT9: //printk("OUT9 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB18, local_data.data); OutputLatch(2); break; case OUT10: //printk("OUT10 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB17, local_data.data); OutputLatch(2); break; case OUT11: //printk("OUT11 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB16, local_data.data); OutputLatch(2); break; case OUT12: //printk("OUT12 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB3, local_data.data); OutputLatch(2); break; case OUT13: //printk("OUT13 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PC10, local_data.data); OutputLatch(2); break; case OUT14: //printk("OUT14 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PC9, local_data.data); OutputLatch(2); break; case OUT15: //printk("OUT15 set to %d \n",local_data.data); at91_set_gpio_output(AT91_PIN_PB2, local_data.data); OutputLatch(2); break; default: break; } return 0; break; case GPIO_GET: switch(local_data.pin) { case IN0: local_data.data = at91_get_gpio_value(AT91_PIN_PA11); break; case IN1: local_data.data = at91_get_gpio_value(AT91_PIN_PB25); break; case IN2: local_data.data = at91_get_gpio_value(AT91_PIN_PB20); break; case IN3: local_data.data = at91_get_gpio_value(AT91_PIN_PB24); break; case IN4: local_data.data = at91_get_gpio_value(AT91_PIN_PB22); break; case IN5: local_data.data = at91_get_gpio_value(AT91_PIN_PB12); break; case IN6: local_data.data = at91_get_gpio_value(AT91_PIN_PB23); break; case IN7: local_data.data = at91_get_gpio_value(AT91_PIN_PB21); break; case IN8: local_data.data = at91_get_gpio_value(AT91_PIN_PA6); break; case IN9: local_data.data = at91_get_gpio_value(AT91_PIN_PB29); break; case IN10: local_data.data = at91_get_gpio_value(AT91_PIN_PB28); break; case IN11: local_data.data = at91_get_gpio_value(AT91_PIN_PB30); break; case IN12: local_data.data = at91_get_gpio_value(AT91_PIN_PB31); break; case IN13: local_data.data = at91_get_gpio_value(AT91_PIN_PC15); break; default: break; } if (copy_to_user((struct gpio_data *)arg, &local_data, sizeof(local_data))) return -EFAULT; return 0; break; default: return -EINVAL; break; } return -EINVAL;}static int gpio_open(struct inode *inode, struct file *file){ DPRINTK("cml: open device\n"); return 0;}static int gpio_release(struct inode *inode, struct file *file){ DPRINTK("cml: release device\n"); return 0;}//cml static struct file_operations gpio_fops = { .open = gpio_open, .release = gpio_release, .ioctl = gpio_ioctl,};//cml ??????????static struct miscdevice gpio_dev = { .minor = 197, .name = "GPIO", .fops = &gpio_fops,};static int __init gpio_init(void){ int ret; ret = misc_register(&gpio_dev);//cml 0~success,negative~error if(ret < 0 ) { DPRINTK("cml: misc_register error\n"); return 0; } at91_set_gpio_output(AT91_PIN_PA9, 1); at91_set_gpio_output(AT91_PIN_PC4, 1);//cml AT91_PIN_PC10 at91_set_gpio_input(AT91_PIN_PA11, 1); at91_set_gpio_input(AT91_PIN_PB25, 1); at91_set_gpio_input(AT91_PIN_PB20, 1); at91_set_gpio_input(AT91_PIN_PB24, 1); at91_set_gpio_input(AT91_PIN_PB22, 1); at91_set_gpio_input(AT91_PIN_PB12, 1); at91_set_gpio_input(AT91_PIN_PB23, 1); at91_set_gpio_input(AT91_PIN_PB21, 1); at91_set_gpio_input(AT91_PIN_PA6, 1); at91_set_gpio_input(AT91_PIN_PB29, 1); at91_set_gpio_input(AT91_PIN_PB28, 1); at91_set_gpio_input(AT91_PIN_PB30, 1); at91_set_gpio_input(AT91_PIN_PB31, 1); at91_set_gpio_input(AT91_PIN_PC15, 1); return 0;}static void __exit gpio_exit(void){ int ret; ret = misc_deregister(&gpio_dev);//cml 0~success,negative~error if(ret < 0 ) { DPRINTK("cml: misc_deregister error\n"); return ; } return ;}MODULE_AUTHOR("Yanjun Luo <yanjun.luo@gmail.com");MODULE_DESCRIPTION("gpio driver");MODULE_LICENSE("GPL");module_init(gpio_init);module_exit(gpio_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -