sysconfig配置系统,作为一个通用的软件平台,还希望通过它。能够适应用户不同的方案。通过给出一个相应的配置。用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数。

一、 sysconfig1.fex简述

配置脚本的本意是给系统传递參数。作为一个稳定的系统。本身应该和方案无关, 无论不同方案的区别有多大,系统都不应该又一次编译才干执行。这里所说的系统。不单单指操作系统,也包含当中的驱动,模块。等等。

不同方案的区别。通常体如今:
1) 使用的硬件模块不同。比方使用了不同的NAND FLASH。RTC模块,等等。
2) 同样模块使用的參数不同。当中包含GPIO不同,比方卡检測脚不同,SPI的引
脚不同,等等。包含运行的频率不同,如DRAM的频率,CPU的频率,等等。
3) 走线的方式不同。

4) 没有列举出的区别。
通常说来。上面列举的方案区别中,(3)和(4)对于一个系统来说没有不论什么区别。仅仅
有(1)和(2),才可能导致一个系统须要又一次编译。


比如:
[uart_para0]
uart_used = 1
uart_port = 0
uart_type = 2
uart_tx = port:PB22<2><1><default><default>
uart_rx = port:PB23<2><1><default><default>

uart_para0是主键 uart_used uart_port uart_type uart_tx uart_rx 各自是uart_para0的子键。而uart_tx uart_rx相应着A10的GPIO

; 说明: 脚本中的字符串区分大写和小写,用户能够改动"="后面的数值,可是不要改动前面的字符串
; 描写叙述gpio的形式:Port:port+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>

这是一种典型的管理配置的方式,简单地归纳特点例如以下
1) 配置独立于代码。用文件的方式存储、可读写
2) 集中管理,具有一定的规范。多种模块遵循同一种配置规则
3) 有专门一套代码去管理配置,读取对应的配置提供给程序

二、 解析过程思路


PC端配置数据的生成

配置脚本本质上是PC端的一个文本文件。通过一个固定的格式形成能够被我们使用的文件,里面保存了大量的配置信息。在图一中,能够看到。PC端的一个数据文件怎样变成了小机端能够用到的文件。

图一 小机端配置文件生成

图一中能够看出,当用户生成一个配置文件之后,不须要做额外的操作。仅仅要依照正常的打包,烧写过程。配置文件的数据就自己主动被嵌入到boot相关的数据中了。

3.2系统启动的数据传递

在小机端,系统启动之后存在数据传递的过程,这个过程主要是数据从boot中读出,然后存放到操作系统指定的位置。

然后操作系统能够自己搬移这块数据,或者直接使用这块和配置有关的数据。相关的处理过程能够參见图二。

图二 配置系统在系统中的流程

从图二中能够看出,boot阶段把数据从boot1.bin中读出,然后传递给了操作系统。操作系统拿到数据之后,做一次初始化动作,然后就一直等待用户进行操作。当系统关机的时候,操作系统须要调用一次配置管理的退出函数。然后,整个配置系统的执行就结束。

3.3用户调用配置系统的数据传递

当用户调用配置系统的时候,里面存在数据传递。图三表示了用户的数据怎样传递到系统。以及系统怎样做出对应的。


图三  配置系统使用中数据传递流程

通过图三。用户能够看出,当调用配置相关的函数的时候。系统中以及配置管理模块怎样管理用户传入的数据。



三、 关键函数分析


在系统中,提供了例如以下的几个函数。提供给用户在系统中读取配置信息的数据。

函数原型: int Script_parser_fetch(char *main_name,
char *sub_name, int value[], int count);

參数:main_name 主键名称,即配置脚本中的主键名称,字符串形式

sub_name  子键名称。配置脚本中的子键名称。字符串形式

value      数据指针,用于存放用户获取的数据

count      用户传进的数据空间的最大word个数

返回值:        成功返回0

失败返回-1

这个函数的功能非常强大。能够获取配置脚本中随意一项的值。

比方,用户须要获取配置脚本中。主键target下的子键boot_clock的值,能够写成

{

int  value;

int  ret;

ret = Script_parser_fetch(“target”, “boot_clock”, &value, 1);

if(ret < 0)

printf(“fetch script data fail\n”);

else

printf(“fetch script data ok, value = %d\n”, value);

return ret;

}

在这个函数中,获取到的值存放在整型变量value中,正常情况下,函数调用的结果是 value
= 406

假设要获取一个配置的GPIO信息,比方twi_para的twi_scl能够使用例如以下的形式

{

user_gpio_set_t  gpio_info[1];

int  ret;

ret = Script_parser_fetch(“twi_para”, “twi_scl”, gpio_info, sizeof(user_gpio_set_t)/sizeof(int));

if(ret < 0)

printf(“fetch script gpio infomation fail\n”);

else

printf(“fetch script gpio infomation ok \n”);

return ret;

}

