UFS之Power Mode

UFS支持7种Power Mode,其中4种基本模式和3种过渡模式。通过START STOP UNIT命令和其他一些属性控制。电源模式独立于上下行链路的状态。

1、模式

下表列出了7种模式的一些基本信息:

Mode

Describe

M-PHY status

Mode transition

Active

执行命令或者后台操作

STALL/HS-BURST,SLEEP/PWM_BURST

From:Poweron、pre-actvie

To:idle、pre-sleep、pre-powerdown

Idle

设备没有任何操作

STALL/SLEEP/ HIBERN8

From:active

To:active

Pre-active

进入active前的过度态

 

From:Pre-Sleep, Sleep, Pre-PowerDown, or PowerDown.

To:active

Sleep

显著降低设备的功耗

HIBERN8

From:pre-sleep

To:pre-active、pre-powerdown

Pre-sleep

进入sleep模式的过渡态

 

From:Active

To:sleep、pre_active

Powerdown

最节省功耗的模式

 

From:pre-powerdown

To:pre-active

Pre-powerdown

进入powerdown模式前的过渡态

 

From:sleep/active

To:PowerDown or Pre-Active.

各个模式的状态转换如下图所示: 

状态转换

条件

Powered_On to Active

设备准备开始上电初始化时

Pre-Active to Active

设备满足active模式下的条件时自动进入

Active to Idle

设备完成所有正在执行的操作时

Active to Pre-Sleep

1、设备初始化结束且bInitPowerMode=0;

2、设备接到START STOP UNIT 命令且POWER CONDITION=2H;

Active to Pre-PowerDown

设备接到START STOP UNIT 命令且POWER CONDITION=3H;

Idle to Active

设备收到处理请求时

Pre-Sleep to Pre-Active

START STOP UNIT命令IMMED=1时进入pre-sleep,之后START STOP UNIT命令的POWER CONDITION=1H;

Pre-Sleep to Sleep

满足进入sleep模式的条件后自动进入

Sleep to Pre-Active

设备接到START STOP UNIT 命令且POWER CONDITION=1H;

Sleep to Pre-PowerDown

设备接到START STOP UNIT 命令且POWER CONDITION=3H;

Pre-PowerDown to Pre-Active

START STOP UNIT命令IMMED=1时进入pre-powerdown,之后START STOP UNIT命令的POWER CONDITION=1H;

Pre-PowerDown to PowerDown

满足进入powerdown模式的条件后自动进入

PowerDown to Pre-Active

设备接到START STOP UNIT 命令且POWER CONDITION=1H;

各个模式下的命令响应:

不同的模式能够响应的命令不同,下表列出了不同模式下能够响应的SCSI命令和UPIU

设备对SCSI命令的响应:

SSU命令

其他非SSU命令

2、SSU命令

SSU命令用来使能失能一个LU、将缓存flush到设备或者加载弹出设备;电源管理命令START STOP UNIT发送到UFS Device well-known logical unit可以控制设备的power mode。

POWER CONDITION域用来选择期望的模式。发送到普通LU的命令POWER CONDITION会被忽略。

SSU  fields

3、属性

电源模式和电流等级

通过bCurrentPowerMode可以获得当前设备的power mode。bCurrentPowerMode是唯一一个可以在任何模式下响应主机命令的参数。

bActiveICCLevel属性用来指定active模式下的电流等级。在active模式下,有16种电流配置,决定了设备的最大功耗。在active mode下,选定了bActiveICCLevel后,在VCC、VCCQ和VCCQ2上的最大电流就决定了。假设bActiveICCLevel=N,那么VCC、VCCQ和VCCQ2上的最大电流分别是wActiveICCLevelsVCC[N]、wActiveICCLevelsVCCQ[N]、wActiveICCLevelsVCCQ2[N].等级0功耗最低性能最差,等级15功耗最高性能最好。

参数格式:

bInitActiveICCLevel参数用来确定设备上电后的电流等级。

汇总一下:

属性

描述

bActiveICCLevel

决定最大功耗等级

bInitActiveICCLevel

决定上电后或者复位后的功耗等级

bInitPowerMode

决定初始化后进入哪种电源模式

bCurrentPowerMode

获取当前功耗模式

