00.lk->kernel(mtk)

mtk平台没有跑app/aboot/aboot.c  跑的是app/mt_boot/mt_boot.c

/ {

        model = "MT8167";

        compatible = "mediatek,mt8167";

        interrupt-parent = <&sysirq>;

        #address-cells = <2>;

        #size-cells = <2>;

        /* chosen */

        chosen {

                bootargs = "console=tty0 console=ttyS0,921600n1 \

                earlycon=uart8250,mmio32,0x11005000 vmalloc=496M \

                androidboot.hardware=mt8167 \

                firmware_class.path=/vendor/firmware loop.max_part=7";

        };

};

LK调用流程:

mt_boot_init

->boot_linux_from_storage

  ->tags_target_addr = get_tags_addr();

  ->bootargs_init((void *)tags_target_addr); //将dts chosen节点下的 bootargs子节点的字符串保存到g_cmdline

  ->boot_linux

   ->boot_linux_fdt        //继续设置属性

/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/bootargs.h

#define CMDLINE_LEN   2048

/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/bootargs.c

static char g_cmdline[CMDLINE_LEN];

static char *cmdline_tail = g_cmdline;

static char *cmdline_end = g_cmdline + CMDLINE_LEN;

void bootargs_init(void *fdt)

  ... ...

        /* Reset cmdline_tail */

        cmdline_tail = g_cmdline;

        offset = fdt_path_offset(fdt, "/chosen");  //dts chosen节点下的 bootargs子节点

        fdt_bootargs = fdt_getprop(fdt, offset, "bootargs", &len);  /vendor/mediatek/proprietary/bootable/bootloader/lk/lib/libfdt/fdt_ro.c

        assert(fdt_bootargs);

        n = snprintf(cmdline_tail, CMDLINE_LEN, "%s", (char *)fdt_bootargs);

        if (n < 0)

                dprintf(INFO, "snprintf error in %s:%d\n", __FILE__, __LINE__);

        else

                cmdline_tail += n;

  ... ...

}

static char g_cmdline[CMDLINE_LEN];

void cmdline_print(void){}

 ->cmd_len = strlen(g_cmdline);

 ->pal_log_err("g_cmdline size: %d\n", cmd_len);

 ->pal_log_err("cmdline: %s\n", temp_cmdline);

Line 1520: (190318_15:43:57.017)[1037]cmdlineconsole=tty0 console=ttyMT0,921600n1 root=/dev/ram earlycon=uart8250,mmio32,0x11005000 vmalloc=496Mandroidboot.hardware=mt8167 firmware_class.path=/vendor/firmware androidboot.verifiedbootstate=green bootopt=64S3,32N2,32N2 buildvariant=user androidboot.veritymode=enforcing printk.disable_uart=0 bootprof.pl_t=2244 bootprof.lk_t=1027 boot_reason=0 androidboot.serialno=0123456789ABCDEF androidboot.bootreason=power_key mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x17b800,0x54000000,0x80000

/kernel-4.9-lc/init/main.c

asmlinkage __visible void __init start_kernel(void){}

 ->pr_notice("Kernel command line: %s\n", boot_command_line);

Line 1554: (190318_15:43:57.484)[    0.000000] <0>-(0)[0:swapper]Kernel command lineconsole=tty0 console=ttyMT0,921600n1 root=/dev/ram earlycon=uart8250,mmio32,0x11005000vmalloc=496M androidboot.hardware=mt8167 firmware_class.path=/vendor/firmware androidboot.verifiedbootstate=green bootopt=64S3,32N2,32N2 buildvariant=user androidboot.veritymode=enforcing printk.disable_uart=0 bootprof.pl_t=2244 bootprof.lk_t=1027 boot_reason=0 androidboot.serialno=0123456789ABCDEF androidboot.bootreason=power_key mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x17b800,0x54000000,0x80000

 /kernel-4.19-lc/lib/cmdline.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

int get_option(char **str, int *pint)
{
    char *cur = *str;

    if (!cur || !(*cur))
        return 0;
    *pint = simple_strtol(cur, str, 0);
    if (cur == *str)
        return 0;
    if (**str == ',') {
        (*str)++;
        return 2;
    }
    if (**str == '-')
        return 3;

    return 1;
}
EXPORT_SYMBOL(get_option);

内核自带例子:

 /kernel-4.19-lc/arch/mips/kernel/mips-mt.c

1
2
3
4
5
6
7
8

static int __init maxvpes(char *str)
{
    get_option(&str, &vpelimit);

    return 1;
}

__setup("maxvpes=", maxvpes)

我们在MTK平台实现的例子:

NVRAM:

LVDS_SELECT_FLAG可以通过SN工具先行写到nvram里面,然后通过读取nvram “proinfo”分区的数据保存到addr

unsigned char *addr;
unsigned long length = 512;
char *part_name = "proinfo";
part_dev_t *dev;
part_t *part;
dev = mt_part_get_device();
part = mt_part_get_partition(part_name);

start_addr = (u64)(part->start_sect) * dev->blkdev->blksz;
addr = (unsigned char *)malloc(length*sizeof(unsigned char));
len = dev->read(dev, start_addr, (uchar*)addr,length, part->part_id);

len = partition_read(part_name, sizeof(part_hdr_t), (uchar *)addr, (size_t)part_hdr->info.dsize);

