日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

location驱动包_Zynq SDK 驱动探求(三):论一个外设驱动的全部身家·Xilinx SDK 驱动源码结构...

發(fā)布時間:2024/10/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 location驱动包_Zynq SDK 驱动探求(三):论一个外设驱动的全部身家·Xilinx SDK 驱动源码结构... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Processor is ready. Configure programable logic.
在新專欄 Rapid TCP/IP on Zynq 中,將圍繞 Xilinx Zynq 系列芯片,從 SDK 驅(qū)動,PS-PL 協(xié)同加速,嵌入式協(xié)議棧 LWIP 分析以及 TCP/IP 硬件加速等方面,一起探求可靈活配置,軟件定義,硬件加速的 TCP/IP 協(xié)議棧的實現(xiàn)。

在 Xilinx SDK 驅(qū)動中,每個外設(shè)都擁有許多源文件,一個個家財萬貫。本文將以私有定時器為例,做一個香港小報記者,一一盤點驅(qū)動大佬們的身家。

Location,Location

全部的 SDK 驅(qū)動源代碼位于賽靈思安裝源目錄

/SDK/2018.3(SDK版本)/data/embeddedsw/XilinxProcessorIPLib/drivers/ 中。

每個文件夾中存放著一個外設(shè)驅(qū)動, PS 和 PL 的外設(shè)驅(qū)動兼有。

3000 多個文件夾,豈不是有 3000 多個外設(shè),瘋了瘋了。其實也沒有這么多,以中斷控制器 scugic 為例,這里包括了外設(shè)驅(qū)動的 6 個版本,所以外設(shè)沒這么多,估摸著也就千八百個。所有提供的歷史版本都可以在 BSP 設(shè)置中切換使用。

當(dāng)你新建一個 SDK 工程的時候,一般都會同時新建一個 BSP,BSP 名為板級支持包,BSP 根據(jù)選擇的硬件平臺,統(tǒng)一管理所有啟用的外設(shè)驅(qū)動函數(shù)庫,以及包括 LwIP 等第三方函數(shù)庫。

值得注意的是:所謂驅(qū)動管理,就是將硬件平臺需要的外設(shè)源代碼復(fù)制到當(dāng)前 BSP 的目錄下。也就是說如果需要修改源代碼,需要到 SDK 的路徑中修改,對于某個 BSP 代碼的修改只對當(dāng)前 BSP 有效。

我們首先新建一個 BSP 來看看 BSP 的結(jié)構(gòu)。

BSP 分為兩個部分:文檔與源碼。

BSP Doucumentation 中是外設(shè)驅(qū)動的文檔,雙擊某個外設(shè)即可用打開包括外設(shè)驅(qū)動概述,API等的文檔,以網(wǎng)頁的形式。在之后的文章中,我們可能會分析一下文檔的重點區(qū)域。

源碼都位于 ps7_cortexa9_0 目錄下,包括頭文件,函數(shù)庫源碼,編譯完的函數(shù)庫,編譯函數(shù)庫的 Makefile 文件以及概述 BSP 信息的 system.mss 文件。Makefile 用于執(zhí)行將所有的外設(shè)驅(qū)動函數(shù)庫源代碼編譯為 libxil.a 。

所以定時器身家?guī)缀?#xff1f;

終于來到了本文的主要部分,定時器的源代碼有哪些文件?

在 libsrc/scutimer 下的 src 目錄中,共有 7 個文件,基本上所有的外設(shè)都是同樣的設(shè)定,所以了解定時器之后,所有外設(shè)的源文件結(jié)構(gòu)也就大抵明了。

xscutimer_selftest.c :

僅包括一個外設(shè)自測試函數(shù) XScuTimer_SelfTest ,通過對外設(shè)寄存器進行讀寫一致性測試判斷外設(shè)是否已經(jīng)就緒。通過測試函數(shù)可以發(fā)現(xiàn)外設(shè)初始化失敗,外設(shè)寄存器基址有誤等錯誤。

xscutimer_sinit.c:

僅包括外設(shè)配置查找函數(shù) XScuTimer_LookupConfig,將外設(shè) ID 對應(yīng)的硬件配置以外設(shè)配置結(jié)構(gòu)體的形式返回。外設(shè)的硬件信息來自于 vivado 生成并導(dǎo)致出至 SDK 的硬件平臺信息。這個函數(shù)在上一篇文章中進行了詳細(xì)的討論。

ljgibbs:Zynq SDK 驅(qū)動探求(二):外設(shè),從初始化到干活?zhuanlan.zhihu.com

xscutimer_g.c:

本文件為通過硬件信息生成的硬件外設(shè) ID 于寄存器基址映射表數(shù)組。數(shù)組中每個位置存放有一個外設(shè)配置結(jié)構(gòu)體。XScuTimer_LookupConfig 正是通過匹配 ID 的方式獲得對應(yīng)的外設(shè)配置結(jié)構(gòu)體。

