キャラクタデバイスドライバのreadについての実験

これまで、キャラクデバイスドライバのwrite(デバイスファイルに対して書き込みを行うタイプのもの)しか試していませんでした。


今更ですが、readについて、デバイスファイルを読み出すと「Hello」を返すものを作成しました。「copy_to_user()」の使い方の備忘録などの為にメモしておきます。

作成したファイル

chardevtest.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/cdev.h>

#define CHARDEVTEST_MAJOR	244
#define CHARDEVTEST_MINORS	1
#define CHARDEVTEST_NAME		"shminchardevtest"

static struct cdev chardevtestdev;

static int
chardevtest_open(struct inode *inode, struct file *file)
{
	return 0;
}

static int
chardevtest_release(struct inode *inode, struct file *file)
{
	return 0;
}

static ssize_t chardevtest_read(struct file *file, char *buf, size_t count, loff_t *offset)
{
	copy_to_user(buf, "Hello", 6);

	*offset += 6;
	return 6;
}

struct file_operations chardevtest_fops = {
	.owner = THIS_MODULE,
	.open = chardevtest_open,
	.read = chardevtest_read,
	.release = chardevtest_release,
};

static int __init chardevtest_init(void)
{
	dev_t dev = MKDEV(CHARDEVTEST_MAJOR, 0);
	int ret;

	cdev_init(&chardevtestdev, &chardevtest_fops);

	ret = cdev_add(&chardevtestdev, dev, CHARDEVTEST_MINORS);
	if (ret){
		printk(KERN_WARNING "shminchardevtest: device add faichardevtest.\n");
		goto err0;
	}

	return 0;

err0:
	unregister_chrdev_region(dev, CHARDEVTEST_MINORS);

	return ret;
}

static void __exit chardevtest_exit(void)
{
	dev_t dev = MKDEV(CHARDEVTEST_MAJOR, 0);

	cdev_del(&chardevtestdev);
	unregister_chrdev_region(dev, CHARDEVTEST_MINORS);
}

module_init(chardevtest_init);
module_exit(chardevtest_exit);

MODULE_LICENSE("GPL");
Makefile
KERNELDIR ?= ../linux-2.6.39.4
PWD := $(shell pwd)

obj-m := chardevtest.o

all:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

使い方

ビルド方法・使い方などは、名前が違うのみで、

  • 以前の記事(id:cupnes:20130101:1357057903)

などと同様です。