1. mycdev.c

 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/cdev.h>
 #include <linux/fs.h>

 #define MAJOR_NUM 250

 struct mycdev
 {
     struct cdev cdev;
 };

 int mycdev_open(struct inode *inode, struct file *file)
 {
     printk("Call mycdev_open()\n");
     ;
 }

 struct file_operations fops = {
     .owner = THIS_MODULE,
     .open = mycdev_open,
 };

 struct mycdev mycdev;

 int mycdev_init(void)
 {
     ;
     dev_t dev;

     dev = MKDEV(MAJOR_NUM, );
     ret = register_chrdev_region(dev, , "mycdev");
     )
     {
         printk("register_chrdev_region() error\n");
         goto err_register_chrdev_region;
     }

     cdev_init(&(mycdev.cdev), &fops);

     ret = cdev_add(&(mycdev.cdev), dev, );
     )
     {
         printk("cdev_add() error\n");
         goto err_cdev_add;
     }

     printk("mycdev_init()\n");
     ;

 err_cdev_add:
     unregister_chrdev_region(dev, );

 err_register_chrdev_region:
     return ret;
 }

 void mycdev_exit(void)
 {
     dev_t dev = mycdev.cdev.dev;

     cdev_del(&(mycdev.cdev));
     unregister_chrdev_region(dev, );

     printk("mycdev_exit()\n");
     return;
 }

 module_init(mycdev_init);
 module_exit(mycdev_exit);

 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("GNB");

2. Makefile

 KERNEL_DIR = /lib/modules/$(shell uname -r)/build
 PWD = $(shell pwd)

 ifneq ($(KERNELRELEASE),)

 obj-m := mycdev.o

 else

 .PHONY:default clean

 default:
     $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

 clean:
     $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean

 endif

3. 应用层app

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main(int argc, const char *argv[])
 {
     int fd;

     fd = open("/dev/mycdev",O_RDONLY);
     printf("fd = %d\n",fd);
     );

     ;
 }

4. 加载驱动

sudo insmod mycdev.ko

5. 创建设备节点,并指定权限

sudo mknod /dev/mycdev c 250 0

sudo chmod 666 /dev/mycdev

6. 测试字符设备

cat /dev/mycdev

echo "hello world" > /dev/mycdev

05 Linux字符驱动---静态注册的更多相关文章

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

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

  2. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read、write

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read.write 0. 导语 在上一篇博客里面,基于OMAPL138的字符驱动_GPIO驱动AD9833(一)之 ...

  3. linux 字符驱动框架(用户态的read,write,poll是怎么操作驱动的)

    前言 这篇文章是通过对一个简单字符设备驱动的操作来解释,用户态的读写操作是怎么映射到具体设备的. 因为针对不同版本的linux内核,驱动的接口函数一直有变化,这贴出我测试的系统信息: root@ubu ...

  4. linux 字符驱动

    1 结构体说明:     struct cdev {         struct kobject kobj;          // 每一个 cdev 都是一个 kobject         st ...

  5. linux字符驱动之poll机制按键驱动

    在上一节中,我们讲解了如何自动创建设备节点,实现一个中断方式的按键驱动.虽然中断式的驱动,效率是蛮高的,但是大家有没有发现,应用程序的死循环里的读函数是一直在读的:在实际的应用场所里,有没有那么一种情 ...

  6. [S5PV210 Linux字符驱动之PWM蜂鸣器驱动

    在SMDK210.C中添加如下beeper_device 结构体 static struct platform_device beeper_device = { .name = "pwm_b ...

  7. 基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ

    基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ 0. 导语 学习进入到了下一个阶段,还是以AD9833为例,这次学习是向设备申请中断,实现触发,在未来很多场景,比如做用 ...

  8. 旧接口注册LED字符驱动设备(静态映射)

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  9. 驱动开发学习笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

    驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Doc ...

随机推荐

  1. php使用curl提交xml数据

    $xml_data ='<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_ ...

  2. Mysql程序

    drop table if exists comp_ap; create table comp_ap as select ProjectName, ModelCode, 'AP_ACMClosed' ...

  3. 【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)

    1.前言 我使用的是USB转串口,芯片是PL2303,貌似ubuntu自带了PL2303的USB驱动,可以直接使用,其它的USB转串口的没试过. 2.minicom安装 在终端中输入 : sudo a ...

  4. cakephp 的事件系统(Getting to grips with CakePHP’s events system), 基于观察者模式

    This article was written about CakePHP 2.x and has been untested with CakePHP 3.x CakePHP seems to g ...

  5. android 画图之setXfermode .

    setXfermode 设置两张图片相交时的模式 我们知道 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状. 如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint: 而 ...

  6. Rails (堆栈)<数据结构>

    题意:<看图片> 解题思路:栈的简单应用: #include<iostream> #include<stack> #include<algorithm> ...

  7. (转)MATLAB入门教程

    MATLAB入门教程   1.MATLAB的基本知识 1-1.基本运算与函数    在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可.例如: ...

  8. bootstrap-table 表头和内容对不齐解决办法

    偶然机会学习bootstrap,表格利用bootstrap-table实现,使用bootstrap-table过程中,发现了一个非常棘手的问题,在ie浏览器中,表格的表头和内容对不齐,特别是列比较多且 ...

  9. 数据同步方案(附Java源码)

    一.问题背景经常碰到要同步数据的情况,而系统自带的复制功能又不能实现增量同步,每次都要做全量复制,发生异常情况后只能重头再来,非常麻烦,优其是对那种大文件的处理,更是耗时.二.解決方案1.计算源目录数 ...

  10. Android 各层中日志打印功能的应用

    1. HAL层 头文件:#include <utils/Log.h> 对应的级别 打印方法 VERBOSE LOGV()DEBUG LOGD()INFO LOGI()WARN LOGW() ...