Linux驱动11 --- buildroot杂项驱动开发方法

目录

一、Buildroot

1.1介绍

        文件系统

        1.一个完整的操作系统需要包含大量的文件

        2.在嵌入式开发中目前应用最广泛的文件系统制作工具就是 buildroot,busybox

        3.buildroot 制作文件系统(了解)

二、杂项驱动编程

1.1 驱动编程做的内容

2.2 特点

2.3 设备号

2.4 相关 API

        杂项设备注册

        杂项设备注销

三、GPIO 子系统

3.1 介绍

3.2 GPIO 号

3.3 相关 API

        GPIO 号的申请

        GPIO 输出方向的设置

        GPIO 电平的设置

        GPIO 的释放

四、文件接口


一、Buildroot

1.1介绍

        环境搭建过程,是根据板子官方的《用户手册》/《快速入门手册》

        环境搭建中不可避免的要遇到问题:

        1、给售后打电话         2、百度/看板子官方的论坛         3、凭经验

        文件系统

        1.一个完整的操作系统需要包含大量的文件

                例如:Linux 系统

                        etc:环境配置文件

                        lib:库文件

                        bin:二进制文件 --- 里面是各种各样的可执行程序 --- 系统的部分指令 ls

                        sbin:管理员用户可以执行的一部分指令 reboot

                        dev:设备文件

                这些系统必要的文件中有大量的子文件/目录,而我们是无法完全掌握每个文件的具体内容 ,所以文件系统的制作是需要依靠工具的

                每个系统的文件,大体相同,局部不同

                        不同:系统中集成的库

                        相同:可以依赖文件系统制作工具完成

        2.在嵌入式开发中目前应用最广泛的文件系统制作工具就是 buildroot,busybox

                busybox 是比较早的文件系统制作工具

                        制作的文件系统非常纯粹 --- 基本没有其它的工具库,都需要开发者自己去移植,移植库需要不停的编译和复制

                buildroot 给开发者降低了开发难度

                buildroot 的文件系统其实也是由 busybox 做的,buildroot 集成了 busybox

                buildroot 的优势在于可以直接通过 make menuconfig 图形化配置界面,去勾选系统中想要加入的库文件,在编译过程中会直接将勾选的库加入到文件系统中,不需要移植,不需要适配

                buildroot 的缺点:编译时间非常长,并且对硬件要求比较高

                buildroot 第一次编译的时间在 8~12 小时

                大部分编译对运行内存要求极高 --- 是为了 build(编译)库

                内核数越多,相对来说,编译的越快

                一部分库他需要去外国网站下载,速度极慢,慢到一定程度,就断开         

               

                 dl 文件就是影响编译比较大的因素,其中放的都是下载的各种各样的库

                buildroot 是开源的,也可以去下载,将已经下载好的 dl 库放进来,可以大大减少 buildroot 的编译时间

        3.buildroot 制作文件系统(了解)

                如果制作了后,后续需要重新编译 SDK,自己做的文件系统仅仅可以让系统运行起来,还需要加各种库,需要百度搜索,在制作之前先把 SDK 生成的配置文件给删除

                解决 Buildroot 终端没有终端提示符,在板子的终端

vi /etc/profile.d/myprofile.shPS1='[\u@\h]:\w$ 'export PS1保存退出 

                文件系统复原

                gedit device/rockchip/rk3588/BoardConfig-rk3588s-evb1-lp4x-v10-yyt.mk

export RK_CFG_BUILDR00T=rockchip_rk3588s
然后
./build.sh lunch 选5
然后
./build.sh

                LVGL 在 buildroot 中选中

                        嵌入式设备才支持 LVGL 生成的可执行程序

                        除此之外还需要勾选 SDL 库

                        这样 buildroot 生成的文件系统中的交叉编译工具才支持编译 LVGL 的程序,这个交叉编译工具的名字带有 build

二、杂项驱动编程

1.1 驱动编程做的内容

        Linux 下一切皆文件

        每一个硬件设备在系统中用文件体现的:

                键盘(/dev/input/event1)和鼠标(/dev/input/event2)

        驱动开发就是将硬件设备 --- 描述在系统中

                例如:让一个 LED 灯用文件控制 --- 本质依然是 GPIO 操作

                        上系统之后,无法直接使用 GPIO

                        在系统中只能通过文件间接控制

                将硬件设备变成一个文件

                通过操作文件去操作这个设备

                        通过 open、read、write、close 实现不同的操作

                        例如:可以通过 open 文件接口去开灯

                                   通过 close 文件接口去关灯

                用单片机直接可以控制 GPIO,也可以开关灯

        那么我为什么要做驱动:MCU 性能有限 --- 可以做控制,但是做 UI 一类的比较弱

        在字符设备驱动开发中有三种开发方法 :杂项        Linux2.6        经典

                演示:杂项和 Linux2.6

