📄 2410io.c
字号:
/************************************************/
/* 2410 2.6内核IO口驱动 */
/* 作者:唐子超 */
/************************************************/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifdef MODULE
#define __MODULE__
#endif
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <asm/arch/hardware.h>
#include <asm/arch/regs-gpio.h>
#include <asm/uaccess.h>
#define MAJOR_NR 130 //主设备号
#define DEVICE_NAME "switch" //设备名称
/********************管脚定义*****************/
#define sw1 S3C2410_GPC10
#define sw2 S3C2410_GPC11
#define sw1out S3C2410_GPC10_OUTP
#define sw2out S3C2410_GPC11_OUTP
static ssize_t io_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos);
static int io_open(struct inode *inode,struct file *file);
static int io_release(struct inode *inode,struct file *file);
int io_init(void);
void io_cleanup(void);
static struct file_operations io_fops=
{
.owner= THIS_MODULE,
.write= io_write,
.open= io_open,
.release= io_release,
};
/********************打开驱动************************/
static int io_open(struct inode *inode,struct file *filp)
{
printk(KERN_ERR "OPEN!\n");
s3c2410_gpio_cfgpin(sw1,sw1out); //配置管脚输入输出
s3c2410_gpio_cfgpin(sw2,sw2out);
s3c2410_gpio_setpin(sw1,0); //设置管脚点平
s3c2410_gpio_setpin(sw2,0);
//MOD_INC_USE_COUNT;
return 0;
} //success
/*******************关闭驱动***************************/
static int io_release(struct inode *inode,struct file *filp)
{
s3c2410_gpio_setpin(sw1,0);
s3c2410_gpio_setpin(sw2,0);
printk(KERN_ERR "RELEASE!\n");
//MOD_DEC_USE_COUNT;
return 0; //close
}
/******************写数据******************************/
static ssize_t io_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos)
{
int temp;
copy_from_user(&temp,buf,count);
s3c2410_gpio_setpin(sw1,((temp&0x1)?1:0));
s3c2410_gpio_setpin(sw2,(((temp>>1)&0x1)?1:0));
return 0;
}
int io_init(void)
{
int result;
result = register_chrdev(MAJOR_NR, DEVICE_NAME, &io_fops);
if (result<0)
{
printk(KERN_ERR DEVICE_NAME ":Unable to get major %d\n",MAJOR_NR);
return result;
}
printk(KERN_ERR DEVICE_NAME":初始化成功!\n");
return 0;
}
void io_cleanup(void)
{
printk(KERN_ERR DEVICE_NAME":驱动关闭\n");
unregister_chrdev(MAJOR_NR,DEVICE_NAME);
}
module_init(io_init);
module_exit(io_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("TangZichao<tangzichao@gmail.com>");
MODULE_DESCRIPTION("io driver for sc2410");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -