字符设备驱动

字符设备驱动开发的流程 字符设备驱动开发,开发流程,驱动框架,具体实现步骤。 阅读详情

遇到的问题总结如下

1. memdev_init 主设备号的使用

   static mem_major = MEMDEV_MAJOR;
   module_param(mem_major, int, S_IRUGO);

   传入数据到内核,很质疑为什么这样传入??

   这里采用静态分配,一定主要不能跟现有设备号重复,否则加载之后,会出现卸载不掉模块的情况
   rmmod: remove 'memdev': Device or resource busy

2.memdev_init分配设备号

  dev_t devno = MKDEV(mem_major, 0);这里MKDEV??

  定义如下#define MKDEV(major,minor) (((major) << MINORBITS) | (minor))

  组装主次备好和此设备号

3.memdev_init分配内存采用了两次 

  /* 为设备描述结构分配内存,这里面设备结构就是设备*/
  mem_devp = kmalloc(MEMDEV_NR_DEVS * sizeof(struct mem_dev), GFP_KERNEL);
  if (!mem_devp)    /*申请失败*/
  {
    result =  - ENOMEM;
    goto fail_malloc;
  }
  memset(mem_devp, 0, sizeof(struct mem_dev));
  
  /*为设备分配内存*/
  for (i=0; i < MEMDEV_NR_DEVS; i++) 
  {
        mem_devp[i].size = MEMDEV_SIZE;
        mem_devp[i].data = kmalloc(MEMDEV_SIZE, GFP_KERNEL);
        memset(mem_devp[i].data, 0, MEMDEV_SIZE);
  }

  自己认为给虚拟设备分配内存空间(第一次本身就是虚拟内存这个设备需要空间,第二次操作这个虚拟设备的结构也需要分配空间)

4.注销模块memdev_exit

   unregister_chrdev_region(MKDEV(mem_major, 0), 2); /*释放设备号*/

   里面不是采用已定义好的devno,因为devno局部变量,无法在注销时使用

5.open操作函数

     /*将设备描述结构指针赋值给文件私有数据指针*/
    filp->private_data = dev;

   这里面filep下面的成员 private_data  为void  *private_data;

   为了保存一个结构体变量,从当中介者 

6.read操作函数

     /*读数据到用户空间*/
  if (copy_to_user(buf, (void*)(dev->data + p), count))

  这里面注意参数的数据类型,void*也可以不用,第二个参数类型为const void* ,而dev->data为整型 p这里面为unsigned long p =  *ppos;

   这里面又牵涉到loff_t *ppos这个是个指针,erloff_t 本身就是long long ,所以ppos其实是指向长整型的指针

7. copy_to_user与cpoy_from_user 主要哪里是内核空间,哪里是用户空间,否则数据会传输错误,而且有些函数也会用错,用户程序不需要考虑这些

 

深入理解Linux字符设备驱动 文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次、组成框架和交互、如何编写驱动、设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解。 阅读详情

相关推荐

字符设备驱动开发

字符设备驱动开发

m0_69211839的博客 2533

Linux 设备驱动常用函数解析(更新中)

1、MKDEVMKDEV(int major,int minor)/** * MKDEV() - 将主设备号和次设备号转换成dev_t类型(32位) * @major: 主设备号 * @minor: 次设备号 * Return value:dev_t类型 *//*函数实现*/ #define MINORBITS 20 #define MKDEV(ma,mi) (((ma) <<

ZP1015 2337

Nuttx 字符设备驱动

Nuttx采用VFS,和linux一样的设计思路,一切设备皆文件。Nuttx系统可以在nsh终端下通过”ls /dev”查看系统已注册的设备。对设备的操作就是对文件的操作。Nuttx下的设备驱动就是实现这种对文件操作的接口,屏蔽了对设备本身的访问的复杂性,呈现简单的接口,如open(), read(), write()等。字符设备是指在I/O传输过程中以字符为单位进行传输的设备,如键盘、鼠标、以及一

