Linux内核大讲堂 (二) 传说中的字符设备(2)

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);

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值