后台驱动代码如下:比较昨天的,添加了读写指针位置移动操作

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/poll.h>    /* COPY_TO_USER */
#include<linux/errno.h>
#include <linux/cdev.h>
#include <linux/slab.h>#define DEV_NAME "rwtest"
#define DEV_NUM 2
#define DEV_MEM_SIZE 4096static int major=0;
//static int MAX_BUF_LEN=1024;
static char drv_buffer[2][1024];
//static char drv_buf0[1024];
//static char drv_buf1[1024];
//static int WRI_LENGTH=0;
struct cdev cdev;
struct mem_dev * mem_devp; /*璁惧缁撴瀯浣撴寚閽?//*mem璁惧鎻忚堪缁撴瀯浣?/
struct mem_dev
{                                                        char *data;                      unsigned long size;
};/***********鍐欏叆*************************/
static ssize_t  dx_write(struct file *filp, const char __user *buffer, size_t size, loff_t * ppos)
{ unsigned long p=*ppos;unsigned int count =size;int ret=0;char * data=filp->private_data ;//struct mem_dev *dev = filp->private_data; /*鑾峰緱璁惧缁撴瀯浣撴寚閽?///struct mem_dev *dev=&mem_devp[0];/*鑾峰緱璁惧缁撴瀯浣撴寚閽?  [0]*/printk("data:::%s\n",data);if(p>=DEV_MEM_SIZE)return 0;if(count>DEV_MEM_SIZE-p){count=DEV_MEM_SIZE-p;}printk("write p::%ld\n",p);/*浠庤繃鎴风┖闂村啓鍏ユ暟鎹?/if(copy_from_user(data + p,buffer,count)){ret=-EFAULT;}else{*ppos +=count;ret=count;printk(KERN_INFO "written %d bytes from %ld\n",count,p);}printk("write:%s\n",(char *)(filp->private_data+p));printk("write buffer:%s\n",buffer);return count;
}
/**************************************璇诲彇***********************************************/
static ssize_t  dx_read(struct file *filp, char __user *buffer, size_t size, loff_t *ppos)
{    //鏂囦欢璇诲彇浣嶇疆unsigned long p=*ppos;unsigned int count =size;//瑕佽鍙栫殑,澶у皬int ret=0;char * data=filp->private_data ;//struct mem_dev *dev = filp->private_data; /*鑾峰緱璁惧缁撴瀯浣撴寚閽?///struct mem_dev *dev=&mem_devp[0];/*鑾峰緱璁惧缁撴瀯浣撴寚閽?  [0]*/if(p>=DEV_MEM_SIZE)return 0;if(count>DEV_MEM_SIZE-p){count=DEV_MEM_SIZE-p;}printk("read p::%ld\n",p);/*浠庢暟鎹鍒扮敤鎴风┖闂?*/if(copy_to_user(buffer,data + p,count)){ret=-EFAULT;}else{*ppos +=count;ret=count;printk(KERN_INFO "written %d bytes from %ld\n",count,p);}printk("read:%s\n",(char *)(filp->private_data));printk("read buffer:%s\n",buffer);return count;
}//===========================鎵撳紑=========================================
static int dx_open(struct inode *inode, struct file *filp)
{//printk("device open sucess!\n");//struct mem_dev *dev;/*鑾峰彇娆¤澶囧彿*/int num = MINOR(inode->i_rdev);if (num >= DEV_NUM) return -ENODEV;//dev = &mem_devp[num];//dev = drv_buffer[num];printk("num:%d\n",num);/*灏嗚澶囨弿杩扮粨鏋勬寚閽堣祴鍊肩粰鏂囦欢绉佹湁鏁版嵁鎸囬拡*/filp->private_data = drv_buffer[num];filp->f_pos +=strlen(drv_buffer[num]);printk("open:%s\n",(char *)filp->private_data);return 0;
}
/**********************************release***************************************************/
static int  dx_release(struct inode *inode, struct file *filp)
{printk("device release\n");return 0;
}static loff_t dx_llseek(struct file *filp, loff_t offset, int whence)
{ loff_t newpos;switch(whence) {case 0: /* SEEK_SET */newpos = offset;//鏂囦欢寮€濮嬩綅缃姞鍋忕Щ閲?            break;case 1: /* SEEK_CUR */newpos = filp->f_pos + offset;//褰撳墠鎸囬拡浣嶇疆鍔犲亸绉婚噺break;case 2: /* SEEK_END */newpos = DEV_MEM_SIZE -1 + offset;//鏂囦欢鏈熬鍔犲亸绉婚噺(鏈€鍚庝竴浣嶄负'\0')break;default: /* can't happen */return -EINVAL;}if ((newpos<0) || (newpos>DEV_MEM_SIZE))return -EINVAL;filp->f_pos = newpos;return newpos;
}//===============缁撴瀯浣?椹卞姩鍚勫睘鎬?=========
static struct file_operations file_opt = {.owner=    THIS_MODULE,.llseek=  dx_llseek,.write=    dx_write,    .read=    dx_read,    .open=    dx_open,  .release=dx_release,
};
//----------------------------------------------------------------------
static int __init qudong_init(void)
{int ret;ret = register_chrdev(0, DEV_NAME, &file_opt);if(ret<0){printk(DEV_NAME " can't get major number\n");return 0;}major=ret;printk("dx module major number is %d\n", ret);return 0;
}
//-----------------------------------------------------------------------
static void __exit qudong_exit(void)
{/*娉ㄩ攢璁惧*/cdev_del(&cdev);//kfree(mem_devp);     /*閲婃斁璁惧缁撴瀯浣撳唴瀛?/unregister_chrdev_region(MKDEV(major,0),1);/*閲婃斁璁惧鍙?/printk("exit\n");
}
module_init(qudong_init);
module_exit(qudong_exit);
MODULE_LICENSE("GPL");/*浣跨敤鏉冮檺*/
MODULE_AUTHOR("Made in China  <china@hotmail.com>");/*浣滆€?/
MODULE_DESCRIPTION("s3c6410 Hypervisor Filesystem");/*鐗堟湰*/

View Code

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include<string.h>
int main()
{int fd0=0;int fd1=0;int ret=0;char bufw[100]={'\0'};char bufr[100]={'\0'};char bufw1[100]={'\0'};char bufr1[100]={'\0'};fd0=open("/dev/rw0",O_RDWR);if(fd0<0){perror("open error\n");return 0;}fd1=open("/dev/rw1",O_RDWR);if(fd1<0){perror("open error\n");return 0;}printf("Please input string:\n");scanf("%s",bufw);ret=write(fd0,bufw,strlen(bufw));if(ret<0){perror("write bufw error\n");return 0;}printf("burw====%s\n",bufw);printf("Please input string:\n");scanf("%s",bufw1);ret=write(fd1,bufw1,strlen(bufw1));if(ret<0){perror("write bufw1 error\n");return 0;}printf("burw1====%s\n",bufw1);int num0=strlen(bufw);printf("num0:%d\n",num0);lseek(fd0,-(num0),SEEK_CUR);//lseek(fd0,0,SEEK_CUR);ret=read(fd0,bufr,99);if(ret<0){perror("read bufr error\n");return 0;}printf("bufr====%s\n",bufr);int num1=strlen(bufw1);printf("num1:%d\n",num1);lseek(fd1,-(num1),SEEK_CUR);//lseek(fd1,0,SEEK_SET);ret=read(fd1,bufr1,99);if(ret<0){perror("read bufr1 error\n");return 0;}printf("bufr1====%s\n",bufr1);close(fd0);close(fd1);return 0;
}

View Code

Makefile文件:

## Makefile template.obj-m := qudong.o
UNAME := $(shell uname -r)
PWD := $(shell pwd)
ADVMOD := qudongdefualt:@make -C /lib/modules/$(UNAME)/build SUBDIRS=$(PWD) modulesclean:    @rm -f *.o    @rm -f *.ko@rm -f *.mod.c@rm -f .*.cmd@rm -rf .tmp_versions
#endif

View Code

转载于:https://www.cnblogs.com/linkong1081/p/3584365.html

ARMLinux 下驱动开发第三节相关推荐

  1. Linux下驱动开发

    Linux下驱动开发 1.简介   驱动,是指驱动计算机里软件的程序.驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息.驱动程序是操作系统与硬件连接的桥梁.   设备 ...

  2. Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

    一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...

  3. 如何正确入门Windows系统下驱动开发领域?

    [作者] 猪头三 作者网站: http://www.x86asm.com 原文链接: http://blog.csdn.net/Code_GodFather/...0/5975901.aspx [贡献 ...

  4. WinXP下USB驱动开发(一)

    目  录 第1节    概述.... 4 第2节       USB相关技术.... 4 2.1.      USB拓扑结构... 4 2.2.      USB数据流模式... 5 2.3.     ...

  5. 转:WinCE驱动开发问题精华集锦

    1.在应用程序中,如何向修改本机的ip 地址等网络参数,并使之立即生效?           网络设置保存在注册表中,位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\Tcp ...

  6. WinCE驱动开发问题精华集锦 [转]

    WinCE驱动开发问题精华集锦 [转] 原文  http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...

  7. linux驱动开发(转载自正点原子)

    一.Linux驱动开发思维 1.Linux下驱动开发直接操作寄存器不现实. 2.根据Linux下的各种驱动框架进行开发.一定要满足框架,也就是Linux下各种驱动框架的掌握. 3.驱动最终表现就是/d ...

  8. arm linux i2c 总线驱动,ARM-Linux中I2C总线驱动开发

    摘  要: 针对I2C总线的特点,Linux内核中定义了I2C驱动体系结构.在分析Linux的I2C总线驱动体系结构基础上,介绍了在S3C2410中设计I2C总线驱动的方法. 关键词: ARM-Lin ...

  9. 如何直接在Windows下进行ARM-Linux应用程序开发调试

    偷个懒,不安装虚拟机,直接在Windows下开发 ARM Linux应用程序. 友情提醒1:本篇适合在嵌入式软件开发已经有一定基础的读者. 1 缘由 在嵌入式行业摸爬滚打了八年有余,一直都没在Linu ...

最新文章

  1. 在Android工程中加入AIDL文件时,gen目录生成的文件报错-问题解决
  2. 【Linux】【服务器】 CentOS7下安装Redis详细过程步骤
  3. python递归函数代码_Python递归函数
  4. Pandas——loc、iloc、ix 函数区别
  5. PHPUnit-附录 A. 断言 (assert)
  6. [js高手之路]使用原型对象(prototype)需要注意的地方
  7. python sorted下标_Python学习教程(Python学习路线):第七天-字符串和常用数据结构
  8. STL map常用操作简介
  9. python访问网页被拒_Python Requests.get访问网页403错误
  10. 《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)
  11. Python字符串常用操作方法
  12. xcode9 免证书调试
  13. C#爬虫项目:SWorld阅读
  14. 漏型与源型、PNP与NPN
  15. IOI2017 Day1 Wiring 题解
  16. DSP28335学习记录(四)——ADC、DMA
  17. 《韩非子》——《孤愤》
  18. 赛尔无人机 | 航测新标杆 Phantom 4 RTK
  19. Pom 文件中 maven 依赖出现 omitted for conflict with ..... 问题解决
  20. 海伦公式求三角形垂线长度

热门文章

  1. 付出与收获对等的自然法则,执行力离开去做马上去做
  2. hdu1181(变形课)
  3. Win10系列:JavaScript动画3
  4. Android下查看共享库依赖项
  5. 上海滩引爆数据中心热潮
  6. UTC时间与当地时间的转换关系?
  7. BZOJ5249:[九省联考2018]IIIDX——题解
  8. Kafka Streams简介: 让流处理变得更简单
  9. centos 基础命令第一节
  10. 随机函数(Pascal入门)