2.2 特点

        1、最简单的驱动开发方法

        2、唯一 一个可以主动生成设备文件的驱动开发方法

        3、主设备号固定为 10,次设备号 0~255

                杂项设备开发方法的缺点:设备文件有限

                0~255 还有系统占用的次设备号

        设备文件:

                字符设备文件开发 --- 

                块设备文件开发

                网络设备文件开发

2.3 设备号

        设备号是区分不同设备文件的唯一标识

        完整的设备号总共 32 位

                高 12 位是主设备号,低 20 位是次设备号

        区分不同文件的唯一标识 --- 节点号

                节点号的查看 --- ls -i

        目前做的是字符设备编程 --- 会向系统注册设备文件

        开发方放的学习就像 MCU 的不同编程方式

                寄存器:代码及其简洁,代码可读性极差

                库函数:好记,代码可读性强,代码篇幅过长

                HAL 库:通过点一点就可以完成简单的功能 --- 代码必须写在固定位置

        学习的是一个框架 --- 固化的流程

        杂项的开发流程

                1、搭建驱动开发的框架

                2、杂项设备注册

                3、杂项核心结构体定义

                4、杂项核心结构体填充

                5、杂项设备注销

2.4 相关 API

        关键字:misc

        头文件:#include <linux/miscdevice.h>

        杂项设备注册

        函数原型        

                int misc_register(struct miscdevice *misc)

        函数参数

struct miscdevice
{//杂项驱动编程的核心结构体int minor;    //次级的 --- 次设备号//次设备号会被占用 --- 255 表示随机分配const char *name;        //生成的设备文件名//这个名字会出现在/dev/下const struct file_operations *fops; //文件接口核心结构体{使用的头文件是:#include <linux/fs.h>对于当前情况下,只需要填写一个内容struct module *owner;    //在内核中固定填写 THIS_MODULE}} 

        函数返回值

                成功返回 0,失败返回负的错误码

        杂项设备注销

        函数原型

                void misc_deregister(struct miscdevice *misc)

        函数参数

                同上

三、GPIO 子系统

3.1 介绍

        GPIO 子系统是 Linux 内核中用于管理通用输入输出(GPIO)引脚的核心框架,提

供标准化的 API 接口以简化硬件操作。它通过抽象硬件细节,允许开发者通过设备树

配置和驱动接口控制引脚方向、电平读写及中断功能,并与 Pinctrl 子系统协同完成引

脚复用与配置。

        用于控制 GPIO

        四个 LED 灯:核心板有两个,底板有两个,蜂鸣器在底板

        两个用户按键:在底板

        哪个板子就看哪个板子的原理图(核心板、底板)

        LED1 对应的是 --- GPIO0_D0                                 LED2 对应的是 --- GPIO1_D5

        GPIO 子系统使用的主要是 GPIO 号

3.2 GPIO 号

        GPIO 号在瑞芯微系列的芯片(RK,RV rockchip)中是可以根据 GPIO 的名字算出来的

        GPIO 号的计算方式

        GPIOx_yz  :x*32+(y-A)*8+z

                例如:LED1 的 GPIO0_D0         0*32+(D-A)*8+0 = 3*8 = 24

                                                                        GPIO1_D5 → 1*32+(D-A)*8+5 = 61

        GPIO 的使用过程

        GPIO 号的申请

        GPIO 输出方向的设置

        GPIO 电平的设置

        GPIO 的释放

3.3 相关 API

        关键字:gpio

        头文件:#include <linux/gpio.h>

        GPIO 号的申请

        函数原型

                int gpio_request(unsigned int gpio, const char *label)

        函数参数

                gpio:要申请 GPIO 的 GPIO 号

                label:是一个标签,不要重复,给个字符串就行

        函数返回值

                成功返回 0,失败返回负数

        GPIO 输出方向的设置

        函数原型

                int gpio_direction_output(unsigned int gpio, int value)

        函数参数

                gpio:要设置的 GPIO 号

                value:初始电平

                        1 高电平

                        0 低电平

        函数返回值

                成功返回 0,失败返回负数

        GPIO 电平的设置

        函数原型

                void gpio_set_value(unsigned int gpio, int value)

        函数参数

                gpio:要设置的 GPIO 号

                value:设置电平值

        GPIO 的释放

        函数原型                

                void gpio_free(unsigned gpio)

        函数参数

                gpio:要释放的 GPIO 号

四、文件接口

        用户直接操作的是系统,系统会通过文件接口(open,close 等)和内核的文件接口(重新定义 struct file_operations 结构体中的文件指针),完成控制硬件设备

struct file_operations {int (*open) (struct inode *, struct file *)int (*release) (struct inode *, struct file *)} 

        struct inode --- 在系统中调用 open 文件接口其实本质上是调用内核的(*open)接口,这个结构体中存放了应用层文件的信息 --- 其中就有设备号 --- 在多节点会用到

        struct file --- 在多节点会用到,更多的时候这个结构体会作为形参作为实参传入另外一个函数中

        注意 :

                在加载函数中,先申请的资源,在卸载函数中,后释放

                先申请的资源有可能会让后申请的资源使用,在使用过程中被释放可能会导致内核错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88898.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity物理系统由浅入深第三节:物理引擎底层原理剖析

Unity物理系统由浅入深第一节&#xff1a;Unity 物理系统基础与应用 Unity物理系统由浅入深第二节&#xff1a;物理系统高级特性与优化 Unity物理系统由浅入深第三节&#xff1a;物理引擎底层原理剖析 Unity物理系统由浅入深第四节&#xff1a;物理约束求解与稳定性 Unity 物理…

Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)脚步

1、Docker安装RocketMq 2、Docker安装Nginx 3、Docker安装MySql 4、Docker安装Minio 5、Docker安装jenkins 6、Docker安装Redis 1、Docker安装RocketMq #!/bin/bash# 定义变量 NAMESRV_CONTAINER"rocketmq-namesrv" BROKER_CONTAINER"rocketmq-broker&quo…

WPF学习笔记(27)科学计算器

科学计算器1. 前端界面2. 功能代码3. 效果展示1. 前端界面 <Window x:Class"Cal.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http:/…

【Linux系列】unzip file 命令

博客目录掌握 unzip -o 命令&#xff1a;高效解压并覆盖文件的完整指南一、unzip 命令基础二、-o 选项的核心作用三、典型应用场景四、与其他选项的组合使用五、注意事项与风险防范六、替代方案与高级技巧掌握 unzip -o 命令&#xff1a;高效解压并覆盖文件的完整指南 在日常的…

1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却

1965–2022年中国大陆高分辨率部门用水数据集 高质量用水数据集对推进变化环境下的水资源研究至关重要。然而&#xff0c;现有中国用水数据通常按行政区划或流域汇总&#xff0c;时空分辨率不足&#xff0c;难以支撑人类用水模式及时空变化特征的精细化分析。为此&#xff0c;…

git中的指令解释

在 Git 的 diff 输出中&#xff0c;---、 和 ... 块的含义如下&#xff1a; 1. --- a/1.py 和 b/1.py --- a/1.py&#xff1a;表示旧版本的文件路径&#xff08;通常是工作目录或上一次提交的版本&#xff09;。 b/1.py&#xff1a;表示新版本的文件路径&#xff08;通常是暂存…

STM32实现四自由度机械臂(SG90舵机)多功能控制(软件篇freertos)

书接上回的硬件篇STM32控制四自由度机械臂&#xff08;SG90舵机&#xff09;&#xff08;硬件篇&#xff09;&#xff08;简单易复刻&#xff09;-CSDN博客 此时硬件平台已经搭建完毕&#xff0c;软件总共设计了三种模式&#xff0c;分别为 模式1&#xff1a;摇杆&蓝牙模…

docker常用命令集(2)

接前一篇文章&#xff1a;docker常用命令集&#xff08;1&#xff09; 本文内容参考&#xff1a; Docker build 命令 | 菜鸟教程 docker基础(二)之docker build-CSDN博客 Docker push 命令 | 菜鸟教程 Docker pull 命令 | 菜鸟教程 特此致谢&#xff01; 3. docker build …

舒尔特方格训练小游戏流量主微信小程序开源

