电子说
今天项目有个新需求就是让屏幕亮度在上电以后保持上次最后设置的值
我们的项目屏幕的初始化是在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;
}
全部0条评论
快来发表一下你的评论吧 !