/*

xscutimer.c:

本文件中定義了定時器初始化,啟動,寫入/讀取定時器等外設(shè)配置控制函數(shù)。這些函數(shù)體中通過 XScuTimer_ReadReg/XScuTimer_WriteReg 函數(shù)訪問寄存器,完成相應(yīng)的外設(shè)控制和配置操作。

但值得注意的是,xscutimer.c 中僅包括了部分外設(shè)管理配置函數(shù),其余的函數(shù)以宏定義的形式分別定義于 xscutimer.h 以及 xscutimer_hw.h 等頭文件中。這不禁讓人發(fā)問:為什么有的函數(shù)定義在源文件中,而有些只能以宏定義的形式蝸居于頭文件中?是什么讓 Xilinx 的程序員厚此薄彼,到底是人性的淪喪還是道德的沉淪?(xilinx 程序員們你們好,手動狗頭)

對此問題,我只發(fā)現(xiàn)了問題的表面現(xiàn)象,那就是在 xscutimer.c 中定義的函數(shù)對傳入?yún)?shù)進行了檢查,而 xscutimer.h 和 xscutimer_hw.h 中宏定義的函數(shù)則不檢查參數(shù)。看來是xscutimer.c 中定義的函數(shù)比較關(guān)鍵吧,命比較貴,惹不起。

xscutimer.h

作為主要的頭文件,定義了外設(shè)的數(shù)據(jù)結(jié)構(gòu),包括最重要的兩個結(jié)構(gòu)體:XScuTimer_Config,XScuTimer。分別為外設(shè)配置結(jié)構(gòu)體,用于存儲外設(shè)的硬件信息;外設(shè)實例結(jié)構(gòu)體,用于存儲外設(shè)具體的配置參數(shù)。

還定義了我們上述討論的外設(shè)配置函數(shù),以及聲明了 xscutimer.c 中定義的函數(shù),做了一個頭文件應(yīng)該做的。

xscutimer_hw.h

該文件的描述中是這么說的:This file contains the hardware interface to the Timer. 定義了寄存器的地址偏移,寄存器位的 mask ,定義了寄存器操作函數(shù) XScuTimer_ReadReg/XScuTimer_WriteReg ,這都非常合理地實現(xiàn)了一個硬件接口的工作,專注于寄存器訪問。

但還定義了外設(shè)配置函數(shù)是什么鬼情況?比如:

#define XScuTimer_SetLoadReg(BaseAddr, Value)

即定義了寫寄存器函數(shù),又定義了調(diào)用寫寄存器函數(shù)的外設(shè)配置函數(shù)。這樣層級不就全亂了,定義硬件結(jié)構(gòu)的初衷也不存在了啊。外設(shè)配置函數(shù)就應(yīng)該定義在 xscutimer.c/h 中啊,然后調(diào)用 xscutimer_hw.h 中的寄存器操作函數(shù)啊。

我冷靜了一下,打開了別的外設(shè) xyyyy_hw.h 文件觀察了一下:我只能說大部分的外設(shè)驅(qū)動代碼遵從了分層的概念:只在 xyyyy_hw.h 文件中定義了讀寫寄存器操作,但有一小部分外設(shè)驅(qū)動還定義了外設(shè)配置函數(shù)。

然后又冷靜了一下:發(fā)現(xiàn)了 xscutimer_hw.h 中函數(shù)的特點,那就是以外設(shè)基址作為參數(shù),而 xscutimer.c/h 中的函數(shù),則以外設(shè)實例結(jié)構(gòu)體作為參數(shù),接收參數(shù)后再從中取出外設(shè)基址。所以這是出于什么考慮呢,暫時不清楚。

對此我只能說兩點:一,作為一個外設(shè)驅(qū)動庫,統(tǒng)一,分層的源碼文件架構(gòu)應(yīng)該是必須的。二,讀寫寄存器操作其實沒有必要再每個外設(shè)中定義,因為不同的外設(shè)實質(zhì)上都使用統(tǒng)一的方式訪問寄存器,即下層的 Xil_In32/ Xil_Out32 函數(shù),完全可以抽象出一個寄存器層次。

#define XScuWdt_ReadReg(BaseAddr, RegOffset)

至于 Makefile 我很想強行分析一下,無奈之前學(xué)的語法已經(jīng)基本上忘了,但應(yīng)該會在后續(xù)的文章中專門分析 SDK 中外設(shè)驅(qū)動的編譯過程。

結(jié)語

至此,本文分析了 SDK 中外設(shè)源碼存放的路徑,BSP 的組成以及以定時器為例,分析了外設(shè)的源文件的組成與功能。此外,還對 Xilinx SDK 的設(shè)計提出了一點小疑問。

總結(jié)

以上是生活随笔為你收集整理的location驱动包_Zynq SDK 驱动探求(三):论一个外设驱动的全部身家·Xilinx SDK 驱动源码结构...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。