ARMLinux 下驱动开发第三节
#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 下驱动开发第三节相关推荐
- Linux下驱动开发
Linux下驱动开发 1.简介 驱动,是指驱动计算机里软件的程序.驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息.驱动程序是操作系统与硬件连接的桥梁. 设备 ...
- Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)
一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...
- 如何正确入门Windows系统下驱动开发领域?
[作者] 猪头三 作者网站: http://www.x86asm.com 原文链接: http://blog.csdn.net/Code_GodFather/...0/5975901.aspx [贡献 ...
- WinXP下USB驱动开发(一)
目 录 第1节 概述.... 4 第2节 USB相关技术.... 4 2.1. USB拓扑结构... 4 2.2. USB数据流模式... 5 2.3. ...
- 转:WinCE驱动开发问题精华集锦
1.在应用程序中,如何向修改本机的ip 地址等网络参数,并使之立即生效? 网络设置保存在注册表中,位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\Tcp ...
- WinCE驱动开发问题精华集锦 [转]
WinCE驱动开发问题精华集锦 [转] 原文 http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...
- linux驱动开发(转载自正点原子)
一.Linux驱动开发思维 1.Linux下驱动开发直接操作寄存器不现实. 2.根据Linux下的各种驱动框架进行开发.一定要满足框架,也就是Linux下各种驱动框架的掌握. 3.驱动最终表现就是/d ...
- arm linux i2c 总线驱动,ARM-Linux中I2C总线驱动开发
摘 要: 针对I2C总线的特点,Linux内核中定义了I2C驱动体系结构.在分析Linux的I2C总线驱动体系结构基础上,介绍了在S3C2410中设计I2C总线驱动的方法. 关键词: ARM-Lin ...
- 如何直接在Windows下进行ARM-Linux应用程序开发调试
偷个懒,不安装虚拟机,直接在Windows下开发 ARM Linux应用程序. 友情提醒1:本篇适合在嵌入式软件开发已经有一定基础的读者. 1 缘由 在嵌入式行业摸爬滚打了八年有余,一直都没在Linu ...
最新文章
- 在Android工程中加入AIDL文件时,gen目录生成的文件报错-问题解决
- 【Linux】【服务器】 CentOS7下安装Redis详细过程步骤
- python递归函数代码_Python递归函数
- Pandas——loc、iloc、ix 函数区别
- PHPUnit-附录 A. 断言 (assert)
- [js高手之路]使用原型对象(prototype)需要注意的地方
- python sorted下标_Python学习教程(Python学习路线):第七天-字符串和常用数据结构
- STL map常用操作简介
- python访问网页被拒_Python Requests.get访问网页403错误
- 《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)
- Python字符串常用操作方法
- xcode9 免证书调试
- C#爬虫项目:SWorld阅读
- 漏型与源型、PNP与NPN
- IOI2017 Day1 Wiring 题解
- DSP28335学习记录(四)——ADC、DMA
- 《韩非子》——《孤愤》
- 赛尔无人机 | 航测新标杆 Phantom 4 RTK
- Pom 文件中 maven 依赖出现 omitted for conflict with ..... 问题解决
- 海伦公式求三角形垂线长度