第二个函数
<span style="font-size:14px;">void arch_early_init(void)
{
/* turn off the cache */
arch_disable_cache(UCACHE);
/* set the vector base to our exception vectors so we dont need to double map at 0 */
#if ARM_CPU_CORTEX_A8
set_vector_base(MEMBASE);
#endif
#if ARM_WITH_MMU
arm_mmu_init();
#endif
/* turn the cache back on */
arch_enable_cache(UCACHE);
#if ARM_WITH_NEON
/* enable cp10 and cp11 */
uint32_t val;
__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));
/* set enable bit in 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));
#endif
#if ARM_CPU_CORTEX_A8
/* enable the cycle count register */
uint32_t en;
__asm__ volatile("mrc p15, 0, %0, c9, c12, 0" : "=r" (en));
en &= ~(1<<3); /* cycle count every cycle */
en |= 1; /* enable all performance counters */
__asm__ volatile("mcr p15, 0, %0, c9, c12, 0" :: "r" (en));
/* enable cycle counter */
en = (1<<31);
__asm__ volatile("mcr p15, 0, %0, c9, c12, 1" :: "r" (en));
#endif
}</span>
用一些arm的汇编完成的动作,具体干啥后续再看
void platform_early_init(void)
{
board_init();
platform_clock_init();
qgic_init();
qtimer_init();
scm_init();
}
子函数一
void board_init()
{
platform_detect();
target_detect(&board); //这个是空函数
target_baseband_detect(&board); //根据之前的board的platform类型来选择board->baseband是那个地址
}
子函数11通过获取指定地址的信息来判断这块板子是什么类型的,并赋值给board这个结构体
static void platform_detect()
{
struct smem_board_info_v6 board_info_v6;
struct smem_board_info_v7 board_info_v7;
struct smem_board_info_v8 board_info_v8;
unsigned int board_info_len = 0;
unsigned ret = 0;
unsigned format = 0;
unsigned pmic_type = 0;
uint8_t i;
uint16_t format_major = 0;
uint16_t format_minor = 0;
ret = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
&format, sizeof(format), 0);
if (ret)
return;
/* Extract the major & minor version info,
* Upper two bytes: major info
* Lower two byets: minor info
*/
format_major = (format & 0xffff0000) >> 16;
format_minor = format & 0x0000ffff;
if (format_major == 0x0)
{
if (format_minor == 6)
{
board_info_len = sizeof(board_info_v6);
ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
&board_info_v6,
board_info_len);
if (ret)
return;
board.platform = board_info_v6.board_info_v3.msm_id;
board.platform_version = board_info_v6.board_info_v3.msm_version;
board.platform_hw = board_info_v6.board_info_v3.hw_platform;
board.platform_subtype = board_info_v6.platform_subtype;
}
else if (format_minor == 7)
{
board_info_len = sizeof(board_info_v7);
ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
&board_info_v7,
board_info_len);
if (ret)
return;
board.platform = board_info_v7.board_info_v3.msm_id;
board.platform_version = board_info_v7.board_info_v3.msm_version;
board.platform_hw = board_info_v7.board_info_v3.hw_platform;
board.platform_subtype = board_info_v7.platform_subtype;
board.pmic_info[0].pmic_type = board_info_v7.pmic_type;
board.pmic_info[0].pmic_version = board_info_v7.pmic_version;
}
else if (format_minor >= 8)
{
dprintf(INFO, "Minor socinfo format detected: %u.%u\n", format_major, format_minor);
board_info_len = sizeof(board_info_v8);
ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
&board_info_v8,
board_info_len);
if (ret)
return;
board.platform = board_info_v8.board_info_v3.msm_id;
board.platform_version = board_info_v8.board_info_v3.msm_version;
board.platform_hw = board_info_v8.board_info_v3.hw_platform;
board.platform_subtype = board_info_v8.platform_subtype;
/*
* fill in board.target with variant_id information
* bit no |31 24 | 23 16 | 15 8 |7 0|
* board.target = |subtype| plat_hw_ver major | plat_hw_ver minor |hw_platform|
*
*/
board.target = (((board_info_v8.platform_subtype & 0xff) << 24) |
(((board_info_v8.platform_version >> 16) & 0xff) << 16) |
((board_info_v8.platform_version & 0xff) << 8) |
(board_info_v8.board_info_v3.hw_platform & 0xff));
for (i = 0; i < SMEM_V8_SMEM_MAX_PMIC_DEVICES; i++) {
board.pmic_info[i].pmic_type = board_info_v8.pmic_info[i].pmic_type;
board.pmic_info[i].pmic_version = board_info_v8.pmic_info[i].pmic_version;
/*
* fill in pimc_board_info with pmic type and pmic version information
* bit no |31 24 | 23 16 | 15 8 |7 0|
* pimc_board_info = |Unused | Major version | Minor version|PMIC_MODEL|
*
*/
pmic_type = board_info_v8.pmic_info[i].pmic_type == PMIC_IS_INVALID? 0 : board_info_v8.pmic_info[i].pmic_type;
board.pmic_info[i].pmic_target = (((board_info_v8.pmic_info[i].pmic_version >> 16) & 0xff) << 16) |
((board_info_v8.pmic_info[i].pmic_version & 0xff) << 8) | (pmic_type & 0xff);
}
if (format_minor == 0x9)
board.foundry_id = board_info_v8.foundry_id;
}
/* HLOS subtype
* bit no |31 20 | 19 16|15 13 |12 11 | 10 8 | 7 0|
* board.platform_hlos_subtype = |reserved | Boot device |Reserved | Panel | DDR detection | subtype|
* | bits | | bits | Detection |
*/
board.platform_hlos_subtype = (board_get_ddr_subtype() << 8) | (platform_get_boot_dev() << 16) | (platform_detect_panel() << 11);
}
else
{
dprintf(CRITICAL, "Unsupported board info format %u.%u\n", format_major, format_minor);
ASSERT(0);
}
}
主要的特点是对地址的强制转型
比如
smem = (struct smem *)smem_addr;
文章浏览阅读4.4k次,点赞2次,收藏7次。文章目录一、线性回归的意义二、一、线性回归的意义线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。由于市场现象一般是受多种因素的影响,而并不是仅仅受一个因素的影响。所以应用一元线性回归分析预测法,必须对影响市场现象的多种因素做全面分析。只有当诸多的影响因素中,确实存在一个对因变量影响作用明显高于其他因素的变量,才能将它作为自变量,应用一元相关回归分析市场预测法进行_excel最小二乘法求线性回归方程
文章浏览阅读3.9k次,点赞2次,收藏15次。数据库语法总结(3)_多表联查
文章浏览阅读636次。创建一个随机的电话号码,前面是5到8位数,后面有随机的区号3到5位数,可能有区号也可能没有。_java随机生成电话号码
文章浏览阅读692次,点赞9次,收藏10次。需求:修改指定目录下所有文件的页眉页脚,或者往里面添加内容。_python 替换word页眉页脚
文章浏览阅读1.5w次,点赞41次,收藏27次。MyBatis是一种优秀的持久层框架,它是一个轻量级的、优化的、功能强大的Java持久层框架,它的设计理念是贴近SQL、便于使用、高效并且功能丰富。通过MyBatis的使用,开发者能够更加专注于业务逻辑的实现,而不用过多关注底层的数据库操作。MyBatis通过XML或注解的方式配置SQL映射文件,并将Java的POJO(Plain Old Java Object,普通的Java对象)与数据库中的记录进行映射,使得开发人员能够以面向对象的方式来操作数据库,同时兼顾了SQL的灵活性和效率。灵活的SQL映射。_mybatis 面试经典题及源码
文章浏览阅读1.6k次。1 XML1.1 XML概述Extensible Markup Language可拓展标记语言用途:1. 数据存储,小型数据库,存在一定的CRUD操作可行性2. 网络端数据的传输3. JavaWEB框架项目配置文件Spring Druid …w3c万维网联盟指定的规范1.2 基本语法1. XML文件后缀名是.xml2. XML第一行是对于当前文件的定义声明3. XML..._position: start_document seen <?xml version="1.0" encoding="utf ... @1:34)</div>
文章浏览阅读3.9k次,点赞2次,收藏15次。本文来自公众号“AI大道理SPP对于一个CNN模型,可以将其分为两个部分:前面包含卷积层、激活函数层、池化层的特征提取网络,下称CNN_Pre,后面的全连接网络,下称CNN_Post。许多CNN模型都对输入的图片大小有要求,实际上CNN_Pre对输入的图片没有要求,可以简单认为其将图片缩小了固定的倍数,而CNN_Post对输入的维度有要求。SPP:空间金字塔池化,无论CNN_Pre输出的feature maps尺寸是怎样,都能输出固定的维度传给CNN_Post。SP._spp模块
文章浏览阅读1k次。开始之前需要先下载乌班图Ubuntu 镜像和制作软件 UltraISO 软碟通。官方最新版乌班图下载:https://cn.ubuntu.com/download官方旧版本乌班图下载:https://ubuntu.com/download/alternative-downloadsUltraISO 软碟通官网下载地址:https://cn.ezbsystems.com/支持正版,请订购软件。以..._软碟通制作u盘启动盘安装ubu
文章浏览阅读1.7k次。刚刚移植完海思。趁新鲜,赶紧写博客记录一下。刚换新公司,老公司用的平台都是三星的,对Qt等支持都非常好,不需要太多操心。新公司采用的是海思的平台,自带pdf是没有说明如何使用QT。QT版本采用Qt4.5.3海思使用的是Hi3520D。首先要安装海思的SDK1、hi3520D SDK包位置 在"hi3520D_V100R001***/01.software/board..._if (hi_success != sample_comm_vo_startchn(vodev, &stpubattr, stvomode)) ^~~~
文章浏览阅读151次。异常是:org.gradle.api.tasks.TaskExecutionException:任务':app:compileDebugJavaWithJavac'的执行失败 . 在org.gradle上的org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsT..._jaranalysis.bin
文章浏览阅读1.1k次。 干了3年的现场维护工程师、工程项目经理。部署了几次动环监控系统,调了无数的交换机。最终发现还是喜欢编程,从14年一直是.Net程序员,开发了公司内部使用的三个系统。无非就是一直在造轮子。EasyUi+Handler的方式,就是这样写了4年系统。当我发现想换工作的时候,我甚至不理解ORM框架,对LINUX也是一穷二白。 正好这个时候接到一个活,用python开发,前台是VU..._安装 flask.json
文章浏览阅读926次,点赞22次,收藏21次。本文首发于公众号:机器感知。_diffusiongpt: llm-driven text-to-image