uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理

news2024/12/28 8:01:28

uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理

  1. uboot开发,要想读取adc在哪个时间点读取以及如何传给cmdline,需要清楚2点,
    1. uboot启动得大致流程及相关启动功能,uboot各个硬件模块得接口,
    2. cmdline如何去设置

uboo开发具体如下:

1.uboot启动流程:

start.s

// 汇编环境

=> IRQ/FIQ/lowlevel/vbar/errata/cp15/gic // ARM架构相关的lowlevel初始化

=> _main

=> stack // 准备好C环境需要的栈

// 【第一阶段】C环境初始化,发起一系列的函数调用

=> board_init_f: init_sequence_f[]

initf_malloc

arch_cpu_init // 【SoC的lowlevel初始化】

serial_init // 串口初始化

dram_init // 【获取ddr容量信息】

reserve_mmu // 从ddr末尾开始往低地址reserve内存

reserve_video

reserve_uboot内存布局

U-Boot 由前级 Loader 加载到 CONFIG_SYS_TEXT_BASE 地址,初始化时会探明当前系统的总内存容

量,32位平台上认为最大4GB可用(但是不影响内核对容量的识别),64位平台上认为所有内存都可

用。然后通过一系列reserve_xxx() 接口从内存末尾往前预留需要的内存,最后把自己relocate到某段

reserve的空间上。内存整体使用布局如下,以ARM64为例(常规情况):

reserve_malloc

reserve_global_data

reserve_fdt

reserve_stacks

dram_init_banksize

sysmem_init

setup_reloc // 确定U-Boot自身要reloc的地址

// 汇编环境

=> relocate_code // 汇编实现U-Boot代码的relocation

// 【第二阶段】C环境初始化,发起一系列的函数调用

=> board_init_r: init_sequence_r[]

initr_caches // 使能MMU和I/Dcache

initr_malloc

bidram_initr

sysmem_initr

initr_of_live // 初始化of_live

initr_dm // 初始化dm框架

board_init // 【平台初始化,最核心部分】

board_debug_uart_init // 串口iomux、clk配置

init_kernel_dtb // 【切到kernel dtb】!

clks_probe // 初始化系统频率

regulators_enable_boot_on // 初始化系统电源

io_domain_init // io-domain初始化

set_armclk_rate // __weak,ARM提频(平台有需求才实现)

dvfs_init // 宽温芯片的调频调压

rk_board_init // __weak,由各个具体平台进行实现

console_init_r

board_late_init // 【平台late初始化】

rockchip_set_ethaddr // 设置mac地址

rockchip_set_serialno // 设置serialno

setup_boot_mode // 解析"reboot xxx"命令、

// 识别按键和loader烧写模式、

recovery

charge_display // U-Boot充电

rockchip_show_logo // 显示开机logo

soc_clk_dump // 打印clk tree

rk_board_late_init // __weak,由各个具体平台进行实现

run_main_loop // 【进入命令行模式,或执行启动命令】

2.通过流程知道,我们大概是要在哪里去加这个adc读取及设置cmdline。起码不能再adc驱动接口之前去处理,我们放在board_init里,追一下代码流程即可

这里我在这里添加如下:

u-boot/common/android_bootloader.c

android_get_dtbo函数(因为这个函数里有处理第一个cmdline字符串),具体debug追代码即可

3.知道在哪里添加接口及设置cmdline,我们需要知道如何获取到adc得值,uboot中有封装了寄存器接口,我们之间调接口即可

当然提前得分析驱动及找到相关接口:

首先得知道uboot2017已经实现了kernel同理设备配合驱动得架构

DM (Driver Model) 是 U-Boot 标准的 device-driver 开发模型,跟 kernel 的 device-driver 模型非常类似。v2017版本也遵循 DM 框架开发各功能模块。建议读者先阅读DM文档,了解DM架构原理和实现。

查看./doc/driver-model/README.txt说明

Terminology

-----------

Uclass - a group of devices which operate in the same way. A uclass provides

a way of accessing individual devices within the group, but always

using the same interface. For example a GPIO uclass provides

operations for get/set value. An I2C uclass may have 10 I2C ports,

4 with one driver, and 6 with another.

Driver - some code which talks to a peripheral and presents a higher-level

interface to it.

Device - an instance of a driver, tied to a particular port or peripheral.

简要概括:

uclass:设备驱动模型

driver: 驱动

device:设备

