mt6577驱动开发 笔记版 转载请注明出处---crosskernel@gmail.com

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




3 Preloader & Uboot

3.1 Preloader




3.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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值