Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14281
  • 博文数量: 5
  • 博客积分: 255
  • 博客等级: 二等列兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 10:15
文章存档

2010年(5)

我的朋友

分类: 嵌入式

2010-06-23 10:44:59


.注册和释放设备号 <linux/fs.h>
//静态注册设备号first,count为注册的设备数量,name为设备名

1. int register_chrdev_region(dev_t first,unsigned int count,char *name);
//动态分配设备号dev,firstminor是次设备号,一般为0,count是请求的连续设备号的总数,name是设备名

2. int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
//释放设备号first,count是请求的连续设备号的总数

3. void unregister_chrdev_region(dev_t first,unsigned int count);

.字符设备的注册(内核struct cdev)
//为struct cdev分配空间

1. struct cdev *my_cdev = cdev_alloc();或者 struct cdev dev;
//初始化struct cdev

2. void cdev_init(struct cdev *cdev,const struct file_operations *fops);
//初始化cdev.owner

cdev.owner = THIS_MODULE;
//向内核添加注册信息,dev是设备号,count是请求的连续设备号的总数

3. int cdev_add(struct cdev *p,dev_t dev,unsigned count);
//卸载一个字符设备

4. void cdev_del(struct cdev *p); 接着再调用unregister_chrdev_region(dev_t first,unsigned int count);

.设备的打开,,写操作
//打开设备的函数,inode结构和file结构均为内核内部的数据结构

1. int scull_open(struct inode *inode,struct file *filp);
//释放设备

2. int scull_release(struct inode *inode,struct file *filp);

//读设备函数,内核设备数据-->用户空间;filp是文件指针,buf是用户空间缓存区准备存储设备传输的数据,count为数据的字节数,*f_pos是偏移量

3. ssize_t scull_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos);
//读设备函数还会调用的内核函数copy_to_user,参数to存放用户空间的地址,from存放内核空间地址,count为数据的字节数

4. unsigned long copy_to_user(void *to,const void *from,unsigned long count);

//写设备函数,用户空间的数据-->内核设备.

5. ssize_t scull_write(struct file *filp,const char __user *buf,size_t count,loff_t *f_pos);
//写设备函数还会调用内核函数copy_from_user,

6. unsigned long copy_from_user(void *to,const void *from,unsigned long count);

. 内核中用于管理的核心函数<linux/slab.h>
void *kmalloc(size_t size,int flags);
void kfree(void *ptr);


阅读(350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~