Linux内核大讲堂 (二) 传说中的字符设备(2)
这一节我们先给出一个字符设备的小例子,源码结构如下:
|-- wwhs_chardev
| |-- Makefile
| |-- wwhs_chardrv.c //驱动
| `-- wwhs_chardrv_test.c //小测试程序
`-- wwhs_public.h
请大家养成看Makefile的好习惯,这个Makefile很简单的。
先生成字符设备的驱动,字符设备驱动会在/dev/目录下生成一个wwhs_chardev的节点。然后再生成测试小程序,小测试程序就是打开这个节点,然后往节点里写几个字符,然后再读出来。
先给出源码吧:
Makefile:
obj-m+=wwhs_chardrv.o
KERNELDIR=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:chardrv test
chardrv:
make -C $(KERNELDIR) M=$(PWD) modules
test:
gcc wwhs_chardrv_test.c -g -o wwhs_chardrv_test
clean:
rm -rf *.o* *.ko* *.mod.c *.cmd *.symvers .tmp_versions .*.cmd wwhs_chardrv_test
wwhs_chardrv.c:
#include "../wwhs_public.h"
#define WWHS_MAJOR 247
#define WWHS_CHARDEV_NAME "wwhs_chardev"
#define WWHS_MAX_BUFFER 256
#define WWHS_CLASS_NAME "wwhs_class"
static int wwhs_open(struct inode *inode, struct file *file)
{
printk("%s/n",__func__);
return 0;
}
static char *wwhs_charname;
ssize_t wwhs_read(struct file *file, char __user *user, size_t size, loff_t *offset)
{
int wwhs_size = strlen(wwhs_charname) + 1;
if(copy_to_user(user,wwhs_charname,wwhs_size))
return 0;
*offset = wwhs_size;
printk("%s/n",__func__);
return wwhs_size;
}
ssize_t wwhs_write(struct file *file, char __user *user, size_t size, loff_t *offset)
{
if (size < 1)
return -EINVAL;
if (wwhs_charname)
kfree(wwhs_charname);
wwhs_charname =kzalloc(size*sizeof(char),GFP_KERNEL);