功能特点 游戏核心功能&#xff1a; 随机生成55舒尔特方格 按顺序点击数字1-25 实时计时和尝试次数统计 错误点击反馈&#xff08;视觉和触觉&#xff09; 数据统计&#xff1a; 记录每次完成时间 保存历史最佳成绩 保存最近5次尝试记录 统计尝试次数&#xff08;错误点击&…

在Spring Boot 开发中 Bean 的声明和依赖注入最佳的组合方式是什么?

在Spring Boot 开发中&#xff0c;社区和 Spring 官方已经形成了一套非常明确的最佳实践。这个黄金组合就是&#xff1a; Bean 声明&#xff1a;使用构造型注解&#xff08;Stereotype Annotations&#xff09;&#xff0c;如 Service, Repository, Component 等。依赖注入&…

Oxygen XML Editor 26.0编辑器

Oxygen XML Editor 26.0编辑器 欢迎使用Oxygen XML Editor 26.0编辑器准备工作安装javajdk安装jdk验证Oxygen XML Editor 26.0安装欢迎使用Oxygen XML Editor 26.0编辑器 准备工作安装java Java官网下载地址:https://www.oracle.com/java/technologies/ Oxygen XML Editor 2…

AWS Lambda Container 方式部署 Flask 应用并通过 API Gateway 提供访问

前言 一年前写过一篇 Lambda 运行 Flask 应用的博文: https://lpwmm.blog.csdn.net/article/details/139756140 当时使用的是 ZIP 包方式部署应用代码, 对于简单的 API 开发用起来还是可以的, 但是如果需要集成到 CI/CD pipeline 里面就有点不太优雅. 本文将介绍使用容器方式…

React虚拟DOM的进化之路

引言 在Web前端开发中&#xff0c;用户交互的流畅性和页面性能一直是核心挑战。早期&#xff0c;开发者直接操作真实DOM&#xff08;Document Object Model&#xff09;时&#xff0c;频繁的重排&#xff08;reflow&#xff09;和重绘&#xff08;repaint&#xff09;导致性能…

(7)机器学习小白入门 YOLOv:机器学习模型训练详解

— (1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小白入门 YOLOv&#xff…

初识MySQL(三)之主从配置与读写分离实战

主重复制 主重复制原理master开启二进制日志记录slave开启IO进程&#xff0c;从master中读取二进制日志并写入slave的中继日志slave开启SQL进程&#xff0c;从中继日志中读取二进制日志并进行重放最终&#xff0c;达到slave与master中数据一致的状态&#xff0c;我们称作为主从…

RabbitMQ面试精讲 Day 2:RabbitMQ工作模型与消息流转

【RabbitMQ面试精讲 Day 2】RabbitMQ工作模型与消息流转 开篇 欢迎来到"RabbitMQ面试精讲"系列的第2天&#xff0c;今天我们将深入探讨RabbitMQ的工作模型与消息流转机制。这是面试中最常被问到的核心知识点之一&#xff0c;90%的RabbitMQ面试都会涉及消息流转流程…

基于SpringBoot3集成Kafka集群

1. build.gradle依赖引入 implementation org.springframework.kafka:spring-kafka:3.2.02. 新增kafka-log.yml文件 在resource/config下面新增kafka-log.yml&#xff0c;配置主题与消费者组 # Kafka消费者群组 kafka:consumer:group:log-data: log-data-grouptopic:log-data: …

wpf Canvas 导出图片

在WPF中将Canvas导出为图片主要涉及以下关键步骤和注意事项: ‌核心实现方法‌使用RenderTargetBitmap将Canvas渲染为位图,再通过PngBitmapEncoder保存为PNG文件。需注意临时移除Canvas的布局变换(LayoutTransform)以避免渲染异常‌1。示例代码片段:CanvasExporter.cs pu…

lvs负载均衡实操模拟

目录 一、配置准备 二、NET模式 修改LVS端 开启路由 修改对内网卡 ens160 修改对外网卡 ens224 加载网卡配置文件 修改web1端 修改网卡信息 重启网络 检测 配置web2 检测 验证配置是否正常 启动nginx服务 验证以上配置 添加lvs规则 验证 三、DR模式 修改…

Spring Boot 是如何简化 IoC 的配置的?

首先Spring Boot 并没有发明新的 IoC 理论&#xff0c;它做的也不是替换掉 Spring IoC 容器。相反&#xff0c;Spring Boot 是 Spring IoC 思想的实践者和简化者。它通过**“约定优于配置”&#xff08;Convention over Configuration&#xff09;**的理念&#xff0c;将原本繁…