if(len < 0){

    printf("Isaac [mboot_common_get_lvds_flag] len=%d\n",len);

   len = -EIO;

    goto exit;

}

LVDS_SELECT_FLAG= addr[64+40+40];

LK:

将LVDS_SELECT_FLAG添加到cmdline当中:

/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c

extern int LVDS_SELECT_FLAG;//Isaac add

int boot_linux_fdt(void *kernel, unsigned *tags,

                   unsigned machtype,

                   void *ramdisk, unsigned ramdisk_sz)

{

  ...

  /* Append androidboot.serialno=xxxxyyyyzzzz in cmdline */

        snprintf(tmpbuf, TMPBUF_SIZE, "%s%s", "androidboot.serialno=", sn_buf);

        cmdline_append(tmpbuf);

        /*Isaac add lvds flag*/

        printf("Isaac [boot_linux_fdt] get LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);

        snprintf(tmpbuf, TMPBUF_SIZE, "%s%d", "lvds_select_flag=", LVDS_SELECT_FLAG);

        cmdline_append(tmpbuf);

}

KERNEL:

kernel-4.4\drivers\misc\mediatek\lcm\B116XAN023_LVDS\B116XAN023_LVDS.c

int LVDS_SELECT_FLAG=0;

#define FRAME_WIDTH  (1366)

#define FRAME_HEIGHT (768)

#define FRAME_WIDTH_MIPI  (1368)

#define FRAME_HEIGHT_MIPI (768)

static int __init get_lvds_select_flag(char *str)

{

        get_option(&str, &LVDS_SELECT_FLAG);

        //LVDS_SELECT_FLAG = simple_strtol(str, NULL, 0);

        return 1;

}

__setup("lvds_select_flag=", get_lvds_select_flag);   

static void lcm_get_params(LCM_PARAMS *params)

{

 printf("LK Isaac [lcm_get_params] LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);

 if(LVDS_SELECT_FLAG == 0x31)

 {

  printf("[LK/LCM] [lcm_get_params]->B116XAN023_LVDS enter\n");

  memset(params, 0, sizeof(LCM_PARAMS));

  params->type         = LCM_TYPE_DPI;

  params->width       = FRAME_WIDTH;

  params->height      = FRAME_HEIGHT;

  ... ...

 }else{

  printf("[LK/LCM] [lcm_get_params]->KD116N5_40NV_B12_MIPI enter\n");

  memset(params, 0, sizeof(LCM_PARAMS));

  params->type           = LCM_TYPE_DSI;

  params->width         = FRAME_WIDTH_MIPI;

  params->height        = FRAME_HEIGHT_MIPI;

  ... ...

 }

}

通过uart_log可以看到lvds_select_flag的值已经成功保存到cmdline:

(190418_21:09:30.218)[1392] g_cmdline size: 869

(190418_21:09:30.218)[1392] cmdline: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_clas

(190418_21:09:30.218)[1394]        : s.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-

(190418_21:09:30.218)[1396]        : 0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.

(190418_21:09:30.218)[1398]        : slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9

(190418_21:09:30.294)[1400]        : bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_

(190418_21:09:30.294)[1401]        : uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEFlvds_select_flag=49 androidboot

(190418_21:09:30.294)[1403]        : .bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000

(190418_21:09:30.372)[    0.000000] <0>-(0)[0:swapper]KernelKernel command line: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_class.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEFlvds_select_flag=49 androidboot.bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000  

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void SOSC_init_8MHz(void) { SCG->SOSCDIV = 0x00000101; /* SOSCDIV1 & SOSCDIV2 =1: divide by 1 */ SCG->SOSCCFG = 0x00000024; /* Range=2: Medium freq (SOSC between 1MHz-8MHz)*/ // SCG->SOSCCFG = 0x00000034; /* Range=3: High freq (SOSC between 8MHz-40MHz)*/ /* HGO=0: Config xtal osc for low power */ /* EREFS=1: Input is external XTAL */ while(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK); /* Ensure SOSCCSR unlocked */ SCG->SOSCCSR = 0x00000001; /* LK=0: SOSCCSR can be written */ /* SOSCCMRE=0: OSC CLK monitor IRQ if enabled */ /* SOSCCM=0: OSC CLK monitor disabled */ /* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled */ /* SOSCLPEN=0: Sys OSC disabled in VLP modes */ /* SOSCSTEN=0: Sys OSC disabled in Stop modes */ /* SOSCEN=1: Enable oscillator */ while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)); /* Wait for sys OSC clk valid */ } void SPLL_init_160MHz(void) { while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */ SCG->SPLLCSR = 0x00000000; /* SPLLEN=0: SPLL is disabled (default) */ SCG->SPLLDIV = 0x00000302; /* SPLLDIV1 divide by 2; SPLLDIV2 divide by 4 */ SCG->SPLLCFG = 0x00180000; /* PREDIV=0: Divide SOSC_CLK by 0+1=1 */ /* MULT=24: Multiply sys pll by 4+24=40 */ /* SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz */ while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */ SCG->SPLLCSR = 0x00000001; /* LK=0: SPLLCSR can be written */ /* SPLLCMRE=0: SPLL CLK monitor IRQ if enabled */ /* SPLLCM=0: SPLL CLK monitor disabled */ /* SPLLSTEN=0: SPLL disabled in Stop modes */ /* SPLLEN=1: Enable SPLL */ while(!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK)); /* Wait for SPLL valid */ }
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值