bootloader (LK)android lk bootloader中相关修改指南

2024-04-05 00:08

本文主要是介绍bootloader (LK)android lk bootloader中相关修改指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/liuxiaochen77/article/details/7535107

 LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代码  ,little kernel 是小内核小操作系统。

           LK 代码 在 bootable/bootloadler/lk 目录下
           LK 代码结构
           +app            // 应用相关
           +arch           // arm 体系
           +dev            // 设备相关
           +include      // 头文件
           +kernel        // lk系统相关  
           +platform    // 相关驱动
           +projiect     // makefile文件
           +scripts      // Jtag 脚本
           +target        // 具体板子相关

       在 bootable/bootloadler/lk/arch/arm/ssystem-onesegment.ld 连接文件中 ENTRY(_start)指定 LK 从_start 函数开始,_start 在 lk/arch/crt0.S中 。crt0.S 主要做一些基本的 CPU 的初始化再通过 bl  kmain ;跳转到 C 代码中。
          kmain 在 lk/kernel/main.c 中


       kmain ()

             kmain 主要做两件事:1、本身 lk 这个系统模块的初始化;2、boot 的启动初始化动作。

             kmain 源码分析:
              void kmain()

          {
          1.初始化进程(lk 中的简单进程)相关结构体。

             thread_init_early();
           2.做一些如 关闭 cache,使能 mmu 的 arm 相关工作。

            arch_early_init();
           3.相关平台的早期初始化

            platform_early_init();
          4.现在就一个函数跳转,初始化UART(板子相关)

            target_early_init();
          5.构造函数相关初始化

            call_constructors();
           6.lk系统相关的堆栈初始化

            heap_init();
           7.简短的初始化定时器对象

            thread_init();
           8.lk系统控制器初始化(相关事件初始化)

            dpc_init();
           9.初始化lk中的定时器

            timer_init();
           
10.新建线程入口函数 bootstrap2 用于boot 工作(重点)
           thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));

         }

   以上与 boot 启动初始化相关函数是arch_early_init、  platform_early_init 、bootstrap2,这些是启动的重点,我们下面慢慢来看。



   arch_early_init()

         体系架构相关的初始化我们一般用的 ARM 体系

         1.关闭cache

         arch_disable_cache(UCACHE);

         2.设置向量基地址 (中断相关)

         set_vector_base(MEMBASE);

         3.初始化MMU

         arm_mmu_init();

         4.初始化MMU映射__平台相关

         platform_init_mmu_mappings();
         5.开启cache        

         arch_enable_cache(UCACHE)

         6.使能 cp10 和 cp11

         __asm__ volatile("mrc    p15, 0, %0, c1, c0, 2" : "=r" (val));
         val |= (3<<22)|(3<<20);

         __asm__ volatile("mcr    p15, 0, %0, c1, c0, 2" :: "r" (val));

        7.设置使能 fpexc 位 (中断相关)

        __asm__ volatile("mrc  p10, 7, %0, c8, c0, 0" : "=r" (val));

        val |= (1<<30);

        __asm__ volatile("mcr  p10, 7, %0, c8, c0, 0" :: "r" (val));

8.使能循环计数寄存器
        __asm__ volatile("mrc    p15, 0, %0, c9, c12, 0" : "=r" (en));
        en &= ~(1<<3); /*循环计算每个周期*/
        en |= 1;

        __asm__ volatile("mcr    p15, 0, %0, c9, c12, 0" :: "r" (en));
9.使能循环计数器
       en = (1<<31);
       __asm__ volatile("mcr    p15, 0, %0, c9, c12, 1" :: "r" (en));




  platform_early_init()

       平台相关初始化不同平台不同的初始化下面是msm7x30

        1.初始化中断

        platform_init_interrupts();
        2.初始化定时器

        platform_init_timer();


  bootstrap2

           bootstrap2 kmain的末尾以线程方式开启。主要分三步:platform_init、target_init、apps_init。

        1.platform_init

               platform_init 中主要是函数 acpu_clock_init。
               在 acpu_clock_init 对 arm11 进行系统时钟设置,超频

       2.target_init

              针对硬件平台进行设置。主要对 arm9 和 arm11 的分区表进行整合,初始化flash和读取FLASH信息
       3.apps_init  

             apps_init 是关键,对 LK 中所谓 app 初始化并运行起来,而 aboot_init 就将在这里开始被运行,android linux 内核的加载工作就在 aboot_init 中完成的 。

  aboot_init

       1.设置NAND/EMMC读取信息页面大小
        if (target_is_emmc_boot())

        {
                  page_size = 2048;
                  page_mask = page_size - 1;
        }
       else
       {
                 page_size = flash_page_size();
                 page_mask = page_size - 1;
        }

      2.读取按键信息,判断是正常开机,还是进入 fastboot ,还是进入recovery 模式
       。。。。。。。。。

     通过一系列的 if (keys_get_state() == XXX) 判断

       。。。。。。。。。
      3.从 nand 中加载 内核
      boot_linux_from_flash();


      partition_dump();
      sz = target_get_max_flash_size();
      fastboot_init(target_get_scratch_address(), sz);
      udc_start(); // 开始 USB 协议

  boot_linux_from_flash
              主要是内核的加载过程,我们的 boot.img 包含:kernel 头、kernel、ramdisk、second stage(可以没有)。
           1.读取boot 头部

           flash_read(p, offset, raw_header, 2048)

           offset += 2048;
           
2.读取 内核   
           memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)
           n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));

           flash_read(p, offset, (void*) hdr->kernel_addr, n)
           offset += n;
           
3.读取 ramdisk
           n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));

           flash_read(p, offset, (void*) hdr->ramdisk_addr, n)
           offset += n;
            4.启动内核
                boot_linux();//在boot_linux 中entry(0,machtype,tags);从kernel加载在内核中的地址开始运行了。
     

       到这里LK的启动过程就结束了。


android lk bootloader中相关修改指南

android lk bootloader中相关修改指南

 (L)ittle (K)ernelbootloader

 

1.主要功能,红色部分是android特有的一些功能,如fastboot,recovery模式等:

* Variety of nand devices for bootup

* USB driver to enable upgrading images over usb during development

* Keypad driver to enable developers enter ‘fastboot’ mode for image upgrades

* Display driver for debugging and splash screen

* Enable Android recovery image and image upgrades

 

2.配置dram内存大小,供linux kernel使用

The memory tags can be customized inlk/target/<target_name>/atags.c

 

3.fastboot模式,可以自行打开或者关闭

如,在boot中关闭按键或者usb 驱动,都可以达到此目的

相关文件

k/app/aboot/fastboot.c

lk/app/aboot/aboot.c

 

4.MTD block setting

可以配置各个mtd image 分区在如下 文件中
lk\target\tcc8900_evm\init.c
static struct ptentry board_part_list[]

 

5.打开或者关闭splash screen in the bootloader

DISPLAY_SPLASH_SCREEN功能可以来打开关闭

开机时候,boot会从’splash’  MTD分区中读取原始的文件到framebuffer中显示,所以也需要加载display 的驱动

这篇关于bootloader (LK)android lk bootloader中相关修改指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877171

相关文章

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10