当前位置: 首页 > >

【Android驱动】字符设备驱动程序 关注点

发布时间:

看肯定是能看懂,经常忘记,若能背下来,那是更好。

看书又要从头看,肯定是要总结一个云笔记

那就是这篇博客

struct cdev {

struct kobject kobj;

struct model *owner;

struct file_operations *ops;

struct list_head list;

dev_t dev; //设备号

unsigned int count;
};

---------------------------------------------------------
void cdev_init(struct cdev*, struct file_operations *);

struct cdev *cdev_alloc(void);

void cdev_put(struct cdev *p);

// 添加一个字符设备到系统
int cdev_add(struct cdev *, dev_t, unsigned);

// 从系统移除一个字符设备
void cdev_del(struct cdev *);

int register_chrdev_region(dev_t from, unsigned count, const char* name);

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char* name);

-------------
fops:

read()函数用于读取数据,成功时返回读取的字节数,出错时返回一个负值。

read() ----> ssize_t read(int fd, void *buf, size_t count)
----> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

write()函数向设备发送数据,成功时返回写入的字节数。

write() ---> ssize_t write(int fd, void *buf, size_t count);
---> ssize_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

无情插入tips:

?


1. read()和write() 如果返回0, 则暗示 end_of_file(EOF)

?


2. .unlocked_ioctl 和 .compat_ioctl区别:

很多驱动里都有一个宏 CONFIG_COMPAT,这个宏理解起来啥意思呢,我也没看到在哪里看到说明,


比如这个:

static const struct file_operations fops = {

.owner = THIS_MODULE,
.unlocked_ioctl = my_ioctl,
.open = my_open,
.release = my_release,

#ifdef CONFIG_COMPAT
.compat_ioctl = my_compat_ioctl,
#endif

.mmap = my_mmap,
};


32位cpu, msm8909, 应用层调用ioctl, 进入的是unlocked_ioctl 。

64位cpu,应用层调用ioctl,进入的应该是compat_ioctl。

CONFIG_COMPAT宏的话,在32位的机器上应该是未定义的。


?


然后下一个函数mmap():

mmap()函数将设备内存映射到进程的虚拟地址空间中。与用户空间的

void *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset)函数对应。


最*看的binder,binder驱动里进程通信就是mmap实现的。


---------------------------------

想写个驱动例子,搞一搞,理解下,暂时没看到例程,后面再看一看



下一个关注的是read()和write()中系统调用函数:

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

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

成功返回0, 失败返回负值。

然后关注的是ioctl()函数:


关注幻数的生成(32位)

内核定义了_IO(), _IOR(), _IOW()和_IOWR()辅助生成命令,先自定义一个MAGIC_NUM,然后自定cmd

参数:设备类型字段,序列号, 数据长度字段
---------------------
#define MY_MAGIC_NUM 0XA0

#define CHAO_COMMAND_ONE _IOW(MY_MYGIC_NUM, 1, int)
#define CHAO_COMMAND_TWO _IOW(MY_MYGIC_NUM, 2, int)
#define CHAO_COMMAND_TEN _IOW(MY_MYGIC_NUM, 10, int)

?



友情链接: