DM365的BSP源碼分析-基于2.6.18內核

DM365的BSP主要包含mach-davinci和plat-davinci兩個目錄(及相關頭文件),BSP復雜龐大又極其重要,它主要完成了板級的初始化,比如內存映射,時鐘和電源初始化,中斷和IO初始化,CPU及各模塊的初始化,相關平臺設備,總線設備的注冊等等。下面就分板一下DM365的BSP部分,以程序流程為縱線,以各個文件為橫線,進行分析。
?
????? 內核在經過一系列的初始化后會進行板級的初始化,主要依靠一個MACHINE_START宏,DM365的板定義宏在board-dm365-evm.c文件中,這個宏有以下幾個成員phys_io,io_pg_offst,boot_params,map_io,init_irq,timer,init_machine。這些成員變量或函數將會由內核在初始化時在適當的時機調用。DM365開發板對這幾個成員都有針對其開發板的內容,phy_io設置為0x01c00000,這是DM365寄存器的起始地址。boot_params為0x80000100,它在DDR中,是用來存放UBOOT的傳遞參數的。map_io會調用davinci_map_io函數,完成開發板的靜態地址映射,同時開發板中此函數還完成了MUX的功能初始化及各模塊時鐘的初始化。init_irq會調用davinci_dm365_evm_irq_init函數,對開發板的中斷系統進行初始化。timer會調用davinci_timer相關的成員,它完成開發板的時間管理初始化。init_machine調用dm365_evm_init函數,完成板級設備(部分)的初始化。下面我們從davinci_map_io函數開始。
?
????? davinci_map_io函數主要由三個部分組成,第一是中斷優先級的初始化,中斷優先級的初始化就是將全局中斷優先級結構指針davinci_irq_priorities指向一個默認的中斷優先級數組dm365_default_priorities,這個第二是調用davinci_map_common_io函數完成靜態地址映射,第三是調用davinci_init_common_hw函數完成MUX的功能初始化及各模塊時鐘的初始化。
?
????? davinci_map_common_io函數最主要就是完成了一段物理地址的靜態虛擬地址映射,此后程序中操作這段物理地址的內容時不必再用ioremap動態得到一個虛擬地址了。至于如何做到映射的,不用去深究,只需要在map_desc結構定義的本平臺使用的davinci_io_desc[]數組中中添加我們需要映射的地址段就可以了。開發板原程序中只映射了平臺寄存器部分的地址空間,其物理起始地址,地址段大小,欲映射成的虛擬起始地址等值填入這個結構中就可以了。這些值定義中io.h文件中,其中物理起始地址IO_PHYS為0x01c00000,這正是寄存器物理地址段的起始地址,地址段大小IO_SIZE為0x00400000,這兩個值由手冊都可以知道。至于欲映射成的虛擬起始地址則由我們人為決定,可以選用IO_VIRT為0xfbc00000,這樣物理地址和虛擬地址就有一個簡單的偏移關系IO_OFFSET為0xfa000000。有了這個偏移關系,物理地址便和虛擬地址隨時進行變換了,我們可以封裝一個宏IO_ADDRESS用來做為物理地址到虛擬地址的轉換。這里需要特別注意的,物理地址和虛擬地址的這層映射關系是內核來確定的,而兩個地址的簡單偏移關系是我們人為決定的,為了處理簡單我們選了一個與物理地址有簡單偏移關系的地址作為虛擬地址,并讓內核去認同。靜態映射一定要搞清楚這里面的東西,一開始很容易被迷惑的。davinci_map_common_io函數完成以后,接著是davinci_init_common_hw函數。
?
????? davinci_init_common_hw函數極其重要,它里面只有兩個函數,davinci_mux_init函數完成模塊引腳復用功能的初始化,davinci_clk_init函數完成模塊時鐘的初始化。
?
????? davinci_mux_init函數將各模塊的復用進行初始化。它首先將幾個重要的結構賦值,davinci_pins是二維指針,它被賦給一個和平臺有關的默認的全局結構,比如dm365_pins,它是一個二維數組,分別定義了若干模塊及每個模塊需要用到的引腳,注意這個維數的索引值是對應模塊在PSC管理中的索引值的。davinci_num_pins就是dm365_pins數組的維數。定義一個pin_config結構的指針table,并指向一個默認的全局結構數組davinci_dm365_pinmux,并得到這個數組的維數size。davinci_dm365_pinmux數組極其重要,它的每一維元素都是一個pin_config結構,它是用一個MUX_CFG宏來構造的,用于模塊引腳復用功能的選擇,實質是構造了欲對PINMUXx寄存器操作的位和欲寫入的值。這個要好好理解,配合手冊中PINMUXx寄存器理解。幾個結構賦值以后就調用davinci_mux_register函數,這個函數將table賦給了全局結構指針pin_table,將size賦給全局變量pin_table_sz,將davinci_get_pins函數地址賦給函數指針get_pin_list,將一個標識用到哪一個pinmux寄存器的數組首址賦給全局指針pinmux_in_use。davinci_get_pins這個函數的作用是通過參數ctr和id來返回davinci_pins數組的某一維,它表示某一個模塊用到的引腳。
?
????? davinci_clk_init函數完成模塊時鐘的初始化。它首先將PSC寄存器的地址賦給全局指針psc_bases,然后通過讀取PLL相關的寄存器得到預分頻,倍頻,后分頻,分頻等值(注意這些設置都在UBL進行設置好了,這里僅僅是讀值),這樣就得到了各個模塊的時鐘值,把它們賦給若干全局變量,比如armrate,voicerate,commonrate,vpssrate,ddrrate等。然后定義一個clk結構的指針clk_list,并指向一個默認的全局結構數組davinci_dm365_clks,并得到這個數組的維數num_clks。davinci_dm365_clks數組的每一維元素都是一個clk結構,定義了平臺各個模塊的時鐘管理參數,包括模塊名,時鐘值,本模塊在電源域的索引序號等。以后對某一模塊進行時鐘電源的開關就是操縱這個結構。
????? 然后調用davinci_enable_clks函數,這個函數實質是循環調用了clk_register函數和clk_enable函數,從而使能davinci_dm365_clks數組中定義的每一個模塊的電源時鐘。clk_register函數將當前模塊放入全局的clocks鏈表中,而后根據usecount的判斷值調用clk_enable函數,再調用__clk_enable函數,而其最終調用davinci_psc_config函數完成某一模塊的時鐘電源使能。需要特別注意的是此時幾乎全部模塊的usecount都不滿足,不會調用clk_enable函數,而即使調用了clk_enable函數(AEMIF),也不會真正調用__clk_enable函數。也就是說這初始化部分并沒有真正使能很多模塊的時鐘電源,只是按初始化的流程走了一個過程而已。在后面要提到的板級設備初始化部分會調用davinci_psc_config函數真正使能一些模塊的時鐘電源。另外其它模塊的時鐘電源則分布在各個模塊的驅動程序中,當驅動加載的時候才會調用clk_enable函數打開這個模塊的時鐘電源。這部分挺迷惑人的,好好理解。
????? davinci_psc_config函數的前一半工作是操作PSC相關的寄存器來使能模塊的時鐘電源,這部分的操作詳見數據手冊,是按手冊的步驟來實現的,另一半工作是調用davinci_pinmux_setup函數來將此模塊相關的復用引腳功能確定,它首先調用get_pin_list函數,它是個函數指針,在先前已經被指向了davinci_get_pins函數,它通過ctlr和id兩個參數從先前的dm365_pins數組中得到相應的某一維,這正是某一模塊需要的那些引腳。然后再通過一個循環將這幾個引腳調用davinci_cfg_reg函數實現其復用的本模塊的功能。
????? davinci_cfg_reg函數,很重要也很復雜。它定義一個pin_config類型的指針cfg指向當前引腳在pin_table的位置,然后根據其所在的PINMUXx寄存器的位為操作。這里的實現過程操作比較復雜,涉及到屏蔽位,模式等,但總的來說就是模塊需要這個引腳做此模塊功能而不是其它功能,暫不深究。
?
????? 到這里,davinci_cfg_reg函數結束了,davinci_pinmux_setup函數也就結束了,davinci_psc_config函數也就結束了,__clk_enable,clk_enable,davinci_enable_clks函數也就結束了,davinci_clk_init函數也就結束了,davinci_init_common_hw函數也就結束了,davinci_map_io函數也就結束了。DM365的BSP板定義宏中的map_io也就結束了。下面分析板定義宏中的init_irq,它指向davinci_dm365_evm_irq_init函數,下面開始分析davinci_dm365_evm_irq_init函數。
?
????? davinci_dm365_evm_irq_init函數,只調用一個davinci_irq_init函數。它首先獲得全部64個中斷的優先級數組,這個前面已經得到并放在全局數組davinci_irq_priorities中。而后操作INTC的寄存器,比如清除中斷請求,禁止中斷等,而后將設置好的優先級值寫入優先級寄存器中。然后就將全部64個中斷注冊到內核中,主要是利用內核中斷管理中的set_irq_chip函數,set_irq_flags函數,set_irq_handler函數,特別是set_irq_chip函數,它將每一個中斷綁定到一個irq_chip結構類型的davinci_irq_chip_0,而它包括了三個對中斷的處理的函數指針,比如使能unmask,禁止mask等,其實質還是操作了INTC的相關寄存器。這些函數就是在程序中,對某一中斷進行使能,禁止的處理,比如調用enable_irq使能某一個中斷時,其實最終就是調用unmask所指的函數。
?
????? 至此,davinci_irq_init函數結束了,davinci_dm365_evm_irq_init函數也就結束了。DM365的BSP板定義宏中的init_irq也就結束了。板定義宏中的timer感覺很復雜,現在不是很理解,以后有機會再看。下面分析板定義宏中的init_machine,它指向dm365_evm_init函數,下面開始分析dm365_evm_init函數。
?
????? dm365_evm_init函數是BSP中最重要的了,它完成了部分設備的初始化及注冊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254034.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254034.shtml

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

