📄 leddriver.c~
字号:
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
#include<linux/config.h>
#include<linux/kernel.h>
#include<asm/arch-s3c2410/regs-gpio.h>
#include<asm/arch/hardware.h>
#include<linux/fs.h>
#include <linux/cdev.h>
#include<linux/delay.h>
#include<asm/uaccess.h>
#define Green S3C2410_GPF5
#define Red S3C2410_GPF4
#define Green1Red0 0xf021
#define Green0Red1 0xf022
#define Green0Red0 0xf023
#define Green1Red1 0xf024
# define DEVICE_NAME "LedDriver"
#define Led_MINOR 1
unsigned int Led_Major=0;
struct cdev led_dev;
extern void s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function);
extern void s3c2410_gpio_setpin(unsigned int pin,unsigned int to);
extern unsigned int s3c2410_gpio_getpin(unsigned int pin);
extern void s3c2410_gpio_pullup(unsigned int pin,unsigned int to);
int gpio_ctl_ioctl(struct inode *inode,
struct file *flip,
unsigned int command,
unsigned long arg)
{
int err = 0;
switch (command)
{
case Green1Red0:
s3c2410_gpio_setpin(Green,1);
s3c2410_gpio_setpin(Red,0);
printk("Green=1,Red=0\n");
return 0;
case Green0Red1:
s3c2410_gpio_setpin(Green,0);
s3c2410_gpio_setpin(Red,1);
printk("Green=0,Red=1\n");
return 0;
case Green0Red0:
s3c2410_gpio_setpin(Green,0);
s3c2410_gpio_setpin(Red,0);
printk("Green=0,Red=0\n");
return 0;
case Green1Red1:
s3c2410_gpio_setpin(Green,1);
s3c2410_gpio_setpin(Red,1);
printk("Green=1,Red=1\n");
return 0;
default:
err = -EINVAL;
}
return err;
}
static int Led_open(struct inode *inode,struct file *filp)
{
s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
s3c2410_gpio_setpin(Green,1);
s3c2410_gpio_setpin(Red,0);
printk("open\n");
return 0;
}
static int Led_release(struct inode *inode,struct file *filp)
{
printk("releaes\n");
return 0;
}
static int led_read(struct file * file, char * buffer, size_t count, loff_t *ppos)
{
unsigned int value;
value=s3c2410_gpio_getpin(S3C2410_GPG3);
//s3c2410_gpio_pullup(S3C2410_GPE8,0);
//s3c2410_gpio_cfgpin(S3C2410_GPE8,S3C2410_GPE8_SDDAT1);
printk(KERN_INFO "read\n");
if(value!=0) return 1;
else return 0;
}
static int led_write(struct file * file, const char * buffer, size_t count, loff_t *ppos)
{
s3c2410_gpio_setpin(Green,0);
printk(KERN_INFO "write\n");
return 0;
}
static struct file_operations led_fops = {
.owner = THIS_MODULE,
.open = Led_open,
.ioctl = gpio_ctl_ioctl,
.read = led_read,
.write = led_write,
.release = Led_release,
};
#ifdef CONFIG_DEVICES_FS
static devfs_handle_t devfs_Led_dir;
static devfs_handle_t devfs_Led_raw;
#endif
/*
static int __init Led_init(void)
{
int ret;
gpio_devfs_dir= devfs_register(NULL,"LedDriver",DEVFS_FL_DEFAULT,Led_Major,
0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP,
&led_fops, NULL);
// ret=register_chrdev(0,DEVICE_NAME,&led_fops);
//if(ret<0)
// {
// printk(DEVICE_NAME"can't get major number\n");
// return ret;
// }
// Led_Major=ret;
//#ifdef CONFIG_DEVFS_FS
// devfs_Led_dir=devfs_mk_dir(NULL,"led",NULL);
// devfs_Led_raw=devfs_register(devfs_Led_dir,"0",DEVFS_FL_DEFAULT,Led_Major,
//Led_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&led_fops,NULL);
//#endif
//-------------------3--
printk(DEVICE_NAME"---initialized\n");
s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
s3c2410_gpio_setpin(Green,0);
s3c2410_gpio_setpin(Red,1);
printk("Success\n");
return 0;
}
static void __exit Led_exit(void)
{
//#ifdef CONFIG_DEVFS_FS
devfs_unregister(gpio_devfs_dir);
//devfs_unregister(devfs_Led_dir);
//#endif
// s3c2410_gpio_setpin(Red,1);
// unregister_chrdev(Led_Major,DEVICE_NAME);
printk("LedDriver Unstalled Ok\n");
}*/
static void __exit Led_exit(void)
{
dev_t dev=MKDEV(Led_Major,0);
cdev_del(&led_dev);
unregister_chrdev_region(dev,1);
#ifdef CONFIG_DEVFS_FS
devfs_remove(DEVICE_NAME);
#endif
printk(KERN_INFO "unregistered the %s\n",DEVICE_NAME);
}
static int __init Led_init(void)
{
int ret,devno;
dev_t dev;
ret = alloc_chrdev_region(&dev,0,1,DEVICE_NAME);
Led_Major= MAJOR(dev);
printk(KERN_INFO "Initial YC2410Led driver!\n");
if (ret<0) {
printk(KERN_WARNING "Led: can't get major number %d\n",Led_Major);
return ret;
}
devno = MKDEV(Led_Major,0);
cdev_init(&led_dev,&led_fops);
led_dev.owner = THIS_MODULE;
led_dev.ops = &led_fops;
ret = cdev_add(&led_dev,devno,1);
if (ret) {
unregister_chrdev_region(dev,1);
printk(KERN_NOTICE "Error %d adding led device\n",ret);
return ret;
}
#ifdef CONFIG_DEVFS_FS
devfs_mk_cdev(MKDEV(Led_Major,0), S_IFCHR | S_IRUSR | S_IWUSR,DEVICE_NAME);
printk(KERN_INFO"/dev/%s has been added to your system.\n",DEVICE_NAME);
#else
printk(DEVICE_NAME "Initialized\n");
printk(KERN_INFO "You must create the dev file manually.\n");
printk(KERN_INFO "Todo: mknod c /dev/%s %d 0\n",DEVICE_NAME,Led_Major);
#endif
return 0;
}
module_init(Led_init);
module_exit(Led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("threewater<threewater@up-tech.com>");
MODULE_DESCRIPTION("gpio(led) driver for s3c2410");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -