本文介绍Linux字符设备的静态注册方法,
其中涉及到的模块加载,不了解的可以先参考


1. 还是线上源代码:



//memdev.h

#ifndef _MEMDEV_H_

#define _MEMDEV_H_

 

#ifndef MEMDEV_MAJOR

#

#endif

 

#ifndef MEMDEV_NR_DEVS

#

#endif

 

#ifndef MEMDEV_SIZE

#

#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
< asm
/ io.h >

# include
< asm
/ system.h >

# include
< asm
/ uaccess.h >

# include
< linux / wait.h
>

# include
< linux / completion.h
>

 

# include
"memdev.h"

 

MODULE_LICENSE( "Dual BSD/GPL" );

 

static
int   mem_major = MEMDEV_MAJOR;

 

struct mem_dev
* mem_devp; /*设备结构体指针*/

 

struct cdev cdev;

 

/*文件打开函数*/

int mem_open(
struct inode * inode,
struct file * filp)

{

printk( "open own file\n" );

      ;

}

 

/*文件操作结构体*/

static
const struct file_operations mem_fops=

{

  .owner = THIS_MODULE,

  .open = mem_open,

};

 

/*设备驱动模块加载函数*/

static
int memdev_init( void )

{

   int result;

   int i;

 

  dev_t devno );

 

   /* 静态申请设备号*/

    result , "memdev" );

   if (result
< )

     return result;

 

   /*初始化cdev结构*/

  cdev_init( & cdev,
& mem_fops);

 

   /* 注册字符设备 */

  cdev_add( ), MEMDEV_NR_DEVS);

 

   return result;

}

 

/*模块卸载函数*/

static
void memdev_exit( void )

{

  cdev_del( & cdev);    /*注销设备*/

  unregister_chrdev_region(MKDEV(mem_major, ), );
/*释放设备号*/

}

 

module_init(memdev_init);

module_exit(memdev_exit);
 

#Makefile

ifneq ($(KERNELRELEASE),)

    obj-m := memdev.o

else

    KERNELDIR ?=/lib/modules/$(shell uname-r)/build

    PWD = $(shell pwd)

default:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

    rm memdev.mod*  module* memdev.o memdev.ko Module.*

endif

 
 
2. 测试
    首先先make下,生成memdev.ko
    然后insmod memdev.ko生成memdev模块
    创建设备节点:sudo mknod /dev/memdev_t c 200 0
    接下开使用设备文件
    下面是一个测试程序



  // memusr.c

#include
<stdio.h>

#include
<string.h>

 

int main()

{

    FILE *fp0;

    /*打开设备文件*/

    fp0 = fopen("/dev/memdev_t","r+");

    if (fp0
== NULL) {

        printf("Open Memdev0 Error!\n");

        return
-;

    }

}

 

 

 

 

 

 
编译运行,然后使用dmesg可以看到日志文件里输出
[38439.741816] Hello World!
[38657.654345] Goodbye
[40393.039520] open own file
 
记得要使用sudo 运行memusr   否则会显示设备打开失败。
 

Linux设备驱动——简单的字符驱动的更多相关文章

  1. linux驱动初探之字符驱动

    关键字:字符驱动.动态生成设备节点.helloworld linux驱动编程,个人觉得第一件事就是配置好平台文件,这里以字符设备,也就是传说中的helloworld为例~ 此驱动程序基于linux3. ...

  2. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】

    转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...

  3. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  4. MPU6050带字符驱动的i2c从设备驱动1

    开干: 1.闲言碎语 这个驱动,越写觉的越简单,入门难,入门之后感觉还好.Linux开发还是比较友好的. 2.编写MPU6050带字符驱动的i2c从设备驱动 要实现的功能就是,将MPU6050作为字符 ...

  5. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl 0. 导语 在嵌入式的道路上寻寻觅觅很久,进入嵌入式这个行业也有几年的时间了,从2011年后 ...

  6. linux设备驱动第二篇:构造和运行模块

      上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...

  7. 【转】linux设备驱动程序之简单字符设备驱动

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...

  8. linux设备驱动第三篇:如何实现一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  9. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

随机推荐

  1. Python3.x:代理ip刷点赞

    Python3.x:代理ip刷点赞 声明:仅供为学习材料,不允许用作商业用途: 一,功能: 针对某网站对企业自动刷点赞: 网站:https://best.zhaopin.com/ 二,步骤: 1,获取 ...

  2. 关于HttpRuntime.Cache的运用

    存Cache方法: HttpRuntime.Cache.Add( KeyName,//缓存名 KeyValue,//要缓存的对象 Dependencies,//依赖项 AbsoluteExpirati ...

  3. 20145335郝昊 Java学习心得 密码学代码复写

    20145335郝昊 Java学习心得 密码学代码复写 本学期我们学习了现代密码学这门课程,在上课的时候接触到了很多种类型的密码体制,对于一些典型很通用的密码体制有自己的学习和设计.不论是从密码体制还 ...

  4. arm-linux工具

    arm-linux工具的功能如下: arm-linux-addr2line 把程序地址转换为文件名和行号.在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上 ...

  5. COGS 197 [HAOI2008] 排名系统

    ★★★☆   输入文件:rank.in   输出文件:rank.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询 ...

  6. LeetCode—— Partition Equal Subset Sum

    Question Given a non-empty array containing only positive integers, find if the array can be partiti ...

  7. Maven 修改默认JDK版本

    方式1.修改maven全局jdk 修改 安装目录\maven2\conf\settings.xml <profiles> <profile> <id>jdk-1.6 ...

  8. springMVC多视图的支持

    1.在springmvc.xml中加上 <!-- 多视图的支持 --> <bean class="org.springframework.web.servlet.view. ...

  9. word2vector 使用方法 计算语义相似度

    参考:http://techblog.youdao.com/?p=915#LinkTarget_699word2vector是一个把词转换成词向量的一个程序,能够把词映射到K维向量空间,甚至词与词之间 ...

  10. awk字符串处理

    awk 字符串处理函数 awk提供了许多强大的字符串函数,见下表:awk内置字符串函数gsub(r,s)    在整个$0中用s替代rgsub(r,s,t)    在整个t中用s替代rindex(s, ...