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