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

caizhengsuo

caizhengsuo   |   当前状态:在线

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

注册时间: 2008-02-22

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

空间 发短消息加为好友

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

caizhengsuo  发表于 2008/10/14 9:17:09      674 查看 0 回复  [上一主题]  [下一主题]

手机阅读

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

globalvar_write函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{

copy_from_user(&global_var, buf, sizeof(int));

}

  ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为:

int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long);

  unsigned int参数为设备驱动程序要执行的命令的代码,由用户自定义,unsigned long参数为相应的命令提供参数,类型可以是整型、指针等。如果设备不提供ioctl 入口点,则对于任何内核未预先定义的请求,ioctl 系统调用将返回错误(-ENOTTY,"No such ioctl fordevice,该设备无此ioctl 命令")。如果该设备方法返回一个非负值,那么该值会被返回给调用程序以表示调用成功。

  llseek()函数 该函数用来修改文件的当前读写位置,并将新位置作为(正的)返回值返回,原型为:

loff_t (*llseek) (struct file *, loff_t, int);

  poll()函数 poll 方法是poll 和select 这两个系统调用的后端实现,用来查询设备是否可读或可写,或是否处于某种特殊状态,原型为:

unsigned int (*poll) (struct file *, struct poll_table_struct *);

  我们将在"设备的阻塞与非阻塞操作"一节对该函数进行更深入的介绍。
设备"gobalvar"的驱动程序的这些函数应分别命名为gobalvar_open、gobalvar_ release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此设备"gobalvar"的基本入口点结构变量gobalvar_fops 赋值如下:

struct file_operations gobalvar_fops = {
 read: gobalvar_read,
 write: gobalvar_write,
};

  上述代码中对gobalvar_fops的初始化方法并不是标准C所支持的,属于GNU扩展语法。
1楼 0 0 回复