- 浏览: 188503 次
- 性别:
- 来自: 北京
最新评论
-
fyc0109:
第1, 2, 3在miui4.0.4上测试都不好使, 第3种就 ...
android 关闭app简要说明 -
anjxue:
使用singleInstance这个方法太草率了。
比如我们的 ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式 -
guoying245:
lasttimes 写道可以尝试在AndroidManifes ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式 -
zhouxiangang123:
你测试过吗???
android唤醒屏幕--保持屏幕唤醒-Reprinted -
lasttimes:
可以尝试在AndroidManifest.xml文件中的启动a ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式
昨天大家问recovery怎么工作的,差不多花了俩小时看了下
这个东西肯定是要bootloader支持的,因为bootloader要选择启动哪个kernel和ramdisk
所以是平台相关的。
这里可以从上往下看,也可以从下往上看。
我们先从上往下吧
多年不做,好在以前做bootloader和kernel的基础还在。
还比较容易找。
Setting里面我们可以选择恢复出厂设置,recovery
Power.reboot("recovery");
参数表示reboot的原因
然后会到JNI
static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)
{
sync();
#ifdef HAVE_ANDROID_OS
if (reason == NULL) {
reboot(RB_AUTOBOOT);
} else {
const char *chars = env->GetStringUTFChars(reason, NULL);
__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
LINUX_REBOOT_CMD_RESTART2, (char*) chars);
env->ReleaseStringUTFChars(reason, chars); // In case it fails.
}
jniThrowIOException(env, errno);
#endif
}
这里会调用到c库里面的函数
__reboot:
.save {r4, r7}
stmfd sp!, {r4, r7}
ldr r7, =__NR_reboot
swi #0
ldmfd sp!, {r4, r7}
movs r0, r0
bxpl lr
b __set_syscall_errno
.fnend
c库实际上到最底下就是系统调用的封装了,
一般都是sys_reboot的实现了,
不过Qualcomm这里用了宏来定义的。
调用了系统调用,kernel里面实现,我们就到了kernel里面
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
void __user *, arg)
switch (cmd) {
case LINUX_REBOOT_CMD_RESTART:
kernel_restart(NULL);
break;
case LINUX_REBOOT_CMD_CAD_ON:
C_A_D = 1;
break;
case LINUX_REBOOT_CMD_CAD_OFF:
C_A_D = 0;
break;
case LINUX_REBOOT_CMD_HALT:
kernel_halt();
unlock_kernel();
do_exit(0);
break;
case LINUX_REBOOT_CMD_POWER_OFF:
kernel_power_off();
unlock_kernel();
do_exit(0);
break;
case LINUX_REBOOT_CMD_RESTART2:
if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
unlock_kernel();
return -EFAULT;
}
buffer[sizeof(buffer) - 1] = '/0';
kernel_restart(buffer);
走到kernel_restart
void kernel_restart(char *cmd)
{
kernel_restart_prepare(cmd);
if (!cmd)
printk(KERN_EMERG "Restarting system./n");
else
printk(KERN_EMERG "Restarting system with command '%s'./n", cmd);
machine_restart(cmd);
}
void machine_restart(char * __unused)
{
arm_pm_restart(reboot_mode);
}
arm_pm_restart(reboot_mode);
这个函数是要每个target自己定义的,
以Qualcomm来说
static void msm_pm_restart(char str)
{
msm_rpcrouter_close();
msm_proc_comm(PCOM_RESET_CHIP, &restart_reason, 0);
for (;;)
;
}
这里的restart reason是recovery
static int msm_reboot_call
(struct notifier_block *this, unsigned long code, void *_cmd)
{
if ((code == SYS_RESTART) && _cmd) {
char *cmd = _cmd;
if (!strcmp(cmd, "bootloader")) {
restart_reason = 0x77665500;
} else if (!strcmp(cmd, "recovery")) {
restart_reason = 0x77665502;
} else if (!strcmp(cmd, "eraseflash")) {
restart_reason = 0x776655EF;
} else if (!strncmp(cmd, "oem-", 4)) {
unsigned code = simple_strtoul(cmd + 4, 0, 16) & 0xff;
restart_reason = 0x6f656d00 | code;
} else {
restart_reason = 0x77665501;
}
}
return NOTIFY_DONE;
}
会把这个原因写到smem里面去
下次启动的时候怎么管用呢?
bootloader下次起来的时候会去读这个值
Qualcomm的bootloader是appsboot.mbn
void aboot_init(const struct app_descriptor *app)
{
unsigned reboot_mode = 0;
unsigned disp_init = 0;
#if DISPLAY_SPLASH_SCREEN
display_init();
dprintf(INFO, "Diplay initialized/n");
disp_init = 1;
#endif
page_size = flash_page_size();
page_mask = page_size - 1;
if (keys_get_state(KEY_HOME) != 0)
boot_into_recovery = 1;
if (keys_get_state(KEY_BACK) != 0)
goto fastboot;
if (keys_get_state(KEY_CLEAR) != 0)
goto fastboot;
if (keys_get_state(KEY_VOLUMEUP) != 0)
goto fastboot;
if (keys_get_state(KEY_CAMERA) != 0)
goto fastboot;
if (keys_get_state(KEY_VOLUMEDOWN) != 0)
boot_into_recovery = 1;
//goto fastboot;
reboot_mode = check_reboot_mode();
if (reboot_mode == RECOVERY_MODE){
boot_into_recovery = 1;
}else if(reboot_mode == FASTBOOT_MODE){
goto fastboot;
}
recovery_init();
boot_linux_from_flash();
dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
"to fastboot mode./n");
fastboot:
if(!disp_init) {
display_init();
} else {
fbcon_clear();
}
dprintf(INFO, "Diplay initialized/n");
udc_init(&surf_udc_device);
fastboot_register("boot", cmd_boot);
fastboot_register("erase:", cmd_erase);
fastboot_register("flash:", cmd_flash);
fastboot_register("continue", cmd_continue);
fastboot_register("reboot", cmd_reboot);
fastboot_register("reboot-bootloader", cmd_reboot_bootloader);
fastboot_publish("product", "swordfish");
fastboot_publish("kernel", "lk");
fastboot_init(target_get_scratch_address(), 150 * 1024 * 1024);
udc_start();
target_battery_charging_enable(1, 0);
}
APP_START(aboot)
.init = aboot_init,
APP_END
函数很简单,
有三种情况
1:如果按键就会进入recovery
2:如果check_boot_mode是recovery的时候就会做
3 : 如果recovery_init返回的是真的话就会进入recovery mode
第一种很好理解,标准就是
第二种会去读smem
unsigned check_reboot_mode(void)
{
unsigned mode[2] = {0, 0};
unsigned int mode_len = sizeof(mode);
unsigned smem_status;
smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
&mode, mode_len );
if(smem_status)
{
dprintf(CRITICAL, "ERROR: unable to read shared memory for reboot mode/n");
return 0;
}
return mode[0];
}
unsigned smem_read_alloc_entry(smem_mem_type_t type, void *buf, int len)
{
struct smem_alloc_info *ainfo;
unsigned *dest = buf;
unsigned src;
unsigned size;
if (((len & 0x3) != 0) || (((unsigned)buf & 0x3) != 0))
return 1;
if (type < SMEM_FIRST_VALID_TYPE || type > SMEM_LAST_VALID_TYPE)
return 1;
/* TODO: Use smem spinlocks */
ainfo = &smem->alloc_info[type];
if (readl(&ainfo->allocated) == 0)
return 1;
if ((size = readl(&ainfo->size)) != (unsigned)len)
return 1;
src = MSM_SHARED_BASE + readl(&ainfo->offset);
for (; size > 0; src += 4, size -= 4)
*(dest++) = readl(src);
return 0;
}
第三种才是网络上普遍说的寻找misc分区
这个我就不说了,可以参考网上的文档。
http://blog.chinaunix.net/u/14459/showart_1911144.html
Qualcomm的机器有些没有misc分区的,我见过的好像都没有?
不过也都没太注意。
这个文章只解释如何进入recovery,至于进入recovery之后如何取cache,
就比较简单了,系统都起来了,后面的recovery的过程就是cache分区的东西了。
实际上所有的Android的bsp都不是完全开源的,
包括Qualcomm的全系列,nvidia的tegra,ti的,freescale的,
都有一些不能开源的部分,比如tegra 的bootloader是单独发布的。没开源。
我上面贴出来的代码都是Qualcomm开源部分的代码。
其他的部分都是合作伙伴才有的,包括Tegra 2也是一样的,大家能下载的
都只是开源的那个部分,私有的部分只有合作伙伴才有。等等厂家都一样。
不过大多数东西,应该说80%的东西都是开源的吧。
目前在做一些系统工程的东西,不过刚才又有其他项目的临时抽调任务。
疑难杂症性质的东西又来了。
关于Android双屏的事情还一直有customer在问,
大体分多种
1:两个屏幕是独立的,各自跑各自的东西,就是俺之前做的那个东西,典型的应用是
大小屏应用。比如游戏机等等
2:两个屏幕是分离的,但是内容要跨界显示,组合成一个屏幕,
也是可以做的了,KERNEL里面做就好了,电子书屏幕的确是太小,不能折叠还。
3:两个屏幕是分离的,显示东西是一样的,这个就更好做了,类似HDMI
但是如果要硬件加速的话,整个系统上的工作会多很多
发表评论
-
Linux input系统(转)
2011-12-26 14:32 2602Linux 系统提供了input子 ... -
android --View 刷新焦点问题
2011-09-19 16:28 3134如果一个activity中,多次调用setContentVie ... -
BinderService And StartService
2011-08-11 00:39 2109当采用Context.startService()方法启 ... -
View 注入事件
2011-08-05 18:19 4113注入是事件处理流程如: 1 .View 接受到上报的Touc ... -
binder
2011-07-22 18:36 1255Android110221:Android binder,pa ... -
超时机制
2011-07-18 19:17 1162static final int OP_PENDING ... -
android-编译
2011-07-18 18:14 2263针对android 选择user版本进行编译的时候,会出现pr ... -
statusbar icon update 转
2011-07-13 18:22 1985公司前些天发现一个状态栏显示图标不正确的Bug,昨天也转给我, ... -
铺捉factoryreset的事件 ---转载
2011-07-09 19:54 1687点击恢复出厂设置后,系统重启,再次进入系统后,一切数据都被清空 ... -
进入recovery模式后,页面选择详解--转载
2011-07-09 19:48 22102【Recovery的进入方式】 1:完全关机,按住音量下+电 ... -
recovery代码流程转载
2011-07-09 19:44 2430===== 应用流程 ... -
recovery.img与boot.img的对比
2011-07-09 19:43 3187今天对比分析了一下reco ... -
recovery流程转载
2011-07-09 19:42 2080=============================== ... -
Android---jni ( 转载 )
2011-06-21 11:27 1468Android系统不允许 ... -
JNINativeMethod的参数解析
2011-06-10 17:58 9321Android JNI 使用的数据 ... -
android 编译环境搭建
2011-01-27 14:19 0http://www.360doc.com/content/1 ... -
android 关闭app简要说明
2011-01-24 10:59 7103关闭app的方法: 1.System.exit(0) 激励不 ... -
不同的方式启动一个应用,解决不重复启动相同的Activity的方式
2011-01-20 14:08 16893Android 安装软件后执行“OPEN”引起的Inten ... -
转- ADB(Android Debug Bridge)技术实现
2011-01-20 12:06 2776本帖最后由 ssw 于 2011-1-7 12:07 ... -
Android 的启动流程-转
2011-01-20 11:33 964Android 根文件系统启动 ...
相关推荐
该文档提供了Bootloader引导程序下载的详细步骤和操作截图说明,十分实用。
XC7K325T 使用 MIG 怎样从 bootloader 引导(含教程和FPGA工程),有操作教程,FPGA源码(VIVADO2017.4打开),参考原理图,资料总共398MB。
bootloader 引导程序源代码! 学习引导程序的朋友不可缺少的资料!
用于stm32工业控制芯片的最小boot更新程序。程序整体小于1k,对ram较小,flash充足,有程序备份区域的适用。其它单片机快速移植使用
IAP实际上是将片上flash分为两个区,第一个区域放置BootLoader的引导程序,作用是接收已经编写好的应用程序(bin文件),同时将接收到的应用APP文件存储到flash第二个区域。存储完成后程序跳转到第二个flash运行APP...
使用方法: ...三、进入fastboot界面(音量下+电源,进入bootloader,然后再按一下电源进入fastboot) 四、将手机和电脑用数据线连接,一般情况下会安装驱动 五、运行一键刷入Recovery.EXE完成刷入recovery
arduino 平台 stm32 bootloader引导程度
本教程适用于 HY—SmartSTM32 Multi Media Development Board首先下载 STM32 USB Bootloader,按下 K
MSP430F5172_BOOTLOADER引导程序,这个程序是我自己写的,不是官方给的,很实用引导程序。
recovery_twrp.img乐视工具箱.exe(1):此程序仅适用于乐视手机2,其他机型请勿使用(2):此工具支持解锁bootloader,刷recovery等.(3):本程序经过严格测试,但不排除个别不兼容情况。(4):刷机有风险,操作需谨慎,风险...
使用串口更新和引导的stm32h743的bootloader 1、串口波特率115200,无校验。上电1s内超级终端点击键盘的字母a和b,小写,进入引导模式。 2、串口波特率921600,偶校验。上电1s内,发送0xa0,启动第一个程序;发送0xa1...
需要拆机就能对产品进行固件升级是很多人想要的效果,...接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的升级。下面来浅析STM32Bootloader设计。首先谈谈stm32的ISP和IAP区别和联系。
这个BootLoader启动引导方式是用SD卡的,值得参考
2、了解BootLoader 引导操作系统的过程 3、掌握bootloader 程序的编译方法 4、掌握BootLoader 程序的使用方法 (1)、Boot Loader 的阶段1 通常主要包括以下步骤: 硬件设备初始化; 拷贝Boot Loader 的程序...
bootloader
stm32 bootloader引导程序示例 内部带有 完整的0.96OLED驱动和0.96LCD驱动 以及AMG8833驱动
完全可用的6414的引导程序,给需要的朋友提供帮助
详细介绍了BootLoader的功能,内容很详细,包括概念,安装,启动,加载,下载及一些相关的问题,BootLoader的典型架构,主要任务
c51实现bootloader的源代码,keil c51下实现的
可用于解锁bootloader及刷写recovery,以及载华为手机USB驱动,重启到fastboot及重启到Recovery,有需要的赶快下载吧!