当前位置: 首页 > news >正文

驱动基础知识

makefile

添加模块

编译好.ko文件后 insmod添加模块 ,由于学习使用的是虚拟终端需要使用dmesg指令显示

Kconfig是定义可配置项,让用户选择对应功能,Makefile会根据用户选择的配置项来控制代码的编译行为。

驱动三种状态

编译进内核,编译成模块,不编译进内核

如何把驱动编译进内核

使用kconfig和Makefile,在内核路径下打开kconfig文件

将驱动放到哪个目录下就到那个目录下的kconfig添加

kconfig

将menuconfig中的驱动选择星号编译进内核后会在内核目录下生成一个 .config目录,

vi.config文件找到对应的配置选项

下一步是Makefile,编译字符目录下的Makefile,与kconfig一样要哪一个类型的驱动就打开哪一个目录下的Makefile

Makefile中的蓝色字体宏改成CONFIG_LEDS_MP1A 后面的项目名字改成驱动文件名字

最后可以进行编译内核了

编译完成后会生成uImage文件

将生成的uImage文件拷贝到tftp目录下

更新内核

setenv bootargs root=/dev/nfs nfsroot=192.168.100.240:/home/hqyj/rootfs rwconsole=ttySAC2,115200 init=/linuxrc ip=192.168.100.241 clk_ignore_unused=true

内核拷贝完成后,创建设备,运行应用程序。

写完驱动和应用程序加载成外部模块(led为例子)

驱动编写

创建设备号 dev_t devno=MKDEV(主设备号,次设备号)
申请设备号 ret=register_chrdev_region(devno,decive_number,"led")
设备初始化 cdev_init(&cdev,&led_fops)
设备注册 ret=cdev_add(&cdev,devno,device_number);

将写好的驱动.c文件交叉编译成.ko文件Makefile中内核所在的路径需要改成自己的路径

linux@ubuntu:$ make ARCH=arm CROSS_COMPILE=arm-fsmp1x-linux-gnueabihf- modules

编译可执行文件test在上图的 最后一行

通过scp tftp 或者nfs 将应用程序和驱动放到开发班上
在开发板上insmod .ko文件安装模块

mknod dev/cdev c 300 0创建设备

./开启可执行文件

将写好的led驱动编译进内核过程

将所需的文件放到内核中对应的文件夹下

用kconfi和Makefile进行编译进内核

进入到驱动文件放置的文件夹下

打开当前文件夹下的kconfig,添加对应的选项

内核目录下进入menuconfig进行图像选择,进入到设备 ->字符设备 将自己编写this is the mainboard leds of MP1A 选为 * (编译进内核)完成后保存并退出会生成一个.config文件

进入.config文件

再进入到驱动下字符设备下的Makefile

括号中的宏改为.config中的宏 等号后的文件名改为驱动的文件名

退到内核目录进行编译

内核编译完成后生成uImage文件,将他拷贝到tftp目录下 uImage在下面的目录下

arch/arm/boot

内核编译

选择对应平台才可以编译,内核需要配置

关于platform——device

写好的设备文件编译后会出现在sys/bus/platform/devices目录下

各种结构体

inode->i_cdev指向struct cdev实例的指针

probe函数中

这行代码是给内核的 I2C 设备对象 “贴标签”—— 告诉内核:这个client(I2C 传感器)对应的驱动私有数据是sensor,后续可以通过client快速找到sensor

对于大量结构体的总结

关于inode

注册字符设备后mknod会在内核中产生inode

内核通过inode里的设备号,匹配到你之前注册的struct cdev,并把cdev的指针赋值给inode->i_cdev

内核调用cdev关联的file_operations中的open函数,并把这个inode作为参数传进去。

inode->i_cdev本质上就是&sensor.cdev(sensor是私有结构体的名字),也就是你自定义结构体里的cdev成员的指针。

这一步的目的:把恢复出来的sensor指针保存起来,这样在后续的readioctl等函数中,就可以直接从file->private_data中取出sensor,进而访问sensor->client

module_platform_driver(platform_drv)

关于insmod和mknod

编译进内核后就不用在开发板上打insmod,使用device_creat函数后就不用mknod了

设备树

设备树节点所在目录

厂商给的写好的设备树文件一般是不会动的,自己可以写一个test.dts文件去,然后去修改文件

关于保存一些传参中给的参数例如inode和client(device)

probe函数之后,驱动的其他函数(如readioctlremove)被调用时,内核不会再直接传入client指针。我们需要通过自定义的sensor结构体来找回这个指针,从而与硬件进行通信。

ioctl中copy_to_user((void *)arg, (void *)&value, sizeof(int)) arg是用户态存放数据的地址

