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

中山外贸营销网站建设开发平台 华为

中山外贸营销网站建设,开发平台 华为,新手学做网站 pdf,58同城做网站推广好不好视频教程请关注 B 站:“嵌入式 Jerry” 一、背景说明:字符设备驱动的角色定位 在 Linux 内核驱动体系中,**字符设备驱动(Character Device Driver)**扮演着关键的桥梁作用,它直接向用户空间程序提供 read/…

视频教程请关注 B 站:“嵌入式 Jerry”

一、背景说明:字符设备驱动的角色定位

在 Linux 内核驱动体系中,**字符设备驱动(Character Device Driver)**扮演着关键的桥梁作用,它直接向用户空间程序提供 read/write/ioctl 等接口,适用于键盘、LED、GPIO、串口等多类设备。而在日常的嵌入式开发中,我们往往会面对一个核心问题:

“设备树已经定义了硬件设备,子系统(比如 gpio-leds)也帮我点亮了 LED,为何还要写字符设备驱动?”

本篇博文将围绕这个问题,逐步展开,从设备模型 → 子系统 → 字符设备驱动之间的逻辑关系梳理,再深入实践,完成一个基于 i.MX8MP 平台的 LED 控制字符设备驱动,掌握字符设备的创建、注册与用户空间控制。


在这里插入图片描述

二、核心概念回顾:设备模型、子系统与字符设备的关系

2.1 设备模型(Device Model)

Linux 内核的设备模型为设备、驱动和总线之间的关系建立了统一的框架:

  • struct device:表示一个实际设备;
  • struct device_driver:对应驱动;
  • struct bus_type:设备与驱动的桥梁。

所有设备都要在 device model 下注册,但设备模型 本身不提供功能接口,它只建立了设备的逻辑与生命周期。


2.2 子系统(Subsystem)

子系统是在设备模型基础上的功能分类,如:

  • input 子系统:键盘、触摸屏;
  • block 子系统:磁盘;
  • tty 子系统:串口;
  • gpio-leds 子系统:LED 控制。

子系统的出现解放了开发者,某些简单设备无需写驱动,只要配置设备树即可,例如 gpio-leds 自动帮你注册 LED class device,并在 /sys/class/leds 下生成节点,支持用户空间直接操作。

但问题来了:

如果我们需要通过 write() 等方式直接从应用控制 LED 呢?

这就要用到:


2.3 字符设备驱动(Character Device Driver)

字符设备驱动负责建立 /dev/mydev 这样的接口,实现 file_operations 结构体,从而让用户空间通过 open/read/write 与内核驱动打交道。它是最基础、最灵活的驱动方式。


三、问题提出:gpio-leds 为何无法直接与字符设备结合?

以设备树片段为例(位于 imx8mp-evk.dts):

gpio-leds {compatible = "gpio-leds";pinctrl-names = "default";pinctrl-0 = <&pinctrl_gpio_led>;status {label = "yellow:status";gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;default-state = "on";};
};

系统自动生成 /sys/class/leds/yellow:status/brightness 节点,我们可:

echo 1 > /sys/class/leds/yellow:status/brightness  # 点亮
echo 0 > /sys/class/leds/yellow:status/brightness  # 熄灭

但此类节点仅通过 sysfs 接口工作,并未与 /dev/ledchar 之类的字符设备产生映射关系


四、实战:为 gpio-leds 控制引入字符设备接口

我们以 gpio3_16(GPIO 编号为 32 * 2 + 16 = 80)为例,构造一个最小的字符设备驱动模块。

4.1 驱动代码

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/uaccess.h>
#include <linux/cdev.h>
#include <linux/device.h>#define GPIO_NUM 80  // 对应 gpio3_16
static dev_t devt;
static struct cdev cdev;
static struct class *led_class;static ssize_t led_write(struct file *filp, const char __user *buf, size_t len, loff_t *off)
{char kbuf[4];if (copy_from_user(kbuf, buf, len))return -EFAULT;gpio_set_value(GPIO_NUM, kbuf[0] == '1' ? 1 : 0);return len;
}static struct file_operations led_fops = {.owner = THIS_MODULE,.write = led_write,
};static int __init led_dev_init(void)
{gpio_request(GPIO_NUM, "led_gpio");gpio_direction_output(GPIO_NUM, 1);alloc_chrdev_region(&devt, 0, 1, "led_char");cdev_init(&cdev, &led_fops);cdev_add(&cdev, devt, 1);led_class = class_create(THIS_MODULE, "led_class");device_create(led_class, NULL, devt, NULL, "ledchar");pr_info("ledchar device initialized\n");return 0;
}static void __exit led_dev_exit(void)
{gpio_set_value(GPIO_NUM, 0);gpio_free(GPIO_NUM);device_destroy(led_class, devt);class_destroy(led_class);cdev_del(&cdev);unregister_chrdev_region(devt, 1);
}module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");

4.2 编译与测试

编译为模块:

obj-m += ledchar.o

加载模块:

insmod ledchar.ko

用户空间控制:

echo 1 > /dev/ledchar   # 点亮
echo 0 > /dev/ledchar   # 熄灭

五、总结对比:sysfs 与字符设备的协作与区别

方式适用场景优势劣势
sysfs接口自动生成的 class 设备无需写驱动,通用接口单一,不支持复杂逻辑
字符设备精细控制 / 用户接口可定义多操作 / 定制协议需自行注册,开发成本略高
两者结合桥接通用与专用可在 sysfs 生成节点 + 自定义更强大但设计复杂

在一些复杂场景(如 SPI 设备、定制协议、UI 控制等)中,字符设备几乎不可替代。


六、延伸思考:如何从子系统向字符设备扩展?

未来开发中,建议按如下路径深入:

  1. 明确内核已支持的子系统是否能满足需求
  2. 通过 class_create + cdev_add 绑定字符设备接口
  3. 使用 udev 自定义 /dev 节点自动创建设备文件
  4. 编写自定义 ioctl 进行配置交互(可参考 camera/v4l2)

七、写在最后

本节通过一个实战示例,深入讲解了:

  • 设备树中的 gpio-leds 与字符设备的区别;
  • 如何构造字符设备驱动访问 GPIO;
  • sysfs 与 /dev 的本质差异。

我们将在下一节中进一步引入 ioctl 控制方法,让字符设备驱动更具交互能力。


每日一句:不要轻视字符设备,它是所有复杂驱动的起点。


视频教程请关注 B 站:“嵌入式 Jerry”


文章转载自:

http://HTv2lYcd.qszyd.cn
http://n43O6VwR.qszyd.cn
http://i41j11ln.qszyd.cn
http://ERqterUC.qszyd.cn
http://vNJhKQlM.qszyd.cn
http://bKiZeQNN.qszyd.cn
http://sK4Fj734.qszyd.cn
http://9yjdng2Y.qszyd.cn
http://SW4KEpam.qszyd.cn
http://YoiCAIte.qszyd.cn
http://ke9XwIFp.qszyd.cn
http://v2GvruO8.qszyd.cn
http://FOvUFsMP.qszyd.cn
http://fYG87Vz0.qszyd.cn
http://HgxpSclC.qszyd.cn
http://mQvIFdUt.qszyd.cn
http://tmTxE53C.qszyd.cn
http://Vf7ZCABn.qszyd.cn
http://QdFXf0bq.qszyd.cn
http://FntLqKrt.qszyd.cn
http://rP0p5b6e.qszyd.cn
http://c2RuxJXG.qszyd.cn
http://DGU6W5cn.qszyd.cn
http://NnhwO5ci.qszyd.cn
http://QLQgnfmh.qszyd.cn
http://QJml3OlH.qszyd.cn
http://9eJ7Hi8r.qszyd.cn
http://xfTfentB.qszyd.cn
http://qdiiy9Qr.qszyd.cn
http://QKzgjcFV.qszyd.cn
http://www.dtcms.com/wzjs/772652.html

相关文章:

  • 做网站说什么5.0啥意思做标签这个网站刷单安全吗
  • 免费做店招哪个网站好网上做网站怎么防止被骗
  • 官方网站模版自己做网站自己做推广教程视频教程
  • 网站界面风格一媒体app软件下载老版本
  • wordpress怎么写网站关键词和描述小视频制作软件app
  • 南宁网站如何制作怎么制作糖葫芦教程
  • 做网站程序看什么书网站域名归属权
  • 石油 技术支持 东莞网站建设中国核工业二三建设有限公司太平岭项目部
  • 临沂网站建设wyjzgzs哪些网站是营销型网站及原因
  • 企业网站建设的评价指标洛阳网站推广优化
  • 自由型的网站长沙门户网站有哪些
  • 网站如何调用数据库建站公司前途
  • 山东富泰建设工程有限公司网站设计师可以在哪些网站接单
  • vue网站开发注意事项网站建设与管理教案怎么写
  • 网站用户 分析全渠道营销案例
  • 做网站wordpresswordpress 修改目录权限设置密码
  • 某公司的网站建设的资金预算书用angular做的网站
  • 饲料行业建设网站方案设计免费下载ppt做网站电话说辞
  • 网站反向链接企业qq手机版
  • 网站建设一个人能做吗开发人员工具
  • php网站开发软件是什么中国平安保险公司官网
  • 网站建设公司内部情况网站开发生命周期模型
  • 成都价格网站建设服务公司长春商城网站建设
  • 顺德新网站制作兴宁市住房和城乡建设部网站
  • 服务好的合肥网站建设石家庄互联网开发
  • 家居企业网站建设报价北京电力交易中心
  • 免费网站建设找哪家wordpress数据大
  • 南京cms建站哪些网站做平面设计素材
  • 做搜狗手机网站优网站建设免费空间注册导航
  • 网站打不开服务器错误深圳注册公司流程图