【s3c2440】【驱动篇】字符设备驱动

一、驱动开发流程

以LED设备为例,总览性地说明一下驱动代码编写流程:

  1. 编写最底层驱动函数led_open()、led_write()等,用户可自定义函数名;
  2. 实例化一个 file_operations 结构体,结构体参数就是上一步生成的led_open、led_write函数指针;
  3. 给库函数 register_chrdev() 传参上一步生成的 file_operations 实例的指针来将驱动程序注册进内核;
  4. 但是谁来调用 register_chrdev() 呢?编写first_drv_init()驱动初始化函数来调用上一步的 register_chrdev() 驱动注册函数,用户可自定义first_drv_init()驱动初始化函数的函数名;
  5. 但谁又来调用first_drv_init()驱动初始化函数呢?给库宏函数 module_init() 传参上一步的first_drv_init函数指针,本质上是将first_drv_init指针赋值给内核中一个结构体 module 的实例的init成员,自此内核与新驱动间的羁绊就产生了。

register_chrdev(主设备号,name,file_operations结构体指针)

主设备号

次设备号

查看单板中已经加载的设备驱动:

cat /proc/devices

insmod命令行工具加载驱动:

insmod first_drv.ko

命令行手工创建设备节点文件:

mknod 设备文件(可自定义) 主设备号 从设备号(暂时用0)

mknod /dev/xxx 111 0

如何获取空闲的主设备号:

① 使用cat /proc/devices 肉眼观察未被占用的主设备号

② register_chrdev()"主设备号"入口参数写0,让系统自动分配主设备号,register_chrdev()函数返回值就是系统分配的无重复的主设备号。

mdev 根据系统信息自动创建设备节点文件:

在first_drv_init()中使用如下两个函数:

firstdrv_class = class_create(THIS_MODULE, "firstdrv"); // "firstdrv" 用于 cat /proc/devices显示名称

class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz" ); //就会在 /dev 目录下创建一个/dev/xyz文件

这样就只需insmod加载驱动,而不需要mknod来创建设备节点文件了。

/sbin/mdev根据/sys/class/firstdrv/xyz找到设备信息

相关推荐
2601_9657984716 分钟前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
我头发多我先学32 分钟前
linux系统编程:初识进程
linux·运维·服务器
Freak嵌入式41 分钟前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
苍狗T1 小时前
LVS相关知识总结
linux·运维·服务器·lvs
lightqjx2 小时前
【Linux系统】基础 IO
linux·c语言·重定向·缓冲区·文件io·文件的系统调用
我星期八休息2 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
RisunJan3 小时前
Linux命令-skill(发送信号给进程)
linux·运维·服务器
潘正翔3 小时前
k8s基础_kubeadm搭建k8s集群
linux·运维·docker·云原生·容器·kubernetes
孪生质数-3 小时前
AI 应用实践篇——让大模型真正开始工作
linux·运维·服务器·人工智能·深度学习·语言模型·llama
2301_777998343 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++