这个时候我们可以去查看dts,找到saradc的硬件定义,然后去找到相关驱动,这里不细说,驱动路径:

u-boot/drivers/adc

查看相关代码即可分析出,我们要获取adc值得接口。

具体使用,传参,你可以搜索是否有样例,也可以分析源码。

4.cmdline如何更新及生效。百度即可知道使用 env_update接口。使用得顺序就是你上传字符串先后得顺序

二、kernel解析cmdline

关于kernel解析,我踩了坑,这里详细说一下,

刚开始我想通过一些字符串得接口,自己去解析出一长串中,我需要得数据,发现会遇到很多问题。

比如:

storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal androidboot.dtb_idx=0 adc_val=20 androidboot.dtbo_idx=0 androidboot.verifiedbootstate=orange androidboot.serialno=11213335POT447000006 console=ttyFIQ0 firmware_class.path=/vendor/etc/firmware init=/init rootwait ro loop.max_part=7 androidboot.console=ttyFIQ0 androidboot.wificountrycode=CN androidboot.hardware=rk30board androidboot.boot_devices=fe2e0000.mmc androidboot.selinux=permissive buildvariant=userdebug earlycon=uart8250,mmio32,0xfeb50000 irqchip.gicv3_pseudo_nmi=0

我获取到这串字符按,然后解析出adc_val=20中得20,其中20是变有可能是100,有可能是1000,字符长度不定。所以很难做到。

通过查找资料,百度等,换了另一种办法通过__setup(xx,xx)去获取我上传得字符串得变量

开发如下:

1.首先kernel已经做了cmdline得解析,start_kernel中setup_arch中解析tags获取cmdline,拷贝到boot_command_line中。我们接着往下看start_kernel。

start_kernel中setup_arch中解析tags获取cmdline,拷贝到boot_command_line中。我们接着往下看start_kernel。调用setup_command_line,

将cmdline拷贝2份,放在saved_command_line static_command_line。

总结下kernel的参数解析:

(1)kernel编译链接,利用.__param .init.setup段将kernel所需参数(driver及通用)和对应处理函数的映射表(obs_kernel_param  kernel_param结构体)存放起来。

(2)Kernel启动,do_early_param处理kernel早期使用的参数(如earlyprintk earlycon)

(3)parse_args对cmdline每个参数都遍历__param .init.setup进行匹配,匹配成功,则调用对应处理函数进行参数值的解析和设置。

总结来说,内核有解析cmdline得源码,它解析出来得数据会存在一个地方,而且cmdline整个字符串,也存在了一个全局指针里。

对于各个内核驱动模块来说,我们可以拿这个全局指针获取到cmdline,然后去解析出你自己需要得字符串数据,又或者是之间使用__setup,

这里我们使用(3)得方法,写一个函数,之间获取到相应字符串得数据,如下:

这样我们就可以再各个内核模块中获取到adc值,进而去判断硬件版本,然后去设置相应得功能

三、在设置不同功能的时候,又会遇到很多坑,涉及到dts得处理。所以最好是能存几份dts,然后根据adc去判断取那份dts,在接下来得文档里说明

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

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

相关文章

主机安全各个方面应该怎么做?

主机安全是指保护主机系统不受恶意攻击和未经授权访问的威胁,以保证系统的稳定性、可用性和数据的安全性。 以下是主机安全涉及的几个方面做法: 1. 操作系统安全:安装操作系统时需要选择合适的版本,及时打补丁更新,配置…

入职Linux驱动工程师后,我才知道的真相…

大家好,我是ST。 做Linux驱动工程师也有一段时间了,今天分享一下我曾经入职才知道的一些事情,算是一个菜鸟的经历吧! 设备树 起初学习Linux驱动,是从最简单的一个.c文件开始。 在.c中实现module_init和module_exit这…

大模型入门(三)—— 大模型的训练方法

参考hugging face的文档介绍:https://huggingface.co/docs/transformers/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism,以下介绍聚焦在pytorch的实现上。 随着现在的模型越来越大,训练数据越来越多时&…

基于Ubuntu22.10系统安装部署webmin软件

Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具。有了这个工具的帮助,我们可以管理内部的系统配置,诸如设置用户账户,磁盘配额,像Apache, DNS, PHP, MySQL,文件共享的服务等。 本文描述在ubuntu22.…

VS+C#+WPF多线程视频摄像头播放器监控

