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、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持。