
uboot\common\mainc
void main_loop(void) 中调用了几个重要的函数
main_loop调用了run_preboot_environment_command, 该函数执行了 preboot定义的行为
preboot 的定义在 这里uboot\include\env_defaulth
所以有一些预先设定的 *** 作可以定义在 CONFIG_PREBOOT 这个宏当中,来看看我所用平台中定义的行为
CONFIG_PREBOOT 中有两个流程需要关注 bcb_cmd 和 switch_bootmode
先介绍下 bcb
BCB是Bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区。占用三个page,其本身就是一个结构体,详细成员以及各成员含义例如以下,位于/bootloader/revocery/bootloaderh文件里:
l command字段:当要重新启动进入Recovery模式或更新radio、bootloader固件时。linux会更新这个值。当固件更新完毕后Bootloader也会更新这个值。另外在成功更新后结束Recovery时。会清除这个成员的值,防止重新启动时再次进入Recovery模式。
l status字段:在完毕对应的更新后。Bootloader会将运行结果写入到这个字段。
l recovery字段:可被Main System写入,也可被Recovery服务程序写入。该文件的内容格式为:
该文件存储的就是一个字符串,必须以recovery\n开头,否则这个字段的全部内容域会被忽略。“recovery\n”之后的部分,是/cache/recovery/command支持的命令。
能够将其理解为Recovery *** 作过程中对命令 *** 作的备份。Recovery对其 *** 作的过程为:先读取BCB然后读取/cache/recovery/command,然后将二者又一次写回BCB。这样在进入Main system之前。确保 *** 作被运行。在 *** 作之后进入Main system之前。Recovery又会清空BCB的command域和recovery域,这样确保重新启动后不再进入Recovery模式。
而定义的 bcb_cmd=get_valid_slot 其介绍为
This command will choose valid slot to boot up which saved it misc partition by mark to decide whether execute command
get_rebootmode do_get_rebootmode
switch_bootmode 中用到的reboot mode 是 factory_reset update cold_boot fastboot 这几种
factory_reset是进recovery 界面
update 是选择了ota 包后直接进入的recovery 升级流程
以reboot mode 为update caes 为例,其流程如下
可以看到做了一些前置的判断后 是通过 bootm ${loadaddr}; 跳转到下一个流程的启动地址
以recovery_from_flash 为例,设置bootargs 参数 和dt 以及recovery 地址,然后使用 imgread kernel 可以 recovery 参数后启动kernel
recovery的流程看完了,看下正常开机的流程,即main_loop 中 bootdelay_process() 和autoboot_command
这个bootcmd 也是有个默认的宏定义值
uboot\include\env_defaulth
在我的工程文件中定义的 CONFIG_BOOTCOMMAND如下
所以可以看到传给autoboot_command 的字符串是 "run storeboot"
这里介绍下其中的 autoboot_command调用的的 abortboot , 如下两个函数会判断是否有对应的输入来决定是否进入boot console
Kernel 314
kernel rebootc 会调用 machine_power_off 和 machine_restart
这边的平台是arm64 平台,其对应函数实现是在 arch/arm64/kernel/processsc
processsc 中有调用了 pm_power_off arm_pm_restart
所以可以通过注册了 pm 的全局方法 pm_power_off arm_pm_restart来实现设定对应的寄存器值
这里是Android的标准流程,这里可以参考这份资料
>
什么是RTU License
S5700交换机支持的RTU License
S5700交换机RTU License使用说明
40GE上行口提升速率RTU License使用说明
分组提升接口速率RTU License使用说明
通过RTU License提升端口速率的 *** 作方法
什么是RTU License
RTU(Right to Use)是用于对 硬件能力 的授权使用方式,如流数、容量、端口等, 绑定设备后不能迁移 。RTU是 硬件 价值一部分,生命周期与硬件相同。
如 表1-1 所示,S交换机支持如下几种License,其中RTU License是资源型License的一种。
表1-1 License分类
License类型说明
功能型License功能型License控制用户对设备某项功能的使用。用户想要使用某受限功能,需要首先获得该功能的授权。
例如用户想要VXLAN的分布式网关功能和BGP E***功能,则就需要购买“VXLAN增强功能授权License”。
资源型License资源型License控制用户对资源项数目的使用。用户想要使用对应资源项,需要首先获得该资源项的授权。
用户根据实际业务需要,可以不选择资源型License,使用产品默认支持的资源;也可以选择购买一个或者多个资源型License,用户可以任意组合,最终获得的资源数目为所有资源型License的资源之和。
根据资源型License控制的资源,可以将资源型License分为软件资源License和硬件资源License。
软件资源License:例如S5700默认支持接入的AP数是16个,如果用户想要扩充AP的接入数量,则就需要购买“WLAN无线接入控制器AP资源授权License”。该License属于软件资源License。
硬件资源License: 即RTU License 。例如S5732-H24UM2CC的接口速率默认是25GE,如果用户想要将接口速率提升到10GE,则就需要购买“25GE接口升级到10GE接口RTU授权License”。
S5700交换机支持的RTU License
S5700系列交换机支持的RTU License是用于提升交换机的端口速率,主要包括下表所示的几种License控制项。S5700系列交换机中不同的设备款型所支持的RTU License不同,具体请参见《S5700系列交换机 License使用指南》中的“ License控制介绍 ”。
表1-2 RTU License控制项
分类License控制项能力说明
40GE上行口提升速率40GE接口升级到100GE接口授权激活License前:6个上行接口默认速率为40Gbit/s。
激活License后:6个上行接口默认速率为100Gbit/s。
分组提升接口速率1GE接口升级到25GE接口授权激活License前:接口默认速率为1Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从1Gbit/s升级到25Gbit/s。
1GE接口升级到5GE接口授权激活License前:接口默认速率为1Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从1Gbit/s升级到5Gbit/s。
1GE接口升级到10GE接口授权激活License前:接口默认速率为1Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从1Gbit/s升级到10Gbit/s。
25GE接口升级到5GE接口授权激活License前:接口默认速率为25Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从25Gbit/s升级到5Gbit/s。
25GE接口升级到10GE接口授权激活License前:接口默认速率为25Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从25Gbit/s升级到10Gbit/s。
5GE接口升级到10GE接口授权激活License前:接口默认速率为5Gbit/s。
激活License后:可以将指定组(每组12个接口为一组)的速率从5Gbit/s升级到10Gbit/s。
S5700交换机RTU License使用说明
40GE上行口提升速率RTU License使用说明
必须同时对固定的6个上行接口同时提升速率。
加载License后,必须执行命令令 assign port-type 100GE [ slot slotid | all ]并重启设备,接口速率才能提升到100GE。
分组提升接口速率RTU License使用说明
组和接口的对应关系固定
每组对应的接口信息已固定,无法修改,仅支持通过命令 display device group-speed configuration 进行查看。
display device group-speed configuration ------------------------------------------------------------------------------- Slot Group Interfaces BaseSpeed ConfigSpeed CurrentSpeed NextSpeed ------------------------------------------------------------------------------- 0 0 MultiGE0/0/1~0/0/12 25G 10G 10G 10G 1 MultiGE0/0/13~0/0/24 25G - 25G 25G
接口速率生效说明
加载License后,需要执行命令 assign group-speed [ slot slotnumber ] group group-number speed 并重启设备。例如:需要将组1中的12个接口的速率提升到5GE。
system-view [HUAWEI] assign group-speed group 1 5000 //配置命令后需要重启设备才能生效
命令配置与License控制项不一致时生效原则
表1-3 命令配置与License控制项不一致时生效原则
原则举例说明
命令设置的接口速率小于License控制项中可以提升的接口速率时,以命令配置为准。例如:
命令配置 assign group-speed group 1 5000 将组1中12个接口的速率从25Gbit/s提升到5Gbit/s,License文件中的控制项为25GE接口升级到10GE接口授权。
激活License重启设备后,组1中12个接口的速率从25Gbit/s提升到5Gbit/s。
命令设置的接口速率大于License控制项中可以提升的接口速率时,以License控制项为准。例如:
命令配置 assign group-speed group 1 10000 将组1中12个接口的速率从25Gbit/s提升到10Gbit/s,License文件中的License控制项为25GE接口升级到5GE接口授权。
激活License重启设备后,组1中12个接口的速率仅能从25Gbit/s提升到5Gbit/s。
License控制项不足时,优先保证组号小的接口的速率先生效。例如:
命令配置 assign group-speed group 0 10000 和 assign group-speed group 1 10000 将组1和组2中接口的速率从25Gbit/s提升到10Gbit/s,License文件中仅有一个25GE接口升级到10GE接口License授权。
激活License重启设备后,仅组1的12个接口的速率可以从25Gbit/s提升到10Gbit/s。
支持可以逐段累计提升接口速率
逐段累计提升接口速率指的是可以对一组接口使用多个License提升接口速率。
例如:用户前期已经根据需要购买了1个25GE接口升级到5GE接口License,将接口的速率升级到了5GE。现因业务扩展,需将接口速率再升级到10GE,此时可以再购买1个5GE接口升级到10GE接口License继续提升接口速率。
再例如:用户前期预购买了1个25GE接口升级到5GE接口License和1个5GE接口升级到10GE接口License。现因业务发展,需要将接口从25GE升级到10GE,此时可以直接使用已经购买的两个License逐段提升接口速率,不需要再购买25GE升级到10GE的License。
支持拆分给多个接口使用
拆分给多个接口使用指的是一个License可以给多个接口使用。
例如:用户前期预购买了1个25GE接口升级到10GE接口License。现因业务发展,在不改变组网连线的情况下,需要将1组12个接口的速率从25Gbit/s提升到5Gbit/s,将另1组12个接口的速率从5Gbit/s提升到10Gbit/s。此时可以对已经购买License进行拆分直接使用,不需要再重新购买两个License。
堆叠系统中RTU License的处理方式
与其他License处理方式一样,堆叠系统的License由主交换机的License决定,具体请参考“如何为S交换机堆叠系统安装License”。
通过RTU License提升端口速率的 *** 作方法
前提条件
已经获取到后缀为dat的License文件。如何获取后缀为dat的License文件,请参见《S1720, S5700, S6700系列交换机 License使用指南》中的“ 申请License ”。
*** 作方法
将后缀为dat的License文件上传到设备。具体 *** 作可以参考“ FTP服务器配置示例 ”。
在设备上加载License文件。
执行命令 license active file-name ,激活License文件。
license active license-testdat Info: The license is being activated Please wait for a momentInfo: Succeeded in activating the license file on the master board
执行命令设置接口速率。
以40GE接口升级到100GE接口为例。
system-view [HUAWEI] assign port-type 100ge all Warning: The configuration of 40G interfaces may be lost after the device restart Therefore, back up their configuration before the restart, and check the configuration after the restart is complete Continue [Y/N]: y Info: The current configuration has been modified and takes effect after the device is restarted[HUAWEI] quit
重启前查看设备的接口速率。
例如:S5732-H24S6Q加载License前6个上行接口的速率为40GE,通过命令 display interface brief 查看接口名为40GE。
display interface brief 40GE0/0/1 down down 0% 0% 0 0 40GE0/0/2 down down 0% 0% 0 0 40GE0/0/3 down down 0% 0% 0 0 40GE0/0/4 down down 0% 0% 0 0 40GE0/0/5 down down 0% 0% 0 0 40GE0/0/6 down down 0% 0% 0 0
执行命令重启设备。
reboot Info: The system is now comparing the configuration, please wait Warning: The configuration has been modified, and it will be saved to the next startup saved-configuration file flash:/vrpcfgzip Continue [Y/N]: y Now saving the current configuration to the slot 0 Save the configuration successfully Info: If want to reboot with saving diagnostic information, input 'N' and then execute 'reboot save diagnostic-information' System will reboot! Continue[Y/N]: y
设备重启后,可以执行命令 display device port-type configuration 或 display device group-speed configuration 查看配置是否生效,可以执行命令 display interface brief 查看接口名判断接口速率是否生效。
例如:通过命令 display interface brief 查看S5732-H24S6Q前6个上行接口的接口名为100GE。
display interface brief 100GE0/0/1 down down 0% 0% 0 0 100GE0/0/2 down down 0% 0% 0 0 100GE0/0/3 down down 0% 0% 0 0 100GE0/0/4 down down 0% 0% 0 0 100GE0/0/5 down down 0% 0% 0 0 100GE0/0/6 down down 0% 0% 0 0
SurfaceFlinger服务是在System进程中启动的,并且负责统一管理设备的帧缓冲区。SurfaceFlinger服务在启动的过程中,会创建两个线程,其中一个线程用来监控控制台事件,而另外一个线程用来渲染系统的UI。在本文中,我们就将详细分析SurfaceFlinger服务的启动过程。
1、生成Vsync信号并分发
2、将app发来的buffer(界面数据)进行合成:根据各个界面的layer(就是Z值,由WindowManagerService来确定),把这些排序后的整体buffer传递给HardwareComposer(后简称HWC)。
3、提供图像绘制buffer,让APP可以有buffer进行图像绘制,通过gralloc模块向ashmen申请内存得到文件句柄fd,将fd通过binder机制传递给对应的app,app再执行mmap *** 作即可获得 对应的buffer。
4、APP对应一个client,一个SurfaceControl对应一个Layer,每个Surface都对应一个mslots数组(mslots数组中共有64个元素,每个元素中包含一个GraphicBuffer 和一个handle,包含fd 和 mmap的映射地址)。Surface获得Buffer的过程如下:
首先执行dequeueBuffer。若Surface无Buffer,则向生产者producer(GraphicBufferProducer类对象,最终通过SF *** 作)申请,查看mslots有无余项,若有直接返回,若无 则向Gralloc HAL申请,得到一个handle(要申请的Buffer的 句柄fd 和mmap的首地址的集合)
其次执行requestBuffer,APP(Client端)通过该方法将SF获得的handle 转移到Client端的handle中
APP获得fd,mmap获得地址(通过Gralloc HAL来执行mmap),接下来 向Buffer中写入内容即可
5、Slot数组的组成
Buffer fd
它要把各个surface 组合(compose/merge) 成一个main Surface ,最后将Main Surface 的内容发送给FB/V4l2 Output ,这样屏幕上就能看到我们想要的效果。 在实际中对这些Surface 进行merge 可以采用两种方式,一种就是采用软件的形式来merge ,还一种就是采用硬件的方式,软件的方式就是我们的SurfaceFlinger ,而硬件的方式就是Overlay 。
用于描述客户端,每个来请求服务的应用都对应一个Client
SurfaceFlinger为每个Client提供8m空间
提供了对窗口控制信息的 *** 作,以及内容的处理SurfaceFlinger只是控制什么时候应该进程这些信息的处理以及处理的过程,所有实际的处理都是Layer中进程,可以理解为创建了一个Surface就是创建了一个Layer
创建 Layer 的过程,首先是由这个应用程序的 Client 根据应用程序的 pid 生成一个唯一的 layer ID ,然后根据大小,位置,格式啊之类的信息创建出 Layer 。在 Layer 里面有一个嵌套的 Surface 类,它主要包含一个 ISurfaceFlingerClient::Surface_data_t ,包含了这个 Surace 的统一标识符以及 buffer信息等,提供给应用程序使用。最后应用程序会根据返回来的 ISurface 信息等创建自己的一个 Surface 。
Android 提供了 4 种类型的 layer 供选择,每个 layer 对应一种类型的窗口,并对应这种窗口相应的 *** 作:
Layer , LayerBlur , LayerBuffer ,LayerDim 。
Norm Layer 是 Android 种使用最多的一种 Layer ,一般的应用程序在创建 surface 的时候都是采用的这样的 layer ,了解 Normal Layer 可以让我们知道 Android 进行 display 过程中的一些基础原理。 Normal Layer 为每个 Surface 分配两个 buffer : front buffer 和 back buffer ,这个前后是相对的概念,他们是可以进行 Flip 的。 Front buffer 用于 SurfaceFlinger 进行显示,而 Back buffer 用于应用程序进行画图,当 Back buffer 填满数据 (dirty) 以后,就会 flip, back buffer 就变成了 front buffer 用于显示,而 front buffer 就变成了 back buffer 用来画图,这两个 buffer 的大小是根据 surface 的大小格式动态变化的
Android 实际上是通过计算每一个窗口的可见区域,就是我们在屏幕上可见的窗口区域 ( 用 Android的词汇来说就是 visibleRegionScreen ) ,然后将各个窗口的可见区域画到一个主 layer 的相应部分,最后就拼接成了一个完整的屏幕,然后将主 layer 输送到 FB 显示。
参考
>
经过上一篇对OpenGL es的解析,我们引出了在eglSwapBuffer时候会调用会调用两个关键的方法:
从上一篇openGL es分析可以得出,每一次当我们绘制完一次图元之后,surface做为生产者一方会在一个循环中一般依次完成如下内容:
对于生产者来说关键的是这四个步骤。不过openGL es把整个过程颠倒,每一次绘制上一帧,对于更加好理解,我把整个过程设置回Android常用的方式。我们分别来研究这几个函数做了什么。
遇到什么问题,欢迎来本文进行讨论 >
timeslotid是一个数据库中的字段,它用于记录时间段的信息。它可以用来记录一天中的每个时间段,例如上午、下午、晚上等。它可以用来记录一周中的每一天,例如星期一、星期二、星期三等。它也可以用来记录一个月中的每一天,例如1号、2号、3号等。timeslotid可以用来记录一年中的每一个月,例如一月、二月、三月等。timeslotid可以用来记录一个季度中的每一个月,例如一季度的一月、二月、三月等。它可以用来记录一年中的每一个季度,例如第一季度、第二季度、第三季度等。timeslotid可以用来记录一年中的每一个季度,例如第一季度、第二季度、第三季度等。它还可以用来记录一年中的每一个季度,例如第一季度、第二季度、第三季度等。总之,timeslotid是一个用于记录时间段信息的字段,它可以用来记录一天、一周、一月、一季度、一年等不同时间段的信息。
以上就是关于Android reboot recovery and normal 的一种实现流程全部的内容,包括:Android reboot recovery and normal 的一种实现流程、69 掌握slot插槽的基本使用、交换机RTU License:什么是Right-to-Use (RTU) License 硬件设备授权等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)