-
-
-
caizhengsuo | 当前状态:在线
总积分:3196 2025年可用积分:0
注册时间: 2008-02-22
最后登录时间: 2015-10-16
-
-
linux驱动入门篇2字符设备驱动
caizhengsuo 发表于 2008/10/14 9:16:50 823 查看 0 回复 [上一主题] [下一主题]
手机阅读
linux驱动入门篇2字符设备驱动
static void __exit gobalvar_exit(void) { if (unregister_chrdev(MAJOR_NUM, " gobalvar ")) { //…卸载失败 } else { //…卸载成功 } } |
随着内核不断增加新的功能,file_operations结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等。
open()函数 对设备特殊文件进行open()系统调用时,将调用驱动程序的open () 函数:
int (*open)(struct inode * ,struct file *); |
其中参数inode为设备特殊文件的inode (索引结点) 结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用MINOR(inode-> i - rdev) 取得)、控制使用设备的进程数、根据执行情况返回状态码(0表示成功,负数表示存在错误) 等;
release()函数 当最后一个打开设备的用户进程执行close ()系统调用时,内核将调用驱动程序的release () 函数:
void (*release) (struct inode * ,struct file *) ; |
release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等。
read()函数 当对设备特殊文件进行read() 系统调用时,将调用驱动程序read() 函数:
ssize_t (*read) (struct file *, char *, size_t, loff_t *); |
用来从设备中读取数据。当该函数指针被赋为NULL 值时,将导致read 系统调用出错并返回-EINVAL("Invalid argument,非法参数")。函数返回非负值表示成功读取的字节数(返回值为"signed size"数据类型,通常就是目标平台上的固有整数类型)。
globalvar_read函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off) { … copy_to_user(buf, &global_var, sizeof(int)); … } |
write( ) 函数 当设备特殊文件进行write () 系统调用时,将调用驱动程序的write () 函数:
ssize_t (*write) (struct file *, const char *, size_t, loff_t *); |
向设备发送数据。如果没有这个函数,write 系统调用会向调用程序返回一个-EINVAL。如果返回值非负,则表示成功写入的字节数。