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.pswp.cn/news/36492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36492.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍帽杯 取證2022

網站取證 網站取證_1 下載附件 并解壓 得到了一個文件以及一個壓縮包 解壓壓縮包 用火絨查病毒 發現后門 打開文件路徑之后 發現了一句話木馬 解出flag 網站取證_2 讓找數據庫鏈接的明文密碼 打開www文件找找 查看數據庫配置文件/application/database.php&#xff08;CodeI…

Vue3.2+TS的父傳子,子傳父

這是父組件 <template><div><!-- 這個fn是子組件emit觸發名&#xff0c;兩邊保持一致 --><Child :num"num" fn"numUp"></Child></div> </template><script setup lang"ts"> import { ref } fr…

截止到目前全量主體總數有多少?

企業主體類型 企業主體類型有很多種&#xff0c;一般我們會分為公司&#xff08;有限責任&#xff09;、合伙企業、個人獨資企業、個體經營戶這些類別。 今天我們按照企業&#xff0c;個體&#xff0c;組織的分類方式來看各個主體的總數。 企業&#xff1a;統一社會信用代碼…

基于IP網絡的存儲協議——iSCSI

文章首發地址 iSCSI&#xff08;Internet Small Computer System Interface&#xff09;是一種基于IP網絡的存儲協議&#xff0c;它能夠在TCP/IP網絡上實現SCSI協議&#xff0c;使得不同的主機可以通過網絡共享存儲設備。iSCSI可以將存儲設備映射到本地主機上&#xff0c;使得主…

ARTS 挑戰打卡的第7天 --- Ubuntu中的WindTerm如何設置成中文,并且關閉shell中Tab鍵聲音(Tips)

前言 &#xff08;1&#xff09;Windterm是一個非常優秀的終端神器。關于他的下載我就不多說了&#xff0c;網上很多。今天我就分享一個國內目前沒有找到的這方面的資料——Ubuntu中的WindTerm如何設置成中文&#xff0c;并且關閉shell中Tab鍵聲音。 將WindTerm設置成中文 &…

【Mac】mac 系統下格式化U盤或移動硬盤為ext4格式

1. 打開終端&#xff0c;安裝 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2. 安裝之后再次運行此命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…

學習C++資料集合

學習C C 是一個難學易用的語言&#xff01; C 的難學&#xff0c;不僅在其廣博的語法&#xff0c;以及語法背後的語意&#xff0c;以及語意背後的深層思維&#xff0c;以及深層思維背後的物件模型&#xff1b; C 的難學&#xff0c;還在於它提供了四種不同&#xff08;但相輔相…

第五十三天

●剪輯——Pr 剪輯(Film editing)&#xff0c;即將影片制作中所拍攝的大量素材&#xff0c;經過選擇、取舍、分解與組接&#xff0c;最終完成一個連貫流暢、含義明確、主題鮮明并有藝術感染力的作品。 ?線性編輯 將素材按時間順序連接成新的連續畫面的技術 ?非線性編輯 …

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 …

MyBatis EntityWrapper DISTINCTQU用法

使用EntityWrapper進行DISTINCT查詢可以通過以下幾個步驟實現&#xff1a; 創建一個EntityWrapper對象&#xff1a;EntityWrapper<T> wrapper new EntityWrapper<>();使用setSqlSelect方法設置需要查詢的字段&#xff0c;并在字段前加上DISTINCT關鍵字&#xff0…

機器人CPP編程基礎-05完結The End

非常不可思議……之前四篇博文竟然有超過100的閱讀量…… 此文此部分終結&#xff0c;沒有繼續寫下去的必要了。 插入一個分享&#xff1a; 編程基礎不重要了&#xff0c;只要明確需求&#xff0c;借助AI工具就能完成一個項目。 當然也不是一次成功&#xff0c;工具使用也需要…

ORA-01539: 表空間 ‘GSC004‘ 未聯機

1.檢查表空間狀態&#xff1a; SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name GSC004;2.聯機表空間&#xff1a;如果表空間處于離線狀態&#xff0c;可以嘗試將其聯機。 ALTER TABLESPACE GSC004 ONLINE;3.檢查表空間文件&#xff0c;確保表空…

代碼隨想錄第48天 | 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

198. 打家劫舍 當前房屋偷與不偷取決于 前一個房屋和前兩個房屋是否被偷了。 遞歸五部曲&#xff1a; dp[i]&#xff1a;考慮下標i&#xff08;包括i&#xff09;以內的房屋&#xff0c;最多可以偷竊的金額為dp[i]。決定dp[i]的因素就是第i房間偷還是不偷。 如果偷第i房間&…

計算機視覺一 —— 介紹與環境安裝

傲不可長 欲不可縱 樂不可極 志不可滿 一、介紹 研究理論和應用 - 研究如何使機器“看”的科學 - 讓計算機具有人類視覺的所有功能 - 讓計算機從圖像中&#xff0c;提取有用的信息&#xff0c;并解釋 - 重構人眼&#xff1b;重構視覺皮層&#xff1b;重構大腦剩余部分 計…

利用ChatGPT繪制思維導圖——以新能源汽車競品分析報告為例

隨著人們對環境保護的日益關注和傳統燃油汽車的限制&#xff0c;全球范圍內對新能源汽車的需求不斷增長。新能源汽車市場的激烈競爭使得了解各個競品的特點和優劣成為關鍵。然而&#xff0c;針對這一領域的詳盡競品分析卻常常需要大量時間和精力。 在此背景下&#xff0c;人工智…

nestjs:nginx反向代理服務器后如何獲取請求的ip地址

問題&#xff1a; 如題 參考&#xff1a; nodejsnginx獲取真實ip-騰訊云開發者社區-騰訊云 「轉」從限流談到偽造 IP nginx remote_addr 解決辦法&#xff1a; 1.設置nginx 對于代理部分&#xff0c;對http header添加Host、X-Real-IP、X-Forwarded-For&#xff08;最重要&…

【SA8295P 源碼分析】69 - Android 側添加支持 busybox telnetd 服務

【SA8295P 源碼分析】69 - Android 側添加支持 busybox telnetd 服務 一、下載 busybox-1.36.1.tar.bz2 源碼包二、編譯 busybox 源碼三、將編譯后的 busybox 打包編入Android 鏡像中系列文章匯總見:《【SA8295P 源碼分析】00 - 系列文章鏈接匯總》 本文鏈接:《【SA8295P 源碼…

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 競賽信息 全國大學生數學建模…

P8605 [藍橋杯 2013 國 AC] 網絡尋路

X 國的一個網絡使用若干條線路連接若干個節點。節點間的通信是雙向的。某重要數據包&#xff0c;為了安全起見&#xff0c;必須恰好被轉發兩次到達目的地。該包可能在任意一個節點產生&#xff0c;我們需要知道該網絡中一共有多少種不同的轉發路徑。 源地址和目標地址可以相同…