程序示例精选 C#WPF多线程视频摄像头播放器监控 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C#WPF多线程视频摄像头播放器监控>>编写代码&#xff0c;代码整洁&#xff0c;规…

el-table点击单元格变成输入框,以及其自动获取焦点失效可能的原因(focus失效)

1.el-table点击单元格变成输入框 这里主要使用了el-table三个自带的方法/属性&#xff1a; <el-table:data"MesTableData"bordercell-click"clickCell":row-class-name"tableRowClassName":cell-class-name"tableCellClassName" …

解决elementUI弹出框关闭后再打开el-select下拉框无法选中的问题

文章目录 一、问题描述&#xff1a;二、问题解决 一、问题描述&#xff1a; 使用的前端UI框架为elementUI。 el-select组件在一个弹框中&#xff0c;打开该弹框&#xff0c;el-select可以正常选中&#xff0c;但是保存弹框中的表单信息关闭弹框后&#xff0c;再打开弹框&…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

【Java基础篇】方法的使用(方法的重载和递归)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

打造智能生活方式

2个互联网工具与你分享 分享一&#xff1a; 随记单词是一款功能强大的单词记忆和管理应用程序。它为用户提供了便捷的学习工具和智能化的记忆方式&#xff0c;帮助用户轻松有效地记忆和掌握单词。 随记单词的特点之一是个性化记忆计划。用户可以根据自己的学习进度和需求&am…

如何使用MATLAB处理涡度通量数据

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&#x…

苹果头显Vision Pro深度解读3 苹果头显visonOS开发指南

1 程序员visonOS开发指南 作为iOS开发者&#xff0c;切换到visionOS开发非常简单啊&#xff0c;过去的一些技术基本上都用得上。目前根据苹果WWDC官方的文档&#xff0c;视频&#xff0c;我们可以知道: 开发语言&#xff0c;使用的是swift object-c c c等&#xff0c;swif…

简化日志数据管理:利用 Elastic 灵活路由的力量

作者&#xff1a;Felix Barnsteiner&#xff0c;Nicolas Ruflin 在 Elasticsearch 8.8 中&#xff0c;我们在技术预览中引入了重新路由处理器&#xff08;reroute processor&#xff09;&#xff0c;它可以根据灵活的路由规则将文档&#xff08;例如日志&#xff09;发送到不同…

Jmeter吞吐量控制器使用小结

吞吐量控制器(Throughput Controller)场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现.。 添加吞吐量控制器 如果你想学习jmeter性能测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网…

第十六届全国大学生信息安全竞赛CISCN---Cypto

1.Sign_in_passwd 打开环境&#xff0c;下载附件&#xff0c;用记事本打开flag的文件 发现里面是像base密码但又不像base密码的一串&#xff0c;第二行的%&#xff0c;就很像url密码啊&#xff0c;之前做题没接触过啊&#xff0c;还是做题做少了 没有啥解题思路&#xff0c;看…

基于Jeecg-boot的flowable流程支持拒绝同意流程操作

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为看很多朋友需要…

利用Transformer BEV解决自动驾驶Corner Case的技术原理

摘要&#xff1a; 本文总结了Transformer和BEV技术在自动驾驶中的原理和应用&#xff0c;特别是如何解决Corner Case问题。 自动驾驶系统在实际应用中需要面对各种复杂的场景&#xff0c;尤其是Corner Case&#xff08;极端情况&#xff09;对自动驾驶的感知和决策能力提出了更…

访问者模式(十八)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了命令模式(十七), 如果没有看过, 请观看上一章 一. 访问者模式 引用 菜鸟教程里面访问者模式介绍: https://www.runoob.com/design-pattern/visitor-pattern.html 在访问者模式&#xff08;Visitor Pattern&#xff09…

大模型入门(六)—— RLHF微调大模型

一、RLHF微调三阶段 参考&#xff1a;https://huggingface.co/blog/rlhf 1&#xff09;使用监督数据微调语言模型&#xff0c;和fine-tuning一致。 2&#xff09;训练奖励模型     奖励模型是输入一个文本序列&#xff0c;模型给出符合人类偏好的奖励数值&#xff0c;这个奖…

大数据技术——用户与组管理

一、实验目的 1.了解linux用户和组 2.熟练掌握liunx用户和组的基本操作 3.进一步了解linux系统 二、实验内容 1.用户账号的添加、删除与修改。 2.用户口令的管理 3.用户组的管理 三、实验原理或流程 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使…