1: ./mk n(r) kernel; ./mk bootimage;当修改kernel相关代码时,具体如下:
alps/kernel/
alps/mediatek/platform/mt65xx/kernel/
alps/mediatek/source/kernel/
alps/mediatek/customer/mt65xx/kernel/
alps/mediatek/customer/common/kernel/
alps/mediatek/customer/$porject_name$/kernel
......
2: ./mk n pl 当修改preloader相关代码时, 具体如下:
alps/mediatek/platform/mt65xx/preloader/
alps/mediatek/source/preloader/
alps/mediatek/customer/mt65xx/preloader/
alps/mediatek/customer/common/preloader/
alps/mediatek/customer/$porject_name$/kernle
......
3: ./mk uboot 当修改uboot相关代码时,具体如下:
alps/mediatek/platform/mt65xx/uboot/
alps/mediatek/source/uboot/
alps/bootable/bootloader/uboot/
alps/mediatek/customer/mt65xx/uboot/
alps/mediatek/customer/common/buoot/
alps/mediatek/customer/$porject_name$/uboot/
......
4: ./mk systemimage 当修改system相关代码时,具体如下:
alps/frameworks/
alps/packages/
alps/vendor/
alps/hardware/
alps/dalvik/
...........
5: ./mk recoverimage 当修改recover相关代码时,具体如下:
alps/bootable/recovery/
alps/mediatek/customer/$project_name$/recovery/
......
6: ./mk factoryimage: 当修改factory相关代码时使用此命令,具体如下:
alps/mediatek/customer/$project_name$/factory/
alps/mediatek/customer/common/factory/
alps/mediatek/source/factory/
......
7: ./mk secroimage 当修改secro相关代码时,具体如下:
alps/mediatek/source/secro/
alps/mediatek/customer/$project_name$/secro/
.....
❷ tiny4412 用光盘带的uboot 引导android系统报错怎么办
对于“bboard_init_f”这种方式的调试,要在GCC编译时加调试选项才行,编译uboot似乎不合适。不加调试选项没有符号信息,只能在某地址下断点。新版的UBoot我还没看。
❸ android怎么进入uboot
本人用的android平台用的bootloader用的是uboot,貌似大多数手持设备平台都不用这个,因为功能过于强大用不上,反而显得太复杂了。不知道这个平台开发者是怎么想的。既然用了那就来分析一下,顺便修改一下其中的几个小问题,以符合我们的要求。
uboot等同于其他所有的bootloader程序,从根本上讲是一个稍复杂的裸机程序,是最底层的东西,要分析裸机程序我们要从它的连接文件开始。连 接文件(.lds文件)定义了程序编译之后整个连接过程,这样我们就可以找到这个程序的第一句汇编代码,进而来下一步分析。uboot的链接文件代码在 android\bootable\bootloader\uboot-imx\u-boot.lds
[cpp] view plain
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //文件输出格式
OUTPUT_ARCH(arm)
ENTRY(_start) //首地址标示符
SECTIONS
{
. = 0x00000000; //其实地址0
. = ALIGN(4); //4字节对齐
.text : //代码段
{
board/freescale/mx6q_sabresd/flash_header.o (.text.flasheader) //第一个文件是board/freescale/mx6q_sabresd/flash_header.o
cpu/arm_cortexa8/start.o //第二个cpu/arm_cortexa8/start.o
board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)
lib_arm/libarm.a (.text)
net/libnet.a (.text)
drivers/mtd/libmtd.a (.text)
drivers/mmc/libmmc.a (.text)
. = DEFINED(env_offset) ? env_offset : .;
common/env_embedded.o(.text)
*(.text) //剩余的所有代码
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } //readonly data 段
. = ALIGN(4);
.data : { *(.data) } //所有的readonly data
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .; //u_boot_cmd段,里面是所有uboot命令的一个列表
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
_end_of_ = .;
__bss_start = .; //bss段 就是内存数据段
.bss : { *(.bss) }
_end = .;
}
从上面的代码可以看出我们编译生成的二进制应用程序组成是:代码段->rodata段->uboot命令列表->bss段。我们启动这个应用程序时候是从,0地址开始的,因此我们来看
board/freescale/mx6q_sabresd/flash_header.s这个文件。
这个文件中除了分配内存和宏定义的伪汇编指令以外,真正执行的命令有一条
[cpp] view plain
.section ".text.flasheader", "x"
b _start
.org CONFIG_FLASH_HEADER_OFFSET
也就是说,这个文件一执行就直接跳到_start 位置处。_start 在android\bootable\bootloader\uboot-imx\cpu\arm_cortexa8\ start.S中,因此我们来看这个文件代码
[cpp] view plain
.globl _start
_start: b reset
这里直接跳转的reset中接下来看
[csharp] view plain
reset:
/*
* set the cpu to SVC32 mode cpu设置成32位管理模式
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
#if (CONFIG_OMAP34XX) //因为我们的cpu不是ompa的 所以这段不会编译
.............................
#endif
/* the mask ROM code should have PLL and others stable */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
这里接下来执行cpu_init_crit
[csharp] view plain
/*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************/
cpu_init_crit:
/*
* Invalidate L1 I/D
*/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
/*
* disable MMU stuff and caches //关闭mmu
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
/*
* Jump to board specific initialization...
* The Mask ROM will have already initialized
* basic memory. Go here to bump up clock rate and handle
* wake up conditions.
*/
mov ip, lr @ persevere link reg across call
bl lowlevel_init @ go setup pll,mux,memory//执行lowlevel_init这个函数代码在
@\bootloader\uboot-imx\board\freescale\mx6q_sabresd\lowlevel_init.S中
@主要对时钟,外部ram,rom等进行了初始化代码不贴了。
mov lr, ip @ restore link
mov pc, lr @ back to my caller
初始化完成后,接下来执行
[csharp] view plain
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: @ relocate U-Boot to RAM 将uboot重新定位到内存中
adr r0, _start @ r0 <- current position of code
ldr r1, _TEXT_BASE @ test if we run from flash or RAM
cmp r0, r1 @ don't reloc ring debug测试当前代码是否已经在内存中
beq stack_setup @如果在的话就直接跳转到stack_setup
ldr r2, _armboot_start @如果不在的话,加载_armboot_start地址到r2中。_armboot_start是uboot执行的主体c函数。
ldr r3, _bss_start
sub r2, r3, r2 @ r2 <- size of armboot计算bss_start-armboot_start 保存到R2中,也就是uboot的总大小
add r2, r0, r2 @ r2 <- source end address 计算出uboot代码和rodata地址
_loop: @ 32 bytes at a time //开始拷贝
ldmia r0!, {r3 - r10} @ from source address [r0]
stmia r1!, {r3 - r10} @ to target address [r1]
cmp r0, r2 @ until source end addreee [r2]
ble _loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
❹ 如何在Android里面uboot传参数
最近我们在做一个LCM两屏或三屏兼容的问题,所以首先要在uboot里面读出各屏的id,然后再将读得到的id传给recovery和kernel,实现机器的正常显示.
一.首先实现uboot读lcm的id.
1.bootable/bootloader/lk/target/msm7627a_sku3_Q6_D/rules.mk是uboot里面宏开关,打开所显示的屏宏
DEFINES += DISPLAY_MIPI_CMD_PANEL_ILI9487=1
DEFINES += DISPLAY_MIPI_CMD_PANEL_HX8357=1
2.去初始化mipi的地方先读id. bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c
在函数int mipi_dsi_panel_initialize(struct mipi_dsi_panel_config *pinfo)
{
......
#if defined(DISPLAY_MIPI_CMD_PANEL_ILI9487)||defined(DISPLAY_MIPI_CMD_PANEL_HX8357)
mipi_dsi_cmd_bta_sw_trigger();
dat = mipi_viroyal_manufacture_id();
if(dat == 0x90)
{
lcm_flag = 8357; //hx8357-c
}
else
{
lcm_flag = 9487; //ili9487
}
pinfo_tmp =get_panel_info();
memcpy(pinfo, pinfo_tmp, sizeof(struct mipi_dsi_panel_config));
#endif
......
}
3.读到id后再初始化屏
struct mipi_dsi_panel_config *get_panel_info(void)
{
.........
#elif (DISPLAY_MIPI_CMD_PANEL_ILI9487)||(DISPLAY_MIPI_CMD_PANEL_HX8357)
if (lcm_flag == 8357)
return &hx8357_cmd_panel_info;
else
return &ili9487_cmd_panel_info;
#endif
..........
}
这样在uboot里面就成功可以显示图片了,下面是如何将lcm_flag的值传给kernel了.
二.传lcm_flag给kernel
1.uboot里面要做的bootable/bootloader/lk/app/aboot/aboot.c
其实原生态的Android系统就有一个将uboot传给kernel的例子,那就是跟踪代码static const char *boot_splash = " splash=1";
我做的也是效仿系统做的,先定义一个字符串
static const char *lcm_flg_ili9486 = " lcmflag=9486";
static const char *lcm_flg_nt35310 = " lcmflag=5310";
然后在下面的函数到kernel
void boot_linux(void *kernel, unsigned *tags,
const char *cmdline, unsigned machtype,
void *ramdisk, unsigned ramdisk_size)
{
.....
if(!boot_into_recovery)
{
cmdline_len += strlen(boot_splash);
#if DISPLAY_TYPE_MIPI
if (lcm_flag == 8357)
cmdline_len += strlen(lcm_flg_hx8357c);
else
cmdline_len += strlen(lcm_flg_ili9487);
#endif
.....
if (!boot_into_recovery)
{
#if DISPLAY_TYPE_MIPI
if (lcm_flag == 8357)
src = lcm_flg_hx8357c;
else
src = lcm_flg_ili9487;
#endif
if (have_cmdline) --dst;
while ((*dst++ = *src++));
.....
}
这样uboot里面的动作就做完了,即是将uboot里面的数据到一个数组里面,这个数组能从uboot传给kernel.
三.kernel接受uboot传来的字符串
msm7627a/kernel/arch/arm/mach-msm/board-msm7x27a.c
在这个函数里面接受(依据自己用的平台阿,要灵活),同样是模仿boot_splash,在代码里添加接受字符串,并转化为数字
/* LK lcm_flag, 0 - off, 1 - on */
int lcm_flag = 0;
static int __init lk_lcmflag_setup(char *str)
{
lcm_flag = simple_strtol(str, NULL, 0);
printk("lcmflag = %d\n", lcm_flag);
return 1;
}
__setup("lcmflag=", lk_lcmflag_setup);
这样就算是取到lcm_flag的值了,然后在具体的驱动中extern int lcm_flag即可,简单吧.其实技术就那样,很怕人认真,呵呵.开个玩笑.
四.把uboot里面的id还要给recovery
上面做完其实lcm可以在uboot和kernel正常显示了,但有一个位置显示会比较诡异,那就是进入"恢复出厂设置"的时候,会有一个诡异的画面,哥研究了2天,最终得出结论原来是recovery没有正常的接受到正确的屏的id,于是乎就将正确的id传给内核
还是从bootable/bootloader/lk/app/aboot/aboot.c入手,现在就是要记住关键字static const char *boot_splash_recovery = " splash=0";
我就仿效boot_splash_recovery将lcm_flag添加再下面的函数中:
void boot_linux(void *kernel, unsigned *tags,
const char *cmdline, unsigned machtype,
void *ramdisk, unsigned ramdisk_size)
{
....
#if DISPLAY_SPLASH_IN_KERNEL
if(!boot_into_recovery)
{
........
}
else
{
cmdline_len += strlen(boot_splash_recovery);
#if DISPLAY_TYPE_MIPI
if (lcm_flag == 8357)
cmdline_len += strlen(lcm_flg_hx8357c);
else
cmdline_len += strlen(lcm_flg_ili9487);
#endif
}
#endif
....
if(!boot_into_recovery)
{
.............
}
else
{
src = boot_splash_recovery;
if (have_cmdline) --dst;
have_cmdline = 1;
while ((*dst++ = *src++));
#if DISPLAY_TYPE_MIPI
if (lcm_flag == 8357)
src = lcm_flg_hx8357c;
else
src = lcm_flg_ili9487;
#endif
if (have_cmdline) --dst;
while ((*dst++ = *src++));
}
......
}
这样recovery就能完全接受uboot里面传来的值,其他的就不用做了.到这里整个系统都可以完全显示完整正确的图片.
❺ 为什么tiny4412在用sd卡烧写android时,串口终端没有显示进度
1. Build uboot
a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好
环境变量PATH,保证可以正常使用。
b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录
tar xzf uboot_tiny4412-20130729.tgz
c) 配置 uboot 并编译
cd uboot_tiny4412
make tiny4412_config
make
d) 编译 用于生成bl2 的工具
make -C sd_fuse
或者
cd sd_fuse; make
-----------------------------------------------------
2. 制作启动 Tiny4412 的SD卡
a) 先准备一张4G或以上的SDHC卡
注意:该卡的已有数据将会被破坏,因此请先对SD卡上的数据进行备份。
b) fusing SD card
假设SD卡已被PC Linux识别为/dev/sdb, 以root用户运行以下命令即可:
cd sd_fuse/tiny4412
./sd_fusing.sh /dev/sdb
-----------------------------------------------------
3. 使用SD卡启动 Tiny4412 并烧写Android
a) 将已经制作好的SD卡插到 Tiny4412 板上,拨动S2切换到SDBOOT,同时连接
串口线到PC且假设已经准备好。
b) 开发板加电,然后在串口控制台(如minicom),按任意键进入uboot 命令行模式
c) 对SD卡进行分区
输入以下uboot命令即可对SD卡进行分区:
fdisk -c 0 320 806 518
重新分区后,可重新格式化FAT分区
fatformat mmc 0:1
d) 进入fastboot模式以烧写Android
使用USB线连接Tiny4412的MICRO_USB口到PC,然后输入以下uboot命令:
fastboot
e) 烧写 Android 到SD卡
首先请准备好Android image,包括: zImage, ramdisk-u.img, system.img
在PC端输入以下命令进行烧写:
fastboot flash kernel zImage (烧写kernel)
fastboot -w (格式化userdata和cache)
fastboot flash ramdisk ramdisk-u.img (烧写ramdisk)
fastboot flash system system.img (烧写system)
f) 也可以在PC端通过fastboot烧写uboot到SD卡
先手动生成bl2.bin
cd sd_fuse/tiny4412
../mkbl2 ../../u-boot.bin bl2.bin 14336
然后输入以下命令:
fastboot flash fwbl1 E4412_N.bl1.bin
fastboot flash bl2 bl2.bin
fastboot flash bootloader ../../u-boot.bin
fastboot flash tzsw E4412_tzsw.bin
-----------------------------------------------------
4. 使用SD卡启动 Android
a) 如果是使用HD700,则烧写完成后直接重启Tiny4412 即可自动启动 Android
b) 如果是使用S700,则需要在uboot上设置kernel命令行参数:
setenv bootargs console=ttySAC0,115200n8 androidboot.console=ttySAC0 lcd=S700
saveenv
然后重启Tiny4412即可。
❻ 整体编译Android系统,大家用了多少时间
我自己实际编译ICS4.0.4源码情况:acer台式机,3.2Ghz cpu,4核,8GB/1600hz内存,整体编译(含u-boot、kernel、boot.img和system.img)需要1小时10分钟。编译时,使用make -j8(因为硬件cpu是4线程的,故使用2倍线程数)。之后的增量编译,一般需要5~10分钟即可。
❼ 编译android过程中,uboot报错
uboot是引导程序,android是系统,两者之间是两个独立工程,使用Uboot的目的只是为了引导Andriod的Linux内核和ramdisk(如果有需要使用ramdisk的话)。如果uboot通过屏蔽通过 ****.h文件中拿掉一些宏定义,使uboot编译通过。那么Andriod编译时候,也应该对一下宏进行屏蔽。
❽ 您好,uboot里面支持的芯片是不是就不需要对uboot进行修改而只要把编译好的uboot烧入到nand去
uboot是引导程序,android是系统,两者之间是两个独立工程,使用Uboot的目的只是为了引导Andriod的Linux内核和ramdisk(如果有需要使用ramdisk的话)。如果uboot通过屏蔽通过 ****.h文件中拿掉一些宏定义,使uboot编译通过。那么Andriod编译时候,也应该对一下宏进行屏蔽。
你的采纳是我前进的动力!
记得好评和采纳,答题不易,互相帮助,
手机提问的朋友在客户端右上角评价点满意即可.
如果你认可我的回答,请及时点击采纳为满意回答按钮
❾ 安卓系统fidsk工具 重新分区
三星手机uboot 下更改NAND的分区 fdisk
一、NAND分区大小:
机器用的是8G的INAND,三星平台一般把它分为四个区:
(1)、fat分区,作为sd卡用;
(2)、系统分区,相当为电脑c 盘,用来安装android系统;
(3)、userdata分区;
(4)、cache分区。
二、分区更改操作过程
1,更改uboot中代码/common/cmd_mmc_fdisk.c
在这个文件中我们可以看到对四个分区大小的定义:
❿ uboot是什么
U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
选择U-Boot的理由:
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持。