chengwenyang的专栏 4666

MKDEV宏定义及其主要函数

MKDEV 功能:将主设备号和次设备号转换成dev_t类型 cdev结构 在Linux2.6内核中一个字符设备用cdev结构来描述,其定义如下: struct cdev { struct kobject kobj; struct module *owner; //所属模块 const struct file_operations*ops; //文件操作结构,在写驱动时,其结构体内的大部分函数要被实现 .

m0_37141848的博客 5554

NSFC结题报告下载脚本失效?3步教你手动修复下载按钮问题(2024最新版)

针对NSFC官网域名变更导致结题报告下载脚本失效的问题,本文提供了详细的手动修复指南。通过三步操作,教你如何修改用户脚本的域名匹配规则,恢复下载按钮功能,确保NSFC结题报告下载器能继续高效工作。

vscode6remote的博客 753

知识导航神器:Obsidian Breadcrumbs 插件全攻略

Parent: 插件Child: Breadcrumbs 用法这样,它就能识别出你和其他笔记的关系。

m0_73735578的博客 1630

MKDEV(int major,int minor)

这是我的第一篇博客,从今天开始记录每日学习笔记,作为一位linux还没有入门的学前班学生,希望各位前辈多多指正。 MKDEV是将主设备号和次设备号转换成dev_t类型 定义在中的宏     形式:MKDEV(int major,int minor)    major为主设备号   minor为次设备号 宏定义:#define MKDEV(major,mi

7811

UDS服务应该支持哪些否定响应码

UDS服务应该支持哪些否定响应码所有服务都需支持的否定响应码具体的服务需要支持的否定响应码否定响应码定义及其取值 USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组: 0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。 0x01 – 0x7F:诊断通信相关的否定响应码。 0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定

闲聊汽车软件开发 4万+

驱动第三天

驱动第三天 【字符设备和块设备的区别】 1. 传输速度大小:字符设备是一个字节一个字节传输的,传输速度慢;块设备是以块为单位进行操作的,传输速度快。 2. 响应速度:字符设备响应速度快,块设备必须经过系统的快速缓冲,所以响应速度慢。 3. 访问顺序:字符设备只能按顺序依次访问设备,块设备则可以随机访问设备。 字符设备和块设备之间没有明显的界限,它们之间仅限于驱动与内核的接口不同。

fancong5201314的专栏 1807

5G NR切换测量事件解析:从A1到B2的实战应用指南

本文深入解析5G NR切换测量事件,从A1到B2的实战应用指南。详细介绍了系统内切换事件(A1-A6)和系统间切换事件(B1-B2)的触发条件与配置建议,帮助优化网络性能。通过实际案例分享,展示如何调整参数提升切换成功率和降低乒乓切换率,适用于5G网络优化工程师。

tcp8optimizer的博客 515

【SystemVerilog笔记(一)】数据类型

(一)内建数据类型 1.按照四值逻辑和二值逻辑分类 四值逻辑类型:integer、logic、reg、wire等线网类型 二值逻辑类型:byte、shortint、int、longint、bit 2.按照有符号和无符号分类 有符号类型:byte、shortint、int、longint、integer 无符号类型:bit、logic、reg、wire等线网类型 ※记忆:按位定义的变量是无符号的。 (二)软件常用类型 1.定宽数组 在这里插入代码片 ...

cc__cc__的博客 1万+

1、字符设备驱动

字符设备驱动: 1、open("/dev/xxx",xx)------>(驱动->open) 首先驱动的初始化函数会调用register_chrdev(major, name, &fops),把该结构体注册进内核的一个数组中。当应用程序调用open打开该设备时,会得到该设备的major,系统的open调用会根据major找到这个结构体,从而调用fops里面的函数。 2、字符设备驱动的

a421701136的专栏 543

SXU-软件项目管理-朱少民-第九章 项目监控与控制 第十章 项目收尾 附相关习题

软件项目管理-朱少民-第九章 项目监控与控制 附相关习题

weixin_63597914的博客 1489

【Linux驱动】字符设备驱动

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。编写一个驱动程序的时候需要调用上层驱动函数的时候需要调用底层实现,并且底层需要留给上层接口,并暴露出去。Linux内核文件中有一个叫做。#endif上层程序使用open。

Julian的博客 1174

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)

