本文介绍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. Linux Java环境搭建

    -------------------------网络配置-------------------------------1.配置DNS:vi /etc/resolv.confnameserver 19 ...

  2. oracle 分区表详解

    一.分区表的概述: Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任 ...

  3. C++之map使用

    解析文件或者字符串,一key跟keyvalue来存在map中,如下代码: test.h: #include <map>#include <vector> Class test ...

  4. 同时执行2条不同sql

    select * from  a: select *from b; 用分号结束.

  5. IDEA 安装插件报错 Plugin Lombok Plugin was not installed: Cannot download

    报错 解决 成功下载插件 3

  6. CSS Ul(列表样式)

    CSS Ul(列表样式) CSS列表属性作用如下: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 一.列表 在HTML中,有两种类型的列表: 无序列表 - 列表 ...

  7. 戴尔服务器使用omreport(OMSA)查看监控硬件信息

    安装OMSA wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash yum install -y n ...

  8. Job流程:提交MR-Job过程

    1.一个标准 MR-Job 的执行入口: //参数 true 表示检查并打印 Job 和 Task 的运行状况 System.exit(job.waitForCompletion(true) ? 0 ...

  9. [Deep Learning] 神经网络基础【转】

    本文转载自:http://www.cnblogs.com/maybe2030/p/5597716.html 阅读目录 1. 神经元模型 2. 感知机和神经网络 3. 误差逆传播算法 4. 常见的神经网 ...

  10. [BZOJ4552]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...