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

📄 idr_gpio_drv.c

📁 at9260 button driver
💻 C
字号:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/arch/io.h>
#include <asm/arch/gpio.h>

#define 	DRIVER_NAME 	"idr_gpio"

static int major = 215;

#define 	LDA_I 		AT91_PIN_PB2    //  long_distance_alarm 
#define 	R_S_I		AT91_PIN_PB16   // remove sound 
#define 	BUZZER_O	AT91_PIN_PB31   //buzzer
#define		DO_1		AT91_PIN_PC4    //
#define 	DO_2		AT91_PIN_PC9    //


#define 	MENU		AT91_PIN_PC0 
#define 	UP			AT91_PIN_PC1 
#define 	DOWN		AT91_PIN_PC2 
#define 	ACK			AT91_PIN_PC3



static void set_gpio(void)
{
	at91_set_gpio_output(BUZZER_O,0);
	at91_set_gpio_output(DO_1,0);
	at91_set_gpio_output(DO_2,0);
	
}

static void set_gpio_multi(void)
{

	at91_set_B_periph(BUZZER_O,1);
	at91_set_multi_drive(BUZZER_O,0);

	
    at91_set_B_periph(DO_1,1);
	at91_set_multi_drive(DO_1,0);
    at91_set_B_periph(DO_2,1);
	at91_set_multi_drive(DO_2,0);
}

static void gpio_init(void)
{


}

static int gpio_open(struct inode *inode,struct file *filp)
{
	unsigned m = iminor(inode);

	if ( m > 63 )
		return -1;

	return 0;
}

static int gpio_release(struct inode *inode,struct file *filp)
{
	
	return 0;	
}

static size_t gpio_read(struct file *filp,char __user *buf,size_t len,loff_t *ppos)
{
	char data;
	int ret;

	data = at91_get_gpio_value(BUZZER_O);
		
	ret = copy_to_user(buf,(char *)&data,len);
		
	return ret;
}

static size_t gpio_write(struct file *filp, const char __user *buf, size_t len,loff_t *ppos)
{
	unsigned char data = 0;
	
	if ( copy_from_user((char *)&data,buf,len) )
		return -EFAULT;

	
	if ( data & (0x01 << 0)) // buzzer
	{	
		if ( !at91_get_gpio_value(BUZZER_O))
			at91_set_gpio_value(BUZZER_O,1);
		
	}
		
	return len;
}
	

static int  gpio_ioctl(struct inode *inode,struct file *filp, unsigned int cmd,unsigned long arg)
{
	int err = 0;

	return err;
}

static struct file_operations gpio_drv_fops = {
	.owner 	= THIS_MODULE,
	.open	= gpio_open,
	.release = gpio_release,
	.read	= gpio_read,
	.write	= gpio_write,
	.ioctl	= gpio_ioctl,
};

static int __init gpio_drv_init(void)
{
	int ret;

	ret = register_chrdev(major,DRIVER_NAME,&gpio_drv_fops);
	if ( ret < 0 )
	{
		printk("unable to register %s!\n",DRIVER_NAME );
		return ret;
	}
	set_gpio_multi();
	set_gpio();	
		
	return 0;
}

static void __exit gpio_drv_exit(void)
{	
	
	unregister_chrdev(major,DRIVER_NAME);
	printk("%s unregister!\n",DRIVER_NAME );

}

module_init(gpio_drv_init);
module_exit(gpio_drv_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Danile <lcj@isinstrments.com>");
MODULE_DESCRIPTION("This is GPIO LCD driver");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -