DM365芯片启动流程与Bootloader解析

4星 · 超过85%的资源 需积分: 3 8 下载量 154 浏览量 更新于2024-07-31 收藏 530KB PPT 举报
"本资料详细阐述了DM365芯片的启动机制,包括从外部存储器和内部ROM启动的不同模式,并深入探讨了NandBootMode的启动流程以及UserBootloader的实现细节。" 在DM365芯片的启动过程中,其启动机制是由CPU在加电或复位后从预设地址执行指令来开始的。DM365提供多种启动方式,主要分为两类:从外部存储器AEMIF(NOR Flash/OneNand)引导启动和从ARM内部ROM(AIROM)引导启动。这两种模式的选择取决于BTSEL[2:0]引脚的状态。 当BTSEL[2:0]设置为001时,系统将从AEMIF执行引导启动代码,这意味着可以从OneNand或NorFlash启动。AIROM支持多种启动模式,包括BTSEL[2:0]为000的NAND Boot,010的MMC/SD Boot,011的UART Boot,100的USB Boot,101的SPI Boot,110的EMAC Boot以及111的HPI Boot。 NandBootMode的启动流程相对复杂,因为DM365处理器的AIRAM空间有限且NAND Flash不支持执行就地(XIP)技术。因此,从NAND Flash引导操作系统通常需要经过三个阶段的代码执行。在这个过程中,DaVinci EVM通常采用AIROM启动方式。启动流程涉及UserBootloader,其源码位于PSP包的board_utilities/flash_utils目录下。 UserBootloader的启动始于汇编文件start.S,该文件负责切换操作模式,建立堆栈,然后调用main函数。main函数进一步调用LOCAL_boot函数进行实际的引导操作,最后跳转到entrypoint执行Uboot。这部分代码主要位于board_utilities/flash_utils/Common/ubl/src目录下的ubl.c文件中,包含了串口烧写源码和JTAG擦除烧写源码等功能。 理解DM365的启动机制对于开发和调试基于该芯片的系统至关重要,特别是涉及到从不同存储介质启动和用户引导加载程序的实现。掌握这些知识可以帮助开发者更有效地配置和优化系统的启动流程。

set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.parallel=true; set hive.exec.parallel.thread.number=30; --drop table if exists dm_finrisk.dm_event_walletSettleSuccessEvent_di; create table if not exists dm_finrisk.dm_event_cashLoanEvent_di( event_uuid string ,event_code string ,dt string ,event_time string ,rawSnapshot string ) COMMENT 'cashLoanEvent' PARTITIONED BY ( day bigint)stored as parquet; drop table if exists tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")}; create table if not exists tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")} as select uuid as event_uuid ,event as event_code ,from_unixtime(unix_timestamp(cast(day as string),'yyyymmdd'),'yyyy-mm-dd') as dt ,from_unixtime(cast(cast(`time` AS BIGINT)/1000 AS BIGINT),'yyyy-MM-dd HH:mm:ss') as event_time ,get_json_object(data,'$.hotPublish.rawSnapshot') as rawSnapshot from dm_finrisk.ods_event_hdfs_snapshot_di where code = 'shield@cashLoanEvent' and day=${zdt.addDay(-1).format("yyyyMMdd")} drop table if exists tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")}; create table if not exists tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")} as select event_uuid ,event_code ,dt ,event_time ,rawSnapshot from tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")}; alter table dm_finrisk.dm_event_cashLoanEvent_di drop if exists partition (day = ${zdt.addDay(-1).format("yyyyMMdd")}); insert overwrite table dm_finrisk.dm_event_cashLoanEvent_di partition (day = ${zdt.addDay(-1).format("yyyyMMdd")}) select event_uuid ,event_code ,dt ,event_time ,rawSnapshot from tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")}分析下上面代码

2023-06-08 上传