void Program_dynamic1(char* ip,int port,LPCWSTR str) { unsigned long playlist = create_playlist(64, 32,8536); cout<<"create_playlist:"<<playlist<<endl; unsigned long program = create_program(L"program_1",_TEXT_T("0xff000000")); cout<<"create_program:"<<program<<endl; int dynamic_type = 1; int display_effects = 52; int display_speed = 10; int stay_time = 0; int gif_flag = 0; LPCWSTR bg_color = L"0xff000000"; LPCWSTR color = L"0xffff0000"; LPCWSTR font_attributes = L"normal"; LPCWSTR font = L"SimSun"; LPCWSTR align_h = L"0"; LPCWSTR align_v = L"0"; LPCWSTR ff=L"1.txt"; TCHAR szFilePath[MAX_PATH + 1]={0}; GetModuleFileName(NULL, szFilePath, MAX_PATH); (_tcsrchr(szFilePath, L'\\'))[1] = 0; LPCWSTR f = wcscat(szFilePath,ff); unsigned long dynamic_area = create_dynamic(); cout<<"create_dynamic:"<<dynamic_area<<endl; int err = add_dynamic_unit(dynamic_area, dynamic_type, display_effects, display_speed, stay_time, _TEXT_T("1.txt"), gif_flag, bg_color, 12, font, color, font_attributes, align_h, align_v, 0, 0, 0,_TEXT_T(""),_TEXT_T("")); err = add_dynamic_unit(dynamic_area, 0, display_effects, display_speed, stay_time, _TEXT_T("1.bmp"), gif_flag, bg_color, 12, font, color, font_attributes, _TEXT_T("0"), _TEXT_T("0"), 0, 0, 0,_TEXT_T(""),_TEXT_T("")); cout<<"add_dynamic_unit:"<<err<<endl; err = add_dynamic(program, dynamic_area,0, 0, 0, 64, 32, L"", 0, L"", 100); cout<<"add_dynamic:"<<err<<endl; delete_dynamic(dynamic_area); LPCWSTR m_aging_start_time = _T("2018-12-01"); LPCWSTR m_aging_stop_time = _T("2018-12-30"); LPCWSTR m_period_ontime = _T("15:14:00"); LPCWSTR m_period_offtime = _T("15:15:00"); err = add_program_in_playlist(playlist, program, 0, 10, m_aging_start_time, m_aging_stop_time, m_period_ontime, m_period_offtime, 127); cout<<"add_program_in_playlist:"<<err<<endl; err = update_dynamic(ip, port, _TEXT_T("guest"), _TEXT_T("guest"), playlist, _TEXT_T(""), 1, 0); cout<<"update_dynamic:"<<err<<endl; cancel_send_program(playlist); delete_playlist(playlist); }
07-16
这段代码是一个C++函数,名为Program_dynamic1。它的作用是创建一个动态节目,并将其添加到播放列表中,然后通过网络更新动态节目。 函数中主要的步骤包括: 1. 调用create_playlist函数创建一个播放列表,返回一个unsigned long类型的值,表示播放列表的ID。 2. 调用create_program函数创建一个节目,其中包括节目名称和背景颜色。 3. 设置一些动态特效的参数,如动态类型、显示特效、显示速度、停留时间等。 4. 调用create_dynamic函数创建一个动态区域,返回一个unsigned long类型的值,表示动态区域的ID。 5. 调用add_dynamic_unit函数向动态区域中添加动态单元,包括一些参数如动态类型、显示特效、显示速度、文件路径等。 6. 调用add_dynamic函数将动态区域添加到节目中。 7. 调用delete_dynamic函数删除动态区域。 8. 设置一些节目的播放时间参数,如开始日期、结束日期、起止时间等。 9. 调用add_program_in_playlist函数将节目添加到播放列表中。 10. 调用update_dynamic函数通过网络更新动态节目。 11. 调用cancel_send_program函数取消发送节目。 12. 调用delete_playlist函数删除播放列表。 以上就是函数Program_dynamic1的主要流程和功能。请注意,该代码中使用了一些Windows特定的函数和数据类型,如LPCWSTR、TCHAR等,这些是为了支持Unicode字符集和跨平台兼容性而定义的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值