设备号300在之前学习中被编译进内核占用了

如何确定有自己设备树节点

然后再去sys/bus/下看

后面蓝色的就是路径:/sys/firmware/devicetree/base/soc/i2c@4001200/sth20@40

注意重启之后要下载扩展板的。

设置私有数据的作用

将驱动侧的私有数据结构与设备实例绑定,方便在整个驱动生命周期中随时获取和使用

sys和dev的区别

/sys目录下的文件是虚拟文本文件,核心作用是 “暴露硬件的属性和状态”,让你用最简单的cat/echo就能查看 / 配置,不用写复杂代码。

  • 按 “总线 - 设备 - 驱动” 的层级组织(如/sys/class/leds/);
  • 每个文件对应一个属性(如亮度、GPIO 号、使能状态);
  • 读写文件会直接触发驱动的show/store回调,本质是操作内核变量;
  • 无主 / 次设备号,纯属性映射

/dev目录下的文件是设备文件(不是普通文本),每个文件对应一个硬件设备,核心作用是给应用层提供 “操作硬件的入口”。

  • 关键特性

    • 设备文件有固定的类型:c(字符设备,如 LED、串口)、b(块设备,如硬盘);
    • 每个设备文件绑定 “主设备号 + 次设备号”,内核通过这组编号找到对应的驱动;
    • 不能用cat/echo直接读写(少数简单设备除外),需要通过编程调用open/read/write

获取私有数据指针的函数

**核心通用函数**:`dev_get_drvdata`/`dev_set_drvdata`(所有设备类型都能复用);

2. **总线专属函数**:Platform 用 `platform_xxx`,I2C 用 `i2c_xxx`,SPI 用 `spi_xxx`(本质是对 `dev_get/set_drvdata` 的封装);

3. **文件操作专属**:直接读写 `file->private_data`(需在 `open` 中初始化);

http://www.jsqmd.com/news/711945/

相关文章:

  • 哈希与向量:计算机理解现实的两座桥梁
  • vue2+element-UI上传图片封装
  • AI时代程序员真的会被替代吗_一份冷静的岗位分析报告
  • 告别卡顿!WaveTools鸣潮工具箱让你的游戏体验丝滑如新
  • 新手程序员必看:用RAG技术为AI大模型配置知识库,轻松提升能力并收藏!
  • 从 15V 交流到 5V 直流:桥式整流、电容滤波与 LM7805 稳压电源设计解析
  • 盟接之桥®制造业EDI软件:从Forecast到Invoice,打通供应链的“任督二脉”
  • 扩散模型与轨迹规划:提升生成式AI效率与质量
  • 【Python编程-03】从零入门 Python 加密算法!含完整可运行代码 + 场景对比 + 避坑详解
  • 【多线路故障】含sop的配电网故障重构研究(Matlab代码实现)
  • StitchFlow:基于AI的本地化UI原型生成工作流实践
  • 第十七届蓝桥杯省赛c++b组题解
  • 高通X105调制解调器:5G Advanced与6G关键技术解析
  • 如何用GHelper轻松掌控华硕笔记本性能:5分钟快速配置终极指南
  • 整个 AI 项目从本地 → 部署到服务器
  • 工业级Cat-1导轨式DTU USR-DR154/DR152(口红DTU)技术规范、核心优势与标准化应用场景白皮书
  • 被低估的 .NET 开源项目:AngleSharp,优雅的 HTML 解析神器
  • 10 分钟让网页颜值翻倍(底层+手写+AI提示词)
  • MySQL如何防止通过权限提升攻击_严格控制SUPER权限分配范围
  • 5分钟极速部署NVIDIA Riva ASR语音识别服务
  • YOLO26桥梁缺陷识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+远程环境部署)
  • 初步了解安卓逆向
  • 2026甘肃亮化工程权威TOP5排行:兰州亮化工程/兰州亮化设计/兰州体育场亮化/兰州体育场泛光照明/兰州商业综合体亮化/选择指南 - 优质品牌商家
  • NDCG@k:推荐系统排序质量评估的核心指标
  • 苹果MacBook Neo与保时捷968 Club Sport:如何让便宜产品变酷炫,成市场新宠?
  • 2026年合肥留学机构测评,最好的口碑好中介如何选 - 速递信息
  • 宜宾宅心装饰2026技术解析:口碑背后的工艺与服务细节 - 优质品牌商家
  • YOLO26电梯内电动车识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+远程环境部署)
  • Portarium:轻量级本地服务可视化管理的Go语言实现
  • 2026年武汉留学中介机构前十解析,哪家科研服务口碑最好 - 速递信息