(10)x210: linux2.6之后的字符驱动
来源:互联网 发布:易语言修改软件 编辑:程序博客网 时间:2024/06/06 00:39
#include <linux/module.h> // module_init module_exit
#include <linux/init.h> // __init __exit
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h> // arch/arm/mach-s5pv210/include/mach/gpio-bank.h
#include <linux/string.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/cdev.h>
#define MYMAJOR 200
#define MYNAME "chardev"
#define MYCNT 1
int mymajor ;
static dev_t mydev;
static struct cdev test_cdev;
char kbuf[100];
static int test_chardev_open(struct inode *inode,struct file *file)
{
printk(KERN_INFO "new test chardev_open\n");
return 0;
}
static int test_chardev_release(struct inode *inode,struct file *file){
printk(KERN_INFO "new test chardev_release\n");
return 0;
}
static ssize_t test_chardev_read(struct file *file,char __user *buf,size_t size, loff_t *ppos)
{
printk(KERN_INFO "new test read\n");
return 0;
}
static ssize_t test_chardev_write(struct file *file,
const char __user *ubuf,size_t count,loff_t * ppos){
printk(KERN_INFO " new test write\n");
return 0;
}
static const struct file_operations test_fops={
.owner=THIS_MODULE,
.open=test_chardev_open,
.release=test_chardev_release,
.write=test_chardev_write,
.read=test_chardev_read,
};
static int __init chardev_init(void)
{ int ret=-1;
printk(KERN_INFO "new module chardev init");
mydev=MKDEV(MYMAJOR,0);
ret=register_chrdev_region(mydev,MYCNT,MYNAME);
if(ret)
{
printk(KERN_ERR "register_chrdev fail\n");
return -EINVAL;
}
printk(KERN_INFO "new register_chrdev success...myjor=%d.\n",mymajor);
cdev_init(&test_cdev,&test_fops);
ret=cdev_add(&test_cdev,mydev,MYCNT);
if(ret)
{
printk(KERN_ERR "unable to add cdev\n");
return -EINVAL;
}
printk(KERN_INFO "new cdev_add success\n");
return 0;
}
static void __exit chardev_exit(void)
{
printk(KERN_INFO "new module chardev exit\n");
cdev_del(&test_cdev);
unregister_chrdev_region(mydev, MYCNT);
}
module_init(chardev_init);
module_exit(chardev_exit);
// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL"); // 描述模块的许可证
MODULE_AUTHOR("aston"); // 描述模块的作者
MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息
MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
#include <linux/init.h> // __init __exit
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h> // arch/arm/mach-s5pv210/include/mach/gpio-bank.h
#include <linux/string.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/cdev.h>
#define MYMAJOR 200
#define MYNAME "chardev"
#define MYCNT 1
int mymajor ;
static dev_t mydev;
static struct cdev test_cdev;
char kbuf[100];
static int test_chardev_open(struct inode *inode,struct file *file)
{
printk(KERN_INFO "new test chardev_open\n");
return 0;
}
static int test_chardev_release(struct inode *inode,struct file *file){
printk(KERN_INFO "new test chardev_release\n");
return 0;
}
static ssize_t test_chardev_read(struct file *file,char __user *buf,size_t size, loff_t *ppos)
{
printk(KERN_INFO "new test read\n");
return 0;
}
static ssize_t test_chardev_write(struct file *file,
const char __user *ubuf,size_t count,loff_t * ppos){
printk(KERN_INFO " new test write\n");
return 0;
}
static const struct file_operations test_fops={
.owner=THIS_MODULE,
.open=test_chardev_open,
.release=test_chardev_release,
.write=test_chardev_write,
.read=test_chardev_read,
};
static int __init chardev_init(void)
{ int ret=-1;
printk(KERN_INFO "new module chardev init");
mydev=MKDEV(MYMAJOR,0);
ret=register_chrdev_region(mydev,MYCNT,MYNAME);
if(ret)
{
printk(KERN_ERR "register_chrdev fail\n");
return -EINVAL;
}
printk(KERN_INFO "new register_chrdev success...myjor=%d.\n",mymajor);
cdev_init(&test_cdev,&test_fops);
ret=cdev_add(&test_cdev,mydev,MYCNT);
if(ret)
{
printk(KERN_ERR "unable to add cdev\n");
return -EINVAL;
}
printk(KERN_INFO "new cdev_add success\n");
return 0;
}
static void __exit chardev_exit(void)
{
printk(KERN_INFO "new module chardev exit\n");
cdev_del(&test_cdev);
unregister_chrdev_region(mydev, MYCNT);
}
module_init(chardev_init);
module_exit(chardev_exit);
// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL"); // 描述模块的许可证
MODULE_AUTHOR("aston"); // 描述模块的作者
MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息
MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
阅读全文
0 0
- (10)x210: linux2.6之后的字符驱动
- (4)x210: 2.4之前的字符驱动
- 字符设备驱动linux2.6
- 一个Linux2.6版内核字符驱动的例子
- 一个Linux2.6版内核字符驱动的例子
- linux2.6字符驱动(一)
- linux2.6字符驱动(二)
- linux2.6字符设备驱动开发模板
- linux2.6字符设备驱动开发模板
- linux2.6驱动学习笔记之字符驱动
- (5)x210:2.4之前的字符驱动-动态获得mymajor主设备号
- 基于linux2.6.30.4的s3c2440的led字符驱动
- Linux2.6内核下简单的字符设备驱动及测试
- linux2.6驱动注册、字符设备注册和它们的释放
- (11)2.6之后的字符驱动led
- LED灯显示字符驱动程序-linux2.6LED显示驱动
- linux2.6字符设备驱动编程第一例:globalmem
- linux2.6字符设备驱动编程第一例:globalmem
- android系统数据业务知识点总结(一)
- vi编辑器
- 在CentOS上安装第三方软件库EPEL
- 2017.10.10 狼和羊的故事 思考记录
- iOS汉字转拼音
- (10)x210: linux2.6之后的字符驱动
- apache下mail 邮件工具类
- 20种常用的DOS命令小结
- Sublime text3 ubuntu 安装
- Qt笔记_15
- socket网络编程一些知识点
- 开源协议知多少
- Android O 新特性和行为变更总结
- 将Centos的yum源更换为国内的阿里云源