3 Preloader & Uboot
3.1 Preloader3.1.1Preloader结构
Preloader的主题结构在文件:“alps\mediatek\platform\mt6577\preloader\src\core\main.c”中。
void main(void)
{
//时钟、uart、mcp等初始化
bldr_pre_process();
…
bldr_handshake(&handler);
…
//这里加载DSP 3G AP的ROM。
…
#if CFG_LOAD_UBOOT
addr = CFG_UBOOT_MEMADDR;
//加载uboot
if (bldr_load_part(PART_UBOOT, bootdev, &addr) != 0)
goto error;
#endif
…
//跳转到uboot
bldr_jump(addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t));
…
}
3.1.2 PLL与Clock
PLL介绍在datasheet 1190
Pll.c中“void mt6577_pll_init(void)”
似乎PLL主要是在preloader里打开的。
//设置的PLL
void mt6577_pll_init(void)
{
}
//根据MCP的型号设置DDR相关时钟
int mt6577_pll_init2 (void)
{
if (mt6577_get_dram_type() == 2)
{
…
}
else if (mt6577_get_dram_type() == 3)
{
…
}
}
3.1.3 DDR的初始化
EMI_SETTINGS emi_settings[]里面定义了KMNJS000ZM_B205 H9TP32A4GDMCPR KMSJS000KM_B308等类型的MCP的配置参数。
在“void mt6577_set_emi (void)”里面会根据“emi_settings[]”的配置初始化MCP控制器。
3.1.4 镜像布局与加载
镜像布局参数被存放在文件:
mediatek/custom/out/mt6577preloader/cust_part.c里
static part_t platform_parts[PART_MAX_COUNT];里面记录每个镜像的长度。
在mediatek/platform/mt6577/preloader/src/core/part.c里
函数int part_init(void)里,依次累加前面所有镜像,算出当前镜像的起始位置。
3.1.5 EMMC 驱动
#define MMC_HOST_ID 0
u32 mmc_init_device(void)
{…
//emmc 零通道
ret = mmc_init(MMC_HOST_ID);
…
}
//分别初始化host和card
int mmc_init(int id)
{
…
host = &sd_host[id];
card = &sd_card[id];
err = mmc_init_host(host, id);
if (err == MMC_ERR_NONE)
err = mmc_init_card(host, card);
…
}
//host初始化
int mmc_init_host(struct mmc_host *host, int id)
{
memset(host, 0, sizeof(struct mmc_host));
return msdc_init(host, id);
}
/*
#define MSDC0_BASE (IO_PHYS + 0x01220000)
#define MSDC1_BASE (IO_PHYS + 0x01230000)
#define MSDC2_BASE (IO_PHYS + 0x01250000)
#define MSDC3_BASE (IO_PHYS + 0x01240000)
#define IO_PHYS 0xC0000000
对于通道0,基地址在MSDC0_BASE即为0xC1220000。其余通道基地址在0xC1230000 0xC1240000 0xC1250000,但是datasheet里只有0通道0xC1220000的信息。
*/
int msdc_init(struct mmc_host *host, int id)
{
u32 baddr[] = {MSDC0_BASE, MSDC1_BASE, MSDC2_BASE, MSDC3_BASE};
//基地址选择0通道
u32 base = baddr[id];
//0通道
host->id = id;
//基地址
host->base = base;
host->f_max = MSDC_MAX_SCLK;
…
//以下所有对0通道的寄存器操作都是基于这基地址“base”进行的
}
3.3 uboot
Uboot代码:
Generic部分:
Uboot的generic的部分位于“bootable/bootloader/uboot/”
Mt6577相关部分相关位于:
mediatek/platform/mt6577/uboot/
mediatek/custom/out/mt6577/uboot/
uboot的config:
“alps\mediatek\custom\out\mt6577\uboot\inc\configs\ubconfigs.h”
3.3.1 uboot初始化流程
Uboot初始化主体位于“bootable/bootloader/uboot/arch/arm/lib/board.c”
void start_armboot (void)
{
…
//执行初始化例程数组
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
…
//执行平台相关misc初始化
#if defined(CONFIG_MISC_INIT_R)
/* miscellaneous platform dependent initialisations */
misc_init_r ();
#endif
}
在“bootable/bootloader/uboot/arch/arm/lib/board.c”定义了初始化例程指针数组,其中的各项例程不同的板卡有自己不同的实现:
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
dram_init, /* configure available RAM banks */ /* change the original init order */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
…
display_dram_config,
NULL,
};
Mt6577的初始化例程的实现位于“mediatek/platform/mt6577/uboot/mt6577_board.c”:
int board_init (void)
{…
mtk_serial_init();
…
mt6577_pinmux_init();s
…
pmic6329_init();
}
3.3.2 镜像布局与分区
Uboot在“int misc_init_r (…)”里对镜像分区初始化
int misc_init_r (void)
{…
mt6577_part_init(BLK_NUM(16 * GB));
…
}
/**********************************************************************/
在“mediatek/custom/out/mt6577/uboot/partition.h”里对分区表定义如下:
#include <common.h>
/*该文件可能就是:
“mediatek/custom/out/mt6577/uboot/inc/mt65xx_partition.h”
*/
#include "mt65xx_partition.h"
part_t partition_layout[] = {
{PART_PRELOADER, PART_BLKS_PRELOADER, PART_FLAG_NONE,0},
{PART_DSP_DL, PART_BLKS_DSP_DL, 0, PART_FLAG_NONE},
…
};
3.3.3 gpio初始化
DCT工具产生的“cust_gpio_b

本文详细介绍了MT6577芯片在驱动开发过程中的Preloader和Uboot阶段,涵盖了这两个阶段的重要概念、功能及实现细节,是驱动开发者深入理解MT6577平台的关键资料。
最低0.47元/天 解锁文章
25万+

被折叠的 条评论
为什么被折叠?



