0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux驱动通过uboot的变量实现掉电记忆

大胆11 2023-07-04 19:17 次阅读

起因

今天项目有个新需求就是让屏幕亮度在上电以后保持上次最后设置的值

我们的项目屏幕的初始化是在kernel里而不是uboot,kernel的驱动的加载是在根文件系统之前,所以我们无法从配置文件中读取亮度。

首先大家能想到的就是让让他存储到内核能读取到的rom中去,到底哪里合适的,方便读写

经过查资料,发现uboot的环境变量的更改是直接保存到rom中,区别于kernel的环境变量保存到rom中。而且我们知道kernel启动后会读取uboot传入的bootargs,那说明kernel就有对应的函数去读。

接下来就说明下接口的调用

使用

首先是对bootargs的一些操作

我是在bootargs添加一个backlight,他的属性值等于另外一个参数,这样做的话就可以减少bootargs的变动

backlight=20
#set kernel cmdline if boot.img or recovery.img has no cmdline we will use this
setargs_nand=setenv bootargs console=${console} root=${nand_root} rootwait init=${init} rdinit=${rdinit} loglevel=${loglevel}  earlyprintk=${earlyprintk} initcall_debug=${initcall_debug}  loglevel=${loglevel} partitions=${partitions} cma=${cma} gpt=1 backlight=${backlight}
setargs_mmc=setenv bootargs console=${console} root=${mmc_root} rootwait init=${init} rdinit=${rdinit} loglevel=${loglevel} earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} loglevel=${loglevel} partitions=${partitions} cma=${cma} gpt=1 backlight=${backlight}

在驱动中使用的函数是__setup(str, fn)​

__setup宏在定义如下:

/*
 * Only for really core code.  See moduleparam.h for the normal way.
 *
 * Force the alignment so the compiler doesn't space elements of the
 * obs_kernel_param "array" too far apart in .init.setup.
 */
#define __setup_param(str, unique_id, fn, early)			
	static const char __setup_str_##unique_id[] __initconst		
		__aligned(1) = str; 					
	static struct obs_kernel_param __setup_##unique_id		
		__used __section(.init.setup)				
		__attribute__((aligned((sizeof(long)))))		
		= { __setup_str_##unique_id, fn, early }

#define __setup(str, fn)						
	__setup_param(str, fn, fn, 0)

第一个参数是bootargs的属性,第二个参数是要把属性值作为参数的函数的指针,说白了就是函数

函数的要求是 static int __init​类型,下面是我使用的时候的一个demo

kstrtoint是用于将读取到的值从字符数字转换成数值

kstrtoint和标准的c库有些去别,请注意看!!!

第一个参数是要被转化的字符串,第二个参数是保存的进制,第三个参数才是int类型的数据的地址

static int __init get_env_backlight(char * backlight)
{

	kstrtoint(backlight, 10, &backlight_value);
	// printk("%s:num:%dn",__FUNCTION__,backlight_value);
	return 0;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209315
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27392
  • Uboot
    +关注

    关注

    4

    文章

    125

    浏览量

    28213
  • Linux驱动
    +关注

    关注

    0

    文章

    43

    浏览量

    9960
  • 掉电记忆
    +关注

    关注

    0

    文章

    3

    浏览量

    2081
收藏 人收藏

    评论

    相关推荐

    linux驱动开发_文件系统本地挂载

    介绍Linux开发根文件系统挂载、NFS文件系统配置,UBOOT环境变量配置,完成文件系统启动。
    的头像 发表于 09-17 15:52 1469次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>驱动</b>开发_文件系统本地挂载

    请问linuxuboot怎么实现u***下载?

    linuxuboot怎么实现u***下载,u***下载命令有哪些?编译UBOOT需要修改哪些配置?
    发表于 10-31 05:20

    STC单片机的掉电记忆功能如何去掉?

    我看了例程,没怎么看懂,谁做过掉电记忆功能这块啊
    发表于 05-08 02:20

    zynq arm移植ubootLinux,使用setenv设置环境变量,显示无这个指令

    最近在学习zynq的Linux开发,在移植ubootLinux内核设置环境变量时报的错误,没有这个指令,网上搜了很多都没有解决办法,有没有人知道啊,求教。
    发表于 08-29 22:29

    uboot lds 文件说明

    linuxuboot lds 文件说明
    发表于 11-02 11:02 0次下载

    基于HL开发板的密码锁掉电记忆密码

    掉电记忆功能是:数码设备突然非正常关机后,再开机时数码设备可以从关机前正在运行的程序处接着运行。不用从头开始。
    发表于 09-01 14:06 2次下载
    基于HL开发板的密码锁<b class='flag-5'>掉电</b><b class='flag-5'>记忆</b>密码

    Linux运行期间升级Linux系 统Uboot+kernel+Rootfs

    Linux运行期间升级Linux系 统Uboot+kernel+Rootfs
    发表于 10-30 08:43 5次下载
    在<b class='flag-5'>Linux</b>运行期间升级<b class='flag-5'>Linux</b>系 统<b class='flag-5'>Uboot</b>+kernel+Rootfs

    UBOOT命令总结

    分享到: 很好的UBOOT命令总结,起步时就是看的这篇东西,熟悉了以后就用?看自带帮助就行:) Printenv 打印环境变量Uboot》 printenv baudrate=115200
    发表于 11-08 10:24 18次下载

    基于ARM9和NANDFlash对ubootLinux内核进行修改

    本文针对嵌入式Linux操作系统提出了一种新的更新机制,并且基于ARM9微处理器和NANDFlash存储器,对ubootLinux内核进行修改,实现了对嵌入式
    发表于 04-07 11:00 2796次阅读
    基于ARM9和NANDFlash对<b class='flag-5'>uboot</b>和<b class='flag-5'>Linux</b>内核进行修改

    linux内核中percpu变量实现

    不会相互影响,所以也就不会有各种多线程问题。 正确的使用thread local变量,能极大的简化多线程开发。所以不管是c/c++/rust,还是java/c#等,都内置了对thread local变量的支持。 但你知道吗,不仅是在编程语言中,在
    的头像 发表于 01-04 13:39 1958次阅读

    嵌入式Linux环境变量分区制作

    嵌入式Linux环境变量分区制作嵌入式环境变量分区准备一个存放环境变量的文本文件制作环境变量的工具制作环境
    发表于 11-02 10:35 8次下载
    嵌入式<b class='flag-5'>Linux</b>环境<b class='flag-5'>变量</b>分区制作

    嵌入式linux学习 Day1 uboot基础

    嵌入式linux学习 Day1 uboot基础
    发表于 12-05 20:51 7次下载
    嵌入式<b class='flag-5'>linux</b>学习 Day1 <b class='flag-5'>uboot</b>基础

    LINUX环境变量总结

    Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的运行环境。而这个环境是由一组变量所定义,这组变量被称为环境变量。用户可以对自己的环境
    发表于 01-29 10:55 437次阅读

    基于51单片机的密码锁(掉电记忆密码)例程源代码

    基于51单片机的密码锁(掉电记忆密码)例程源代码
    发表于 05-16 11:13 25次下载

    Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种。环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时
    的头像 发表于 10-23 13:39 156次阅读