这个函数将把获取到的GPIO信息存放到结构体gpio_info中。

用户能够使用这个结果,来调用GPIO管理模块提供的函数。

用户也能够使用脚本函数来获取一个字符串。

比方,存在例如以下的一个主键和子键项目

[string_test]

string_demo = string:abcdefghijklmn

如今。能够用这个函数来获取出主键string_test的子键string_demo的值。

正常情况下。调用例如以下的函数之后。string_info中保存的值将是“abcdefghijklmn”(没有引號)。

{

char  string_info[128];

int  ret;

memset(string_info, 0, 128);

ret = Script_parser_fetch(“string_test”, “string_demo”, string_info, 128/sizeof(int));

if(ret < 0)

printf(“fetch script string infomation fail\n”);

else

printf(“fetch script string infomation ok \n”);

return ret;

}

获取子键个数

函数原型:int  Script_parser_subkey_count(char *main_name);

參数:      main_name 主键名称,即配置脚本中的主键名称,字符串形式

返回值:  成功返回 主键下的子键个数

失败返回 -1

这个函数返回的是一个主键下全部的子键的个数,通经常使用户不会关心它。

这个函数更大的用途还在于做检查。

{

int  sub_key_count;

sub_key_count = Script_parser_subkey_count (“target”);

if(sub_key_count < 0)

printf(“fetch script sub key count fail\n”);

else

printf(“fetch script sub key count ok , sub_key_count = %d\n”, sub_key_count);

return sub_key_count;

}

调用如上的函数。将获取到主键target下的全部子键的个数,即得到数值4。

获取主键个数

函数原型:int Script_parser_mainkey_count(void);

參数:无

返回值:  成功返回 配置脚本中主键的总的个数

失败返回 -1

这个函数将获取全部主键的个数,和Script_parser_subkey_count一样,主要用途还是做检查使用。

{

int  main_key_count;

main_key_count = Script_parser_mainkey_count();

if(main_key_count < 0)

printf(“fetch script sub key count fail\n”);

else

printf(“fetch script main key count ok , main_key_count = %d\n”, main_key_count);

return main_key_count;

}

调用如上的函数,将获取到配置脚本中主键的个数。

函数原型:int Script_parser_mainkey_get_gpio_count(char
*main_name);

參数:main_name  配置脚本中主键的名称。字符串形式

返回值:  成功返回 配置脚本中主键下的,数据GPIO类型的子键个数

失败返回 -1

获取主键下GPIO个数

这个函数的调用将得到主键下的子键中,值属于GPIO类型的子键个数。

比方。当获取twi_para下的子键中的GPIO类型时。将获取到数值2。

{

int  gpio_key_count;

gpio_key_count = Script_parser_mainkey_get_gpio_count (“twi_para”);

if(gpio_key_count < 0)

printf(“fetch script sub key count fail\n”);

else

printf(“fetch script gpio key count ok , gpio_key_count = %d\n”, gpio_key_count);

return gpio_key_count;

}

假设把上面函数的參数twi_para替换成target,则得到的将是0。

假设把上面函数的參数twi_para替换成nand_para,则得到的将是23。

获取主键下GPIO配置

这个函数将获取一个主键下,全部属于GPIO的子键的GPIO描写叙述值。

函数原型:int Script_parser_mainkey_get_gpio_cfg(char
*main_name, void *gpio_cfg, int gpio_count);

參数:main_name 主键名称,即配置脚本中的主键名称,字符串形式

gpio_cfg   用于存放GPIO信息的地址,应该是属于user_gpio_set_t的数据结构

gpio_coumt 用户传进的结构体的个数

返回值:   成功返回0

失败返回-1

调用这个函数。将把配置脚本中匹配主键名称的。属于GPIO类型的子键的个数。

{

user_gpio_set_t  gpio_info[2];

int  ret;

ret = Script_parser_mainkey_get_gpio_cfg(“twi_para”,gpio_info, 2);

if(ret < 0)

printf(“fetch script gpio infomation fail\n”);

else

printf(“fetch script gpio infomation ok \n”);

return ret;

}

调用这个函数,将获取配置脚本里,twi_para的子键中。属于GPIO类型的描写叙述信息。



本文大致地将sysconfig1.fex简介一下。主要是为了后面分析驱动的过程做准备,大部分SUN4I平台的驱动都是採用这样的方式来管理配置的,我们最好还是也用这样的方式.






















版权声明:本文博客原创文章,博客,未经同意,不得转载。

