Linux驱动(基于4412)
文章平均质量分 71
理论结合实战,学习探索Linux驱动开发
琪琪猫不会嵌入式
喜欢嵌入式
展开
-
Linux驱动——注册字符类设备
前面介绍的杂项设备并没有分配内存空间这个过程, 是因为系统自带的代码已经给杂项设备分配好了。Linux 中注册字符类设备需要首先申请内存空间, 有一个专门分配小内存空间的函数 kmalloc, 这个函数在头文件“include/linux/slab.h” 中, 如下图所示, 使用命令“vim include/linux/slab.h” 打开头文件。原创 2023-11-03 12:30:04 · 173 阅读 · 0 评论 -
Linux驱动——Linux内核开发基础
每个 CPU 的子目录, 又进一步分解为 boot, mm, kernel 等子目录, 分别控制系统引导, 内存管理, 系统调用, 动态调频, 主频率设置部分等。提供给大家的内核源码一百多 M, 最后编译成的 zImage 只有不到 5M, 这都是依靠这个工具来实现的, 后面会有针对性的实验来教大家如何使用编译工具。从程序员的角度分析, 将 linux 底层和和应用分开, 将 linux 底层和应用分开, 做应用的做应用, 做底层的做底层, 各干各的。用户空间中包含了 C 库, 用户的应用程序。原创 2023-10-28 15:55:53 · 76 阅读 · 0 评论 -
最小Linux驱动编写、加载初体验
包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此文件中。– 所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查下资料。– 为了理解整个Linux内核编译过程,可以从学习Linux模块的编译入手。– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!Linux的驱动可以和Linux源码放在一起编译,也可以单独拿出来编译。– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的。原创 2023-10-28 17:15:44 · 23 阅读 · 0 评论 -
Linux驱动——menuconfig_kconfig
Linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉menuconfig是生成.config的一个工具在Linux发展过程中,配置内核可以使用一下命令:– #make config(基于文本的最为传统的配置界面,不推荐使用)– #make menuconfig(基于文本菜单的配置界面)– #make xconfig(要求QT被安装)– #make gconfig(要求GTK+被安装)原创 2023-10-30 14:53:31 · 329 阅读 · 0 评论 -
Linux驱动——Makefile编译
拿到源码后一般需要设置一下编译器路径,在源码目录Makefile文件中可以设置编译路径“CROSS_COMPILE”– 如果定义了宏CONFIG_LEDS_CTL则将itop4412_leds.c文件编译进内核。前面编译环境搭建的时候,解压arm-2009q3的目录和这里对应。打开drivers/char/Makefile文件。打开drivers/Makefile文件。– 强制编译char目录下的文件。原创 2023-10-30 15:10:07 · 154 阅读 · 0 评论 -
Linux驱动——设备注册
接着到 menuconfig 中将其配置上, 使用命令“ make menuconfig” , 进入“ Device Drivers --->” →“Character devices --->” →“Enable HELLO config” , 如下图所示, 配置上宏定义“HELLO_CTL”。在上图红色方框中, 注册平台设备结构体“platform_device” 中, 只调用了两个参数“*name” 和“id”。如下图所示, 就在第一页中, 就可以看到结构体“platform_device”。原创 2023-10-30 16:28:33 · 115 阅读 · 0 评论 -
Linux驱动——驱动注册
在驱动中首先要做的就是定义platform_driver 中 的 函 数 , 并 创 建 这 个 结 构 的 一 个 对 象 实 例 , 然 后 在 init() 函 数 中 调 用platform_driver_register()向系统注册驱动。下面给接着给大家介绍一个小知识点, 以 platform_driver 结构体中的参数 probe 为例, 这个参数指向platform_driver_probe 函数, 如下图所示。这两个函数都会调用一个 platform_driver 类型的结构体。原创 2023-10-30 20:12:34 · 109 阅读 · 0 评论 -
Linux驱动——生成设备节点
杂项设备的头文件在“include/linux/miscdevice.h” , 有两个需要掌握的函数和一个结构体, 如下图所示, 在源码目录下使用命令“vim include/linux/miscdevice.h”。一般将 Linux 驱动分为字符设备、 块设备、 网络设备, 但是这个分类不能包含所有的设备, 所以将无法归类的设备统称为杂项设备, 杂项设备可能用到字符设备、 快设备、 网络设备中的一项或者多项设备。其中杂项设备的主设备号是 10, 在任何 Linux 系统中它都是固定的。原创 2023-10-31 21:18:08 · 85 阅读 · 0 评论 -
Linux驱动——地址概念归纳和总结
Linux内核中函数ioremap,他会返回一个地址,这个地址一定在0x4000 0000--0x0000 001G的内存0x4000 0000--0x8000 0000。I2C的地址:I2C总线用于区分I2C设备的地址。例如: I2C总线挂载了设备camera,声卡,eeprom...MPU如何区分I2C是和哪个设备通信,通过I2C的地址。某一类寄存器的起始地址,一个寄存器加上偏移地址,就是这个寄存器的物理地址。i RAM:iROM中是不能运行程序,三星固化的代码在iRAM中运行。SER: 特殊寄存器。原创 2023-11-01 16:11:59 · 36 阅读 · 0 评论 -
Linux驱动——leds驱动
Led 的电路比较简单, 一般是使用三极管搭建一个控制电路。如下图所示, 是原理图中两个 Led 的控制电路。KP_COL0 和 VDD50_EN 网络控制 Led 的通断。当 KP_COL0 和 VDD50_EN 网络时高电平的时候, 三极管 L9014 的 BE 导通, CE 导通, 相当于 5V 的VSYS 电压加到 1K 和 Led 小灯上, 小灯就会亮。原创 2023-11-02 11:06:35 · 88 阅读 · 0 评论 -
Linux驱动——驱动模块传参
在头文件“include/linux/moduleparam.h”中包含了向模块传参数的函数。这个功能是集成的, 在任何linux 系统之中都可以使用。参数传递有两个函数, 分别是函数 module_param 和函数 module_param_array。函数 module_param 支持单个参数传递, 在头文件中, 如下图所示。如上图所示, 这个宏定义函数有三个参数分别如下。参数 name, 模块参数的名称;原创 2023-11-02 12:40:24 · 159 阅读 · 0 评论 -
Linux驱动——静态申请字符类设备号
Linux 的设备主要分为三大类, 字符设备、 块设备、 网络设备。前面带大家写的驱动是杂项设备, 它和字符设备唯一的区别就是主设备号已经搞定了, 不需要像字符设备那样去手动申请。这里先给大家介绍几个常用的申请字符类设备的函数。如下图所示, 在头问价“include/linux/fs.h”中, 可以找到三个注册字符设备的函数。这三个分别是函数register_chrdev_region, 函数 alloc_chrdev_region, 函数 register_chrdev()。原创 2023-11-02 13:25:56 · 30 阅读 · 0 评论 -
Linux驱动——动态申请字符类设备号
参数*dev, 存放返回的设备号;参数 unsigned, 一般为 0;参数 unsigned, 次设备号连续编号范围;参数 const char *, 设备名称;函数调用成功则返回 0,反之返回-1。原创 2023-11-02 13:36:57 · 49 阅读 · 0 评论