相關文章

第四章:Django 模型 —— 設計系統表

1. Django框架提供了完善的模型(Model )層來創建和存儲數據,每一個模型對應數據庫中的唯一的一張表。 2. Django 模型基礎知識: 。每一本模型是一個Python類,繼承了django.db.models.Model類 。該模型中每一個屬性一個…

DM365 使用BT656協議驅動LCD的實現

前兩天已經調好了,主要是對davinci_platform.c的修改 因為輸入輸出都為pal的制式,所以就在pal的函數中進行了修改。 在PAL設置的函數中,修改如下: /* * setting PAL mode */ static void davinci_enc_set_pal(struct vid_enc_mode…

工業視覺鏡頭NAVITAR

品牌介紹 美國NAVITAR是優越的上等光學系統制造商和供應商,工業視覺鏡頭NAVITAR為機器視覺、檢測和生物醫學診斷行業提供的定制光學解決方案。 工業視覺鏡頭NAVITAR用于鑒定產品、檢查產品缺陷、測量零件尺寸、操縱機器人設備和協助進行科學分析與探索。 還用來引導…

TCP系列48—擁塞控制—11、FRTO擁塞撤銷

一、概述FRTO虛假超時重傳檢測我們之前重傳章節的文章已經介紹過了,這里不再重復介紹,針對后面的示例在說明兩點1、FRTO只能用于虛假超時重傳的探測,不能用于虛假快速重傳的探測。2、延遲ER重傳觸發的進入Recovery狀態時候,并不會…

娛樂一下

6年前,沒幾個人知道尤里米爾納(Yuri Milner)是誰。但今天,他已經是地球上最有名的投資人了。 短短幾年內,這家伙掌管的風險投資基金DST(數字天空科技)投遍了全球的互聯網明星企業,并…

機器視覺行業市場現狀及發展前景分析

1.中國的機器視覺起步較晚,目前正處于快速增長期。 我國機器視覺最早起源于20世紀80年代。機器視覺生產線和先進設備自1998年眾多電子、半導體企業落戶廣東、上海以來,先后在國內誕生了國際代理商和機器視覺系統集成商。 第一個階段是1999-2003年的啟蒙…

從bootm 命令講起/U-boot的環境變量: bootcmd 和bootargs

從bootm 命令講起 1 找到linux的內核入口 Bootm命令通過讀取uImage的頭部040字節的信息,將uImage定位到正確的地址,同時找到linux的內核入口地址。 這個地方就涉及到uImage的頭部040字節信息到底是什么的問題?uboot提供了mkimage命令去把040字節加在lin…

關于創建SWAP示例

cd /data 進入指定目錄dd if/dev/zero of/data/swapfile bs1M count102400【參數說明】if文件名&#xff1a;輸入文件名&#xff0c;缺省為標準輸入。即指定源文件。< ifinput file >of文件名&#xff1a;輸出文件名&#xff0c;缺省為標準輸出。即指定目的文件。< of…

一個公式來說明加接圈的作用和缺點

一個公式來說明加接圈的作用和缺點 在很多視覺項目中&#xff0c;如果想要將視野縮小&#xff0c;一種方式是換用長焦鏡頭&#xff1b;另一種方式則是通過加接圈的方式來實現。那么&#xff0c;接圈到底改變的是什么參數&#xff0c;能夠使圖像進行放大呢&#xff1f;核心公式上…

bzoj4636: 蒟蒻的數列

作為惟一一個離線動態開點線段樹的。。我是不是沒救了。。 維護一下區間修改和區間和。。。 然而由于一些奇怪的原因翻車 到最后索性跑到一個點直接開左右兒子 最后注意區間左右端點可以相等。。。 1 #include<cstdio>2 #include<iostream>3 #include<algorithm…

module_param 在內核編程中的作用

module_param 在用戶態下編程可以通過main()的來傳遞命令行參數&#xff0c;而編寫一個內核模塊則通過module_param()! module_param的作用一.module_param1.為什么引入 在用戶態下編程可以通過main()來傳遞命令行參數&#xff0c;而編寫一個內核模塊則可通過module_param()來傳…

ubuntu 備忘

卷組擴容 Linux mint采用默認卷組的安裝方式 sainLinux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev 3.7G 0 3.7G 0% /dev tmpfs 743M 9.5M 733M 2% /run /dev/mapper/mint--vg-root…

DDL DML DCL

2019獨角獸企業重金招聘Python工程師標準>>> DDL is Data Definition Language statements. Some examples:數據定義語言&#xff0c;用于定義和管理 SQL 數據庫中的所有對象的語言 DML is Data Manipulation Language statements. Some examples:數據操作語言&…

學習halcon的論壇與書籍

論壇、培訓 halcon學習網&#xff1a;http://www.ihalcon.com/鳥叔機器視覺&#xff1a;http://bbs.szvbt.com/forum.php 博客 韓兆新的博客園majunfuLife and Codingzhaojun的博客風韻無聲騎螞蟻上高速的博客小馬_xiaoLV2小新識圖程序園-程序員的世界章柯淵的博客 注&…

LINUX內核中的xx_initcall初始化標號

LINUX內核中的xx_initcall初始化標號 田海立CSDN 2011-07-02 LINUX內核中有很多的初始化指示標志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 這些起什么作用呢&#xff1f;查閱源代碼&#xff08;android goldfish-2.6.29&#xff09;…

代碼習慣---打印參數

打印參數很重要。轉載于:https://www.cnblogs.com/Andomly/p/6050773.html

javascript設置和獲取cookie的方法

設置cookie的方法&#xff0c;和獲取cookie的方法例如以下 設置cookie document.cookie"name"value;//獲取cookie當中index是cookie的名稱function getCookie(index){var allcookies document.cookie; var cookie_pos allcookies.indexOf(index);if (cookie_pos !…

favicon.ico--網站標題小圖片二三事

前言: 什么是favicon? 直接用圖說話:這個就是favicon favicon.ico 是一種格式&#xff0c;一般用于網頁地址欄前或者在標簽上以縮略方式顯示網站標志&#xff0c;也可以拖曳favicon到桌面以建立到網站的快捷方式。為什么要設置favicon圖標&#xff0c;以圖像形態顯示&#xff…

鏡頭MTF傳遞函數解讀

什么是鏡頭的MTF曲線&#xff1f;MTF全稱是Modulation Transfer Function&#xff0c;譯為調制傳遞函數&#xff0c;其單位以line/mm來表示。MTF綜合反映了鏡頭的反差和分辨率特性&#xff0c; MTF是用儀器測量的&#xff0c;因而可以完全排除膠片等客觀因素的影響和人工判讀的…