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

📄 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		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 + -