Lichee (五岁以下儿童) sysconfig1.fex 配置系统的更多相关文章

  1. Lichee (五) sysconfig1.fex 配置系统

    sysconfig配置系统,作为一个通用的软件平台,还希望通过它,可以适应用户不同的方案.通过给出一个对应的配置,用户的方案就可以自动运行,而不需要修改系统里面的代码,或者重新给出参数. 配置脚本的本 ...

  2. (五岁以下儿童)NS3样本演示:桥模块演示样品csma-bridge.cc凝视程序

    (五岁以下儿童)NS3:桥模块演示样品csma-bridge.cc凝视程序 1.Ns3 bridge模csma-bridge.cc演示示例程序的目光 // Network topology // // ...

  3. linux下一个Oracle11g RAC建立(五岁以下儿童)

    linux下一个Oracle11g RAC建立(五岁以下儿童) 四.建立主机之间的信任关系(node1.node2) 建立节点之间oracle .grid 用户之间的信任(通过ssh 建立公钥和私钥) ...

  4. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  5. PE文件结构(五岁以下儿童)基地搬迁

    PE文件结构(五岁以下儿童) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 基址重定位 链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认 ...

  6. Servlet(五岁以下儿童)web.xml一些常用的配置

    (1)lode-on-startup,这Servlet该项目启动时它将被称为(从主要的电话init办法,为了安全起见,一般不应为Servlet建立URL制图).一些数据通常被用作前处理,或使用多线程建 ...

  7. Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)

    首先.在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中,研究的是爬取单个网页的方法.在教程(三)(http://blo ...

  8. nagios二次开发(五岁以下儿童)---nagios和nagiosql关系

    基于nagios和nagiosql理解.这将是这两个梳理比较粗糙的简单关系,有关详细信息,请参阅下面的图如:      从上面的关系图中能够看出,nagios与nagiosql共享了主机.主机组.服务 ...

  9. ExtJs4得知(五岁以下儿童)主要的Ext分类

    Ext类是ExtJs最常见的.最基本的类,它是一个全局对象,它封装了全班.辛格尔顿和 Sencha 该方法提供了一种有用的库. 嵌套在该命名空间中一个较低的水平最用户界面组件. 但是提供了很多有用的功 ...

随机推荐

  1. AOP编程,spring实现及JDK,CGLIB实现

    什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程)和OOP(Object-Oriented Programing,面向对象编程)思想不同,两者并非对立关系,前 ...

  2. 搭建Go开发及调试环境(LiteIDE + GoClipse)

    搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 这里以Windows7 64位为例,如果是32位环境需安装对应版本程序. 一.安装golang1.2.2 1.3 ...

  3. MYSQL 语法大全自己总结的

    mysql语法大全 --------数据链接---------------------数据库服务启动net start mysql --关闭服务net stop mysql --登录 -u,-p后面不 ...

  4. Hadoop2.0/YARN深入浅出(Hadoop2.0、Spark、Storm和Tez)

    随着云计算.大数据迅速发展,亟需用hadoop解决大数据量高并发访问的瓶颈.谷歌.淘宝.百度.京东等底层都应用hadoop.越来越多的企 业急需引入hadoop技术人才.由于掌握Hadoop技术的开发 ...

  5. Cocos2d-x学习笔记(5)

    Cocos2d-x基本元素介绍: 1.CCDirector:大总管 这是控制游戏流程的主要组件,包含设定游戏呈现窗体.FPS显示.默认帧率上限.纹理颜色位宽等切换当前游戏场景.暂停或恢复场景执行.通过 ...

  6. 解决VTune错误.../lib64/libstdc++.so.6: version `GLIBCXX_3.4.14&#39; not found (required by ...)

    错误信息及出现情景: 在export环境变量LD_PRELOAD=$XTERN_ROOT/dync_hook/interpose.so后,再执行amplxe-gui,出现上述错误.新增的动态链接库对V ...

  7. PDCA模型的学习

    PDCA是广泛应用于质量控制中的一种管理学模型. P即plan,分析和了解当前的状况,然后作出改进的计划: D即do,执行所作出的计划: C即check,对执行的结果进行检查,要确认哪些是对的,哪些是 ...

  8. 中国本土管理咨询公司排名TOP50

    中国本土管理咨询公司排名TOP50 1. 北京正略钧策管理顾问有限公司 2. 北京和君咨询公司 3. 北大纵横管理咨询公司 4. 远卓管理顾问公司 5. AMT管理咨询公司 6. 华夏基石管理咨询有限 ...

  9. velocity中的velocityCounter不起作用的原因

    今天用org.springframework.ui.velocity.VelocityEngineFactoryBean 时,velocityCounter这个变量的时候死活不起作用,折腾了良久也不行 ...

  10. 待机状态下,服务类型 WCDMA Service type in Idle mode

    Services aredistinguished into categories defined in [7]; also the categorisation of cellsaccording ...