您的位置:控制工程论坛网论坛 » 嵌入式系统 » linux驱动入门篇2字符设备驱动

caizhengsuo

caizhengsuo   |   当前状态:在线

总积分:3196  2025年可用积分:0

注册时间: 2008-02-22

最后登录时间: 2015-10-16

空间 发短消息加为好友

linux驱动入门篇2字符设备驱动

caizhengsuo  发表于 2008/10/14 9:16:50      823 查看 0 回复  [上一主题]  [下一主题]

手机阅读

linux驱动入门篇2字符设备驱动

与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的"反函数" unregister_chrdev():

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。如果返回值非负,则表示成功写入的字节数。
1楼 0 0 回复