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. Css span div

    SPAN元素和DIV元素有什么区别 解决思路: 最明显的区别是:DIV是块元素,SPAN是内嵌元素.块元素相当于内嵌元素在前后各加一个<br>换行.其实,块元素和行内元素也不是一成不变的, ...

  2. JS读RSS

    <html>  <head>   <title>javascript读取RSS数据</title>   <META content="t ...

  3. Android开源项目收集

    软件名:gaeproxy软件作用:Android手机配置GoAgentFQ.项目地址:https://github.com/madeye/gaeproxy.git 软件名:ProxyDroid软件作用 ...

  4. 2.1Android界面View及ViewGroup(转)

    2.1Android界面View及ViewGroup 2.1.0 View及ViewGroup类关系Android View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,V ...

  5. mystring c++ 自己的string 封装

    1 /************************************************************************* > File Name: mystrin ...

  6. 原创:LoadTest系列之Local.testtings之Web Test

    在录制脚本后,需要对脚本进行回放,而在Loal.testting的Web Test设置中,可以设置脚本运行的次数,以及是否考虑think time等,如下图所示: 1. 双击Solution Item ...

  7. memory runs at single channel问题解决

    memory runs at single channel 解决方案:开机后按DEL ,然后进入BIOS 选择第一项,回车! advanced下面的有个momori什么什么的,选择disable. m ...

  8. mysql优化---优化工具MySQL performance tuning primer script

    MySQL performance tuning primer script一个简单好用的mysql优化工具,其实一个shell脚本 下载: $ wget http://www.day32.com/M ...

  9. ural1521 War Games 2

    War Games 2 Time limit: 1.0 secondMemory limit: 64 MB Background During the latest war games (this s ...

  10. openstack创建实例测试步骤

    source admin-openrc.shkeystone user-create --name=demo --pass=123456keystone tenant-create --name=de ...