一、环境介绍 QT版本: 5.12.6 编译环境: win10 64位 目标系统: Android 完整工程源码下载地址(包含APK文件):https://download.youkuaiyun.com/download/xiaolong1126626497/19051696 二、功能介绍 本软件是一款BLE蓝牙串口调试助手,支持常规的发送和接收调试,BLE是低功耗类型蓝牙,在智能家居、物联网领域使用较多。BLE低功耗蓝牙一般不能直接使用手机进行连接,手机蓝牙默认都是工作在传统蓝牙模式,无法直接连接BL..

7663

字符设备驱动实验

一、字符设备基础 字符设备:是指只能一个字节一个字节进行读写操作的设备,不能随机读取设备中的某一数据、读取数据要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED等。 一般每个字符设备或者块设备都会在/dev目录(可以是任意目录,这样是为了统一)下对应一个设备文件。linux用户层程序通过设备文件来使用驱动程序操作字符设备或块设备 二、驱动设备基础 驱动...

Wanggj的博客 3789

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Linux 驱动篇(一)】字符设备驱动开发

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

K3169的博客 5666

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux驱动——字符设备驱动总结

定义一个目标设备结构体,这个结构体中包含如下变量待分配的设备号dev_t;该字符设备对应的struct cdev结构体;设备类class;struct device设备结构体主次设备号整型变量int major;int minor;定义文件操作函数file_operations结构体。自定义实现设备需要的操作函数实现驱动入口函数xxx_init,在驱动入口函数完成具体字符设备的初始化,譬如相关寄存器位的设置。然后开始注册字符设备驱动。。。。1、

weixin_46066367的博客 911

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

嵌入式linux驱动开发-字符设备驱动

驱动字符设备驱动简介字符设备驱动开发步骤驱动模块的加载和卸载 之前在嵌入式系统移植停留了一段时间,枯燥地看uboot、kernel和跟文件系统的源码感觉没有成就感,在这之前已经对嵌入式linux的启动流程有了大体的了解,因此先跳到驱动开发,体验学习一下子哈!!。 Linux 中的三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。 字符设备驱动:IO口的驱动,比如点灯、 I2C、 SPI、音频等。 块设备驱动:存储器设备的驱动,比如 EMMC、 NAND、 SD 卡和 U 盘等存储设备 网络设备驱动:网络驱

平平酱的博客 3652

字符设备驱动—1

字符设备通常缩写为cdev,它是不可寻址的,仅提供数据的流式访问,通过字符(一个接一个的字符)以字节流方式向用户程序传递数据。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和功能,通过这个文件可以在设备和用户程序之间进行数据的交换。

m0_72622181的博客 1761

Linux 字符设备驱动开发模板

介绍字符驱动开发的基本模式

安迪西_嵌入式攻城狮 3703

Linux驱动——字符设备驱动

1.使用什么工具来写驱动代码:安装source insight工具(1)找到软件提示把工具安装激活(2)把Linux内核代码解压到windows目录中(3)打开工具添加查看的项目第一个对话框:第一个文本框:输入工程名字第二个文本框:路径(默认)第二个对话框: 在项目源码位置,选择 Linux内核代码位置 点击OK 第三个对话框: 选择需要查看的Linux内核代码的包含的源码文件(要查看的内核目录)需要添加的目录:driver/iicinclude。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3439
上一篇: u-boot移植(Mini2440)
下一篇: Linux内核之 “typedef int (init_fnc_t) (void);”
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值