ATF BL1 UFS初始化简单分析

ATF BL1 UFS初始化分析

  • 1 ATF的下载链接
  • 2 ATF BL1 UFS 初始化简易流程图
  • 3 ATF BL1 ufs初始化简单过程分析
    • 3.1 调用过程
    • 3.2 hikey960_ufs_init
    • 3.3 dw_ufs_init
    • 3.3 ufs_init

以海思hikey960为例来介绍,简单介绍在ATF BL1阶段的初始化处理。

1 ATF的下载链接

https://github.com/ARM-software/arm-trusted-firmware

可以通过下面的命令来下载ATF的代码,或者通过打包下载的方式也可以。

git clone git@github.com:ARM-software/arm-trusted-firmware.git

2 ATF BL1 UFS 初始化简易流程图

在这里插入图片描述

3 ATF BL1 ufs初始化简单过程分析

3.1 调用过程

以以海思hikey960为例来介绍ATF BL1 ufs 初始化的调用关系

| -- bl1_main -------- bl1_main.c| - bl1_platform_setup -------- plat/hisilicon/hikey960/hikey960_bl1_setup.c| - hikey960_ufs_init -------- plat/hisilicon/hikey960/hikey960_bl1_setup.c| - hikey960_ufs_reset -------- plat/hisilicon/hikey960/hikey960_bl1_setup.c| - dw_ufs_init -------- drivers/synopsys/ufs/dw_ufs.c| - ufs_init  -------- drivers/synopsys/ufs/dw_ufs.c

3.2 hikey960_ufs_init

  • UFS_REG_BASE表示UFS 配置空间的基地址
  • HIKEY960_UFS_DESC_BASE表示ufs 描述符的基地址
  • HIKEY960_UFS_DESC_SIZE表示ufs描述符的大小
  • (ufs_params.flags & UFS_FLAGS_SKIPINIT) == 0当前ufs驱动的flag如果是skipinit则先去做复位操作,对于hikey960来说是不会参与该处理流程的。
  • dw_ufs_init(&ufs_params);dw ufs的初始化处理
static void hikey960_ufs_init(void)
{dw_ufs_params_t ufs_params;memset(&ufs_params, 0, sizeof(ufs_params));ufs_params.reg_base = UFS_REG_BASE;ufs_params.desc_base = HIKEY960_UFS_DESC_BASE;                                                                                                                                                                               ufs_params.desc_size = HIKEY960_UFS_DESC_SIZE;if ((ufs_params.flags & UFS_FLAGS_SKIPINIT) == 0)hikey960_ufs_reset();dw_ufs_init(&ufs_params);
}

3.3 dw_ufs_init

  • .phy_init ufs phy初始化的处理
  • .phy_set_pwr_mode ufs phy 电源模式设置
  • ufs_init(&dw_ufs_ops, &ufs_params); dw ufs以dw_ufs_ops作为初始化ops以及ufs_params配置参数去做对应的dw ufs初始化操作。
static const ufs_ops_t dw_ufs_ops = {.phy_init               = dwufs_phy_init,.phy_set_pwr_mode       = dwufs_phy_set_pwr_mode,
};int dw_ufs_init(dw_ufs_params_t *params)
{       ufs_params_t ufs_params;memset(&ufs_params, 0, sizeof(ufs_params));ufs_params.reg_base = params->reg_base;ufs_params.desc_base = params->desc_base;ufs_params.desc_size = params->desc_size;ufs_params.flags = params->flags;                                                                                                                                                                                            ufs_init(&dw_ufs_ops, &ufs_params);return 0;
}

3.3 ufs_init

  • nutrs = (mmio_read_32(ufs_params.reg_base + CAP) & CAP_NUTRS_MASK) + 1;读取CAP寄存器去获取UTP传输请求槽数量Number of UTP Transfer Request Slots (NUTRS)。当前在BL1阶段采用的是Legacy Single Doorbell mode
    Number of UTP Transfer Request Slots (NUTRS): For Legacy Single Doorbell mode, this indicates the number of slots provided by the UTP Transfer Request List. A minimum of 1 and maximum of 32 slots may be supported.
    UTP传输请求槽数 (NUTRS): 对于传统单门铃模式,它表示UTP 传输请求列表提供的槽数量。可支持最少 1 个、最多 32 个插槽。
    For MCQ mode, this field specifies how many active transfer tasks the Host HW controller is capable of managing in parallel. The minimum of 1 and maximum of 256 slots may be supported.
    对于 MCQ 模式,该字段指定主机硬件控制器能够并行管理的活动传输任务数量。最少可支持 1 个插槽,最多可支持 256 个插槽。
    在这里插入图片描述
  • ufshc_reset(ufs_params.reg_base); ufs 复位操作
  • ops->phy_init(&ufs_params); ufs phy初始化,这个会调用在dw_ufs_init注册的ops的phy_init接口,即dwufs_phy_init
  • ufshc_link_startup(ufs_params.reg_base);执行linkstartup
  • ufs_get_device_info(&card);获取当前UFS设备的设备描述符
  • ops->phy_set_pwr_mode(&ufs_params);设置当前ufs的工作电源模式,会调用到dw_ufs_init注册的opsphy_set_pwr_mode接口,即dwufs_phy_set_pwr_mode函数
int ufs_init(const ufs_ops_t *ops, ufs_params_t *params)
{int result;unsigned int data;uic_cmd_t cmd;struct ufs_dev_desc card = {0};assert((params != NULL) &&(params->reg_base != 0) &&(params->desc_base != 0) &&(params->desc_size >= UFS_DESC_SIZE));memcpy(&ufs_params, params, sizeof(ufs_params_t));/* 0 means 1 slot */nutrs = (mmio_read_32(ufs_params.reg_base + CAP) & CAP_NUTRS_MASK) + 1;if (nutrs > (ufs_params.desc_size / UFS_DESC_SIZE)) {nutrs = ufs_params.desc_size / UFS_DESC_SIZE;}if (ufs_params.flags & UFS_FLAGS_SKIPINIT) {mmio_write_32(ufs_params.reg_base + UTRLBA,ufs_params.desc_base & UINT32_MAX);mmio_write_32(ufs_params.reg_base + UTRLBAU,(ufs_params.desc_base >> 32) & UINT32_MAX);result = ufshc_dme_get(0x1571, 0, &data);assert(result == 0);result = ufshc_dme_get(0x41, 0, &data);assert(result == 0);if (data == 1) {/* prepare to exit hibernate mode */memset(&cmd, 0, sizeof(uic_cmd_t));cmd.op = DME_HIBERNATE_EXIT;                                                                                                                                                                                                                                                                                                                                                                                                                      result = ufshc_send_uic_cmd(ufs_params.reg_base,&cmd);assert(result == 0);data = mmio_read_32(ufs_params.reg_base + UCMDARG2);assert(data == 0);do {data = mmio_read_32(ufs_params.reg_base + IS);} while ((data & UFS_INT_UHXS) == 0);mmio_write_32(ufs_params.reg_base + IS, UFS_INT_UHXS);data = mmio_read_32(ufs_params.reg_base + HCS);assert((data & HCS_UPMCRS_MASK) == HCS_PWR_LOCAL);}result = ufshc_dme_get(0x1568, 0, &data);assert(result == 0);assert((data > 0) && (data <= 3));} else {assert((ops != NULL) && (ops->phy_init != NULL) &&(ops->phy_set_pwr_mode != NULL));result = ufshc_reset(ufs_params.reg_base);assert(result == 0);ops->phy_init(&ufs_params);result = ufshc_link_startup(ufs_params.reg_base);assert(result == 0);/* enable all interrupts */data = UFS_INT_UCCS | UFS_INT_UHES | UFS_INT_UHXS | UFS_INT_UPMS;data |= UFS_INT_UTRCS | UFS_INT_ERR;mmio_write_32(ufs_params.reg_base + IE, data);ufs_enum();ufs_get_device_info(&card);if (card.wmanufacturerid == UFS_VENDOR_SKHYNIX) {ufs_params.flags |= UFS_FLAGS_VENDOR_SKHYNIX;}ops->phy_set_pwr_mode(&ufs_params);}(void)result;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝帽杯 取证2022

网站取证 网站取证_1 下载附件 并解压 得到了一个文件以及一个压缩包 解压压缩包 用火绒查病毒 发现后门 打开文件路径之后 发现了一句话木马 解出flag 网站取证_2 让找数据库链接的明文密码 打开www文件找找 查看数据库配置文件/application/database.php&#xff08;CodeI…

截止到目前全量主体总数有多少?

企业主体类型 企业主体类型有很多种&#xff0c;一般我们会分为公司&#xff08;有限责任&#xff09;、合伙企业、个人独资企业、个体经营户这些类别。 今天我们按照企业&#xff0c;个体&#xff0c;组织的分类方式来看各个主体的总数。 企业&#xff1a;统一社会信用代码…

ARTS 挑战打卡的第7天 --- Ubuntu中的WindTerm如何设置成中文,并且关闭shell中Tab键声音(Tips)

前言 &#xff08;1&#xff09;Windterm是一个非常优秀的终端神器。关于他的下载我就不多说了&#xff0c;网上很多。今天我就分享一个国内目前没有找到的这方面的资料——Ubuntu中的WindTerm如何设置成中文&#xff0c;并且关闭shell中Tab键声音。 将WindTerm设置成中文 &…

Unity zSpace 开发

文章目录 1.下载 zSpace 开发环境1.1 zCore Unity Package1.2 zView Unity Package 2. 导入工程3. 发布设置4.功能实现4.1 用触控笔来实现对模型的拖拽&#xff1a; 5. 后续更新 1.下载 zSpace 开发环境 官网地址 1.1 zCore Unity Package zSpace 开发核心必须 1.2 zView …

机器人CPP编程基础-05完结The End

非常不可思议……之前四篇博文竟然有超过100的阅读量…… 此文此部分终结&#xff0c;没有继续写下去的必要了。 插入一个分享&#xff1a; 编程基础不重要了&#xff0c;只要明确需求&#xff0c;借助AI工具就能完成一个项目。 当然也不是一次成功&#xff0c;工具使用也需要…

计算机视觉一 —— 介绍与环境安装

傲不可长 欲不可纵 乐不可极 志不可满 一、介绍 研究理论和应用 - 研究如何使机器“看”的科学 - 让计算机具有人类视觉的所有功能 - 让计算机从图像中&#xff0c;提取有用的信息&#xff0c;并解释 - 重构人眼&#xff1b;重构视觉皮层&#xff1b;重构大脑剩余部分 计…

利用ChatGPT绘制思维导图——以新能源汽车竞品分析报告为例

随着人们对环境保护的日益关注和传统燃油汽车的限制&#xff0c;全球范围内对新能源汽车的需求不断增长。新能源汽车市场的激烈竞争使得了解各个竞品的特点和优劣成为关键。然而&#xff0c;针对这一领域的详尽竞品分析却常常需要大量时间和精力。 在此背景下&#xff0c;人工智…

Qt+C++自定义控件仪表盘动画仿真

程序示例精选 QtC自定义控件仪表盘动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC自定义控件仪表盘动画仿真>>编写代码&#xff0c;代码整洁&#xff0c;规则&…

2023国赛数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

PHP原生类

什么是php原生类 原生类就是php内置类&#xff0c;不用定义php自带的类&#xff0c;即不需要在当前脚本写出&#xff0c;但也可以实例化的类 我们可以通过脚本找一下php原生类 <?php $classes get_declared_classes(); foreach ($classes as $class) {$methods get_clas…

Docker的基本概念及镜像加速器的配置

1.Docker的概念 由于代码运行环境不同&#xff0c;代码运行会出现水土不服的情况。运用docker容器会把环境进行打包&#xff0c;避免水土不服。docker是一种容器技术&#xff0c;它解决软件跨环境迁移的问题。 2&#xff0c;安装Docker 3.Docker架构 4.Docker镜像加速器的配…

我们常说这个pycharm里有陷阱,第三方库导入失败,看这里!

最近有小伙伴遇到了明明安装了 python 第三方库&#xff0c;但是在 pycharm 当中却导入不成功的问题。 ​ 一直以来&#xff0c;也有不少初学 python 的小伙伴&#xff0c;一不小心就跳进了虚拟环境和系统环境的【陷阱】中。 本文就基于此问题&#xff0c;来说说在 pycharm 当…

Spring Cloud 面试突击2

Spring Cloud 面试突击2 高并发&#xff1a;是一种系统运行过程中遇到的短时间大量的请求操作 响应时间&#xff1a; 吞吐量&#xff1a; QPS&#xff1a;数据库为维度 TPS 并发用户数 并发的维度&#xff1a;很多的 并发是不是达到的当前系统的瓶颈 缓存 &#xff08…

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…

指针---进阶篇(二)

指针---进阶篇&#xff08;二&#xff09; 前言一、函数指针1.抛砖引玉2.如何判断函数指针&#xff1f;&#xff08;方法总结&#xff09; 二、函数指针数组1.什么是函数指针数组&#xff1f;2.讲解函数指针数组3.模拟计算器&#xff1a;讲解函数指针数组 三、指向函数指针数组…

Maven基础之仓库、命令、插件机制

文章目录 Maven 仓库中央仓库和本地仓库中央仓库本地仓库 Maven 命令generate 命令compile 命令clean 命令test 命令package 命令install 命令 Maven 插件机制官方插件&#xff1a;Compile 插件Tomcat 7 插件 Maven 仓库 中央仓库和本地仓库 [✎] 简单一点说 中央仓库是一个网…

Redis复制

在Redis中&#xff0c;用户可以通过执行SLAVEOF命令或者设置slaveof选项&#xff0c;让一个服务器去复制(replicate) 另一个服务器&#xff0c;我们称呼被复制的服务器为主服务器(master)&#xff0c;而对主服务器进行复制的服务器则被称为从服务器(slave)&#xff0c;如下图所…

PHP codeigniter4 搭配Nginx

> 主要是为了用Nginx运行PHP环境 1. Nginx 官方文档的配置 default.conf This configuration enables URLs without “index.php” in them and using CodeIgniter’s “404 - File Not Found” for URLs ending with “.php”. server {listen 80;listen [::]:80;se…

springboot 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 SpringBoot JavaEE 简介 JavaEE的局限性&#xff1a; 1、过于复杂&#xff0c;JavaEE正对的是复杂的分布式企业应用&#xff0c;然而现实…

爬虫如何应对网站的反爬机制?如何查找user-agent对应的值

import requestsurl https://movie.douban.com/top250 response requests.get(url) # 查看结果 print(response)在requests使用一文中我们有讲到&#xff0c;当状态码不是200时表示爬虫不可用&#xff0c;也就是说我们获取不到网页源代码。但是我们还是可以挣扎一下&#xff…