续:高通 MSM8K bootloader 之一: SBL1
上篇将我重点关注SBL1的内容1和2基本说明完,本篇继续内容3和4。
1、 CDT : Platform ID和DDR参数
2、 debug log :
3、 download : msm8K 新平台软件download支持两种协议,sahara和firehose
4、 ramdump :死机异常信息dump
四、SW download
1、软件升级模式
高通8K以后平台支持如下两种,说到下载模式,忍不住又得骂高通。
以前6K, 7K平台不支持紧急下载模式,工厂生产软件要down到手机里,非常复杂。
要嘛先用烧录器烧一段sbl image,然后剩下的image自己开发升级软件用usb多路升级。
要嘛全部image用烧录器一次性烧完。
坑人的高通啊!么得办法,就害苦咱苦命的民工。 好了,介绍一下现在支持的两种下载模式吧!
紧急下载模式:pbl负责与PC交互,实现软件下载
自动进入紧急下载模式:主板刚生产emmc是裸片时,或者sbl运行异常时,系统自动进入紧急下载模式。
这种情况就不多说了,主要是用于工厂生产,及sbl异常处理。
手动进入紧急下载模式:通过硬件一个gpio下拉,pbl检测到该gpio后强制进入紧急下载模式。这种主要
以防不测情况。
另外一种就是软件通过设置magic number,然后由热重启,pbl检测到magic number后,强制进入下载模式。
软件切换接口,参考如下boot_dload.c代码:
/*=============================================================================
** Function : boot_dload_transition_pbl_forced_dload
** ==========================================================================
*/
/*!
*
* @brief
* This function sets the magic numbers for PBL to detect and enter forced
* download mode. It then calls the target specific function to trigger a
* system reset.
*
* @par Dependencies
* None
*
* @retval
* None
*
* @par Side Effects
* Set's PBL magic numbers to enter forced download, resets target, never to
* return.
*
*/
void <strong>boot_dload_transition_pbl_forced_dload</strong>( void )
{
/* PBL uses the last four bits of BOOT_MISC_DETECT to trigger forced download.
Preserve the other bits of the register. */
uint32 register_value =
HWIO_TCSR_BOOT_MISC_DETECT_INM(HWIO_TCSR_BOOT_MISC_DETECT_RMSK);
/* Clear the PBL masked area and then apply HS_USB value */
register_value &= ~(FORCE_DLOAD_MASK);
register_value |= FORCE_DLOAD_HS_USB_MAGIC_NUM;
/* Write the new value back out to the register */
HWIO_TCSR_BOOT_MISC_DETECT_OUTM(FORCE_DLOAD_MASK,
register_value);
boot_hw_reset(BOOT_WARM_RESET_TYPE);
} /* boot_dload_transition_pbl_forced_dload() */
普通下载模式:sbl负责与PC交互,实现软件下载
手机第一次下载完软件以后,普通情况下,可不进入pbl紧急下载模式,可由sbl进行软件升级。
sbl是如何进入普通下载模式的呢?看如下函数boot_dload_check()。
boot_dload_check()检测到USB D+ 接地、或者sbl发生异常时调用boot_dload_set_cookie()设置了cookie,进自 动进入普通的下载模式。
<pre name="code" class="cpp">
/*===========================================================================
** Function : boot_dload_check
** ==========================================================================
*/
/*!
*
* @brief
* This function will check to see if the downloader should be entered
* for QPST download, and enter the downloader if directed to.
*
* @param[in] bl_shared_data Pointer to the shared data
*
* @par Dependencies
* Download ID must be present in IRAM if downloader is to be entered.
*
* @retval
* None
*
* @par Side Effects
* Boot may be halted and QPST downloader entered.
*
*/
void boot_dload_check
(
bl_shared_data_type *bl_shared_data
)
{
/* Check whether USB D+ line is grounded. If it is, then enter
PBL Download mode */
<strong><span style="color:#cc0000;"> if(boot_qhsusb_al_check_for_pbl_dload(0))
{
boot_dload_transition_pbl_forced_dload();
}</span></strong>
/* Determine if the downloader should be entered at this time,
instead of continuing with the normal boot process. */
if ( boot_dload_entry( ) == TRUE )
{
/* Check the UEFI ram dump cookie, we enter download mode
only if UEFI ram dump cookie is NOT set*/
if ( !( boot_shared_imem_cookie_ptr != NULL &&
boot_shared_imem_cookie_ptr->uefi_ram_dump_magic ==
UEFI_CRASH_DUMP_MAGIC_NUM ) )
{
/* Before entering downloader clear RESET_DEBUG[BLOCK_RESIN] so
the next resin_n is not blocked. This is part of the abnormal
reset logic in Bear family */
HWIO_GCC_RESET_DEBUG_OUTM(HWIO_GCC_RESET_DEBUG_BLOCK_RESIN_BMSK,
0);
/* Enter downloader for QPST */
sbl_dload_entry();
}
}
} /* boot_dload_check() */
/*===========================================================================
** Function : boot_dload_set_cookie
** ==========================================================================
*/
/*!
*
* @brief
* Set the SBL dload mode cookie
**
* @par Dependencies
* None
*
*/
void boot_dload_set_cookie()
{
HWIO_TCSR_BOOT_MISC_DETECT_OUTM(SBL_DLOAD_MODE_BIT_MASK,
SBL_DLOAD_MODE_BIT_MASK);
}
再看看下面的代码!!! 我们又有新的发现!
sbl1_target.c
<pre name="code" class="cpp">/*===========================================================================
** Function : sbl_dload_entry
** ==========================================================================
*/
/*!
*
* @brief
* This function pointer is defined in each SBL* Bootloader to handle SBL-specific
* requirements to enter a download routine. It is initialized to
* boot_dload_transition_pbl_forced_dload by default.
*
* @par Dependencies
* None
*
* @retval
* None
*
* @par Side Effects
* None
*
*/
void (*sbl_dload_entry)(void) = boot_dload_transition_pbl_forced_dload;
函数指针sbl_dload_entry默认指向紧急下载模式的入口:boot_dload_transition_pbl_forced_dload ,
该下载方式会切换到pbl,由pbl通过firehose协议实现download。
void sbl1_dload_entry ()
{
static uint32 dload_entry_count = 0;
dload_entry_count++;
/* Only execute the pre-dload procedures the first time we try to enter
* dload in case there is an error within these procedures. */
if( dload_entry_count == 1 && &bl_shared_data != NULL )
{
/* Entering dload routine for the first time */
<strong>boot_do_procedures</strong>( &bl_shared_data, sbl1_pre_dload_procs );
}
pm_device_config_in_dloadmode();
/* Enter boot Sahara */
<strong>boot_dload_transition_enter_sahara</strong>();
}/* sbl1_dload_entry() */
而sbl1定义了另一个下载模式的入口:sbl1_dload_entry,它支持直接在sbl1中通过sahara协议download,
还支持crash ram dump 功能。包括dump to raw partition ,and dump to sdcard 。
见:boot_do_procedures( &bl_shared_data, sbl1_pre_dload_procs );
crash ramdump章节再详细看看。
sbl1_mc.c
<pre name="code" class="cpp">/*DLOAD flag for SBL1 to enter PBL error handler*/
#ifdef BOOT_ENTER_PBL_DLOAD_ON_SBL_ERROR
static boot_boolean edload_flag = TRUE;
#else
static boot_boolean edload_flag = FALSE;
#endif
</pre><pre name="code" class="cpp">void sbl1_post_ddr_init(bl_shared_data_type *bl_shared_data)
{
..........
if (edload_flag != TRUE)
{
/* Update the dload entry to sbl1 sahara dload entry function */
sbl_dload_entry = sbl1_dload_entry;
}
}
好,既然在sbl1有两个download入口,如何选则呢?
sbl1_mc.c 中通过宏BOOT_ENTER_PBL_DLOAD_ON_SBL_ERROR控制。
如果定义该宏,则dload处理会转交给PBL帮忙处理了。
2、进入升级模式的方法
上节描述的高通默认进入下载模式的方法,都是自动的,显然无法满足开发、生产、售后等需求。
因此如下两种方法,实用于开发、生产、售后。
sbl1扫描按键组合:
关机状态下,sbl1扫描按键组合,比如,扫描到power & vol+ 两个按键同时按下,则进入pbl紧急下模模式。