Linux驱动开发: 杂项字符设备

DS小龙哥 2021-09-15 03:57:32
linux 开发 杂项 字符 驱动


 

一、什么是杂项设备?

        杂项设备(misc device)也是在嵌入式系统中用得比较多的一种设备驱动。

        在Linux内核的include\linux目录下有Miscdevice.h文件,misc设备定义及其内核提供的相关函数在这里。

        其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主设备10,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的。

        也就是说,misc设备其实也就是特殊的字符设备

        在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(miscdevice结构体表述)

        miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。

        所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。

        在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。

     miscdevice的API实现在drivers/char/misc.c中。

 

二、描述杂项设备的结构

内核用struct miscdevice的结构体来描述杂项设备:

struct miscdevice {

int minor; //次设备号,杂项设备的主设备?10 
const char *name; //设备的名称 
const struct file_operations *fops; //文件操作 
/* 下面的成员是供内核使用 ,驱动编写不需要理会 */
struct list_head list; //misc_list的链表头 
struct device *parent; //父设备 
struct device *this_device; //当前设备,是device_create的返回值 
}; 

        minor:次设备号,0~255,当传递255时候,会自动由内核分配一个可用次设备号。

        name:备名/dev/下的设备节点名。

        fops:文件操作方法指针。

特点:当安装此类驱动后,会在系统的/dev下生成相应的设备节点文件。

三、内核提供来编写杂项设备的API函数

3.1 注册函数

函数原型

int misc_register(struct miscdevice * misc)

头文件

#include <linux/miscdevice.h>

功能

注册一个杂项设备

参数

misc- 杂项设备的核心结构指针,

至少已经实现minor,name,fops三个成员。

返回值

0,表示注册成功;负数,注册失败。

 3.2 注销函数

函数原型

int misc_deregister(struct miscdevice *misc)

头文件

#include <linux/miscdevice.h>

功能

注销一个已经存在杂项设备

参数

misc,杂项设备的核心结构指针,已经注册的struct miscdevice结构。

返回值

0,表示注册成功;负数,注册失败。

四、杂项设备的设备号&特征

设备号是用来标志设备。分为设备号和此设备号。其中杂项设备的设备号如下:

主设备号:固定为10。

次设备号:0~255。

a.主设备号固定为10

b.注册后会自动在/dev/目录下生成设备文件

c.使用一个核心结构 struct miscdevice 封装起来了。

五、编写驱动程序

步骤如下

 1)先写一个模块基本代码
 2)增加设备模型所需要的头文件 
 3)在模块的初始化函数注册设备对应结构体
 4)在模块的出口注销设备对应的结构
 5)按照对应设备模型:注册函数需要的参数反向推出应该的结构体成员。
 

       针对杂项模型

1)定义一个struct miscdevice  ,并且填充 minor,fops,name成员

 2)定义一个 struct file_operations ,并且填充需要成员

 3)在初始化函数中调用misc_register注册一上步实现的 struct miscdevice 结构变量;

 4)在出口函数中调用misc_deregister注销一上步实现的 struct miscdevice 结构变量;

 5)写一个应用程序测试驱动是否按照自己想法运行,对比结果。

        最核心的工作在实现 file_operations 的接口函数,这些函数才是真正操作硬件的代码。其他的都模型代码。

六、杂项设备示例
6.1. 驱动程序代码清单

