⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio.c~

📁 AT9260处理器Linux2.6.24内核通用IO驱动程序
💻 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 + -