杂项设备

linux里面的misc杂项设备是主设备号为10的驱动设备,misc设备其实也就是特殊的字符设备,可自动生成设备节点。
定义头文件<linux/miscdevice.h>
杂项设备的结构体:
struct miscdevice{int minor; //杂项设备的此设备号(如果设置为MISC_DYNAMIC_MINOR,表示系统自动分配未使用的minor)const char *name;const stuct file_operations *fops;//驱动主题函数入口指针struct list_head list;struct device *parent;struct device *this device;const char *nodename;(在/dev下面创建的设备驱动节点)mode_t mode;
}; 

注册和释放
注册:int misc_register(struct miscdevice *misc)
释放:int misc_deregister(struct miscdevice *misc)
misc_device是特殊字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_creat或者device_creat().
杂项字符设备和一般字符设备的区别:
1.一般字符设备首先申请设备号。  但是杂项字符设备的主设备号为10次设备号通过结构体struct miscdevice中的minor来设置。
2.一般字符设备要创建设备文件。 但是杂项字符设备在注册时会自动创建。
3.一般字符设备要分配一个cdev(字符设备)。  但是杂项字符设备只要创建struct miscdevice结构即可。
4.一般字符设备需要初始化cdev(即给字符设备设置对应的操作函数集struct file_operation). 但是杂项字符设备在结构体truct miscdevice中定义。
5.一般字符设备使用注册函数 int cdev_add struct (cdev *p,devt_t dev, unsigned)(第一个参数为之前初始化的字符设备,第二个参数为设备号,第三个参数为要添加设备的个数) 而杂项字符设备使用int misc_register(struct miscdevice *misc)来注册
驱动调用的实质:
就是通过 设备文件找到与之对应设备号的设备,再通过设备初始化时绑定的操作函数硬件进行控制

  1 #include <linux/miscdevice.h>
  2 #include <linux/delay.h>
  3 #include <asm/irq.h>
  4 #include <mach/regs-gpio.h>
  5 #include <mach/hardware.h>
  6 #include <linux/kernel.h>
  7 #include <linux/module.h>
  8 #include <linux/init.h>
  9 #include <linux/mm.h>
 10 #include <linux/fs.h>
 11 #include <linux/types.h>
 12 #include <linux/delay.h>
 13 #include <linux/moduleparam.h>
 14 #include <linux/slab.h>
 15 #include <linux/errno.h>
 16 #include <linux/ioctl.h>
 17 #include <linux/cdev.h>
 18 #include <linux/string.h>
 19 #include <linux/list.h>
 20 #include <linux/pci.h>
 21 #include <linux/gpio.h>
 22 #include <asm/uaccess.h>
 23 #include <asm/atomic.h>
 24 #include <asm/unistd.h>
 25
 26
 27 #define DEVICE_NAME "leds"
 28
 29 #define IOCTL_LED_ON 1
 30 #define IOCTL_LED_OFF 0
 31
 32 static unsigned long led_table [] =
 33 {
 34 S3C2410_GPB(5),
 35 S3C2410_GPB(6),
 36 S3C2410_GPB(7),
 37 S3C2410_GPB(8),
 38 };
 39
 40 static unsigned int led_cfg_table [] =
 41 {
 42 S3C2410_GPIO_OUTPUT,
 43 S3C2410_GPIO_OUTPUT,
 44 S3C2410_GPIO_OUTPUT,
 45 S3C2410_GPIO_OUTPUT,
 46 };
 47
 48 static int gt2440_leds_ioctl(
 49 // struct inode *inode,
 50 struct file *file,
 51 unsigned int cmd,
 52 unsigned long arg)
 53 {
 54 if (arg > 4)
 55 {
 56 return -EINVAL;
 57 }
 58
 59 switch(cmd)
 60 {
 61 case IOCTL_LED_ON:
 62 // 设置指定引脚的输出电平为0
 63 s3c2410_gpio_setpin(led_table[arg], 0);
 64 return 0;
 65
 66 case IOCTL_LED_OFF:
 67 // 设置指定引脚的输出电平为1
 68 s3c2410_gpio_setpin(led_table[arg], 1);
 69 return 0;
 70
 71 default:
 72 return -EINVAL;
 73 }
 74 }
 75
 76 static struct file_operations dev_fops = {
 77 .owner = THIS_MODULE,
 78 .unlocked_ioctl =  gt2440_leds_ioctl,
 79 };
 80
 81 static struct miscdevice misc = {
 82 .minor = MISC_DYNAMIC_MINOR,
 83 .name = DEVICE_NAME,
 84 .fops = &dev_fops,
 85 };
 86
 87 static int __init dev_init(void)
 88 {
 89 int ret;
 90
 91 int i;
 92 for (i = 0; i < 4; i++)
 93 {
 94 s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
 95 s3c2410_gpio_setpin(led_table[i], 0);
 96 }
 97
 98 ret = misc_register(&misc);
 99
100 printk (DEVICE_NAME" initialized\n");
101
102 return ret;
103 }
104
105 static void __exit dev_exit(void)
106 {
107 misc_deregister(&misc);
108 }
109
110 module_init(dev_init);
111 module_exit(dev_exit);
112
113 MODULE_LICENSE("GPL");
114 MODULE_AUTHOR("www.e-online.cc");
115 MODULE_DESCRIPTION("LEDS control for GT2440 Board");

View Code

转载于:https://www.cnblogs.com/kwseeker-bolgs/p/4472438.html

Linux驱动设计——字符杂项设备相关推荐

  1. Linux驱动(14)--字符类设备与驱动

    字符类设备 1. 静态申请字符类设备号 1.1 所需函数与头文件 1.2 源码与注释 1.3 运行结果 2. 动态申请字符类设备号 2.1 所需函数与头文件 2.2 源码与注释 2.3 运行结果 3. ...

  2. linux misc device字符杂项设备驱动

    杂项设备也是在嵌入式系统中用得比较多的一种设备驱动.miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同.misc设备其实就是特殊的字符设备,主设备编号采用10,并且可自 ...

  3. linux 杂项设备,Linux下自动创建节点的字符杂项设备 misc_register

    Linux下自动创建节点的字符杂项设备 misc_register admin • 2020 年 01 月 07 日 杂项设备 Linux里面的misc杂项设备是主设备号为10的驱动设备 定义头文件: ...

  4. 【linux驱动之字符设备驱动基础】

    linux驱动之字符设备驱动基础 文章目录 linux驱动之字符设备驱动基础 前言 一.开启驱动学习之路 二.驱动预备知识 三.什么是驱动? 3.1 驱动概念 3.2 linux 体系架构 3.3 模 ...

  5. linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...

    原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...

  6. linux驱动之字符设备

    linux驱动之字符设备 linux驱动设备分类 linux驱动分为了三种驱动: 字符设备: 字符设备和应用程序之间是以字节进行进行数据交换的.在进行数据交换的时候数据是以一定顺序进行传输的,传输是实 ...

  7. Linux驱动之 字符设备 ioctl接口使用

    字符设备ioctl接口使用: Linux驱动编写除了对设备进行读写数据之外,通常还希望可以对设备进行控制. 从应用层传递一些命令参数,并在驱动层实现相应设备操作,这时候就用到了 ioctl函数: 应用 ...

  8. Linux驱动之字符设备驱动

    系列文章目录 第一章 Linux入门之驱动框架 第二章 Linux驱动之字符设备驱动 文章目录 系列文章目录 前言 一.认识字符设备驱动 1.基本概念 2.基本概念 二.字符设备旧框架 1.注册和注销 ...

  9. Linux驱动设计——硬件基础

    Linux 驱动设计之硬件基础 0.开篇说明 本片内容主要来源于宋宝华老师<Linux设备驱动开发> 1.处理器 目前主流的通用处理器(GPP)多采用SoC(片上系统)的芯片设计方法,集成 ...

最新文章

  1. 编程语言java-并发(锁)
  2. golang中的接口
  3. spring里头各种获取ApplicationContext的方法
  4. boost::describe模块实现string转enum的测试程序
  5. Python 列表List的定义及操作
  6. 关于显示和隐藏DIV标签
  7. 8位二进制数的原码、反码、补码以及它能表示的范围
  8. 全面质量管理体系方案
  9. php环境搭建phpeclipse
  10. 向量空间的基和维数例题_向量空间的基与维数.ppt
  11. SpringBoot整合腾讯云COS
  12. 外部方式启动AndroidStudio模拟器
  13. 怎么用diskgenius扩大c盘,超简单。
  14. Keras.metrics中的 accuracy 总结
  15. 数据标注工具下载中遇到的各种问题
  16. linux shell编程从入门到精通pdf_SHELL脚本编程入门
  17. 文件目录自动生成工具--Dir Tree Noter
  18. 用户管理“明星”工具——在线客服系统
  19. 使用 gitbook 制作 pdf 电子书
  20. 防止进入后含有edittext的界面自动弹出软件盘

热门文章

  1. Hyperledger Fabric 1.0 实战开发系列 第一课 系统环境搭建
  2. mysql sail_MySQL使用小记
  3. Syszuxpin中文输入法移植
  4. mysql sys exec_mysql提权lib_mysqludf_sys执行sys_exec出现32256的问题解决办法
  5. Too many files open; check that FILES = 20 in your CONFIG.SYS file 解决方案
  6. ECCV 2020《Linguistic Structure Guided Context Modeling for Referring Image Segmentation》论文笔记
  7. 51单片机的配p10端口c语言,stc12c5a16s2的单片机的p5口做普通端口怎么定义?
  8. ssh 与 telnet 有何不同?_Secure Shell(SSH)介绍
  9. 20210614 什么是状态?什么是状态空间?
  10. [Java复习02] 集合框架 Collection