memdev.h文件示例代码如下:
#ifndef _MEMDEV_H
#define _MEMDEV_H
//采用静态分配设备号
#ifndef MEMDEV_MAJOR
#define MEMDEV_MAJOR 260
#endif
#ifndef MEMDEV_NR_DEVS
#define MEMDEV_NR_DEVS 2
#endif
#ifndef MEMEV_SIZE
#define MEMDEV_SIZE 4096
#endif
struct mem_dev{
char *data;
unsigned long size;
};
#endif
memdev.c文件示例代码如下:
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include "memdev.h"
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Retacn Yue");
MODULE_DESCRIPTION("memdev module");
MODULE_ALIAS("memdev module");
static int mem_major=MEMDEV_MAJOR;
module_param(mem_major,int,S_IRUGO);
struct mem_dev *mem_devp;
struct cdev cdev;
/*初始化*/
int mem_open(struct inode *inode,struct file *filp){
struct mem_dev *dev;
int num=MINOR(inode->i_rdev);
if(num>MEMDEV_NR_DEVS){
return -ENODEV;
}
dev=&mem_devp[num];
filp->private_data=dev;
return 0;
}
/*关闭释主资源*/
int mem_release(struct inode *inode,struct file *flip){
return 0;
}
/*从字符设备读取数据*/
static ssize_t mem_read(struct file *filp,char __user *buff,size_t
size,loff_t *poss){
unsigned long p=*poss;
unsigned int count=size;
int ret=0;
struct mem_dev *dev=filp->private_data;
if(p>=MEMDEV_SIZE)
return 0;
if(count>MEMDEV_SIZE-p)
count=MEMDEV_SIZE-p;
if(copy_to_user(buff,(void*)(dev->data+p),count)){
ret=-EFAULT;
}else{
*poss+=count;
ret=count;
printk(KERN_INFO "read %d bytes form %lu\n",count,p);
}
return 0;
}
/*向字符设备发送数据*/
static ssize_t mem_write(struct file *filp,const char __user
*buf,size_t size,loff_t *poss){
unsigned long p=*poss;
unsigned int count=size;
int ret=0;
struct mem_dev *dev=filp->private_data;
if(p>=MEMDEV_SIZE)
return 0;
if(count>MEMDEV_SIZE-p)
count=MEMDEV_SIZE-p;
if(copy_from_user(dev->data+p,buf,count)){
ret=-EFAULT;
}else{
*poss+=count;
ret=count;
printk(KERN_INFO "write %d bytes from %lu\n",count,p);
}
return 0;
}
/*修改文件当前读写位置*/
static loff_t mem_llseek(struct file *filp,loff_t offset, int whence){
loff_t newpos;
switch(whence){
case 0:
newpos=offset;
break;
case 1:
newpos=filp->f_pos+offset;
break;
case 2:
newpos=MEMDEV_SIZE-1+offset;
break;
default:
return -EINVAL;
}
if((newpos<0)||(newpos>MEMDEV_SIZE))
return -EINVAL;
filp->f_pos=newpos;
return 0;
}
/*应用程序在设备上调用的所有操作*/
static const struct file_operations mem_fops={
.owner=THIS_MODULE,
.llseek=mem_llseek,
.read=mem_read,
.write=mem_write,
.open=mem_open,
.release=mem_release
};
/*初始化方法 :分配设备号
字符设备注册
*/
static int memdev_init(void){
int result;
int i;
dev_t devno=MKDEV(mem_major,0);
/*静态分配*/
if(mem_major){
result=register_chrdev_region(devno,2,"memdev");
}
/*动态分配*/
else{
result=alloc_chrdev_region(&devno,0,2,"memdev");
mem_major=MAJOR(devno);
}
if(result<0)
return result;
/*初始化*/
cdev_init(&cdev,&mem_fops);
cdev.owner=THIS_MODULE;
cdev.ops=&mem_fops;
/*添加设备文件*/
cdev_add(&cdev,MKDEV(mem_major,0),MEMDEV_NR_DEVS);
mem_devp=kmalloc(MEMDEV_NR_DEVS * sizeof(struct
mem_dev),GFP_KERNEL);
if(!mem_devp){
result=-ENOMEM;
goto fail_malloc;
}
memset(mem_devp,0,MEMDEV_NR_DEVS * sizeof(struct mem_dev));
for(i=0;i<MEMDEV_NR_DEVS;i++){
mem_devp[i].size=MEMDEV_SIZE;
mem_devp[i].data=kmalloc(MEMDEV_SIZE,GFP_KERNEL);
memset(mem_devp[i].data,0,MEMDEV_SIZE);
}
return 0;
fail_malloc:
unregister_chrdev_region(devno,2);
return result;
}
static void memdev_exit(void){
cdev_del(&cdev);
kfree(mem_devp);
unregister_chrdev_region(MKDEV(mem_major,0),2);
}
module_init(memdev_init);
module_exit(memdev_exit);
makefile文件示例代码如下:
ifneq ($(KERNELRELEASE),)
obj-m:=memdev.o
else
KERNELDIR:=/opt/FriendlyARM/mini6410/linux/linux-2.6.38
PWD:=$(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm
CROSS_COMPILE=arm-linux-
clean:
rm -fr *.ko *.o *.mod.c *mod.o *.symvers
endif
编译:make
生成memdev.ko文件下载到开发板/lib/modules/
加载模块
[root@FriendlyARM modules]# lnsmod memdev.ko
查看设备节点
[root@FriendlyARM modules]# cat /proc/devices
创建设备文件
[root@FriendlyARM modules]# cd /dev
[root@FriendlyARM dev]# mknod memdev0 c 260 0
测试字符设备驱动
示例代码如下:
/*测试字符设备驱动*/
int main(){
int fd;
char buf[4096];
strcpy(buf,"this is a example of charactar devices driver");
printf("buf:%s\n",buf);
fd=open("/dev/memdev0",O_RDWR);
if(fd==-1){
printf("open memdev failed!\n");
return -1;
}
write(fd,buf,sizeof(buf));
lseek(fd,0,SEEK_SET);
strcpy(buf,"nothing");
read(fd,buf,sizeof(buf));
printf("buf:%s\n",buf);
return 0;
}
编译:
[root@localhost memdev]# arm-linux-gcc -o memdevapp memdevapp.c
将生成的memdevapp下载到开发板,运行应用程序
[root@FriendlyARM plg]# ./memdev/app
运行结果如下:
[root@FriendlyARM plg]# ./memdevapp
buf:this is a example of charactar devices driverwrite 4096 bytes from
0
read 4096 bytes form 0
buf:this is a example of charactar devices driver
- 浏览: 263253 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2429Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1325U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1140Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1287链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1041DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 962Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2183安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1367linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 890linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 755字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 589竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 813用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83712m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1167串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10781 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 973嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 425画个草图也挺过瘾 -
进程间通信学习笔记一(管道通信)
2013-02-01 20:08 1418进程间通信(ipc) 应用场景: 数据传输 资源共享 通知事件 ... -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 793信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ... -
进程间通信学习笔记三(共享内存通信)
2013-02-16 21:40 609共享内存通信 被多个进程共享的一部分物理内存,是进程间共享数据 ...
相关推荐
Linux 字符设备驱动程序学习笔记 Linux 字符设备驱动程序是 Linux 操作系统中的一种驱动程序,负责管理字符设备的输入和输出操作。字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常...
Linux 字符设备驱动学习笔记 本文档主要讲述 Linux 字符设备驱动学习笔记,涵盖了设备文件、主次设备号、字符设备驱动中的数据结构等知识点。 一、 设备文件 设备文件是一种特殊类型的文件,用来代表一个设备。...
"Linux内核与设备驱动程序学习笔记"可能包含了以下内容: 1. **内核模块**:内核模块是可加载到运行中的内核中的代码段,允许用户动态添加或移除设备驱动。这使得系统可以在需要时加载特定驱动,节省内存。 2. **...
这篇“字符设备驱动学习笔记(2.6.23)”文档针对的是Linux内核版本2.6.23,这可能是2007年的内核版本,当时Linux系统已经相当成熟,但相对于最新的内核版本,它可能不包含一些新特性或优化。 学习Linux字符设备驱动...
《Linux设备驱动程序(2)-字符设备驱动程序》将介绍如何实现基本的字符设备驱动,包括设备节点创建、打开、关闭、读写等操作。 3. **高级字符驱动程序操作**:在《Linux设备驱动程序(7)-高级字符驱动程序操作2》...
学习Linux设备驱动程序是深入了解Linux操作系统工作原理的重要步骤,同时也是嵌入式系统开发中不可或缺的知识。 首先,设备驱动程序在Linux内核中扮演着特殊的角色。它是硬件与内核之间的中介,使得硬件能够响应一...
在字符设备驱动中,有三个重要的数据结构体:`struct inode`、`struct file_operations`和`struct file`。`struct inode`描述了文件的元数据,如权限、大小等;`struct file_operations`包含了针对设备文件的一系列...
"3char"可能涉及字符设备驱动,这是驱动开发中最基础的部分。"9udev_misc"可能涉及udev设备管理系统,它管理Linux中的动态设备。最后,"8linuxmodel"可能探讨的是Linux内核模型,如模块化内核或静态内核的选择。 ...
### Windows驱动程序开发学习笔记知识点解析 #### 一、Windows驱动程序开发概述 - **学习背景**: 学习者最初接触Windows驱动程序开发时遇到不少困难,经历了一段时间的摸索后逐渐入门。这一过程中,作者参考了...
本文主要讲述了s3c2440 Linux设备驱动开发过程中的重要细节,包括字符设备驱动程序的设计、实现和测试。下面是相关知识点的总结: 1. 设备驱动程序的基本结构: 在Linux设备驱动程序中,需要定义一个结构体file_...
《Linux设备驱动程序学习》是一本深入探讨Linux操作系统下设备驱动程序开发的教程,共170页。这本书旨在帮助读者理解Linux内核与设备之间的交互机制,掌握编写高效、稳定设备驱动的基本技能。标签“Linux 设备驱动 ...
本学习笔记主要关注Linux环境下对设备驱动程序的构建和优化,这是一门涉及多方面知识的综合学科。 首先,我们要理解Linux设备驱动的基本概念。在Linux系统中,设备驱动是操作系统内核的一部分,它提供了与硬件设备...
3. **字符设备驱动**:这是最基本的设备驱动类型,适用于打印机、键盘等简单设备。你将学习到如何注册和注销字符设备,以及如何实现`open`、`read`、`write`等操作函数。 4. **块设备驱动**:块设备驱动用于硬盘、...
以上就是《Linux设备驱动程序》第三版学习笔记的主要内容,涵盖了Linux驱动开发的各个方面。通过深入学习和实践,你可以掌握构建高效、可靠的Linux驱动程序的技巧,为你的Linux开发事业奠定坚实的基础。
这份"Linux设备驱动程序笔记"深入浅出地讲解了如何编写和理解这些程序,对于学习Linux内核机制和提升系统开发能力具有极大价值。 笔记可能涵盖了以下几个核心知识点: 1. **设备模型**:Linux设备模型提供了一种...
以下是 Linux Kernel 的学习笔记,涵盖了存储器寻址、设备驱动程序开发、字符设备驱动程序、PCI 设备、内核初始化优化宏、访问内核参数的接口、内核初始化选项、内核模块编程和网络子系统等方面的知识点。...