/*驱动代码 misc.c */
#include <linux/module.h> /* Needed by all modules */
#include <linux/init.h> /* Needed for the module-macros */
#include <linux/fs.h>
#include <linux/miscdevice.h>
static ssize_t misc_read (struct file *pfile, char __user *buff, size_t size, loff_t *off) {
printk(KERN_EMERG "line:%d,%s is call\n",__LINE__,__FUNCTION__);
return 0;
}
static ssize_t misc_write(struct file *pfile, const char __user *buff, size_t size, loff_t *off) {
printk(KERN_EMERG "line:%d,%s is call\n",__LINE__,__FUNCTION__);
return 0;
}
static int misc_open(struct inode *pinode, struct file *pfile) {
printk(KERN_EMERG "line:%d,%s is call\n",__LINE__,__FUNCTION__);
return 0;
}
static int misc_release(struct inode *pinode, struct file *pfile) {
printk(KERN_EMERG "line:%d,%s is call\n",__LINE__,__FUNCTION__);
return 0;
}
//文件操作方法:根据具体设备实现需要的功能
static const struct file_operations misc_fops = {

.read = misc_read,
.write = misc_write,
.release = misc_release,
.open = misc_open,
};
#define DEV_NAME "abc"
#if 1 
//C99 标准 新增加的结构体初始化方法,这种可以选其中部分进行初始化,初始化顺序不限
static struct miscdevice misc_dev = {

.fops = &misc_fops, /* 设备文件操作方法 */
.minor = 255, /* 次设备号 */
.name = DEV_NAME, /* 设备名/dev/下的设备节点名 */
};
#else 
//c89标准风格的结构体成员初始,只能按顺序初始化成员(做了解)
static struct miscdevice misc_dev = {

255, /* 次设备号 */
DEV_NAME, /* 设备名/dev/下的设备节点名 */
&misc_fops /* 设备文件操作方法 */
};
#endif
static int __init hello_init(void) {
misc_register(&misc_dev);
printk(KERN_EMERG "misc init \n");
return 0;
}
static void __exit hello_exit(void) {
misc_deregister(&misc_dev);
printk(KERN_EMERG "Goodbye,misc\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

6.2. 应用程序代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEV_NAME "/dev/abc"
int main(void)
{
char buf[] = {1, 0, 0, 0};
int i = 0;
int fd;
//打开设备文件 O_RDWR, O_RDONLY, O_WRONLY,
fd = open(DEV_NAME, O_RDWR);
if(fd < 0)
{
printf("open :%s failt!\r\n", DEV_NAME);
return -1;
}
//写数据到内核空间
write(fd, buf, 4);
//从内核空间中读取数据
read(fd, buf, 4);
//关闭设备
close(fd);
return 0;
}

6.3.  Makefile 代码 

obj-m := misc.o
KDIR := /home/work/linux-3.5
all:
make -C $(KDIR) M=$(PWD) modules
rm -f *.o *.mod.o *.mod.c *.symvers *.markers *.unsigned *.order *~
arm-linux-gcc app.c -o app
cp -f *.ko app /home/work/rootfs/root
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.markers *.unsigned *.order *~

 

版权声明
本文为[DS小龙哥]所创,转载请带上原文链接,感谢
https://xiaolong.blog.csdn.net/article/details/120298765

  1. spring教程极客学院,Java这些高端技术只有你还不知道,
  2. Spring事务扩展机制,2021大厂Java知识点总结 面试题解析!
  3. SpringSecurity如何实现加密和解码,Spring事务是如何传播的?
  4. Interviewer: do redis transactions satisfy atomicity?
  5. SpringSecurity如何實現加密和解碼,Spring事務是如何傳播的?
  6. Comment la sécurité printanière implémente - t - elle le chiffrement et le décodage, et comment les transactions printanières se propagent - elles?
  7. Spring transaction extension Mechanism, 2021 Big Plant Java Knowledge point Summary Interview Question Analysis!
  8. Spring Tutorial geek Academy, Java, ces technologies haut de gamme que vous ne connaissez pas encore,
  9. Sword finger offer plan 9 (dynamic programming medium version) -- Java
  10. 2020 Summary - don't worry about the present, don't worry about the future, Java Web interview questions
  11. Huawei cloud guassdb (for redis) released a new version, and the two core features were officially unveiled
  12. Utilisez @ async dans Spring boot pour effectuer des appels asynchrones et accélérer l'exécution des tâches!
  13. Méthodes de fonctionnement des tableaux couramment utilisées en javascript
  14. MySQL practice 45 lectures (21-25) - Notes
  15. Java programmers must master 10 open source tools!
  16. Enterprise Understanding Spring CIO
  17. tomcat常见面试题,聊聊你对分布式锁技术方案的理解,
  18. spring源码视频教程,我是如何收割多家大厂offer的?
  19. spring框架教程推荐,2021最新爱奇艺Java社招面试题目,
  20. tomcat常見面試題,聊聊你對分布式鎖技術方案的理解,
  21. Spring事務擴展機制,2021大廠Java知識點總結 面試題解析!
  22. Des questions d'entrevue communes à Tomcat pour discuter de votre compréhension de la technologie de verrouillage distribué,
  23. Java Development Interview Question with Answers, 2021 Big Factory Java Knowledge point Summary Interview Question Analysis!
  24. Android 400 questions d'entrevue pour vous aider à entrer dans l'usine, un tour pour vous apprendre à comprendre netty
  25. Les développeurs Java, les entretiens techniques avec le magnat d'Ali,
  26. Java + SSM Maotai Liquor e - commerce Platform for Computer Graduation DesignVente d'alcool
  27. spring框架教程推薦,2021最新愛奇藝Java社招面試題目,
  28. Recommandé pour le tutoriel Spring Framework, 2021 dernière question d'entrevue d'embauche de la société aiqiyi Java,
  29. Spring source Video tutoriel, comment récolter plusieurs grandes usines?
  30. Springcloud learning notes (I)
  31. Basic knowledge of hive (III) complete collection of functions in hive
  32. spring源碼視頻教程,我是如何收割多家大廠offer的?
  33. 【微信小程序】,看看最新BTA大厂的Java程序员的招聘技术标准,
  34. 【工作经验分享】,2021最新百度、头条等公司Java面试题目,
  35. 【微信小程序】,看看最新BTA大廠的Java程序員的招聘技術標准,
  36. [Widget Wechat] pour voir les dernières normes techniques de recrutement des programmeurs Java de BTA.
  37. Video | Tencent cloud enterprise MySQL (CDB) - dynamic thread pool function
  38. Upgrade your Linux PC hardware using open source tools
  39. RTFM! How to read (and understand) the magic man pages in Linux
  40. [partage d'expérience de travail], 2021 les dernières questions d'entrevue Java de Baidu, Headlines, etc.
  41. Java 16 is coming online. You can't even use the features of Java 8, can you?
  42. Java (3) basic data types and their type conversion
  43. 一位Java大牛的BAT面试心得与经验总结,2021年Java春招面试经历,
  44. 一举拿下腾讯美团滴滴offer,快来瞧瞧这份Spring面试小抄!
  45. 一个Java应届生从上海离职,万字长文总结Java多进程,
  46. Seven design principles of java object-oriented design pattern
  47. 一個Java應届生從上海離職,萬字長文總結Java多進程,
  48. Un nouvel étudiant Java a quitté Shanghai et a résumé plusieurs processus Java.
  49. Prenez d'un coup l'offre de Tencent meituan et jetez un coup d'oeil à cette copie de l'entrevue de printemps!
  50. L'expérience et l'expérience d'un Maverick Java en matière d'entrevue sur les MTD, l'expérience de l'entrevue d'embauche du printemps Java en 2021,
  51. Interface graphique X: mise à jour des tables de rendu et optimisation du Code (compilation intégrée 10)
  52. Widget de vérification de fichiers personnalisés Linux
  53. Java thread pool - work queue
  54. [Part 7] - Summary of B2B2C e-commerce technology of spring cloud live mall managed by git branch
  55. Reflection type of Java Foundation
  56. Want to get started with data structures, but always fall under the pomegranate skirt of the linked list?
  57. Interviewer: do redis transactions satisfy atomicity?
  58. 一篇文章教你搞定计算机网络面试,350道Java面试真题分享,
  59. 一条正确的Java职业生涯规划,揭秘今年Java春招面试必问问题有哪些?
  60. 一名毕业三年的女程序媛面试头条经验,关于Redis主从节点数据过期一致性的思考,