Linux杂项设备驱动

2023-11-18

一、概念
        杂项设备是一种特殊的字符设备,在linux2.6之后出现,与platform虚拟总线相关。通常嵌套在 platform 总线驱动中,实现复杂的驱动。其主设备号固定为10,设备注册是用主设备号10来调用register_chrdev()来实现。调用class_create()和device_create()为每个杂项设备创建设备类和设备节点。杂项设备是对字符设备驱动的再次封装,降低了字符设备驱动的难度,同时节约了主设备号资源。

二、字符设备与杂项设备实现对比

1、字符设备驱动开发流程:
1)构造flie_operations结构体,其包含字符设备操作函数的集合;
2)实现flie_operations结构体中字符设备操作函数,如open/read/write/ioctl/release等;
3)构造设备号:MKDEV(int major,int minor);
4)将设备号注册到系统:支持静态申请register_chrdev_region或动态申请alloc_chrdev_region;
5)字符设备结构体cdev初始化,建立cdev和file_operations之间的连接:cdev_init;
6)内核注册一个struct cdev结构体,cdev_add;
7)创建设备文件:
手动创建:mknod filename type major minor
自动创建:先调用class_create创建设备类,再调用device_create创建设备节点;
8)告诉内核模块入口函数与出口函数:
static int __init xxx_init(void); 
static void __exit xxx_exit(void);
9)传统的创建设备过程

alloc_chrdev_region(); /* 申请设备号 */
cdev_init(); /* 初始化 cdev */
cdev_add(); /* 添加 cdev */
class_create(); /* 创建类 */
device_create(); /* 创建设备 */

10)传统的删除设备的过程

cdev_del(); /* 删除 cdev */
unregister_chrdev_region(); /* 注销设备号 */
device_destroy(); /* 删除设备 */
class_destroy(); /* 删除类 */

2、杂项设备驱动开发流程:
1)构造flie_operations结构体,其包含字符设备操作函数的集合;
2)实现flie_operations结构体中字符设备操作函数,如open/read/write/ioctl/release等;
3)构造杂项设备驱动实体struct miscdevice;
4)在模块入口函数调用misc_register()向系统注册杂项设备;
5)在模块出口函数调用misc_deregister()从系统注销杂项设备;
6)告诉内核模块入口函数与出口函数:
static int __init xxx_init(void); 
static void __exit xxx_exit(void);


三、结构体及函数原型

1、描述杂项设备的结构体struct miscdevice
头文件:#include <linux/miscdevice.h>
struct miscdevice  {
    int minor;                                /* 次设备号 */
    const char *name;                        /* 杂项设备的名字 */
    const struct file_operations *fops;        /* 设备的操作函数集 */
    struct list_head list;                    /* 将miscdevice串成链表使用 */
    struct device *parent;                 /* 父设备(设备模型有关) */
    struct device *this_device;         /* 指向当前设备的结构体(代表自己的设备,与设备模型有关) */
};
对于miscdevice结构体主要关注前三项:
minor:如果设置为MISC_DYNAMIC_MINOR,表示系统自动分配未使用的minor;
name:设备名称;
fops:操作集合的声明,将文件操作集合结构体地址赋值给它即可;

2、杂项设备注册函数
头文件:#include <linux/miscdevice.h>
函数原型:int misc_register(struct miscdevice *misc)
参数:描述砸向设备的struct miscdevice结构体类型指针;
函数功能:将杂项设备注册到内核的设备模型中;
返回值:返回值为一个整数,如果注册成功返回0,注册失败则返回失败的错误代码。
说明:该函数内部检查次设备号是否合法,如果次设备号被占用,则返回设备忙状态;如果miscdevice的成员minor为255,则尝试动态设备请一个次设备号。当次设备号可用时,函数会将杂项设备注册到内核的设备模型中去;

3、杂项设备注销函数
头文件:#include <linux/miscdevice.h>
函数原型:int misc_deregister(struct miscdevice *misc)
参数:描述杂项设备的struct miscdevice结构体类型指针;
函数功能:将杂项设备从内核的设备模型中注销;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux杂项设备驱动 的相关文章

  • BUG - 在 IOS 中没有选择标签的完成按钮

    我正在使用最新的离子并有一个简单的选择标签
  • iOS 8 支持动态链接吗?

    直到 iOS7 之前 出于安全考虑 Apple 都不支持动态链接 开发人员之间的代码重用通常依赖于静态库 这些静态库是作为应用程序可执行文件的一部分构建的 在 iOS8 中引入扩展似乎稍微改变了这一点 因为扩展是单独的可执行文件 扩展及其包
  • 允许的 APNS 持续连接数量是多少?

    我正在尝试编写服务器端代码来为我的应用程序发送推送通知 根据 Apple 的建议 我计划保留连接并根据需要发送推送通知 Apple 还允许打开和保留多个并行连接以发送推送通知 您可以与同一网关或多个网关实例建立多个并行连接 为此 我想维护一
  • UICollectionView 自动滚动到 IndexPath 处的单元格

    在加载集合视图之前 用户设置集合视图数组中的图像数量 所有单元格都不适合屏幕 我有 30 个单元格 但屏幕上只有 6 个 问题 如何在加载 UICollectionView 时自动滚动到具有所需图像的单元格 新的 编辑过的答案 将其添加到v
  • 如何打开定位服务

    当有人第一次拒绝时 如何从实际应用程序重新打开定位服务 我可以选择关闭或打开它 您只能提示他们在屏幕上打开定位服务 如下所示 UIApplication sharedApplication openURL NSURL URLWithStri
  • NSString – 静态还是内联?有性能提升吗?

    如果我写的话会有任何性能提升吗 NSString helloStringWithName NSString name static NSString formatString Hello return NSString stringWith
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • Parse.com 从相关 PFObject 获取 PFUser

    我正在将照片保存为 PFObject 解析 并使用 PFUser currentUser 用户 ID 作为其键之一 我想在表格视图中显示照片以及该 PFUser 的详细信息 但是当我尝试获取用户时 PFUser user self phot
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • Xcode 8 / Swift 3:“UIViewController 类型的表达式?未使用”警告

    我有以下函数 它之前编译得很干净 但在 Xcode 8 中生成警告 func exitViewController navigationController popViewController animated true UIViewCon
  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我

随机推荐