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

这篇具有很好参考价值的文章主要介绍了uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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追代码即可

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

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

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

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

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

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

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)得方法,写一个函数,之间获取到相应字符串得数据,如下:

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

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

三、在设置不同功能的时候,又会遇到很多坑,涉及到dts得处理。所以最好是能存几份dts,然后根据adc去判断取那份dts,在接下来得文档里说明文章来源地址https://www.toymoban.com/news/detail-490078.html

到了这里,关于uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 完全理解ARM启动流程:Uboot-Kernel

    内容共计5W+字数,但是我还是很多地方说的不够尽兴。那么下次聊! bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。 PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例

    2024年04月15日
    浏览(37)
  • ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs

    懒人方式: 直接去方锐/qemu克隆项目,执行script目录的脚本即可 1. build_env.sh安装环境 2. build_rootfs.sh 生成rootfs 3. build_kernel.sh编译kernel 4. qemu_run.sh开始调试 2.1busybox代码的下载编译 Busybox下载地址:https://busybox.net/downloads/ Download 1.36.0 Busybox 默认会安装到 ./_install 目录下 制作ro

    2024年02月02日
    浏览(40)
  • IMX6ULL---Buildroot构建uboot kernel rootfs

    目录 1. Buildroot 简介 2. 获取 buildroot 源码  3. 编译环境配置 4. 通过buildroot编译imx6ull

    2024年02月03日
    浏览(22)
  • IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

    目录 linux开发板启动流程 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用  安装内核和模块到开发板上  Bootloader 介绍 编译 u-boot 镜像 Reset--ROM--bootloader--kernel+dtb--rootfs--AP

    2024年01月22日
    浏览(34)
  • 荔枝派Zero(全志V3S)烧录Uboot、Kernel及rootfs到SD卡并运行在板子上

    通过前面 Uboot编译及配置 我们获得了 u-boot-sunxi-with-spl.bin 通过前面 Kernel编译 我们获得了zImage镜像文件及sun8i-v3s-licheepi-zero-dock.dtb设备树文件 通过前面 rootfs编译我们获得了 rootfs.tar 文件系统 那么下面就将相关文件烧录到 SD 卡并运行在板子上看下效果 1、插上SD卡 2、查看分区

    2024年02月08日
    浏览(54)
  • STM32--ADC数值采样/附ADC采集热敏传感器使用

    目录 一丶ADC介绍 二丶ADC工作原理及管脚分布 三丶代码部分详解 (一)库函数介绍 (二)代码部分整合         ADC模块中文名为模拟/数字转换器,是12位逐次逼近型的模拟数字转换器,一般用于数值的采样   可以将引脚上连续变化的模拟电压转换为内存中存储的数字变

    2024年02月03日
    浏览(33)
  • Stm32_标准库_11_ADC_光敏&热敏传感器_测数值

    在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1: 在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_

    2024年02月19日
    浏览(30)
  • 前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

    具体的流程如图所示: 1.点击excel录入按钮  2.打开弹框  3.点击上传按钮,会自动打开计算机本地文件,选择想上传的文件,点击打开  4.会将excel的数据解析成一个表格,可以在表格中做删除操作,点击确定  5.将excel的人员与系统中的人员做一个对比,若不在系统中,则无

    2024年02月16日
    浏览(38)
  • STM32—ADC详解入门(ADC读取烟雾传感器的值)

    目录 一、ADC是什么 二、ADC的性能指标 三、ADC特性 四、ADC通道 五、ADC转换顺序 六、ADC触发方式 七、ADC转化时间 八、ADC转化模式 九、实验(使用ADC读取烟雾传感器的值) 1、配置 2、代码         ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指

    2024年02月11日
    浏览(29)
  • Matlab:从文本文件中读取数值数据到矩阵

    Matlab:从文本文件中读取数值数据到矩阵 在Matlab中,我们常常需要将保存在文本文件中的数值数据读取到程序中,以便进行数据处理和分析。本文将介绍如何使用Matlab将文本文件中的数值数据导入到矩阵中。 首先,我们需要创建一个文本文件,其中包含我们希望读取的数值

    2024年02月15日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包