前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >驱动基础——字符设备3

驱动基础——字符设备3

作者头像
用户3765803
发布2019-03-05 10:12:22
9610
发布2019-03-05 10:12:22
举报
文章被收录于专栏:悟空被FFmpeg玩悟空被FFmpeg玩

字符设备驱动中的 read接口的使用,简单实例 驱动部分代码

#include <linux/module.h> #include <linux/slab.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/major.h> #include <asm/uaccess.h> static ssize_t flash_env_dev_open(struct inode *inode,struct file *file) {     return 0; } static ssize_t flash_env_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {     unsigned char *p = (unsigned char *)kmalloc(11,GFP_KERNEL);     memcpy(p,"lingjiujianke",13);     if(!(copy_to_user(buf,p,10)))     {         printk("<1>copy ok\n");     }     return 0; } static ssize_t flash_env_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {     unsigned char *p=kmalloc(11,GFP_KERNEL);     if(copy_from_user(p,buf,10)==0)     {         printk("<1>%s\n",p);     }     kfree(p);     return 0; } static ssize_t flash_env_dev_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) {     printk("<1> %d\n",cmd);     switch(cmd){     case 0:         printk("<1> in flash 0\n");         break;     case 1:         printk("<1> in flash 1\n");         break;     default:         printk("<1> others\n");     }     return 0; } static const struct file_operations flash_fops = {     .owner    =THIS_MODULE,     .open    = flash_env_dev_open,     .read    = flash_env_dev_read,     .write    = flash_env_dev_write,     .ioctl    = flash_env_dev_ioctl, }; #define MAX_FLASH_ENV_MINORS 262 static struct cdev flash_cdev; dev_t dev; static __init int flash_env_dev_init(void) {     int res;     dev=MKDEV(263,262); cdev_init(&flash_cdev,&flash_fops);     res=register_chrdev_region(dev, MAX_FLASH_ENV_MINORS, "/dev/read_dev");     if(res)         printk("<1> fuck\n");              res=cdev_add(&flash_cdev,dev,MAX_FLASH_ENV_MINORS);     if(res)         printk("<1> fuck2 \n"); /*    devfs_mk_dir("flash_env_dev");*/     printk("<1> Hello World\n");     return 0; } static void __exit flash_env_dev_exit(void) {     unregister_chrdev_region(dev,MAX_FLASH_ENV_MINORS);     printk("<1> exit Hello World\n"); } module_init(flash_env_dev_init); module_exit(flash_env_dev_exit);

Makefile部分代码

KERNELDIR = /usr/src/kernels/2.6.27.25-170.2.72.fc10.i686     PWD := $(shell pwd) obj-m := chrdev.o modules:     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules     gcc test_chrdev.c -o test_chrdev clean:     rm -rf *.o *.ko test_chrdev Module.* module* *.mod.c

测试代码

#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdlib.h> #include <string.h> int main() {     int fd=0;     int ret=0;     unsigned char buffer[20];     fd=open("/dev/read_dev", O_RDWR);     if(fd<0)         printf("open file error\n");     memset(buffer,0,20);     ret=read(fd,buffer,10);     if(ret<0)         printf("ioctl error\n");     if(buffer)     {         printf("the buffer is |%s|\n",buffer);     }     return 0; }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009-07-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档