📄 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 0x02typedef struct gpio_data { unsigned int pin; unsigned int data;}gpio_data;void OutputLatch(unsigned int port){ if(port == 1){ at91_set_gpio_output(AT91_PIN_PA9, 0); udelay(1); at91_set_gpio_output(AT91_PIN_PA9, 1); }else{ at91_set_gpio_output(AT91_PIN_PC4, 0); udelay(1); 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: at91_set_gpio_output(AT91_PIN_PB2, local_data.data); OutputLatch(1); break; case OUT1: at91_set_gpio_output(AT91_PIN_PC9, local_data.data); OutputLatch(1); break; case OUT2: at91_set_gpio_output(AT91_PIN_PC10, local_data.data); OutputLatch(1); break; case OUT3: at91_set_gpio_output(AT91_PIN_PB3, local_data.data); OutputLatch(1); break; case OUT4: at91_set_gpio_output(AT91_PIN_PB16, local_data.data); OutputLatch(1); break; case OUT5: at91_set_gpio_output(AT91_PIN_PB17, local_data.data); OutputLatch(1); break; case OUT6: at91_set_gpio_output(AT91_PIN_PB18, local_data.data); OutputLatch(1); break; case OUT7: at91_set_gpio_output(AT91_PIN_PB19, local_data.data); OutputLatch(1); break; case OUT8: at91_set_gpio_output(AT91_PIN_PB2, local_data.data); OutputLatch(2); break; case OUT9: at91_set_gpio_output(AT91_PIN_PC9, local_data.data); OutputLatch(2); break; case OUT10: at91_set_gpio_output(AT91_PIN_PC10, local_data.data); OutputLatch(2); break; case OUT11: at91_set_gpio_output(AT91_PIN_PB3, local_data.data); OutputLatch(2); break; case OUT12: at91_set_gpio_output(AT91_PIN_PB16, local_data.data); OutputLatch(2); break; case OUT13: at91_set_gpio_output(AT91_PIN_PB17, local_data.data); OutputLatch(2); break; case OUT14: at91_set_gpio_output(AT91_PIN_PB18, local_data.data); OutputLatch(2); break; case OUT15: at91_set_gpio_output(AT91_PIN_PB19, 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; } printk("PIN%02d: %d\n", local_data.pin, local_data.data); 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){ return 0;}static int gpio_release(struct inode *inode, struct file *file){ return 0;}static struct file_operations gpio_fops = { .open = gpio_open, .release = gpio_release, .ioctl = gpio_ioctl,};static struct miscdevice gpio_dev = { .minor = 197, .name = "GPIO", .fops = &gpio_fops,};static int __init gpio_init(void){ misc_register(&gpio_dev); at91_set_gpio_output(AT91_PIN_PA9, 1); at91_set_gpio_output(AT91_PIN_PC10, 1); 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){ misc_deregister(&gpio_dev);}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 + -